<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>guzik &#187; DB</title>
	<atom:link href="http://guzik.net.pl/blog/category/tech/db/feed/" rel="self" type="application/rss+xml" />
	<link>http://guzik.net.pl/blog</link>
	<description>Mój blog</description>
	<lastBuildDate>Fri, 27 Jan 2012 22:13:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Oracle standby</title>
		<link>http://guzik.net.pl/blog/2012/01/oracle-standby/</link>
		<comments>http://guzik.net.pl/blog/2012/01/oracle-standby/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 22:12:47 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Szkolenia]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=3683</guid>
		<description><![CDATA[Ukończyłem dziś szkolenie &#8222;Zaawansowana administracja bazą danych Oracle&#8221; w ramach Oracle Partner Academy. Szkolenie odbyło się w Krakowie, a prowadził je Kamil Stawiarski. Ciekawa formuła, a w zasadzie jej brak &#8211; to szkolenie odbyło się po raz pierwszy i my niejako kreowaliśmy jak będzie wyglądać w przyszłości. Ja wyniosłem wiele, więc wydaje mi się, że [...]]]></description>
			<content:encoded><![CDATA[<p>Ukończyłem dziś szkolenie &#8222;<a href="http://arrowecsservices.pl/www/news.nsf/id/Zaawansowana_administracja_baza_danych_Oracle">Zaawansowana administracja bazą danych Oracle</a>&#8221; w ramach <a href="http://arrowecs.pl/WWW/News.nsf/id/Partner_Academy">Oracle Partner Academy</a>. Szkolenie odbyło się w Krakowie, a prowadził je <a href="http://ora-600.pl/">Kamil Stawiarski</a>. </p>
<p>Ciekawa formuła, a w zasadzie jej brak &#8211; to szkolenie odbyło się po raz pierwszy i my niejako kreowaliśmy jak będzie wyglądać w przyszłości. <span id="more-3683"></span>Ja wyniosłem wiele, więc wydaje mi się, że się udało.</p>
<p>Zaczęło się nietuzinkowo &#8211; dostaliśmy jakąś kopię bazy, która uległa awarii i żeby robić cokolwiek przez resztę dni, musieliśmy to odratować. Później było jeszcze ciekawiej.<!--more--></p>
<p>Żeby było jeszcze bardziej PRO, zrobiliśmy nawet <em>standby</em> na ekspresie do kawy ;-)</p>
<p><a href="http://guzik.net.pl/blog/wp-content/uploads/2012/01/Zdjęcie0688.jpg"><img src="http://guzik.net.pl/blog/wp-content/uploads/2012/01/Zdjęcie0688-300x225.jpg" alt="" title="Zdjęcie0688" width="300" height="225" class="aligncenter size-medium wp-image-3685" /></a></p>
<p>Żeby nie było &#8211; ja też dałem coś od siebie prowadzącemu i kursantom. Promowałem <a href="http://orbada.sourceforge.net/html/www_orbada_doc.html">Orbadę</a> i <a href="http://tmux.sourceforge.net/">tmux</a>&#8216;a!</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2012/01/oracle-standby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rlwrap czyli historia w sqlplus</title>
		<link>http://guzik.net.pl/blog/2012/01/rlwrap-czyli-historia-w-sqlplus/</link>
		<comments>http://guzik.net.pl/blog/2012/01/rlwrap-czyli-historia-w-sqlplus/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 22:05:18 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[rlwrap]]></category>
		<category><![CDATA[SQL*Plus]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=3649</guid>
		<description><![CDATA[Od zawsze irytował mnie brak historii poleceń w sqlplus pod Linuksem. Owszem, można się dostać do ostatniego, ale chodzi mi o wygodne przewijanie góra &#8211; dół i ew. edycję. Czemu w ogóle pod Windows to działa, a pod Linuksem nie? Częściowym rozwiązaniem problemu jest użycie rlwrap. To małe narzędzie pozwala na edycję poleceń wpisywanych w [...]]]></description>
			<content:encoded><![CDATA[<p>Od zawsze irytował mnie brak historii poleceń w sqlplus pod Linuksem. Owszem, można się dostać do ostatniego, ale chodzi mi o wygodne przewijanie góra &#8211; dół i ew. edycję. Czemu w ogóle pod Windows to działa, a pod Linuksem nie?<br />
Częściowym rozwiązaniem problemu jest użycie <a href="http://utopia.knoware.nl/~hlub/uck/rlwrap">rlwrap</a>. To małe narzędzie pozwala na edycję poleceń wpisywanych w jakimkolwiek programie. Utrzymuje osobną historię dla każdej komendy i obsługuje uzupełnianie słów.<br />
Użycie równie trywialne jak instalacja, np.:</p>
<blockquote><p><code>rlwrap sqlplus</code></p></blockquote>
<p><span id="more-3649"></span><br />
Historię możemy również przeszukiwać wstecz przy użyciu kombinacji [Ctrl] + [R].<br />
Aby zadziałało uzupełnianie, musimy podać plik z listą słów (<code>-f</code>). Oczywiście nie będzie to tak inteligentne jak psql z PostgreSQL, bo dopasowywać będzie każde słowo, niezależnie od kontekstu, ale zawsze to coś.</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2012/01/rlwrap-czyli-historia-w-sqlplus/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Znak zachęty w SQL*Plus</title>
		<link>http://guzik.net.pl/blog/2011/11/znak-zachety-w-sqlplus/</link>
		<comments>http://guzik.net.pl/blog/2011/11/znak-zachety-w-sqlplus/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 22:29:57 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL*Plus]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=3457</guid>
		<description><![CDATA[Krótko (ostatnio jakoś brak czasu) i na temat &#8211; zmiana znaku zachęty (prompt) w SQL*Plus: - plik konfiguracyjny glogin.sql znajduje się w $ORACLE_HOME/sqlplus/admin (Unix) lub %ORACLE_HOME%\sqlplus\admin (Windows), - aby wyświetlić nazwę zalogowanego użytkownika, identyfikator połączenia i datę wystarczy dopisać: SET SQLPROMPT "_USER'@'_CONNECT_IDENTIFIER _DATE> " I już wśród wielu okien terminali wiemy gdzie pracujemy. Godzinę można [...]]]></description>
			<content:encoded><![CDATA[<p>Krótko (ostatnio jakoś brak czasu) i na temat &#8211; zmiana znaku zachęty (prompt) w SQL*Plus:<br />
- plik konfiguracyjny <code>glogin.sql</code> znajduje się w <code>$ORACLE_HOME/sqlplus/admin</code> (Unix) lub <code>%ORACLE_HOME%\sqlplus\admin</code> (Windows),<br />
- aby wyświetlić nazwę zalogowanego użytkownika, identyfikator połączenia i datę wystarczy dopisać:</p>
<blockquote><p><code>SET SQLPROMPT "_USER'@'_CONNECT_IDENTIFIER _DATE> "</code></p></blockquote>
<p>I już wśród wielu okien terminali wiemy gdzie pracujemy.</p>
<p>Godzinę można też dodać ustawiając zmienną <code>time</code>:</p>
<blockquote><p><code>set time on</code></p></blockquote>
<p>Przeczytaj więcej na:</p>
<ul>
<li><a href="http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch2.htm">Configuring SQL*Plus</a></li>
<li><a href="http://www.iherve.com/oracle/prompt_sqlplus.htm">Useful Prompt in SQL*Plus</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2011/11/znak-zachety-w-sqlplus/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Oracle: RMAN &#8211; raport wykonania kopii</title>
		<link>http://guzik.net.pl/blog/2011/07/oracle-rman-raport-wykonania-kopii/</link>
		<comments>http://guzik.net.pl/blog/2011/07/oracle-rman-raport-wykonania-kopii/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 18:55:36 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[RMAN]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=3077</guid>
		<description><![CDATA[Tydzień temu opisałem jak zrobić zestawienie kopii wykonanych przez Bacula, dziś zapytanie, które wyciągnie informacje o kopiach wykonywanych przy użyciu RMAN. Zestawienie, tak jak poprzednio &#8211; za miniony tydzień: SELECT TO_CHAR(START_TIME, 'yyyy-mm-dd HH24:MI') AS START_TIME, TO_CHAR(END_TIME, 'yyyy-mm-dd hh24:mi') AS END_TIME, TRUNC(TO_CHAR(END_TIME-START_TIME)*24) &#124;&#124; ' h ' &#124;&#124; TRUNC(MOD(TO_CHAR(END_TIME-START_TIME)*24*60,60)) &#124;&#124; ' min' AS DURATION, DECODE(TRUNC(LOG(1024, OUTPUT_BYTES)) , [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.oracle.com/"><img alt="" src="http://www.oracleimg.com/us/assets/oralogo-small.gif" class="alignright" width="133" height="18" /></a>Tydzień temu opisałem jak zrobić zestawienie kopii wykonanych przez Bacula, dziś zapytanie, które wyciągnie informacje o kopiach wykonywanych przy użyciu RMAN. Zestawienie, tak jak poprzednio &#8211; za miniony tydzień:</p>
<pre>SELECT
 TO_CHAR(START_TIME, 'yyyy-mm-dd HH24:MI') AS START_TIME,
 TO_CHAR(END_TIME, 'yyyy-mm-dd hh24:mi') AS END_TIME,
 TRUNC(TO_CHAR(END_TIME-START_TIME)*24) || ' h ' || TRUNC(MOD(TO_CHAR(END_TIME-START_TIME)*24*60,60)) || ' min' AS DURATION,
 DECODE(TRUNC(LOG(1024, OUTPUT_BYTES)) , 0, ROUND(OUTPUT_BYTES / POWER(1024, 0), 2) || ' Byte' , 1, ROUND(OUTPUT_BYTES / POWER(1024, 1), 2) || ' KB' , 2, ROUND(OUTPUT_BYTES / POWER(1024, 2), 2) || ' MB' , 3, ROUND(OUTPUT_BYTES / POWER(1024, 3), 2) || ' GB', 4, ROUND(OUTPUT_BYTES / POWER(1024, 4), 2) || ' TB') AS BACKUP_SIZE ,
 ROUND(OUTPUT_BYTES/INPUT_BYTES*100, 2) || ' %' AS RATIO,
 OBJECT_TYPE
FROM
 V$RMAN_STATUS
WHERE
 OBJECT_TYPE IN ('DB INCR', 'DB FULL', 'ARCHIVELOG')
 AND OPERATION = 'BACKUP'
 AND TO_CHAR(END_TIME, 'iw') >= TO_CHAR(SYSDATE-7, 'iw')
 AND TO_CHAR(START_TIME, 'iw') < TO_CHAR(SYSDATE, 'iw')
ORDER BY
 START_TIME ASC</pre>
<p><span id="more-3077"></span><br />
W <a href="http://sourceforge.net/projects/orbada/">Orbada</a> wynik może wyglądać tak:</p>
<p><a href="http://guzik.net.pl/blog/wp-content/uploads/2011/07/Screenshot-1.png"><img src="http://guzik.net.pl/blog/wp-content/uploads/2011/07/Screenshot-1-282x300.png" alt="" title="Screenshot-1" width="282" height="300" class="aligncenter size-medium wp-image-3084" /></a></p>
<p>Jak łatwo zauważyć, mamy kolejno: czas rozpoczęcia i zakończenia oraz czas trwania zadania, rozmiar wynikowy, mój wskaźnik 'ratio' czyli stosunek bajtów odczytanych do zapisanych, a na koniec rodzaj kopii. Kopia przyrostowa zawsze będzie oznaczona jako <code>DB INCR</code>, niezależnie od poziomu.</p>
<p>Powyższe działa na Oracle 10g2.</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2011/07/oracle-rman-raport-wykonania-kopii/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Bacula i własne zestawienia</title>
		<link>http://guzik.net.pl/blog/2011/06/bacula-i-wlasne-zestawienia/</link>
		<comments>http://guzik.net.pl/blog/2011/06/bacula-i-wlasne-zestawienia/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 18:07:22 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Bacula]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=3004</guid>
		<description><![CDATA[Bacula oprócz gotowych zestawień informacji (wyświetlanych przy pomocy komend np. status czy list) umożliwia tworzenie własnych, możliwych do wykorzystania w raportach czy po prostu pomocnych przy codziennej pracy. Z racji tego, że wszystkie dane przechowywane są w bazie SQL (MySQL lub PostgreSQL) można to zrobić dowolnym klientem (np. Orbada :&#62;). Można też przygotować zapytania i [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://bacula.org/"><img class="alignright" src="http://bacula.org/images/bacu_logo-red.jpg" alt="" width="600" height="80" /></a><a href="http://bacula.org/">Bacula</a> oprócz gotowych zestawień informacji (wyświetlanych przy pomocy komend np. <code>status</code> czy <code>list</code>) umożliwia tworzenie własnych, możliwych do wykorzystania w raportach czy po prostu pomocnych przy codziennej pracy. Z racji tego, że wszystkie dane przechowywane są w bazie SQL (MySQL lub PostgreSQL) można to zrobić dowolnym klientem (np. <a href="http://sourceforge.net/projects/orbada/">Orbada</a> :&gt;). Można też przygotować zapytania i wywoływać je z poziomu <code>bconsole</code> &#8211; daje to pewną &#8222;interaktywność&#8221;.</p>
<p>Sam napisałem własne i dopisuję na potrzeby chwili kolejne zapytania.<span id="more-3004"></span> Jednym z nich jest posortowana lista wolumenów (tak, dokładnie to co daje <code>list media pool=&lt;pool&gt;</code>, ale poukładane jak chcemy). Wygląda to tak:</p>
<pre>:List Volumes with order:
*Enter Pool name:
*Enter order (eg. VolumeName, LastWritten)
SELECT Media.MediaId, Media.VolumeName, Media.VolStatus, Media.Enabled,
Media.VolBytes, Media.VolFiles, Media.VolRetention, Media.Recycle, Media.Slot,
Media.InChanger, Media.MediaType, Media.LastWritten
FROM Media, Pool
WHERE Pool.PoolId = Media.PoolId
AND Pool.Name = '%1'
ORDER BY Media.%2</pre>
<p>Zapytania zapisujemy w pliku <code>etc/query.sql</code> (chyba, że dla <code>Director</code> mamy podaną inną nazwę pliku w <code>QueryFile</code>). Powyższe niech posłuży za przykład.<br />
Nazwę rozpoczynamy od dwukropka, pytania o ew. parametry rozpoczynamy od gwiazdki, a zapytania piszemy po prostu tekstem bez wyróżników. Oczywiście komentarze to <code>#</code>. Jeśli chcemy się posłużyć parametrami, to odwołujemy się do nich za pomocą <code>%n</code>, gdzie n jest pozycją parametru liczonym od 1.<br />
W zasadzie taka opcja jak sortowanie mogła by się znaleźć w standardzie, zwłaszcza, że przy dużej ilości wolumenów można się pogubić, no ale jakoś <em>Request for Changes</em> jeszcze nie wysłałem. Nie znalazłem też możliwości tworzenia dynamicznej listy przy podawaniu parametrów, RfC również nie wysłałem.<br />
Wywołanie zapytania z poziomu konsoli Bacula za pomocą komendy <code>query</code>. Nie znalazłem możliwości szybkiego wpisania w stylu <code>query queryid=21</code>. No, ale pewnie nie jest tak dlatego, że zapytania są odczytywane z pliku w momencie podania komendy.</p>
<p>Kolejne zapytanie robi zestawienie wykonywanych kopii w minionym tygodniu. Akurat takiego formatu potrzebowałem, ale polecam dostosowanie do własnych potrzeb:</p>
<pre>SELECT
 Name,
 Level,
 DATE_FORMAT(StartTime, &#039;%Y-%m-%d %H:%i&#039;) AS StartTime,
 DATE_FORMAT(EndTime, &#039;%Y-%m-%d %H:%i&#039;) AS EndTime,
 CONCAT(TIMESTAMPDIFF(HOUR, StartTime, EndTime), &#039; h &#039;, MOD(TIMESTAMPDIFF(MINUTE, StartTime, EndTime), 60), &#039; min&#039;) AS Duration,
 Status.JobStatusLong
FROM
 Job,
 Status
WHERE
 Job.JobStatus = Status.JobStatus
 AND EndTime &gt; DATE_FORMAT(DATE_SUB(NOW(), INTERVAL(DAYOFWEEK(NOW())+5) DAY), &#039;%Y-%m-%d&#039;)
 AND StartTime &lt;= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL(DAYOFWEEK(NOW())-1) DAY), &#039;%Y-%m-%d&#039;)
 AND Status.JobStatus != &#039;A&#039;
ORDER BY
 StartTime ASC,
 EndTime ASC</pre>
<p><a href="http://sourceforge.net/projects/orbada/"><img class="alignright" src="http://a.fsdn.com/con/icons/or/orbada@sf.net/orbada48.png" alt="" width="48" height="48" /></a>Przy okazji testowania powyższego w Orbada zauważyłem kolejny &#8216;kwiatek&#8217; w jdbc:mysql (vide <a href="http://guzik.net.pl/blog/2011/06/jdbcmysql-i-data/">jdbc:mysql i data</a>). Funkcja <a href="http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_timediff">TIMEDIFF()</a> zwraca wartość w zmiennej typu <a href="http://dev.mysql.com/doc/refman/5.1/en/time.html"><code>TIME</code></a>, jdbc:mysql i tak daje to jako <a href="http://dev.mysql.com/doc/refman/5.1/en/datetime.html"><code>TIMESTAMP</code></a>, a jak dodatkowo przekroczymy zakres TIME, to otrzymamy wyjątek.<br />
Obejściem zamiany typu przez jdbc:mysql jest <a href="http://acme-tech.net/blog/2011/01/30/mysql-timediff-java-sql-sqlexception-illegal-hour-value-for-java-sql-time-type/">sztuczna konwersja zwracanego wyniku do string za pomocą CONCAT()</a>.</p>
<p>Wspomniany zakres dla TIME to 838h, 59 min i 59 sek (<a href="http://www.microshell.com/database/mysql/getting-around-mysql-timediff-maximum-value-of-8385959/">polecam lekturę</a>). Moje obejście to <a href="http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_timestampdiff">TIMESTAMPDIFF()</a>, co widać w drugim zapytaniu.</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2011/06/bacula-i-wlasne-zestawienia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jdbc:mysql i data</title>
		<link>http://guzik.net.pl/blog/2011/06/jdbcmysql-i-data/</link>
		<comments>http://guzik.net.pl/blog/2011/06/jdbcmysql-i-data/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 01:03:42 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Orbada]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=2996</guid>
		<description><![CDATA[Od jakiegoś czasu jestem (szczęśliwym) użytkownikiem Orbada &#8211; narzędzia do administracji i zarządzania bazą danych. Podczas wyświetlania dat, które są zerowe (np. ustawione domyślnie na &#8217;0000-00-00 00:00:00&#8242;) zwraca takie błędy: java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 11 to TIMESTAMP. Caused by: java.sql.SQLException: Value '[B@13ad88b' can not be represented as java.sql.Timestamp Nie jest to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://orbada.sourceforge.net/html/www_orbada_doc.html"><img class=" alignleft" src="http://a.fsdn.com/con/icons/or/orbada@sf.net/orbada48.png" alt="Orbada" width="48" height="48" /></a><br />
Od jakiegoś czasu jestem (szczęśliwym) użytkownikiem <a href="http://orbada.sourceforge.net/html/www_orbada_doc.html">Orbada</a> &#8211; narzędzia do administracji i zarządzania bazą danych. Podczas wyświetlania dat, które są zerowe (np. ustawione domyślnie na &#8217;0000-00-00 00:00:00&#8242;) zwraca takie błędy:</p>
<blockquote><p><code>java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 11 to TIMESTAMP.<br />
Caused by: java.sql.SQLException: Value '[B@13ad88b' can not be represented as java.sql.Timestamp</code></p></blockquote>
<p>Nie jest to oczywiście błąd Orbada, a sterownika JDBC, z którego program korzysta przy połączeniach. Obejście to zmodyfikowanie <em>connection string</em> poprzed dodanie <code>zeroDateTimeBehavior=convertToNull</code>.</p>
<p><a href="http://guzik.net.pl/blog/wp-content/uploads/2011/06/jdbc.png"><img src="http://guzik.net.pl/blog/wp-content/uploads/2011/06/jdbc-300x239.png" alt="" title="jdbc" width="300" height="239" class="aligncenter size-medium wp-image-2997" /></a><br />
Nie reklamuję Orbada tylko dlatego, że <a href="http://sourceforge.net/users/akaluza">Andrzej</a> to mój kolega z pracy &#8211; to naprawdę dobry program. Spróbujcie sami, <a href="http://sourceforge.net/projects/orbada/reviews/">polećcie innym</a> i <a href="http://sourceforge.net/donate/index.php?group_id=361699">wspomóżcie projekt</a> (za niedługo będą nawet ładne koszulki z logo).</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2011/06/jdbcmysql-i-data/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Oracle: Recovery Manager: format string</title>
		<link>http://guzik.net.pl/blog/2011/04/oracle-recovery-manager-format-string/</link>
		<comments>http://guzik.net.pl/blog/2011/04/oracle-recovery-manager-format-string/#comments</comments>
		<pubDate>Thu, 28 Apr 2011 15:42:44 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[RMAN]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=2851</guid>
		<description><![CDATA[Ile środowisk, tyle strategii kopii. Jakiś czas temu postanowiłem wykonując pełne kopie używać stałych nazw i nadpisywać je w kolejnym cyklu. Wynikało to poniekąd z braku miejsca na dwie pełne kopie i wszystkie przyrostowe czy ArchiveLog robione w międzyczasie. Optymistycznie założyłem wtedy, że taki skrypt zadziała (z pamięci, więc coś może się nie zgadzać): RUN [...]]]></description>
			<content:encoded><![CDATA[<p>Ile środowisk, tyle strategii kopii. Jakiś czas temu postanowiłem wykonując pełne kopie używać stałych nazw i nadpisywać je w kolejnym cyklu. Wynikało to poniekąd z braku miejsca na dwie pełne kopie i wszystkie przyrostowe czy ArchiveLog robione w międzyczasie. Optymistycznie założyłem wtedy, że taki skrypt zadziała (z pamięci, więc coś może się nie zgadzać):</p>
<blockquote><p><code>RUN {<br />
ALLOCATE CHANNEL d1 DEVICE TYPE DISK FORMAT='/backup/%d_%p' MAXPIECESIZE=750G;<br />
BACKUP REUSE INCREMENTAL LEVEL 0 DATABASE TAG='level0';<br />
RELEASE CHANNEL d1;<br />
}</code></p></blockquote>
<p>No i zadziałało, ale nie tak jak się spodziewałem.<span id="more-2851"></span> RMAN po każdym wykonaniu <code>BACKUP DATABASE</code> robi kopię <code>controlfile</code> i <code>spfile</code>. Również wtedy gdy wyłączona jest opcja <code>CONTROLFILE AUTOBACKUP</code>. To dobre zachowanie, ale robi to w osobnym <i>backupset</i>, co znaczy, że znów użyje formatu <code>/backup/%d_%p</code>, a tym samym nadpisze pierwszy kawałek kopii bazy. No i kopia jest bezużyteczna. RMAN sam z siebie nie weryfikuje tego, więc kolejna kopia <code>LEVEL 1</code> będzie przyrostowa, a nie pełna.</p>
<p>Rozwiązaniem problemu jest globalne ustawienie formatu dla kopii pliku <code>controlfile</code>, np. tak:</p>
<blockquote><p><code>CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/%F';</code></p></blockquote>
<p>Przy okazji &#8211; ustawiając nazwę możemy użyć zmiennych jak wspomiane <code>%d</code> rozwijane na nazwę bazy czy <code>%p</code> podające numer kawałka. Najczęściej używane są unikalne <code>%F</code> czy też <code>%U</code>. Po opis wszystkich odsyłam do dokumentacji.<br />
Znajduje się w niej też wzmianka o <code>%n</code> czyli uzupełnienie nazwy bazy (<code>%d</code>) znakami <code>x</code> do ośmiu. Nazwane to zostało <em><strong>Porn star alias name</strong></em>, a książkowy scott pasuje do tego świetnie &#8211; scotxxx. Próbowałem znaleźć czy ktoś jeszcze używa takiej nazwy, bo spotkałem się z nią pierwszy raz, ale wyniki skierowały mnie na strony, które daleko odciągają uwagę od problemu kopii ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2011/04/oracle-recovery-manager-format-string/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FortiAnalyzer i MySQL</title>
		<link>http://guzik.net.pl/blog/2010/04/fortianalyzer-i-mysql/</link>
		<comments>http://guzik.net.pl/blog/2010/04/fortianalyzer-i-mysql/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 20:51:52 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[FortiAnalyzer]]></category>
		<category><![CDATA[Fortinet]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=1769</guid>
		<description><![CDATA[W dokumencie FortiAnalyzer v4.0 MR2 Release Notes w rozdziale &#8217;1.1 Summary of Enhancements Provided by FortiAnalyzer v4.0 MR2 Release&#8217; można znaleźć między innymi coś takiego: Remote SQL database (MySQL) support SQL DB PostgreSQL support Przyznam, że zaintrygowało mnie to na tyle, że postanowiłem od razu sprawdzić z czym to się je i co można z tego [...]]]></description>
			<content:encoded><![CDATA[<p>W dokumencie <a title="ftp://support.fortinet.com/FortiAnalyzer/v4.00/4.0MR2/MR2/FortiAnalyzer-v4.0-MR2-Release-Notes.pdf" href="ftp://support.fortinet.com/FortiAnalyzer/v4.00/4.0MR2/MR2/FortiAnalyzer-v4.0-MR2-Release-Notes.pdf">FortiAnalyzer v4.0 MR2 Release Notes</a> w rozdziale &#8217;1.1 Summary of Enhancements Provided by FortiAnalyzer v4.0 MR2 Release&#8217; można znaleźć między innymi coś takiego:</p>
<ul>
<li>Remote SQL database (MySQL) support</li>
<li>SQL DB PostgreSQL support</li>
</ul>
<p>Przyznam, że zaintrygowało mnie to na tyle, że postanowiłem od razu sprawdzić z czym to się je i co można z tego wycisnąć.<br />
<span id="more-1769"></span><br />
Konfiguracja prosta &#8211; jak na załączonym obrazku:</p>
<p><a href="http://guzik.net.pl/blog/wp-content/uploads/2010/04/famysql.jpg"><img class="aligncenter size-medium wp-image-1770" title="famysql" src="http://guzik.net.pl/blog/wp-content/uploads/2010/04/famysql-300x133.jpg" alt="" width="300" height="133" /></a><br />
Podajemy sposób przechowywania danych (<em>Location</em>): lokalny to prawdopodobnie PostgreSQL i zdalny, czyli MySQL. Wybrałem ten ostatni. Po uzupełnieniu niezbędnych danych (serwer, użytkownik, hasło, baza) zaznaczyłem logowanie wszystkich typów zdarzeń.<br />
Jeśli użytkownik, którego podamy ma prawo do zakładania baz, nic więcej nie musimy robić. W przeciwnym razie należy mu pomóc.<br />
Poniżej kawałek mojego <em>query log</em>&#8216;a:</p>
<blockquote><p><code>Connect fa@A.B.C.D on<br />
Query create database if not exists `fortianalyzer`<br />
Query use `fortianalyzer`<br />
Query select tbl_name from table_ref where tbl_name like 'FG100A3907510579-elog-%' and row_num=0<br />
</code></p></blockquote>
<p>Czyli mamy połączenie z serwerem, próbę założenia oraz podłączenie do bazy, a następnie przeszukanie tabeli <code>table_ref</code> (założona wcześniej). Tabela ta zawiera informacje o innych tablicach z logami &#8211; podejrzewam, że zaplanowana została jakaś rotacja (wskazują na to kolumny <code>itime_start</code>, <code>itime_end</code>, <code>dtime_start</code>, <code>dtime_end</code>, <code>row_num</code>). Czemu tylko podejrzewam, a nie wiem? Otóż w przypadku, gdy nie zostanie znaleziony żaden wynik, FortiAnalyzer próbuje stworzyć nową tablicę. U mnie próbuje, bo nikt nie pomyslał, że baza może mieć domyślne kodowanie ustawione na <code>utf8</code> zamiast np. <code>latin1</code>, a przy ograniczeniach MySQL nie każdą tablicę da się założyć. Jakiej się nie da? Wyczerpująco opisuje to dodatek <a title="http://dev.mysql.com/doc/refman/5.1/en/column-count-limit.html" href="http://dev.mysql.com/doc/refman/5.1/en/column-count-limit.html">D.7.2. The Maximum Number of Columns Per Table</a> dokumentacji MySQL.<br />
Zapytanie jak poniżej:</p>
<blockquote><p><code>create table `FG100A3907510579-elog-20100409220517` (`id` bigint unsigned not null primary key,`itime` datetime,`dtime` datetime,`cluster_id` varchar(24),`device_id` varchar(16),`log_id` smallint unsigned default 0,`subtype` varchar(255),`type` varchar(255),`timestamp` int unsigned default 0,`pri` varchar(255),`vd` varchar(255),`user` varchar(255),`msg` varchar(255),`ssid` varchar(255),`action` varchar(255),`session_id` int unsigned default 0,`count` int unsigned default 0,`proto` varchar(255),`profile` varchar(255),`cpu` tinyint unsigned default 0,`src` varchar(40),`epoch` int unsigned default 0,`mem` tinyint unsigned default 0,`duration` int unsigned default 0,`infected` int unsigned default 0,`from` varchar(255),`dst` varchar(40),`ha_group` tinyint unsigned default 0,`tunnel_id` int unsigned default 0,`status` varchar(255),`bssid` varchar(255),`tunnel_type` varchar(255),`event_id` int unsigned default 0,`ip` varchar(40),`ha_role` varchar(255),`rem_ip` varchar(40),`src_int` varchar(255),`suspicious` int unsigned default 0,`sn` varchar(255),`to` varchar(255),`total_session` int unsigned default 0,`ap` varchar(255),`scanned` int unsigned default 0,`vcluster` int unsigned default 0,`remote_ip` varchar(40),`carrier_ep` varchar(255),`imsi` varchar(255),`loc_ip` varchar(40),`dst_int` varchar(255),`from_vcluster` int unsigned default 0,`rem_port` smallint unsigned default 0,`src_port` smallint unsigned default 0,`msisdn` varchar(255),`tunnel_ip` varchar(40),`intercepted` int unsigned default 0,`vap` varchar(255),`service` varchar(255),`apn` varchar(255),`out_intf` varchar(255),`blocked` int unsigned default 0,`dst_port` smallint unsigned default 0,`mac` varchar(255),`to_vcluster` int unsigned default 0,`acct_stat` varchar(255),`selection` varchar(255),`reason` varchar(255),`group` varchar(255),`rate` tinyint unsigned default 0,`loc_port` smallint unsigned default 0,`vcluster_member` int unsigned default 0,`vcluster_state` varchar(255),`app-type` varchar(255),`nsapi` tinyint unsigned default 0,`dport` smallint unsigned default 0,`channel` tinyint unsigned default 0,`cookies` varchar(255),`checksum` int unsigned default 0,`dst_host` varchar(255),`nf_type` varchar(255),`vdname` varchar(255),`linked-nsapi` tinyint unsigned default 0,`next_stats` int unsigned default 0,`virus` varchar(255),`imei-sv` varchar(255),`devintfname` varchar(255),`security` varchar(255),`policy_id` int unsigned default 0,`rai` varchar(255),`hostname` varchar(255),`xauth_user` varchar(255),`uli` varchar(255),`xauth_group` varchar(255),`sent` bigint unsigned default 0,`policyid` int unsigned default 0,`rcvd` bigint unsigned default 0,`sess_duration` int unsigned default 0,`hbdn_reason` varchar(255),`banned_src` varchar(255),`end-usr-address` varchar(40),`msg-type` tinyint unsigned default 0,`sync_type` varchar(255),`banned_rule` varchar(255),`state` varchar(255),`vpn_tunnel` varchar(255),`sync_status` varchar(255),`alert` varchar(255),`sensor` varchar(255),`endpoint` varchar(255),`stage` tinyint unsigned default 0,`voip_proto` varchar(255),`deny_cause` varchar(255),`desc` varchar(255),`dir` varchar(255),`kind` varchar(255),`init` varchar(255),`mode` varchar(255),`cert-type` varchar(255),`ui` varchar(255),`exch` varchar(255),`rat-type` varchar(255),`c-gsn` varchar(40),`error_num` varchar(255),`u-gsn` varchar(40),`method` varchar(255),`phase2_name` varchar(255),`spi` varchar(255),`name` varchar(255),`c-sgsn` varchar(40),`request_name` varchar(255),`seq` varchar(255),`c-ggsn` varchar(40),`in_spi` varchar(255),`u-sgsn` varchar(40),`out_spi` varchar(255),`u-ggsn` varchar(40),`c-sgsn-teid` int unsigned default 0,`enc_spi` varchar(255),`c-ggsn-teid` int unsigned default 0,`dec_spi` varchar(255),`message_type` varchar(255),`malform_desc` varchar(255),`tunnel` varchar(255),`u-sgsn-teid` int unsigned default 0,`u-ggsn-teid` int unsigned default 0,`malform_data` int unsigned default 0,`tunnel-idx` int unsigned default 0,`line` varchar(255),`column` int unsigned default 0,`c-pkts` bigint unsigned default 0,`phone` varchar(255),`profile_group` varchar(255),`c-bytes` bigint unsigned default 0,`u-pkts` bigint unsigned default 0,`u-bytes` bigint unsigned default 0,`next_stat` int unsigned default 0,`user_data` varchar(255),`role` varchar(255),`result` varchar(255),`xauth_result` varchar(255),`esp_transform` varchar(255),`esp_auth` varchar(255),`error_reason` varchar(255),`peer_notif` varchar(255))</code></p></blockquote>
<p>zakończy się niepowodzeniem, a serwer zwróci błąd:</p>
<blockquote><p><code>ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs</code></p></blockquote>
<p>Nie chce mi się nawet liczyć ile bajtów to zajmuje. A wystarczyło dopisać <code>CHARACTER SET latin1</code>&#8230;</p>
<p>Podejrzewam, że po poprawnym założeniu tabeli dopisze się coś do <code>table_ref</code>, ale jest już zbyt późno, a ja mam za dużo lat, żeby dochodzić jak to powinno wyglądać.</p>
<p>Tak czy inaczej &#8211; inżynierowie Fortinet tracą jeden punkt.</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2010/04/fortianalyzer-i-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LOCATE() na innym podwórku</title>
		<link>http://guzik.net.pl/blog/2010/03/locate-na-innym-podworku/</link>
		<comments>http://guzik.net.pl/blog/2010/03/locate-na-innym-podworku/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 21:00:56 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=1700</guid>
		<description><![CDATA[Rozpędziłem się z tym wpisem dot. Blind SQL injection i nie wspomniałem o innych bazach. LOCATE() to oczywiście funkcja MySQL. PostgreSQL ma swoją POSITION(substing in string), a MS SQL &#8211; CHARINDEX(substring, string[, position]). Jest jeszcze INSTR(string, substring [,position [,occurrence]]) dla Oracle. Innych nie znam, bo nie używałem. No, ale co tam z PHP może jeszcze [...]]]></description>
			<content:encoded><![CDATA[<p>Rozpędziłem się z tym wpisem dot. <em><a title="http://guzik.net.pl/blog/2010/03/kolo-fortuny-blind-sql-injection/" href="http://guzik.net.pl/blog/2010/03/kolo-fortuny-blind-sql-injection/">Blind SQL injection</a></em> i nie wspomniałem o innych bazach. <code>LOCATE()</code> to oczywiście funkcja MySQL. PostgreSQL ma swoją <code>POSITION(substing in string)</code>, a MS SQL &#8211; <code>CHARINDEX(substring, string[, position])</code>. Jest jeszcze <code>INSTR(string, substring [,position [,occurrence]])</code> dla Oracle.</p>
<p>Innych nie znam, bo nie używałem. No, ale co tam z PHP może jeszcze być? SQLite? Ten akurat ma ograniczoną w ogóle liczbę funkcji (w dokumentacji nie znalazłem żadnego odpowiednika).</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2010/03/locate-na-innym-podworku/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Koło fortuny (Blind SQL injection)</title>
		<link>http://guzik.net.pl/blog/2010/03/kolo-fortuny-blind-sql-injection/</link>
		<comments>http://guzik.net.pl/blog/2010/03/kolo-fortuny-blind-sql-injection/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 14:01:00 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[SQL injection]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=1695</guid>
		<description><![CDATA[Od wczoraj przeglądam blog Michała Ławickiego i w komentarzach uzupełniam artykuły dot. baz danych (vide Analiza struktury bazy danych czy Obsługa plików, a SQL Injection). Dziś przyjrzałem się jego podejściu do Blind SQL injection czyli ataku na stronę, która nie wyświetla błędów. Metoda na odgadywanie hasła znak po znaku jest rzeczywiście toporna. Biorąc pod uwagę [...]]]></description>
			<content:encoded><![CDATA[<p>Od wczoraj przeglądam blog <a title="http://www.goldenline.pl/michal-lawicki" href="http://www.goldenline.pl/michal-lawicki">Michała Ławickiego</a> i w komentarzach uzupełniam artykuły dot. baz danych (vide <a title="Analiza struktury bazy danych" rel="bookmark" href="http://www.beldzio.com/analiza-struktury-bazy-danych">Analiza struktury bazy danych</a> czy <a title="Obsługa plików, a SQL Injection" rel="bookmark" href="http://www.beldzio.com/obsluga-plikow-a-sql-injection">Obsługa plików, a SQL Injection</a>). Dziś przyjrzałem się jego podejściu do <em><a title="http://www.beldzio.com/blind-sql-injection" href="http://www.beldzio.com/blind-sql-injection">Blind SQL injection</a></em> czyli ataku na stronę, która nie wyświetla błędów.<br />
Metoda na odgadywanie hasła znak po znaku jest rzeczywiście toporna. Biorąc pod uwagę 95 dostępnych znaków i hasło o długości 16, możliwych kombinacji jest dość sporo. Wysyłanie 1k5 zapytań zajmie trochę czasu. Dlatego można to zmodyfikować wstawiając pomiędzy <code>LENGTH(passwd)</code>, a <code>SUBSTRING(passwd, x, y)</code> funkcję <code>LOCATE(char, passwd)</code>, która pokaże jakie znaki mamy w ogóle dostępne (jak w teleturnieju &#8211; stąd temat wiadomości).<br />
<span id="more-1695"></span><br />
Nie znam się prawie w ogóle na atakach i bezpieczeństwie, ale wydaje mi się, że jeżeli ktokolwiek stosuje tą metodę, to pewnie chce sam proces skrócić do minimum. Tu <code>LOCATE()</code> wywołujemy maksymalnie 95 razy i jeśli się znaki w haśle nie powtarzają to po sprawie. Jeśli natomiast któryś się powtarza, możemy jeszcze raz wykonać tą funkcję, podając jako trzeci argument pozycję, od której zaczynamy szukać &#8211; <code>LOCATE(char, passwd, pos)</code>, ew. męczymy <code>SUBSTRING()</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2010/03/kolo-fortuny-blind-sql-injection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

