<?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>blog.gabrym.pl</title>
	<atom:link href="http://blog.gabrym.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gabrym.pl</link>
	<description>blog.gabrym.pl</description>
	<lastBuildDate>Sun, 29 Jan 2012 21:15:22 +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>Mysqlslap &#8211; testy mysql</title>
		<link>http://blog.gabrym.pl/2011/02/04/testy_mysql_mysqlslap/</link>
		<comments>http://blog.gabrym.pl/2011/02/04/testy_mysql_mysqlslap/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 22:36:21 +0000</pubDate>
		<dc:creator>Gabrym</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Mysqlslap]]></category>

		<guid isPermaLink="false">http://blog.gabrym.pl/?p=99</guid>
		<description><![CDATA[Projektując bazę danych zapewne zastanawiacie się czy to co tworzycie będzie wydajne lub które z rozwiązań zastosować do konkretnego projektu. Najlepszym rozwiązaniem jest zasymulować obciążenie naszego projektu. Jest dużo narzędzi którymi możemy przeprowadzić testy np.: sysbench, mysqlslap i wiele innych. Zaprezentuję sposób użycia mysqlslap dostarczanego przez producent mysql. poniżej przykład zastosowania: mysqlslap --concurrency=1,25,50,100 --iterations=10 --csv=/home/benchmark_result.csv [...]]]></description>
			<content:encoded><![CDATA[<p>Projektując bazę danych zapewne zastanawiacie się czy to co tworzycie będzie wydajne lub które z rozwiązań zastosować do konkretnego projektu.<br />
Najlepszym rozwiązaniem jest zasymulować obciążenie naszego projektu.<br />
Jest dużo narzędzi którymi możemy przeprowadzić testy np.: sysbench, mysqlslap i wiele innych.<br />
Zaprezentuję sposób użycia mysqlslap dostarczanego przez producent mysql.</p>
<p>poniżej przykład zastosowania:</p>
<pre><code>
mysqlslap  --concurrency=1,25,50,100 --iterations=10 --csv=/home/benchmark_result.csv
--delimiter=';' --host=host --user=username --password=pass
--query=/home/queries_benchmark.sql
</code></pre>
<p>
&#8211;concurrency &#8211; ilość jednoczesnych zapytań,<br />
&#8211;iterations &#8211; ilość iteracji,<br />
&#8211;csv &#8211; wskazuje w jakim pliku zapisze wynik testu<br />
&#8211;delimiter &#8211; jakim znakiem są rozdzielone zapytania<br />
&#8211;query &#8211; plik z zapytaniami<br />
<br />
Poniżej przykład pliku zapytań.<br />
queries_benchmark.sql:</p>
<pre><code>
SELECT name, age FROM users where id=xx;
CALL udd_search(session_id,12323,'2011-01-01', '2011-02-04',all);
SELECT id FROM users WHERE name LIKE 'ab%';
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.gabrym.pl/2011/02/04/testy_mysql_mysqlslap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSL &#8211; zdejmowanie szyfrowania z prywatnego klucza RSA</title>
		<link>http://blog.gabrym.pl/2010/10/15/ssl-unencrypted/</link>
		<comments>http://blog.gabrym.pl/2010/10/15/ssl-unencrypted/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 11:53:19 +0000</pubDate>
		<dc:creator>Gabrym</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[ssl unencrypted]]></category>

		<guid isPermaLink="false">http://blog.gabrym.pl/?p=95</guid>
		<description><![CDATA[Zdaża się że dostajecie pod opiekę serwis w którym podczas podnoszenia usług (np. Apache) przy ładowaniu ssl-a prosi o hasło. Jest to o problematyczne gdy zaniknie zasilanie na serwerze usługa (w tym wypadku Apache) będzie czekał na wprowadzenie hasła. Chyba nikogo nie ucieszy nocny sms zmuszający do wstania. Do dzieła: server:~# openssl rsa -in cert.key [...]]]></description>
			<content:encoded><![CDATA[<p>Zdaża się że dostajecie pod opiekę serwis w którym podczas podnoszenia usług (np. Apache) przy ładowaniu ssl-a prosi o hasło.<br />
Jest to o problematyczne gdy zaniknie zasilanie na serwerze usługa (w tym wypadku Apache) będzie czekał na wprowadzenie hasła.<br />
Chyba nikogo nie ucieszy nocny sms zmuszający do wstania.<br />
Do dzieła:</p>
<pre><code>
server:~# openssl rsa -in cert.key -out cert.key.new
server:~# mv cert.key cert.key.back
server:~# mv cert.key.new cert.key
</code></pre>
<p>Warto dla bezpieczeństwa zdjąc uprawnienia do czytania klucza np:</p>
<pre><code>
server:~# chown www-data:www-data cert.key
server:~# chmod 400 cert.key
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.gabrym.pl/2010/10/15/ssl-unencrypted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL &#8211; status tabel.</title>
		<link>http://blog.gabrym.pl/2010/06/15/mysql-show-table-status/</link>
		<comments>http://blog.gabrym.pl/2010/06/15/mysql-show-table-status/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 06:05:53 +0000</pubDate>
		<dc:creator>Gabrym</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[table status]]></category>

		<guid isPermaLink="false">http://blog.gabrym.pl/?p=84</guid>
		<description><![CDATA[Administrując bazę MySQL przeważnie używam klienta mysql do logowania z poziomu systemu operacyjnego. Co zrobić żeby szybko odczytać status tabeli (ilość rekordów, czas utworzenia i inne wartości). Pomocne będzie polecenie: show table status like 'nazwa_tabeli'G Wynik polecenia jest następujący: show table status like 'nazwa_tabeli'G *************************** 1. row *************************** Name: nazwa_tabeli Engine: MyISAM Version: 10 Row_format: [...]]]></description>
			<content:encoded><![CDATA[<p>Administrując bazę MySQL przeważnie używam klienta mysql do logowania z poziomu systemu operacyjnego.<br />
Co zrobić żeby szybko odczytać status tabeli (ilość rekordów, czas utworzenia i inne wartości).<br />
Pomocne będzie polecenie:</p>
<pre><code>
show table status like 'nazwa_tabeli'G
</code></pre>
<p>Wynik polecenia jest następujący:</p>
<pre><code>
show table status like 'nazwa_tabeli'G
*************************** 1. row ***************************
           Name: nazwa_tabeli
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 183
 Avg_row_length: 24
    Data_length: 4556
Max_data_length: 281474976710655
   Index_length: 4096
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2010-05-11 23:32:49
    Update_time: 2010-05-11 23:32:49
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment: komentarz do tabeli
1 row in set (0.00 sec)
</code></pre>
<p>Zastosowanie na końcu wywołania &#8216;G&#8217; zamiast średnika wyświetla wynik pionowo.</p>
<p>Na dev.mysql.com opis składni polecenia:</p>
<pre><code>
SHOW TABLE STATUS [{FROM | IN} db_name]
    [LIKE 'pattern' | WHERE expr]
</code></pre>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html">http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gabrym.pl/2010/06/15/mysql-show-table-status/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[ERROR] Can&#8217;t find messagefile &#8216;/share/mysql/english/errmsg.sys&#8217;</title>
		<link>http://blog.gabrym.pl/2010/06/14/error-cant-find-messagefile-errmsg-sys/</link>
		<comments>http://blog.gabrym.pl/2010/06/14/error-cant-find-messagefile-errmsg-sys/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 16:51:33 +0000</pubDate>
		<dc:creator>Gabrym</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[errmsg.sys]]></category>
		<category><![CDATA[mariadb]]></category>

		<guid isPermaLink="false">http://blog.gabrym.pl/?p=64</guid>
		<description><![CDATA[Po szybkiej aktualizacji systemu wraz z bazą do wersji MySQL 5.1.47 pojawił się problem z uruchomieniem demona MariaDB. Błąd wygląda następująco: xxxxxx 19:33:41 mysqld_safe Starting mysqld daemon with databases from /srv/base/sql xxxxxx 19:33:42 [ERROR] Can't find messagefile '/share/mysql/english/errmsg.sys' xxxxxx 19:33:42 [Note] PrimeBase XT (PBXT) Engine 1.0.09g RC loaded... xxxxxx 19:33:42 [Note] Paul McCullagh, PrimeBase Technologies [...]]]></description>
			<content:encoded><![CDATA[<p>Po szybkiej aktualizacji systemu wraz z bazą do wersji MySQL 5.1.47<br /> pojawił się problem z uruchomieniem demona MariaDB.</p>
<p>Błąd wygląda następująco:</p>
<pre><code>
xxxxxx 19:33:41 mysqld_safe Starting mysqld daemon with databases from /srv/base/sql
xxxxxx 19:33:42 [ERROR] Can't find messagefile '/share/mysql/english/errmsg.sys'
xxxxxx 19:33:42 [Note] PrimeBase XT (PBXT) Engine 1.0.09g RC loaded...
xxxxxx 19:33:42 [Note] Paul McCullagh, PrimeBase Technologies GmbH, http://www.primebase.org
InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use GCC atomic builtins
xxxxxx 19:33:42  InnoDB: highest supported file format is Barracuda.
xxxxxx 19:33:42 InnoDB Plugin 1.0.6-9 started; log sequence number 44244
xxxxxx 19:33:42 [ERROR] Aborting

xxxxxx 19:33:42  InnoDB: Starting shutdown...
xxxxxx 19:33:54  InnoDB: Shutdown completed; log sequence number 44268
xxxxxx 19:33:54 [Note] PrimeBase XT Engine shutdown...
xxxxxx 19:33:54 [Note]
xxxxxx 19:33:54 mysqld_safe mysqld from pid file /srv/base/sql/mariadb.pid ended
</code></pre>
<p>
<b>Szybkie rozwiązanie problemu.</b><br />
Edytujemy skrypt startowy mariadb lub mysqld (w arch linux jest w /etc/rc.d/mariadb lub /etc/rc.d/mysqld )</p>
<pre><code>
#!/bin/bash

MYSQLD_ROOT="/home/base/sql"
# source application-specific settings
[ -f /etc/conf.d/mysqld ] &amp;&amp; . /etc/conf.d/mysqld

# general config
. /etc/rc.conf
. /etc/rc.d/functions

getPID() {
   echo $(pgrep -u mysql mysqld);
}

case "$1" in
  start)
    stat_busy "Starting MariaDB"
    if [ -z "$(getPID)" ]; then
       /opt/MariaDB/bin/mysqld_safe --datadir=$MYSQLD_ROOT --ledir=/opt/MariaDB/bin &amp;&gt;/dev/null &amp;
      if [ $? -gt 0 ]; then
        stat_fail
        exit 1
      else
     ...
</code></pre>
<p><span id="more-64"></span><br />
Dodajemy do wywołania mysqld_safe ściezkę do pliku z błędami.<br />
W moim przypadku jest w:<br />
/opt/MariaDB/share/mysql/english<br />
lub w mysql-u:<br />
/usr/share/mysql/english</p>
<pre><code>
#!/bin/bash

MYSQLD_ROOT="/home/base/sql"
# source application-specific settings
[ -f /etc/conf.d/mysqld ] &amp;&amp; . /etc/conf.d/mysqld

# general config
. /etc/rc.conf
. /etc/rc.d/functions

getPID() {
   echo $(pgrep -u mysql mysqld);
}

case "$1" in
 start)
  stat_busy "Starting MariaDB"
  if [ -z "$(getPID)" ]; then
   /opt/MariaDB/bin/mysqld_safe --language=/opt/MariaDB/share/mysql/english
                --datadir=$MYSQLD_ROOT --ledir=/opt/MariaDB/bin &amp;&gt;/dev/null &amp;
   if [ $? -gt 0 ]; then
     stat_fail
     exit 1
    else
   ...
</code></pre>
<p>Gotowe !<br />
Serwer wstaje bez problemu.<br /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gabrym.pl/2010/06/14/error-cant-find-messagefile-errmsg-sys/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nowy adres.</title>
		<link>http://blog.gabrym.pl/2010/04/13/nowy-adres/</link>
		<comments>http://blog.gabrym.pl/2010/04/13/nowy-adres/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 00:22:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://blog.gabrym.pl/?p=58</guid>
		<description><![CDATA[Od dzisiaj serwis zostaje przeniesiony na adres blog.gabrym.pl. Mam nadzieję że ta zmiana zwiększy ilość wpisów&#8230;]]></description>
			<content:encoded><![CDATA[<p>Od dzisiaj serwis zostaje przeniesiony na adres <a title="tech blog blog.gabrym.pl" href="http://blog.gabrym.pl/" target="_self">blog.gabrym.pl</a>.</p>
<p>Mam nadzieję że ta zmiana zwiększy ilość wpisów&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gabrym.pl/2010/04/13/nowy-adres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Events w przykładach.</title>
		<link>http://blog.gabrym.pl/2010/01/15/mysql-events-przyklady/</link>
		<comments>http://blog.gabrym.pl/2010/01/15/mysql-events-przyklady/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 20:04:06 +0000</pubDate>
		<dc:creator>Gabrym</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[events]]></category>

		<guid isPermaLink="false">http://gabrym.pl/?p=46</guid>
		<description><![CDATA[Oto kilka przykładów użycia crona w bazie MySQL. Powiedzmy że mamy do przebudowania tabelę często używaną z dużą ilością rekordów. Oczywiście najlepiej zrobić to w nocy kiedy ruch maleje a co za tym idzie serwer ma większy zapas mocy. Możemy przeprowadzić to na kilka sposobów: - ustawić budzik na właściwą godzinę, - za pomoca linuksowego [...]]]></description>
			<content:encoded><![CDATA[<p>Oto kilka przykładów użycia crona w bazie MySQL.<br />
Powiedzmy że mamy do przebudowania tabelę często używaną z dużą ilością rekordów.<br />
Oczywiście najlepiej zrobić to w nocy kiedy ruch maleje a co za tym idzie serwer ma większy zapas mocy.<br />
<br />
Możemy przeprowadzić to na kilka sposobów:<br />
- ustawić budzik na właściwą godzinę, <img src='http://blog.gabrym.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
- za pomoca linuksowego cron-a,<br />
- wbudowanego mechanizmu event scheduler.</p>
<p>Zobaczmy kilka przykładów z użyciem zaplanowanych zadań (opcja trzecia).<br />
<br />
Jednorazowe zadania:</p>
<pre><code>
-- event zaplanowany na konkretną godzinę.
CREATE EVENT event_alter
 ON SCHEDULE AT TIMESTAMP '2010-01-16 04:00:01'
 DO alter table tab_name change `nazwa` `nazwa` varchar(100) NOT NULL;

-- event ma się wykonać za 7 godzin od czasu stworzenia go.
CREATE EVENT event_alter
 ON SCHEDULE AT TIMESTAMP (NOW() + INTERVAL 7 HOUR)
 DO alter table tab_name change `nazwa` `nazwa` varchar(100) NOT NULL;
</code></pre>
<p><span id="more-46"></span><br />
Cykliczne zadania:</p>
<pre><code>
-- event ma się wykonywać raz dziennie od 2010-01-16 02:30:00.
CREATE EVENT event_delete
 ON SCHEDULE
  EVERY 1 DAY
  STARTS '2010-01-16 02:30:00'
COMMENT 'Event ma skasowac dane starsze niz tydzine'
   DO DELETE FROM tab_name WHERE datetime&lt; (NOW() - INTERVAL 7 DAY);

-- event ma się wykonywać raz dziennie od teraz + 7 godzin.
CREATE EVENT event_delete
 ON SCHEDULE
  EVERY 1 DAY
  STARTS (NOW() + INTERVAL 7 HOUR)
COMMENT 'Event ma skasowac dane starsze niz tydzine'
   DO DELETE FROM tab_name WHERE datetime&lt; (NOW() - INTERVAL 7 DAY);
</code></pre>
<p>
Tu przykład zadania kasujacego binlogi starszych niż 2 dni.</p>
<pre><code>
CREATE EVENT `event_delete_binlogs`
 ON SCHEDULE EVERY 1 DAY
 STARTS '2010-01-16 03:00:01'
 ON COMPLETION NOT PRESERVE ENABLE
 COMMENT 'Event ma za zadanie wyczyscic binlogi 2 dni wstecz'
 DO PURGE BINARY LOGS BEFORE (NOW() - INTERVAL 2 DAY);
</code></pre>
<p>
Miłego planowania.</p>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/events-syntax.html">http://dev.mysql.com/doc/refman/5.1/en/events-syntax.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gabrym.pl/2010/01/15/mysql-events-przyklady/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KateOS linux został zamknięty.</title>
		<link>http://blog.gabrym.pl/2010/01/14/kateos-linux-zostal-zamkniety/</link>
		<comments>http://blog.gabrym.pl/2010/01/14/kateos-linux-zostal-zamkniety/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 17:49:54 +0000</pubDate>
		<dc:creator>Gabrym</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[kateos]]></category>

		<guid isPermaLink="false">http://blog.gabrym.pl/?p=40</guid>
		<description><![CDATA[0]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj doszła mnie smutna wiadomość.<br />
Jak pisze copyme na swoim <a href="http://copyme.jogger.pl/2010/01/11/historia-konca-kateos/">blogu</a> projekt KateOS linux został zawieszony .<br />
To była naprawdę świetna robota. Trzeba mieć tylko nadzieję że ktoś reaktywuję Kaśkę.<br />
To była świetna robota chłopaki.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gabrym.pl/2010/01/14/kateos-linux-zostal-zamkniety/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Replikacja w mysql + error 1535</title>
		<link>http://blog.gabrym.pl/2009/03/23/replikacja-w-mysql-error-1535/</link>
		<comments>http://blog.gabrym.pl/2009/03/23/replikacja-w-mysql-error-1535/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 23:58:48 +0000</pubDate>
		<dc:creator>Gabrym</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[error 1535]]></category>
		<category><![CDATA[replikacja]]></category>

		<guid isPermaLink="false">http://gabrym.pl/?p=32</guid>
		<description><![CDATA[Czas rozwiazać kolejny problem. Replikacja zostaje przerwana błędem 1535 przy zastosowania tabeli z polami FLOAT i GEOMETRY. Przykład tabeli: CREATE TABLE `lokalizacje` ( `id` mediumint(10) unsigned, `pkt` geometry NOT NULL DEFAULT '', `x` FLOAT(20,17), `y` FLOAT(20,17), PRIMARY KEY (`id`), SPATIAL KEY `pkt` (`pkt`) ) ENGINE=MyISAM; Po zainsertowaniu rekordów na serwerze master replikacja ulega przerwaniu. Na [...]]]></description>
			<content:encoded><![CDATA[<p>Czas rozwiazać kolejny problem.<br />
Replikacja zostaje przerwana błędem 1535 przy zastosowania tabeli z polami FLOAT i GEOMETRY.</p>
<p>Przykład tabeli:</p>
<pre><code>
CREATE TABLE `lokalizacje` (
  `id` mediumint(10) unsigned,
  `pkt` geometry NOT NULL DEFAULT '',
  `x` FLOAT(20,17),
  `y` FLOAT(20,17),
  PRIMARY KEY (`id`),
  SPATIAL KEY `pkt` (`pkt`)
) ENGINE=MyISAM;
</code></pre>
<p>Po zainsertowaniu rekordów na serwerze master replikacja ulega przerwaniu.<br />
Na maszynie slave widzimy:</p>
<pre><code>
mysql (database) &gt; show slave statusG
************************ 1. row ************************
Slave_IO_State: Waiting for master to send event
Master_Host: x.x.x.x
Master_User: user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000024
Read_Master_Log_Pos: 183819499
Relay_Log_File: relay-log.000033
Relay_Log_Pos: 1235861
Relay_Master_Log_File: mysql-bin.000024
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1535
Last_Error: Table definition on master and slave does not match:
 Column 5 size mismatch - master has size 247, database.lokalizacje on slave
 has size 1. Master's column size should be &lt;= the slave's column size.
Skip_Counter: 0
Exec_Master_Log_Pos: 182967168
Relay_Log_Space: 2094792
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1535
Last_SQL_Error: Table definition on master and slave does not match:
 Column 5 size mismatch - master has size 247, database.lokalizacje on slave
 has size 1. Master's column size should be &lt;= the slave's column size.
1 row in set (0.00 sec)
</code></pre>
<p>Zaistniały błąd pojawia się w momencie gdy tabela różni się kolumnami na serwerach master i slave.<span id="more-32"></span><br />
Czy aby napewno w naszym przypadku tak jest !?<br />
Porównujemy budowę tabel na maszynach.</p>
<pre><code>
SHOW CREATE TABLE lokalizacjaG
SHOW TABLE STATUS LIKE 'lokalizacja';
</code></pre>
<p>I w tym przypadku są identyczne.</p>
<p>Problem rozwiązuje zmiana formatu binloga z mixed na statement.</p>
<p>Środowisko:</p>
<pre><code>
mysql (database) &gt; show variables like '%version%';
+-------------------------+------------------------------+
| Variable_name           | Value                        |
+-------------------------+------------------------------+
| protocol_version        | 10                           |
| version                 | 5.1.32-log                   |
| version_comment         | MySQL Community Server (GPL) |
| version_compile_machine | x86_64                       |
| version_compile_os      | pc-solaris2.10               |
+-------------------------+------------------------------+
5 rows in set (0.00 sec)

mysql (database) &gt; show variables like '%binlog_format%';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | MIXED     |
+---------------+-----------+
1 row in set (0.00 sec)
</code></pre>
<p>Wprowadzamy zmiany</p>
<pre><code>
mysql (database) &gt; SET GLOBAL BINLOG_FORMAT=MIXED;
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)

mysql (database) &gt; show variables like '%binlog_format%';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)

</code></pre>
<p>Pozostaje wznowić replikację.</p>
<pre><code>
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
</code></pre>
<p>Po czym zrzucić tabelę na mastrze i ponownie wrzucić.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gabrym.pl/2009/03/23/replikacja-w-mysql-error-1535/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Warning Stored routine &#8216;database&#8217;.&#039;table&#8217;: invalid value in column mysql.proc.db_collation</title>
		<link>http://blog.gabrym.pl/2009/03/09/warning-stored-routine-databasetable-invalid-value-in-column-mysqlprocdb_collation/</link>
		<comments>http://blog.gabrym.pl/2009/03/09/warning-stored-routine-databasetable-invalid-value-in-column-mysqlprocdb_collation/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 21:21:19 +0000</pubDate>
		<dc:creator>Gabrym</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[warning stored routine]]></category>

		<guid isPermaLink="false">http://gabrym.pl/?p=29</guid>
		<description><![CDATA[Pewnego dnia w pracy postanowiłem zaktualizować mysql do wersji 5.1.28-rc. Po pierwszej zaktualizowanej maszynie widzę w logach ciekawy warning: [Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.db_collation. [Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.character_set_client. [Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.collation_connection. W wersji 5.1.28 i nowszych w momencie gdy procedury [...]]]></description>
			<content:encoded><![CDATA[<p>Pewnego dnia w pracy postanowiłem zaktualizować mysql do wersji 5.1.28-rc.</p>
<p>Po pierwszej zaktualizowanej maszynie widzę w logach ciekawy warning:</p>
<pre>
<code>
[Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.db_collation.
[Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.character_set_client.
[Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.collation_connection.
</code>
</pre>
<p>W wersji 5.1.28 i nowszych w momencie gdy procedury różnią się kodowaniem od tabel widzimy właśnie taki warning.</p>
<p>Rozwiązaniem jest zmiana kodowania procedur na używane w tabelach.</p>
<p>Przykład błędnego zaimportowania procedury:</p>
<pre>
<code>
mysql (database) &gt; show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | latin1                           |
| character_set_connection | latin1                           |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | latin1                           |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /opt/mysql/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)

mysql (database) &gt; show create procedure exampleG
*************************** 1. row ***************************
           Procedure: example
            sql_mode:
    Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `example`()
begin select 1; end
character_set_client: latin1
collation_connection: latin1_swedish_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)
</code>
</pre>
<p>Baza i tabele są kodowane utf8 tymczasem nasz klient podłączył się z użyciem kodowania latin1.<br />
Nasza procedura przyjęła kodowanie latin1.</p>
<p>Rozwiązanie:<br />
Zmieniamy kodowanie.<br />
<span id="more-29"></span></p>
<pre>
<code>
mysql (database) &gt; show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /opt/mysql/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)

mysql (database) &gt; DROP PROCEDURE example;
Query OK, 0 rows affected (0.00 sec)

mysql (database) &gt; DELIMITER ||
mysql (database) &gt; create procedure example()
 begin
   select 1;
 end ||
Query OK, 0 rows affected (0.01 sec)

mysql (database) &gt; show create procedure exampleG
*************************** 1. row ***************************
           Procedure: example
            sql_mode:
    Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `example`()
begin select 1; end
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)
</code>
</pre>
<p>Dodajmy jeszcze do my.cnf domyslne kodowanie dla clienta na utf8.</p>
<pre>
<code>
[client]
default_character_set = utf8
</code>
</pre>
<p>Na koniec:</p>
<pre>
<code>
mysql (database) &gt; flush logs;
</code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.gabrym.pl/2009/03/09/warning-stored-routine-databasetable-invalid-value-in-column-mysqlprocdb_collation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql + proxy = mysql-proxy</title>
		<link>http://blog.gabrym.pl/2009/03/07/mysql-proxy-mysql-proxy/</link>
		<comments>http://blog.gabrym.pl/2009/03/07/mysql-proxy-mysql-proxy/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 18:07:46 +0000</pubDate>
		<dc:creator>Gabrym</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysql-proxy]]></category>

		<guid isPermaLink="false">http://gabrym.pl/?p=19</guid>
		<description><![CDATA[Witajcie po dłuższej przerwie. Zaprezentuję bardzo przydatną aplikację do dzielania ruchu dla baz mysql. Podczas dużego obciążenie stosujemy replikację w celu jego rozłożenia na wiekszą ilość maszyn. Co jednak zrobić żeby właściwie zarządzać ruchem. Dla bazy mysql jest kilka rozwiązań którę to zapenią między innymi &#8211; mysql-proxy. Mysql-proxy oferuje nam: - monitorowanie ruchu - analizowanie [...]]]></description>
			<content:encoded><![CDATA[<p><span style="margin-left: 20px"></span>Witajcie po dłuższej przerwie. Zaprezentuję bardzo przydatną aplikację do dzielania ruchu dla baz mysql.<br />
Podczas dużego obciążenie stosujemy replikację w celu jego rozłożenia na wiekszą ilość maszyn.<br />
Co jednak zrobić żeby właściwie zarządzać ruchem.<br />
Dla bazy mysql jest kilka rozwiązań którę to zapenią między innymi &#8211; <a href="http://forge.mysql.com/wiki/MySQL_Proxy">mysql-proxy</a>.<br />
<a href="http://forge.mysql.com/wiki/MySQL_Proxy">Mysql-proxy</a> oferuje nam:<br />
- monitorowanie ruchu<br />
- analizowanie zapytań<br />
- load balancer<br />
- failover<br />
- filtrowanie<br />
- możliwość modyfikowania wchodzących/wychodzących zapytań<br />
- obsługa socketów<br />
- lua-script do definiowania działania</p>
<p>Przykład:</p>
<table align="center" border="0" width="100%">
<tr>
<td style="padding-left:10%">
<img src="http://gabrym.pl/zdjecia/mysql-proxy-1.gif" alt="" width="288" height="55" />
</td>
</tr>
</table>
<p>
Jedna z najczęściej stosowana konfiguracji (małe serwisy internetowe).<span id="more-19"></span> Widać klienta łączącego się z bazą danych na jednym serwerze. W momencie gdy obciążenie maszyny przekracza 50% czas na zmiany które zabezpieczą dalszy rozwój potencjalnej strony. Warto tu wspomnieć o małym bezpieczeństwie takiej konfiguracji &#8211; awaria bazy wyłącza dostęp do strony.<br />Rozkładamy ruch na dwie maszyny w replikacji Master-Slave + proxy.<br />
Pozwoli to także zwiększyć bezpieczęństwo w momencie awarii jednego z serwerów.<br />
Konfigurujemy proxy tak żeby automatycznie przepinało ruch w momencie braku odpowiedzi od serwera.</p>
<table align="center" border="0" width="100%">
<tr>
<td style="padding-left:10%">
<img src="http://gabrym.pl/zdjecia/mysql-proxy-2.gif" alt="" width="300" height="123" />
</td>
</tr>
</table>
<p></p>
<p>Parametry startowe:</p>
<pre>
<code>
$ ./mysql-proxy
  --proxy-backend-addresses=127.0.0.1:3306               -- master
  --proxy-read-only-backend-addresses=127.0.0.2:3306     -- slave
  --daemon
</code>
</pre>
<p></p>
<p><b>Bilans zysków:</b><br />
+ dla bezpieczeństwa<br />
+ dla stabilności<br />
+ dla elastyczności<br />
<br />
Więcej opcje:</p>
<pre>
<code>
$ ./mysql-proxy --help-all
Usage:
  mysql-proxy [OPTION...] - MySQL Proxy

Help Options:
  -?, --help                                          Show help options
  --help-all                                          Show all help options
  --help-admin                                        Show options for the admin-module
  --help-proxy                                        Show options for the proxy-module

admin module
  --admin-address=                         listening address:port of internal admin-server (default: :4041)

proxy-module
  --proxy-address=                         listening address:port of the proxy-server (default: :4040)
  --proxy-read-only-backend-addresses=     address:port of the remote slave-server (default: not set)
  --proxy-backend-addresses=               address:port of the remote backend-servers (default: 127.0.0.1:3306)
  --proxy-skip-profiling                              disables profiling of queries (default: enabled)
  --proxy-fix-bug-25371                               fix bug #25371 (mysqld &gt; 5.1.12) for older libmysql versions
  --proxy-lua-script=                           filename of the lua script (default: not set)
  --no-proxy                                          Don't start proxy-server

Application Options:
  -V, --version                                       Show version
  --daemon                                            Start in daemon-mode
  --pid-file=                                   PID file in case we are started as daemon
</code>
</pre>
<p></p>
<p>Strony warte odwiedzenia:<br />
- strona projektu<br />
<a title="http://forge.mysql.com/wiki/MySQL_Proxy" href="http://forge.mysql.com/wiki/MySQL_Proxy"> http://forge.mysql.com/wiki/MySQL_Proxy</a><br />
- kod do poprania: <a href="https://launchpad.net/mysql-proxy"></p>
<p>https://launchpad.net/mysql-proxy</a></p>
<p>- blog jednoego z programistów:<br />
<a href="http://jan.kneschke.de/projects/mysql/mysql-proxy/">http://jan.kneschke.de/projects/mysql/mysql-proxy/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gabrym.pl/2009/03/07/mysql-proxy-mysql-proxy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

