<?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>Wed, 16 May 2012 20:15:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>PHP i transakcje w MySQL</title>
		<link>http://guzik.net.pl/blog/2012/05/php-i-transakcje-w-mysql/</link>
		<comments>http://guzik.net.pl/blog/2012/05/php-i-transakcje-w-mysql/#comments</comments>
		<pubDate>Wed, 16 May 2012 20:15:38 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PDO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=3832</guid>
		<description><![CDATA[Nie jestem programistą, ani Programistą PHP. Czasem robię code review lub piszę protezę dla jakichś systemów. Po ostatnim przeglądzie uważam, że warto wspomnieć o prostych sposobach na transakcje w (My)SQL. Jeśli mamy do dyspozycji PDO (PHP Data Objects) i PHP >= 5.1 (ew. 5.0 i PDO jako PECL), to możemy użyć gotowych mechanizmów do obsługi [...]]]></description>
			<content:encoded><![CDATA[<p>Nie jestem programistą, ani Programistą PHP. Czasem robię <em>code review</em> lub piszę protezę dla jakichś systemów.<br />
Po ostatnim przeglądzie uważam, że warto wspomnieć o prostych sposobach na transakcje w (My)SQL.</p>
<p>Jeśli mamy do dyspozycji <a href="http://www.php.net/manual/en/book.pdo.php">PDO (PHP Data Objects)</a> i PHP >= 5.1 (ew. 5.0 i PDO jako PECL), to możemy użyć gotowych mechanizmów do obsługi transakcji i <a href="http://php.net/manual/en/language.exceptions.php">wyjątków</a> (od PHP 5.0):</p>
<blockquote><p><code>try {<br />
&nbsp;&nbsp;$dbh-><a href="http://php.net/manual/en/pdo.begintransaction.php">beginTransaction</a>();<br />
&nbsp;&nbsp;$dbh-><a href="http://www.php.net/manual/en/pdo.exec.php">exec</a>('pierwsze zapytanie');<br />
&nbsp;&nbsp;$dbh->exec('drugie zapytanie');<br />
&nbsp;&nbsp;$dbh->exec('trzecie zapytanie');<br />
&nbsp;&nbsp;$dbh-><a href="http://www.php.net/manual/en/pdo.commit.php">commit</a>();<br />
} catch (<a href="http://www.php.net/manual/en/class.exception.php">Exception</a> $e) {<br />
&nbsp;&nbsp;$dbh-><a href="http://www.php.net/manual/en/pdo.rollback.php">rollBack</a>();<br />
&nbsp;&nbsp;echo $e-><a href="http://www.php.net/manual/en/exception.getmessage.php">getMessage</a>();<br />
}</code></p></blockquote>
<p><span id="more-3832"></span>Jeśli wystąpi jakikolwiek wyjątek, blok <code>try{}</code> jest przerywany i wykonuje się <code>catch{}</code>. Na końcu tego pierwszego mamy <code>commit()</code>, w przypadku wystąpienia błędu &#8211; wywołany zostanie <code>rollback()</code>.<br />
<code>try{} catch{}</code> znane jest z innych języków i jest przydatne &#8211; warto zapamiętać.</p>
<p>W przypadku, gdy nie używamy PDO, można użyć sztuczki z operatorami logicznymi:</p>
<blockquote><p><code>mysql_query("BEGIN");<br />
$r = mysql_query('pierwsze zapytanie');<br />
$r &#038;= mysql_query('drugie zapytanie');<br />
$r &#038;= mysql_query('trzecie zapytanie');<br />
if ($r)<br />
&nbsp;&nbsp;mysql_query('COMMIT');<br />
else<br />
&nbsp;&nbsp;mysql_query('ROLLBACK');</code></p></blockquote>
<p>Naturalnie brak tu obsługi błędów, bo po <code>else</code> <code>mysql_error()</code> zwróci nam to, co nastąpiło po ostatnim <code>mysql_query</code>, ale czasami i to wystarcza.</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2012/05/php-i-transakcje-w-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle 11gR2 na SUSE Linux Enterprise Server 11.1</title>
		<link>http://guzik.net.pl/blog/2012/05/oracle-11gr2-na-suse-linux-enterprise-server-11-1/</link>
		<comments>http://guzik.net.pl/blog/2012/05/oracle-11gr2-na-suse-linux-enterprise-server-11-1/#comments</comments>
		<pubDate>Sun, 13 May 2012 20:27:24 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SuSE]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=3815</guid>
		<description><![CDATA[W sieci jest mnóstwo ściąg jak zainstalować Oracle 11gR2 na SLES 11, nawet na stronie Novell, ale instalacja/aktualizacja 11.2.0.2 wygląda trochę inaczej. Mianowicie przy wyborze grupy systemowej (dla SYSDBA i SYSOPER) mamy na liście disk, oinstall i dba. Niezależnie od tego co wybierzemy instalator sprawdza istnienie wszystkich tych grup w systemie (11.2.0.1 tak nie miał). [...]]]></description>
			<content:encoded><![CDATA[<p>W sieci jest mnóstwo ściąg jak zainstalować Oracle 11gR2 na SLES 11, nawet <a href="http://ftp.novell.com/partners/oracle/docs/11gR2_sles11_install.pdf">na stronie Novell</a>, ale instalacja/aktualizacja 11.2.0.2 wygląda trochę inaczej. Mianowicie przy wyborze grupy systemowej (dla SYSDBA i SYSOPER) mamy na liście <code>disk</code>, <code>oinstall</code> i <code>dba</code>. Niezależnie od tego co wybierzemy instalator sprawdza istnienie wszystkich tych grup w systemie (11.2.0.1 tak nie miał). Jeśli którejś nie znajdzie, zwraca błąd <code>INS-30060</code>.</p>
<p><a href="http://guzik.net.pl/blog/wp-content/uploads/2012/05/sles11ora11202.png"><img src="http://guzik.net.pl/blog/wp-content/uploads/2012/05/sles11ora11202-300x234.png" alt="" title="sles11ora11202" width="300" height="234" class="aligncenter size-medium wp-image-3816" /></a><br />
<span id="more-3815"></span><br />
Pytanie brzmi &#8222;<em>Are yuo sure you want to continue?</em>&#8222;, ale niestety odpowiedź &#8222;<em>Yes</em>&#8221; nie oznacza, że uda nam się przejść dalej. Po prostu instalator się zamyka.</p>
<p>Żeby było jasne &#8211; za pomocą pakietu orarun przygotowałem wcześniej system. Ale nawet te programy/skrypty nie dodają grupy <code>dba</code>.</p>
<p>Obejściem problemu jest uruchomienie instalatora z parametrem <code>-ignoreInternalDriverError</code>. Rozwiązaniem &#8211; dodanie przed instalacją grupy dba w systemie i dorzucenie do niej użytkownika, z którego prawami działać będzie baza (zazwyczaj oracle).</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2012/05/oracle-11gr2-na-suse-linux-enterprise-server-11-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gnatt &amp; dbms_scheduler</title>
		<link>http://guzik.net.pl/blog/2012/02/gnatt-dbms_scheduler/</link>
		<comments>http://guzik.net.pl/blog/2012/02/gnatt-dbms_scheduler/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 06:00:08 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[dbms_scheduler]]></category>
		<category><![CDATA[Gnatt]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=3737</guid>
		<description><![CDATA[Było zastosowanie Gnatt do kopii Oracle, to teraz do zadań harmonogramu Oracle (przez dbms_scheduler): set colsep ';' set head off; set feed off; set trimspool on; set linesize 32767; set pagesize 32767; set echo off; set termout off; set timing off; spool sched.csv SELECT 'Week ' &#124;&#124; TO_CHAR(SYSDATE-7, 'iw'), NEXT_DAY(trunc(SYSDATE)-14, 'MONDAY'), NEXT_DAY(trunc(SYSDATE)-7-1/60/60/24, 'SUNDAY') FROM dual; [...]]]></description>
			<content:encoded><![CDATA[<p>Było zastosowanie <a href="http://guzik.net.pl/blog/2012/02/gnatt-rman/">Gnatt do kopii Oracle</a>, to teraz do zadań harmonogramu Oracle (przez dbms_scheduler):</p>
<blockquote><p><code>set colsep ';'<br />
set head off;<br />
set feed off;<br />
set trimspool on;<br />
set linesize 32767;<br />
set pagesize 32767;<br />
set echo off;<br />
set termout off;<br />
set timing off;</p>
<p>spool sched.csv</p>
<p>SELECT 'Week ' || TO_CHAR(SYSDATE-7, 'iw'), NEXT_DAY(trunc(SYSDATE)-14, 'MONDAY'), NEXT_DAY(trunc(SYSDATE)-7-1/60/60/24, 'SUNDAY') FROM dual;<br />
<span id="more-3737"></span><br />
SELECT OWNER || '.' || JOB_NAME AS job, to_char(ACTUAL_START_DATE, 'YYYY-MM-DD HH24:MI:SS') as start_date, to_char(LOG_DATE, 'YYYY-MM-DD HH24:MI:SS') as end_date<br />
  FROM DBA_SCHEDULER_JOB_RUN_DETAILS<br />
 WHERE OWNER NOT IN ('EXFSYS', 'SYS')<br />
   AND TO_CHAR(LOG_DATE, 'iw') >= TO_CHAR(SYSDATE-7, 'iw')<br />
   AND TO_CHAR(ACTUAL_START_DATE, 'iw') < TO_CHAR(SYSDATE, 'iw')<br />
ORDER BY 1, 2, 3;</p>
<p>exit</code></p></blockquote>
<p>Podobnie jak poprzednio w wyniku otrzymamy plik sched.csv z zadaniami z minionego tygodnia, który ręcznie wczytujemy do Gnatt (ciągle brak przetwarzania wsadowego).<br />
Wywołanie:</p>
<blockquote><p><code>sqlplus -S '/ as sysdba' @sched.sql</code></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2012/02/gnatt-dbms_scheduler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>6</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>
	</channel>
</rss>

