<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>erkules</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/" />
    <link rel="self" type="application/atom+xml" href="http://linsenraum.de/erkules/atom.xml" />
    <id>tag:linsenraum.de,2010-01-29:/erkules//2</id>
    <updated>2011-12-28T10:13:54Z</updated>
    <subtitle>bloggiwoggi</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.23-en</generator>

<entry>
    <title>Von der Verzweiflung --plugin-dir zu setzen</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/12/von-der-verzweiflung---plugin-dir-zu-setzen.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.206</id>

    <published>2011-12-28T09:36:08Z</published>
    <updated>2011-12-28T10:13:54Z</updated>

    <summary>Ich nutze für einige Installationen bestimmte Pfade für das plugin-dir. Bei dem Upgrade auf MySQL 5.5 wurde die Konfiguration nicht mehr gezogen.Beim direkten Starten vom mysqld $CONF war wieder alles in Ordnung. Es zeigte sich, dass der Fehler im mysqld_safe...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Ich nutze für einige Installationen bestimmte Pfade für das plugin-dir. <br />Bei dem Upgrade auf MySQL 5.5 wurde die Konfiguration nicht mehr gezogen.<br />Beim direkten Starten vom mysqld $CONF war wieder alles in Ordnung. <br />Es zeigte sich, dass der Fehler im mysqld_safe liegt.<br />mysqld_safe meint seit 5.5.? die Option plugin-dir parsen zu müssen.<br />Hierfür wurde die Funktion parse_arguments() erweitert.<br />#v+<br />177&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --plugin-dir=*) PLUGIN_DIR="$val" ;;<br />#v- <br /><br />Folgender Code greift auf die Variable zu (wenn die denn gesetzt wurde):<br />421 if [ -n "${PLUGIN_DIR}" ]; then<br />422&nbsp;&nbsp; plugin_dir="${PLUGIN_DIR}"<br />423 else<br />424&nbsp;&nbsp; # Try to find plugin dir relative to basedir<br />425&nbsp;&nbsp; for dir in lib/mysql/plugin lib/plugin<br />426&nbsp;&nbsp; do<br />427&nbsp;&nbsp;&nbsp;&nbsp; if [ -d "${MY_BASEDIR_VERSION}/${dir}" ]; then<br />428&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; plugin_dir="${MY_BASEDIR_VERSION}/${dir}"<br />429&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break<br />430&nbsp;&nbsp;&nbsp;&nbsp; fi<br />431&nbsp;&nbsp; done<br />432&nbsp;&nbsp; # Give up and use compiled-in default<br />433&nbsp;&nbsp; if [ -z "${plugin_dir}" ]; then<br />434&nbsp;&nbsp;&nbsp;&nbsp; plugin_dir='/usr/local/mysql/lib/plugin'<br />435&nbsp;&nbsp; fi<br />436 fi<br /><br /><br />Dummerweise wird die Funktion zum Parsen der Config erst später aufgerufen :/<br />488 parse_arguments `$print_defaults $defaults --loose-verbose mysqld server`<br />494 parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysqld`<br />495 parse_arguments PICK-ARGS-FROM-ARGV "$@"<br /><br />Ergo ist es egal was konfiguriert wurde. Da zum Zeitpunkt des ersten Code-Schnipsels $PLUGIN_DIR immer leer ist.<br /><br />Bugreport: http://bugs.mysql.com/bug.php?id=63862<br /><br />Für jene, welche einen schnellen Würgaround brauchen, einfach<br />&nbsp;"--datadir=$DATADIR" "--plugin-dir=$plugin_dir" "$USER_OPTION"<br />durch<br />"--datadir=$DATADIR"&nbsp; "$USER_OPTION"<br />ersetzen.<br /><br />Viel Spaß<br />Erkan<br /><br /> ]]>
        
    </content>
</entry>

<entry>
    <title>Slides DOAG 2011</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/11/slides-doag-2011.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.200</id>

    <published>2011-11-24T10:21:52Z</published>
    <updated>2011-11-24T22:29:20Z</updated>

    <summary>Moinsen,hier die Slides zu meinen MySQL Vorträgen auf der DOAG 2011.Partitionieren ueber Rechnergrenzen hinweg und MySQL kann auch NoSQL.Viel SpaßErkan...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="konferenz" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Moinsen,<br /><br />hier die Slides zu meinen MySQL Vorträgen auf der DOAG 2011.<br /><a href="http://linsenraum.de/documents/doag-spider.pdf">Partitionieren ueber Rechnergrenzen hinweg</a> und <a href="http://linsenraum.de/documents/doag-mynosql.pdf">MySQL kann auch NoSQL</a>.<br /><br />Viel Spaß<br />Erkan<br /><br /><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>memcached@mysql: mysql-5.6.4-labs-innodb-memcache</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/11/memcachedmysql-mysql-564-labs-innodb-memcache.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.198</id>

    <published>2011-11-20T23:23:42Z</published>
    <updated>2011-11-20T23:26:41Z</updated>

    <summary>MySQL hat seit einiger Zeit Previews auf neue Funktionalitäten in MySQL zum Anschauen zur Verfügung gestellt. Folgend schauen wir uns mysql-5.6.4-labs-innodb-memcached an. Die Grundidee ist, dass quasi an MySQL vorbei direkt auf die Storage Engine zugegriffen wird. So wird der...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[MySQL hat seit einiger Zeit <a href="http://labs.mysql.com/">Previews</a>
auf neue Funktionalitäten in MySQL zum Anschauen zur
Verfügung gestellt.<br />
Folgend schauen wir uns mysql-5.6.4-labs-innodb-memcached an. Die
Grundidee ist, dass quasi an MySQL vorbei direkt auf die Storage Engine
zugegriffen wird. So wird der Overhead des SQL Parsers/Optimisers, wie
auch der des Verbindungsaufbau gespart.<br />
<br />
Ist das Paket installiert, muß das memcached Plugin noch
installiert werden. Vorab sind die Verwaltungstabellen - welche sich in
scripts/innodb_memcached_config.sql befinden - zu installieren. (mysql
&lt; scripts/innodb_memcached_config.sql )<br />
Ein Blick in die Datei verrät, dass das memcached Plugin ein
eigenes Schema (<span style="font-style: italic;">innodb_memcache</span>)
zum
Verwalten des Zugriffes von Datenbankabfragen benötigt/erstellt. <br />
Die Tabelle containers:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">mysql&gt; show create table
containers\G<br />
*************************** 1. row ***************************<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Table: containers<br />
Create Table: CREATE TABLE `containers` (<br />
&nbsp; `name` varchar(50) NOT NULL,<br />
&nbsp; `db_schema` varchar(250) NOT NULL,<br />
&nbsp; `db_table` varchar(250) NOT NULL,<br />
&nbsp; `key_columns` varchar(250) NOT NULL,<br />
&nbsp; `value_columns` varchar(250) DEFAULT NULL,<br />
&nbsp; `flags` varchar(250) NOT NULL DEFAULT '0',<br />
&nbsp; `cas_column` varchar(250) DEFAULT NULL,<br />
&nbsp; `expire_time_column` varchar(250) DEFAULT NULL,<br />
&nbsp; `unique_idx_name_on_key` varchar(250) NOT NULL,<br />
&nbsp; PRIMARY KEY (`name`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1<br />
1 row in set (0.00 sec)<br />
<br />
mysql&gt; select * from containers;<br />
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+<br />
| name | db_schema | db_table&nbsp; | key_columns | value_columns |
flags | cas_column | expire_time_column | unique_idx_name_on_key |<br />
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+<br />
| aaa&nbsp; | test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | demo_test |
c1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |
c2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |
c3&nbsp;&nbsp;&nbsp; |
c4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |
c5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
PRIMARY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br />
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+<br />
1 row in set (0.00 sec)<br />
</span></p>
<span style="font-family: serif;">Das Skript
innodb_memcached_config.sql hat nicht nur diese Tabelle erstellt
sondern - wie auch bei den folgenen Tabellen - auch noch einen Eintrag
eingefügt.<br />
Jede Zeile in der Tabelle containers ist definiert auf welche Tabelle
memcached zugreift. Die Spalte <span style="font-style: italic;">name</span>
dient hier dazu auch mehrere (Ziel)Tabellen zu definieren. Derzeit wird
nur
eine Tabelle unterstützt. Mir ist auch nicht klar wie via
memcached mehr als eine Tabelle unterstützt werden soll. (Ich habe
gehört, dass dies dadurch erreicht werden soll, indem die keys aus
<span style="font-style: italic;">name</span>:<span style="font-style: italic;">memcachekey </span>bestehen werden
sollen.)<br />
<br />
<span style="font-style: italic;">db_schema/db_table</span> verweisen
auf das konkrete Schema/Tabelle.Die Spalten </span> <span style="font-style: italic;">key_columns, value_columns, flags,
cas_column, expire_time_column</span> sind dem <a href="http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt">memcached
Protokoll</a> geschuldet. Auf dieses gehe ich - unter anderem wegen
meiner Unwissenheit bezüglich des Protokolls - nicht ein. Die
Spalte
<span style="font-style: italic;">unique_idx_name_on_key</span>
enthält den Namen des Indexes (welcher UNIQUE sein muß) auf
key_columns (hier c1).<br />
So ist ersichtlich, dass Tabellen, welche via dem memcached Plugin
zugreifbar sein sollen, dem obigem Format entsprechen müssen.
Memcached ist ein simplers Key (key_colums) Value (value_columns)
Store. Das memcached Plugin erlaubt unter value_columns mehrere Spalten
anzugeben. Da das memcached Protokoll aber nur Key Value kann, bietet
das Plugin an einen Separator zu definieren. So wird via memcached ein
String (Value) übergeben welches das Plugin nach dem Trenner teilt
und in die passenden Spalten schreibt. Zu definieren ist der Trenner in
der Tabelle config_optioins:<br />
<span style="font-family: serif;"></span><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">mysql&gt; show create table
config_options\G<br />
*************************** 1. row ***************************<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Table: config_options<br />
Create Table: CREATE TABLE `config_options` (<br />
&nbsp; `name` varchar(50) NOT NULL,<br />
&nbsp; `value` varchar(50) DEFAULT NULL,<br />
&nbsp; PRIMARY KEY (`name`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1<br />
1 row in set (0.00 sec)<br />
<br />
mysql&gt; select * from config_options;<br />
+-----------+-------+<br />
| name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | value |<br />
+-----------+-------+<br />
| separator | |&nbsp;&nbsp;&nbsp;&nbsp; |<br />
+-----------+-------+<br />
</span></p>
<span style="font-family: serif;">Es ist davon auszugehen, dass hier
noch weitere Konfigurationsmöglichkeiten kommen werden. Eine
weitere Tabelle ist die <span style="font-style: italic;">cache_policies</span>:<br />
<br />
</span><span style="font-family: monospace;"></span>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">mysql&gt; show create table
cache_policies\G</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">*************************** 1.
row ***************************</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Table:
cache_policies</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">Create Table: CREATE TABLE
`cache_policies` (</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">&nbsp; `policy_name` varchar(40)
NOT NULL,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">&nbsp; `get_policy`
enum('innodb_only','cache_only','caching','disabled') NOT NULL,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">&nbsp; `set_policy`
enum('innodb_only','cache_only','caching','disabled') NOT NULL,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">&nbsp; `delete_policy`
enum('innodb_only','cache_only','caching','disabled') NOT NULL,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">&nbsp; `flush_policy`
enum('innodb_only','cache_only','caching','disabled') NOT NULL,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">&nbsp; PRIMARY KEY (`policy_name`)</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">) ENGINE=InnoDB DEFAULT
CHARSET=latin1</span><br />
<br />
<span style="font-family: monospace;"></span></p>
<span style="font-family: serif;">Während in der Tabelle
containers noch angelegt ist auf mehrere Tabellen zuzugreifen, ist dies
hier nicht vorgeshen, die Einstellungen pro Tabelle vorzunehmen.<br />
Daher ist das als Konfiguration für alle Tabellen zu
interpretieren.<br />
Die genaue Konfiguration wie auch eine auführliche Einleitung ist <a href="http://blogs.innodb.com/wp/2011/04/get-started-with-innodb-memcached-daemon-plugin/">hier</a>
zu finden.<br />
Ärgerlich ist, dass Änderungen in den cache_policies erst
nach einem Restart des Servers ziehen.<br />
</span><br />
Doch bisher haben wir die Installation des Plugin versäumt:<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">mysql&gt; INSTALL PLUGIN
daemon_memcached SONAME 'libmemcached.so';<br />
Query OK, 0 rows affected (0.00 sec)<br />
mysql&gt; SELECT * from&nbsp; INFORMATION_SCHEMA.PLUGINS WHERE
PLUGIN_NAME='daemon_memcached'\G<br />
*************************** 1. row ***************************<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
PLUGIN_NAME: daemon_memcached<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PLUGIN_VERSION: 1.0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PLUGIN_STATUS: ACTIVE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
PLUGIN_TYPE: DAEMON<br />
&nbsp;&nbsp; PLUGIN_TYPE_VERSION: 50604.0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PLUGIN_LIBRARY:
libmemcached.so<br />
PLUGIN_LIBRARY_VERSION: 1.3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PLUGIN_AUTHOR: Jimmy
Yang<br />
&nbsp;&nbsp;&nbsp; PLUGIN_DESCRIPTION: Memcached Daemon<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PLUGIN_LICENSE: GPL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
LOAD_OPTION: ON<br />
1 row in set (0.00 sec)<br />
</span></p>
<span style="font-family: serif;">Folgende Variablen sind zu setzen:</span><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">mysql&gt; show global variables like
'daemon_memcached%';<br />
+----------------------------------+------------------+<br />
|
Variable_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br />
+----------------------------------+------------------+<br />
| daemon_memcached_enable_binlog&nbsp;&nbsp; |
OFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br />
| daemon_memcached_engine_lib_name | innodb_engine.so |<br />
| daemon_memcached_engine_lib_path
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br />
|
daemon_memcached_option&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br />
| daemon_memcached_r_batch_size&nbsp;&nbsp;&nbsp; |
1048576&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| daemon_memcached_w_batch_size&nbsp;&nbsp;&nbsp; |
32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br />
+----------------------------------+------------------+<br />
<br />
</span></p>
<span style="font-family: serif;">Es handelt sich hierbei um read-only
Variablen. So sind diese auch nicht zur Laufzeit zu ändern.
Interessant ist die Option </span><span style="font-style: italic;">daemon_memcached_w_batch_size</span>.
Zum
Steigern der Performance wird nur alles 32 Änderungen
committed. Will man nun (in der Verbindung) auch die noch nicht
committetten Anweisungen sehen, ist der Transaktions Level anzupassen:<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">SET SESSION TRANSACTION ISOLATION
LEVEL READ UNCOMMITTED;<br />
</span></p>
<h2><br />
</h2>
<h2>Fazit:</h2>
Also mir erschließt sich der Mehrwert der Memcached Erweiterung
nicht.
Handlersocket z.B. erlaubt den Zugriff auf jede und mehrere Tabellen
der Applikation. Das memcached Plugin verlangt eine Tabelle nach einem
festgelegtem Format. Die Usability ist bescheiden. Und wenn man meint
durch folgendes den mysqld nicht restarten zu müssen, crasht
mysqld eben :)<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">mysql&gt; uninstall PLUGIN
daemon_memcached;<br />
Query OK, 0 rows affected (2.00 sec)<br />
<br />
mysql&gt; INSTALL PLUGIN daemon_memcached SONAME 'libmemcached.so';<br />
Query OK, 0 rows affected (0.00 sec)<br />
</span><br />
</p>
<br />
<br />
Viel Spaß<br />
Erkan<br />
<br />]]>
        
    </content>
</entry>

<entry>
    <title>Spielen mit 5.6s Information_Schema Erweiterungen</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/11/spielen-mit-56s-information-schema-erweiterungen.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.197</id>

    <published>2011-11-20T23:06:52Z</published>
    <updated>2011-11-20T23:10:33Z</updated>

    <summary><![CDATA[Beim Rumspielen mit MySQL 5.6 - von der es Previewversionen gibt - fiel auf, dass es neue Tabellen im I_S gibt: 5.5.13: mysql&gt; show tables like 'INNODB%'; +----------------------------------------+ | Tables_in_information_schema (INNODB%) | +----------------------------------------+ | INNODB_CMP_RESET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | | INNODB_TRX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | |...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Beim Rumspielen mit MySQL 5.6 - von der es <a
href="http://labs.mysql.com/">Previewversionen</a> gibt - fiel auf,
dass es neue Tabellen im I_S gibt:<br>
<br>
5.5.13:<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span
style="font-family: monospace;">mysql&gt; show tables like 'INNODB%';<br>
+----------------------------------------+<br>
| Tables_in_information_schema (INNODB%) |<br>
+----------------------------------------+<br>
|
INNODB_CMP_RESET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_TRX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_CMPMEM_RESET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_LOCK_WAITS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_CMPMEM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_LOCKS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
+----------------------------------------+<br>
</span></p>
5.6.2:<span style="font-family: monospace;"><br>
</span>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span
style="font-family: monospace;">mysql&gt; SHOW TABLES LIKE 'INNODB%';<br>
+----------------------------------------+<br>
| Tables_in_information_schema (INNODB%) |<br>
+----------------------------------------+<br>
|
INNODB_CMPMEM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_TRX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_BUFFER_PAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_LOCK_WAITS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_SYS_TABLESTATS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_SYS_COLUMNS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_CMPMEM_RESET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_SYS_FOREIGN_COLS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_BUFFER_PAGE_LRU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_BUFFER_POOL_STATS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_CMP_RESET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_SYS_FOREIGN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_METRICS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_SYS_INDEXES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_LOCKS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_SYS_FIELDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
|
INNODB_SYS_TABLES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
+----------------------------------------+<br>
</span></p>
Betrachten wir uns die INNODB_SYS_FOREIGN% Tabellen. Diese
erlauben es f&uuml;r InnoDB Tabellen einfach an die Foreign Keys (FK)
heran zu kommen. In der Datenbank existiert ein FK kind -&gt; papa. <br>
<span style="font-family: monospace;"></span>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span
style="font-family: monospace;">mysql&gt; select * from
INNODB_SYS_FOREIGN;<br>
+------------------+-----------+-----------+--------+------+<br>
|
ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
FOR_NAME&nbsp; | REF_NAME&nbsp; | N_COLS | TYPE |<br>
+------------------+-----------+-----------+--------+------+<br>
| test/kind_ibfk_1 | test/kind | test/papa
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp; 1 |<br>
+------------------+-----------+-----------+--------+------+<br>
1 row in set (0.00 sec)<br>
<br>
mysql&gt; select * from INNODB_SYS_FOREIGN_COLS;<br>
+------------------+--------------+--------------+-----+<br>
|
ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
FOR_COL_NAME | REF_COL_NAME | POS |<br>
+------------------+--------------+--------------+-----+<br>
| test/kind_ibfk_1 |
id2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |
id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp; 0 |<br>
+------------------+--------------+--------------+-----+<br>
1 row in set (0.00 sec)<br>
</span></p>
<span style="font-family: serif;">&Uuml;ber INNODB_SYS_FOREIGN erhalten
wir die verkn&uuml;pften Tabellen. TYPE = 1 meint hier ON DELETE
CASCADE. Imho nicht wirklich lesbar, vielleicht h&auml;tte man sich bei
TYPE
f&uuml;r den Typ SET entscheiden sollen :)<br>
<br>
Die Tabelle INNODB_SYS_FOREIGN_COLS verr&auml;t uns die Spalten des FK.<br>
Beide verkn&uuml;pft: &nbsp; </span><br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span
style="font-family: monospace;">mysql&gt; select
concat(FOR_NAME,":",FOR_COL_NAME," -&gt;
",REF_NAME,":",REF_COL_NAME)&nbsp; as FK from INNODB_SYS_FOREIGN_COLS
JOIN INNODB_SYS_FOREIGN using(ID);<br>
+-------------------------------+<br>
|
FK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
+-------------------------------+<br>
| test/kind:id2 -&gt; test/papa:id |<br>
+-------------------------------+<br>
</span></p>
<br>
<span style="font-family: serif;">Folgend sehen wir wie dies f&uuml;r
MySQL 5.[1,5,6].x auch ohne die neuen Tabellen (ann&auml;hernd)
erledigt werden kann.<br>
<br>
</span><span style="font-family: monospace;"></span>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span
style="font-family: monospace;">mysql&gt; select * from
TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY';<br>
+--------------------+-------------------+-----------------+--------------+------------+-----------------+<br>
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME |
TABLE_SCHEMA | TABLE_NAME | CONSTRAINT_TYPE |<br>
+--------------------+-------------------+-----------------+--------------+------------+-----------------+<br>
|
def&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
kind_ibfk_1&nbsp;&nbsp;&nbsp;&nbsp; |
test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |
kind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | FOREIGN
KEY&nbsp;&nbsp;&nbsp;&nbsp; |<br>
+--------------------+-------------------+-----------------+--------------+------------+-----------------+<br>
&nbsp;<br>
mysql&gt; select * from KEY_COLUMN_USAGE WHERE
CONSTRAINT_NAME='kind_ibfk_1'\G<br>
*************************** 1. row ***************************<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
CONSTRAINT_CATALOG: def<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
CONSTRAINT_SCHEMA: test<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
CONSTRAINT_NAME:
kind_ibfk_1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
TABLE_CATALOG:
def<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
TABLE_SCHEMA:
test<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
TABLE_NAME:
kind<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
COLUMN_NAME:
id2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ORDINAL_POSITION:
1<br>
POSITION_IN_UNIQUE_CONSTRAINT: 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REFERENCED_TABLE_SCHEMA: test<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REFERENCED_TABLE_NAME: papa<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REFERENCED_COLUMN_NAME: id<br>
<br>
mysql&gt; SELECT
concat(A.TABLE_SCHEMA,'/',A.TABLE_NAME,':',A.COLUMN_NAME,' -&gt;
',A.REFERENCED_TABLE_SCHEMA,'/',A.REFERENCED_TABLE_NAME,':',A.REFERENCED_COLUMN_NAME)
FK
from KEY_COLUMN_USAGE A JOIN TABLE_CONSTRAINTS
USING(CONSTRAINT_NAME) WHERE TABLE_CONSTRAINTS.CONSTRAINT_TYPE='FOREIGN
KEY';<br>
+-------------------------------+<br>
|
FK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
+-------------------------------+<br>
| test/kind:id2 -&gt; test/papa:id |<br>
+-------------------------------+<br>
<br>
</span></p>
Wenn sich jemand merkt, wof&uuml;r die jeweiligen Werte der Type Spalte
in 5.6.2 stehen, sind im Zugriff auf INNODB_SYS_FROREIG% mehr
Informationen zu holen. Letzterer Ansatz hat nicht nur denVorteil auf
MySQL 5.1.x und 5.5.x zu laufen, sondern auch FKs auf Tabellen zu
entdecken, welche nicht InnoDB sind.<br>
<br>
<br>
<br>
Viel Spa&szlig;<br>
Erkan<br>
<br>
]]>
        
    </content>
</entry>

<entry>
    <title>DOAG 2011</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/11/doag-2011.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.196</id>

    <published>2011-11-14T09:53:53Z</published>
    <updated>2011-11-14T09:59:03Z</updated>

    <summary><![CDATA[Moin, morgen beginnt die DOAG 2011. Auf der werden einige Vorträge gehalten werden.Zwei (1,2) von mir.&nbsp;Jene, welche sich dort aufhalten, werden gebeten aufzuschlagen.Viel SpaßErkan :)...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="konferenz" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Moin, morgen beginnt die DOAG 2011. Auf der werden einige Vorträge gehalten werden.<br />Zwei (<a href="http://www.doag.org/konferenz/vortrag_details.php?merken=0&amp;id=427852">1</a>,<a href="http://www.doag.org/konferenz/vortrag_details.php?merken=0&amp;id=427857">2</a>) von mir.&nbsp;<br />Jene, welche sich dort aufhalten, werden gebeten aufzuschlagen.<br /><br />Viel Spaß<br />Erkan :)<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>MySQL 24/7 [Update]</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/10/mysql-257.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.190</id>

    <published>2011-10-10T09:38:43Z</published>
    <updated>2011-10-11T22:21:17Z</updated>

    <summary><![CDATA[Wer sich gegenwärtig auf MySQL@Launchpad zugreifen will wird mit folgendem Schild konfrontiert:&nbsp; Auch downloads.mysql.com ist (seit mind.) diesem Wochenende nicht verfügbar. Hierhin wird man geschickt, alsbald man&nbsp; z.B.&nbsp; die - heftig umworbenen - 5.6.x Features anschauen will.Es soll Änderungen in...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Wer sich gegenwärtig auf MySQL@Launchpad zugreifen will wird mit folgendem Schild konfrontiert:<br /><br /><br /><form class="mt-enclosure mt-enclosure-image" style="display: inline;" contenteditable="false"><img alt="launchpad.png" src="http://linsenraum.de/erkules/2011/10/10/launchpad.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" height="111" width="448" /></form>&nbsp; <br />Auch
 downloads.mysql.com ist (seit mind.) diesem Wochenende nicht verfügbar.
 Hierhin wird man geschickt, alsbald man&nbsp; z.B.&nbsp; die - heftig umworbenen -
 5.6.x Features anschauen will.<br />Es soll Änderungen in der 
Infrastruktur von MySQL gegeben haben. So dass diese nun nicht mehr 
direkt zugänglich sind.&nbsp; Aber mir ist hier keine Ankündigung bekannt.<br /><br />[Update]<br />Beides ist wieder verfügbar. <br />Das nächste mal werde ich früher bloggen. <br />Versprochen! :)<br />]]>
        
    </content>
</entry>

<entry>
    <title>Momentum Galera</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/06/momentum-galera.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.177</id>

    <published>2011-06-24T23:42:53Z</published>
    <updated>2011-06-24T23:47:26Z</updated>

    <summary><![CDATA[ Ich hatte schon länger vor mir mal&nbsp;Galera anzuschauen. Folgender Blog hatte mich daran erinnert es endlich zu machen. Was ist Galera? Galera verspricht synchrone Replikation und ein Multi-Master-Setup. So werden die Daten nicht nur sicher repliziert, nein Galera ist...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="HA" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[
  Ich hatte schon länger vor mir mal&nbsp;<a href="http://codership.com/">Galera</a> anzuschauen. Folgender <a href="http://openlife.cc/blogs/2011/june/first-touch-galera-clustering-mysql">Blog</a>
hatte mich daran erinnert es endlich zu machen. <br />
Was ist Galera?<br />
Galera verspricht synchrone Replikation und ein Multi-Master-Setup. So
werden die Daten nicht nur sicher repliziert, nein Galera ist es auch
egal in welche der Nodes (auch gleichzeitig) geschrieben wird.<br />
Um dies zu bewerkstelligen wurde MySQL gepatcht. Wobei wir auch schon
beim ersten Problem sind. Wer sich Galera (Version 0.8) anschauen will
bekommt eine MySQL 5.1.53. Des weiteren repliziert Galera nur
InnoDB/XtraDB-Tabellen. Da obiger Blog schon mit einem Howto kommt.
Erspare ich mir diese Erklärung. Zudem ist die Installation des
Demo-Tar-Balls straight forward.<br />
Galera erlaubt unter anderem eine (nahezu) synchrone Replikation. Die
erste Frage die sich stellen mag, ist ob das nicht etwas langsam ist?
Mit MySQL 5.5.x gibt es die semisynchrone Replikation, welche zumindest
in die Nähe der synchronen Replikation kommt. Zwar erlaubt Galera
auch so schöne Sachen wie auf alle Nodes gleichzeitig zu
schreiben, aber dies wird in einem späteren Blogpost fokusiert
werden.<br />
Getestet wurden MySQL 5.5.13 und Galera 0.8 (ships with MySQL 5.1.53).<br />
Die Konfiguration richtetet sich nach der von Galera mitegelieferten
Konfig. Einzig innodb_buffer_pool_size wurde auf 4GB gesetzt.<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">innodb_flush_log_at_trx_commit=0<br />
innodb_buffer_pool_size=4G<br />
innodb_log_file_size=100M<br />
innodb_doublewrite=0<br />
innodb_locks_unsafe_for_binlog=1<br />
innodb_autoinc_lock_mode=2<br />
</span></p>
Für einen schnellen Test wurden je 100.000 Rows mit einer
Concurrency von 1,8,16,32,64,128 und 256 in eine einfache Tabelle
geschrieben.<br />
<br />
<img style="width: 680px; height: 480px;" alt="replikation" src="http://linsenraum.de/erkules/png/galera-sync.png" /><br />
Ein einfacher aber imho schon beeindruckender Test. So ist bietet sich
Galera schon als performanterer Ersatz für semisynchrone
Replikation an. Unterstützung für MySQL 5.5.x ist in der
Mache und es ist schwer zu Hoffen, daß Galera in mind. einem der
MySQL-Branches aufgenommen wird.<br />
<br />
Viel Spaß<br />
Erkan<br />]]>
        
    </content>
</entry>

<entry>
    <title>Mysql 5.1.x und dann noch tar-files?</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/06/mysql-51x-und-dann-noch-tar-files.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.175</id>

    <published>2011-06-18T15:43:55Z</published>
    <updated>2011-06-18T16:00:30Z</updated>

    <summary>Moinsen, ich nutze noch stark die 5.1.xer Schiene von MySQL. Zudem verwende ich keine Pakete der Distributionen. Beim Verarbeiten der Binärpakete von MySQL. Schrieben meine Installskripte - bei der 5.1.57 - plötzlich ins Errorlog:WARNING: HELP FILES ARE NOT COMPLETELY INSTALLED!The...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Moinsen, ich nutze noch stark die 5.1.xer Schiene von MySQL. Zudem verwende ich keine Pakete der Distributionen. Beim Verarbeiten der Binärpakete von MySQL. Schrieben meine Installskripte - bei der 5.1.57 - plötzlich ins Errorlog:<br /><br /><pre class="note">WARNING: HELP FILES ARE NOT COMPLETELY INSTALLED!<br />The "HELP" command might not work properly.<br /></pre>Genaueres ist <a href="http://bugs.mysql.com/bug.php?id=61520">hier</a> nachzulesen. Da wurde die fill_help_tables.sql - von 5.1.56 auf 5.1.57 - um genauere Links erweitert. Nur dass diese dann zu lang für `url` char(128) NOT NULL in der Tabelle mysql.help_topic waren.<br /><br />Es handelt sich "nur" um die Helpfiles ... aber trotzdem :)<br /><br />Viel Spaß<br />Erkan<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>MariaDB on temporary tables</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/06/mariadb-on-temporary-tables.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.174</id>

    <published>2011-06-02T21:16:07Z</published>
    <updated>2011-06-02T21:22:48Z</updated>

    <summary>MariaDB soll laut folgender Page bei temporay tables schneller sein als MySQL. Da: Our use of the Aria storage engine enables faster complex queries (queries which normally use disk-based temporary tables). The Aria storage engine is used for internal temporary...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="MariaDB" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[MariaDB soll laut folgender <a href="http://kb.askmonty.org/v/mariadb-versus-mysql-features">Page</a>
bei temporay tables schneller sein als MySQL. Da:<br />
<div style="margin-left: 40px; text-align: left;"><span style="font-style: italic;"><br />
Our use of the Aria storage engine enables faster complex queries
(queries which normally use disk-based temporary tables). The </span><a style="font-style: italic;" href="http://kb.askmonty.org/v/aria-formerly-known-as-maria">Aria</a><span style="font-style: italic;"> storage engine is used for internal
temporary tables, which should give you a speedup when doing complex
selects. Aria is usually faster for temporary tables when compared to
MyISAM because Aria caches row data in memory and normally doesn't have
to write the temporary rows to disk.</span>
</div>
<br />
Um dies zu testen wurden folgende Versionen installiert:<br />
<ul>
<li>MySQL 5.5.12</li>
<li>MySQL 5.1.57</li>
<li>MariaDB 5.2.6</li>
<li>MariaDB 5.1.55<br />
</li>
</ul>
Es wurden zwei Tabellen mit jeweils 10000 Rows erstellt:<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">mysql&gt; desc
sort_id;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+-------+---------+------+-----+---------+-------+&nbsp;&nbsp;&nbsp;&nbsp;
</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| Field | Type&nbsp;&nbsp;&nbsp;
| Null | Key | Default | Extra |&nbsp;&nbsp;&nbsp;&nbsp; </span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+-------+---------+------+-----+---------+-------+&nbsp;&nbsp;&nbsp;&nbsp;
</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| id&nbsp;&nbsp;&nbsp; | int(11)
| YES&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; | NULL&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; </span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+-------+---------+------+-----+---------+-------+&nbsp;&nbsp;&nbsp;&nbsp;
</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">1 row in set (0.00
sec)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">mysql&gt; desc
sort_1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+-------+---------+------+-----+---------+-------+&nbsp;&nbsp;&nbsp;&nbsp;
</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| Field | Type&nbsp;&nbsp;&nbsp;
| Null | Key | Default | Extra |&nbsp;&nbsp;&nbsp;&nbsp; </span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+-------+---------+------+-----+---------+-------+&nbsp;&nbsp;&nbsp;&nbsp;
</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| id&nbsp;&nbsp;&nbsp; | int(11)
| YES&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; | NULL&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; </span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| tea&nbsp;&nbsp; |
text&nbsp;&nbsp;&nbsp; | YES&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |
NULL&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp;&nbsp; </span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+-------+---------+------+-----+---------+-------+&nbsp;&nbsp;&nbsp;&nbsp;
</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">2 rows in set (0.00 sec) </span><br />
</p>
Auf allen Servern wurde zudem<span style="font-family: Courier New,Courier,monospace;"> tmp_table_size</span>
auf 1024 gesetzt um Temptables schnellstmöglich zu erzwingen.<br />
Daraufhin wurde mit mysqlslap die Query SELECT * FROM sort_id group by
id 20x3 mal ausgeführt. Dies geschah auch für die Tabelle
sort_1.<br />
Hier erst mal der EXPLAIN zu den Queries:<br /><br />
<p style="font-family: monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">mysql&gt;
explain SELECT * from sbtest.sort_id group by id\G<br />
*************************** 1. row ***************************<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id: 1<br />
&nbsp; select_type: SIMPLE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table: sort_id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type: ALL<br />
possible_keys: NULL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key: NULL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key_len: NULL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ref: NULL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rows: 10000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Extra: <span style="color: rgb(0, 0, 153);">Using temporary</span>; Using filesort<br />
1 row in set (0.00 sec)<br />
<br />
mysql&gt; explain SELECT * from sbtest.sort_1 group by id\G<br />
*************************** 1. row ***************************<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id: 1<br />
&nbsp; select_type: SIMPLE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table: sort_1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type: ALL<br />
possible_keys: NULL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key: NULL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key_len: NULL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ref: NULL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rows: 10000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Extra: <span style="color: rgb(0, 0, 153);">Using temporary</span>; Using filesort<br />
1 row in set (0.00 sec)<br />
<br />
</p>
<br />Die (aufgehübschte) Ausgabe sah für <span style="font-family: Courier New,Courier,monospace;">SELECT * from
sort_1 group&nbsp; by id</span>; wiefolgt aus:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code>Benchmark
[[5.5.12]]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of seconds to
run all queries: 1.803 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Minimum number of seconds to
run all queries: 1.791 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Maximum number of seconds to
run all queries: 1.826 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number of clients running
queries: 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of queries
per client: 20<br />
<br />
Benchmark [[MariaDB 5.2.6]]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of seconds to
run all queries: 5.547 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Minimum number of seconds to
run all queries: 5.542 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Maximum number of seconds to
run all queries: 5.556 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number of clients running
queries: 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of queries
per client: 20<br />
<br />
Benchmark [[5.1.57]]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of seconds to
run all queries: 1.605 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Minimum number of seconds to
run all queries: 1.603 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Maximum number of seconds to
run all queries: 1.606 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number of clients running
queries: 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of queries
per client: 20<br />
<br />
Benchmark [[MariaDB 5.1.55]]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of seconds to
run all queries: 5.283 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Minimum number of seconds to
run all queries: 5.214 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Maximum number of seconds to
run all queries: 5.344 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number of clients running
queries: 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of queries
per client: 20<br />
<br />
</code></p>
<br />
Die (aufgehübschte) Ausgabe sah für <span style="font-family: Courier New,Courier,monospace;">SELECT * from
sort_id group&nbsp; by id;</span> wiefolgt aus:<br />
<code><br />
</code>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code>Benchmark
[[5.5.12]]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of seconds to
run all queries: 1.146 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Minimum number of seconds to
run all queries: 1.135 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Maximum number of seconds to
run all queries: 1.170 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number of clients running
queries: 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of queries
per client: 20<br />
<br />
Benchmark&nbsp; [[MariaDB 5.2.6]]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of seconds to
run all queries: 4.359 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Minimum number of seconds to
run all queries: 4.352 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Maximum number of seconds to
run all queries: 4.366 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number of clients running
queries: 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of queries
per client: 20<br />
<br />
Benchmark [[5.1.57]]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of seconds to
run all queries: 1.049 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Minimum number of seconds to
run all queries: 1.032 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Maximum number of seconds to
run all queries: 1.068 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number of clients running
queries: 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of queries
per client: 20<br />
<br />
Benchmark [[MariaDB 5.1.55]]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of seconds to
run all queries: 4.261 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Minimum number of seconds to
run all queries: 4.202 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Maximum number of seconds to
run all queries: 4.341 seconds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number of clients running
queries: 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average number of queries
per client: 20<br />
<br />
</code></p>
<code><span style="font-family: serif;"><br />
<img style="width: 680px; height: 480px;" alt="BlobTable grouped by" src="http://linsenraum.de/erkules/png/blob-group.png" /><br />
<img style="width: 680px; height: 480px;" alt="table grouped by" src="http://linsenraum.de/erkules/png/group.png" /><br />
<br />
Nutzt MariaDB wieder die MyISAM-Engine für die temporay tables ist
laut Serg </span></code>Golubchik die Performance wieder vergleichbar
mit MySQL. Derzeit muss festgehalten werden, dass die Aussage MariaDB
sei bei tmp-tables performanter nicht verifiziert werden kann. <br />
<br />
<br />
Viel Spaß<br />
Erkan<br />]]>
        
    </content>
</entry>

<entry>
    <title>Power to the Backend</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/05/power-to-the-backend.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.171</id>

    <published>2011-05-08T23:17:45Z</published>
    <updated>2011-05-08T23:55:17Z</updated>

    <summary> Ich selbst nutze unter anderem PowerDNS als DNS-Server. Im letzten Monat betrachtete ich mir dessen MySQL-Backend, da ich über zwei Kanäle darüber informiert wurde, dass PowerDNS mit dem Backend nicht skaliert. Die DNS-Records werden in PowerDNS in zwei Tabellen...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="PowerDNS" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[ Ich selbst nutze unter anderem PowerDNS als DNS-Server. Im letzten
Monat betrachtete ich mir dessen MySQL-Backend, da ich über zwei
Kanäle darüber informiert wurde, dass PowerDNS mit dem
Backend nicht skaliert. <br />
<br />
Die DNS-Records werden in PowerDNS in zwei Tabellen abgelegt. Eine
für die Domains:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">create table domains (</span><br style="font-family: monospace;" />
<span style="font-family: monospace;"> id INT auto_increment,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;"> name VARCHAR(255) NOT NULL,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;"> master VARCHAR(128) DEFAULT NULL,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;"> last_check INT DEFAULT NULL,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;"> type VARCHAR(6) NOT NULL,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;"> notified_serial INT DEFAULT
NULL, </span><br style="font-family: monospace;" />
<span style="font-family: monospace;"> account VARCHAR(40) DEFAULT NULL,</span><br style="font-family: monospace;" />
<span style="font-family: monospace;"> primary key (id)</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">) Engine=InnoDB;</span><br />
</p>
Und eine weitere für die Records:<br /><br />
<p style="font-family: monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">CREATE
TABLE records (<br />
id int(11) NOT NULL auto_increment,<br />
domain_id int(11) NOT NULL,<br />
name varchar(255) NOT NULL,<br />
type varchar(10) NOT NULL,<br />
content varchar(255) NOT NULL,<br />
ttl int(11) NOT NULL,<br />
prio int(11) default NULL,<br />
change_date int(11) default NULL,<br />
PRIMARY KEY (id),<br />
KEY name_index(name),<br />
KEY nametype_index(name,type),<br />
KEY domainid_index(domain_id)<br />
);</p>
Zudem existiert noch ein FK-Constraint, aber auch der tut hier nichts
zur Sache.<br />
Die Tabelle domains wurde mit 6.000.000 Datensätzen bestückt.
Die Tabelle records wurde mit 46.195.356 Datensätzen
bestückt. Ich denke damit wird schon ein größerer DNS-Server simuliert :D<br /><br />
Zwar schien es, als sollte man sich mal Gedanken über die
Normalisierung ansich machen, doch das war nicht
mein Skope. Es galt mit etwas Mikrotuning schon Erfolge zu erzielen. PowerDNS pdns-3.0-rc2 und folgende MySQL-Version kam zum Einsatz:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code>[pdns]&gt;
SELECT VERSION();<br />
+-------------------+<br />
| VERSION()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
+-------------------+<br />
| 5.2.5-MariaDB-log |<br />
+-------------------+<br />
1 row in set (0.00 sec)<br />
</code></p>
<code><span style="font-family: serif;">Die Datenbank meinte die
Tabellen würden folgenden Platzverbrauch haben.</span><br /><br />
</code>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code>&gt;
SELECT TABLE_NAME,INDEX_LENGTH,DATA_LENGTH from
information_schema.TABLES where TABLE_NAME IN('records','domains');<br />
+------------+--------------+-------------+<br />
| TABLE_NAME | INDEX_LENGTH | DATA_LENGTH |<br />
+------------+--------------+-------------+<br />
| domains&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 475004928 |&nbsp;&nbsp;
431898624 |<br />
| records&nbsp;&nbsp;&nbsp; |&nbsp; 11372855296 |&nbsp; 5813305344 |<br />
+------------+--------------+-------------+<br />
<br />
</code></p>
<code><span style="font-family: serif;">Bei PowerDNS wurden alle Caches
abgeschaltet (es galt die Datenbank zu testen!) und 494969 disjunkte
DNS-Abfragen gestellt. Diese waren in 48.9 Sekunden durchgelaufen, was
ca. 10114 qps entspricht. (Für jeden Test wurde die Datenbank
restartet und der zweite Lauf genommen.)<br /><br />Da Abfragen gegen die Tabelle records gehen,&nbsp; nur diese Tabelle "optimiert"- Einige Änderungen sind analog in der Tabelle domains möglich.<br />
<br />
Als erste Optimierung wurde ein redundanter Index entfernt. <br />
<br />
</span></code>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code>drop&nbsp;
index `rec_name_index`&nbsp; on records;<br />
</code></p>
<code><span style="font-family: serif;"><br />
Hiernach wurden 10822 qps gemessen. Dies ist wohl nicht die Welt. Beim
Platzverbrauch sieht es schon besser aus:</span><br />
</code><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code>+------------+--------------+-------------+<br />
| TABLE_NAME | INDEX_LENGTH | DATA_LENGTH |<br />
+------------+--------------+-------------+<br />
| domains&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 475004928 |&nbsp;&nbsp;
431898624 |<br />
| records&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 6116343808 |&nbsp; 5813305344
|<br />
+------------+--------------+-------------+<br />
</code></p>
<span style="font-family: serif;">Die Spalte type speichert die
Recordtypen</span>. Aus dem VARCHAR wird im Index ein CHAR. Da die
Menge der Werte begrenzt ist bietet sich hier ein ENUM an. Welches den
Vorteil hat ein INT zu sein und zum anderen sicherstellt, dass nicht
andere als die definierten Werte in die Tabelle kommen.<br /><br />
<code></code>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code>ALTER
TABLE records&nbsp;&nbsp; MODIFY&nbsp; `type`
enum('A','AAAA','SOA','NS','MX','CNAME','PTR','TXT');<br />
</code></p>
<code><span style="font-family: serif;">Zugegeben, dies ist nur ein
Subset der nötigen Recordtypen. Am Ergebnis wird dies nichts
ändern. Nach dieser Änderung haben wir nun 10918 qps.
Angenehmer ist die weitere Reduktion der Datengröße. Diesmal
auch nicht nur bei den Indexdaten.</span><br /><br />
</code>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code><br />
+------------+--------------+-------------+<br />
| TABLE_NAME | INDEX_LENGTH | DATA_LENGTH |<br />
+------------+--------------+-------------+<br />
| domains&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 475004928 |&nbsp;&nbsp;
431898624 |<br />
| records&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 5816451072 |&nbsp; 5696913408
|<br />
+------------+--------------+-------------+<br />
<br />
</code></p>
<code><span style="font-family: serif;">All diese Tests liefen
mit&nbsp; distributor-threads=32. Das ist eine
Konfigurationseinstellung (im PowerDNS) für die Anzahl der
Verbindungen, die PowerDNS zur Datenbank öffnet. Der Default liegt
bei 3. Mit </span></code><code><span style="font-family: serif;">distributor-threads=3
erreichte ich lediglich<span style="font-family: serif;"> 5656 qps.<br />
Zu guter Letzt ändern wir noch den Index nametype_index. Die
wenigsten FQDN nutzen die im RFC ermöglichten 255 Zeichen aus.
Sprich hier lohnt sich ein prefix-Index. (Der alte wurde gedropt)<br /><br />
</span></span></code><code></code>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code>CREATE
INDEX `nametype_index` on records(name(100),type);<br />
</code></p>
<small><big><span style="font-family: serif;">Nun waren wir bei 10923
qps angelangt und was sagt der Platzverbrauch?</span><br /><br />
</big></small>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><small><big><span style="font-family: monospace;">+------------+--------------+-------------+</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| TABLE_NAME | INDEX_LENGTH |
DATA_LENGTH |</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------------+--------------+-------------+</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| domains&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp; 475004928 |&nbsp;&nbsp; 431898624 |</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| records&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp; 3547332608 |&nbsp; 5696913408 |</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------------+--------------+-------------+<br />
</span></big></small></p>
<br />
Sweet! Halten wir fest die Index_legth ist von <code style="font-family: serif;">11372855296 Bytes auf </code><small style="font-family: serif;"><big>3547332608 Bytes reduziert worden.</big></small>
Damit wurden hier etwas über 7GB gespart \o/<br />
An diesem Punkt angelangt wurden die records noch in PBXT
geändert. Hierbei wurden 12375 qps erreicht:) Wobei der
Platzverbrauch immens anstieg:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><small><big><span style="font-family: monospace;">| records&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp; 5684629504 | 12380356432 |<br />
</span></big>
</small></p>
<br />
Später wurde ich in #powerdns darauf hingewiesen, dass das
verwendete Benchmarktool (dnsperf) auch mit einer längeren Queue
ausgeführt werden kann. So wurden mit <span style="font-family: Courier New,Courier,monospace;">./dnsperf -d
/var/tmp/pdns.list -q 2000 -s localhost</span> schnell 22994 qps
erreicht.<br />
Das ist selbstredend nur ein Anfang. Aber zeigt es doch, dass in vielen
Projekten noch Steigerungspotential steckt. Von nicht skalieren kann aber nicht gesprochen werden. :) <br />
<br />
<br />
Viel Spaß<br />
Erkan<br />]]>
        
    </content>
</entry>

<entry>
    <title>MariaDBs Kruschelkiste: Dynamic Columns for MySQL</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/05/mariadbs-kruschelkiste-dynamic-columns-for-mysql.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.170</id>

    <published>2011-05-08T02:11:44Z</published>
    <updated>2011-05-08T03:06:01Z</updated>

    <summary>Mit MariaDB 5.3 wird ein neuer ColumnType Einzug halten. Das sogenannte Dynamic Column. Die Idee ist gewisse Vorgehensweisen, welche aus den DocumentStore-Lösungen (z.B. MongoDB) bekannt sind zu erfüllen. Ob man das wirklich will, liegt nicht an mir zu entscheiden. Doch...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Mit MariaDB 5.3 wird ein neuer ColumnType Einzug halten. Das sogenannte
Dynamic Column. Die Idee ist gewisse Vorgehensweisen, welche aus den
DocumentStore-Lösungen (z.B. MongoDB) bekannt sind zu
erfüllen. Ob man das wirklich will, liegt nicht an mir zu
entscheiden. Doch sei folgender <a href="http://blog.koehntopp.de/archives/3057-Zusammenfassung-Schemaless.html">Link</a>
dem geneigten Leser nahe gelegt.<br />
Die Idee ist denkbar einfach: In der Tabelle wird eine BLOB-Spalte
verwendet um darin die dynamischen Element zu verwalten.<br />
Es sei erwähnt, dass zum Nachspielen&nbsp;
https://code.launchpad.net/~maria-captains/maria/5.3-mwl34 zu verwenden
ist.<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code>MariaDB
[test]&gt; SELECT VERSION();<br />
+---------------------+<br />
| VERSION()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br />
+---------------------+<br />
| 5.3.0-MariaDB-alpha |<br />
+---------------------+<br />
1 row in set (0,00 sec)<br />
</code></p>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><small><span style="font-family: monospace;"><big>CREATE TABLE dyni ( id INT,
sonderlocke BLOB</big></span>);<br />
</small></p>
Hier ist noch keine Magie. Jede StorageEngine, welche mit BLOB umgehen
kann erfüllt dies.<br />
<br />
sql/lex.h verrät uns dass folgende Funktionen existieren:<br />
COLUMN_ADD&nbsp;&nbsp;&nbsp;&nbsp; <br />
COLUMN_CREATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
COLUMN_DELETE&nbsp; <br />
COLUMN_EXISTS<br />
COLUMN_GET&nbsp;&nbsp;&nbsp;&nbsp; <br />
COLUMN_LIST<br />
<br />
COLUMN_CREATE() wird zum initialisieren des BLOB-Eintrages genutzt:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">INSERT INTO dyni
VALUES(1,COLUMN_CREATE(1 , "hallo", 2 , 42));</span><br />
</p>
COLUMN_CREATE() erhält seine Argumente in der Form key, value ,
key value. Perlmonger wünschen sich hier schnell ein =&gt; herbei.
key =&gt; value , key =&gt; value ;)<br />
Hier wird auch klar, dass es sich *genaugenommen* nicht um einen neuen
ColumnType handelt. Dieser ist und bleibt BLOB. Mit COLUMN_CREATE() wird
der BLOB Zeile für Zeile initialisiert.<br />
Mit COLUMN_LIST() gibt die Keys der Spalte zurück und
COLUMN_GET(key) den Value des Keys:<br /><br />
<code></code><code class="red"></code>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code class="red"><small><big><big><big><small><span style="font-weight: bold;"></span></small></big></big></big></small>MariaDB
[test]&gt; SELECT id, COLUMN_LIST(sonderlocke) from dyni;<br />
+------+--------------------------+<br />
| id&nbsp;&nbsp; | COLUMN_LIST(sonderlocke) |<br />
+------+--------------------------+<br />
|&nbsp;&nbsp;&nbsp; 1 |
1,2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br />
+------+--------------------------+<br />
MariaDB [test]&gt; SELECT id,COLUMN_GET(sonderlocke,1 as char) from
dyni;<br />
+------+------------------------------------+<br />
| id&nbsp;&nbsp; | COLUMN_GET(sonderlocke,id as char) |<br />
+------+------------------------------------+<br />
|&nbsp;&nbsp;&nbsp; 1 |
hallo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br />
+------+------------------------------------+<br />
1 row in set (0,00 sec)<br />
<br />
</code></p>
COLUMN_GET() verlangt als erstes Argument den Spaltennamen, gefolgt von
dem Key. Hier muss - wie bei NoSQL wohl üblich - der Anwender
angeben, von welchem typ der Inhalt ist ( .. as char). Sollen weitere
Einträge gemacht werden ist COLUMN_ADD() zu verwenden.
COLUMN_ADD() kann auch Keys löschen indem der Value auf NULL
gesetzt wird. Wem dies zu merkwürdig ist kann auch COLUMN_DELETE()
verwenden.<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code class="red">MariaDB [test]&gt; UPDATE dyni SET
sonderlocke=COLUMN_ADD(sonderlocke,2,NULL,3,"\o/");<br />
Query OK, 1 row affected (0,00 sec)<br />
Rows matched: 1&nbsp; Changed: 1&nbsp; Warnings: 0<br />
<br />
MariaDB [test]&gt; SELECT id, COLUMN_LIST(sonderlocke) from dyni;<br />
+------+--------------------------+<br />
| id&nbsp;&nbsp; | COLUMN_LIST(sonderlocke) |<br />
+------+--------------------------+<br />
|&nbsp;&nbsp;&nbsp; 1 |
1,3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br />
+------+--------------------------+<br />
1 row in set (0,00 sec)<br />
<br />
</code></p>
<code class="red">&nbsp; </code>COLUMN_EXISTS() prüft ob der
angefragte Key vorhanden ist.<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code class="red"></code><span style="font-family: monospace;">MariaDB
[test]&gt; SELECT COLUMN_EXISTS(sonderlocke,1) from dyni;</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------------------------------+</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| COLUMN_EXISTS(sonderlocke,1) |</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------------------------------+</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1 |</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------------------------------+</span><br />
</p>
Das schöne an dieser Lösung ist&nbsp; - wie anfangs
erwähnt -, dass die StorageEngine nur BLOBs unterstützen muss.<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><span style="font-family: monospace;">MariaDB [test]&gt; ALTER TABLE dyni
ENGINE=Aria;</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">Query OK, 1 row affected (0,01
sec)</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">Records: 1&nbsp; Duplicates:
0&nbsp; Warnings: 0</span><br style="font-family: monospace;" />
<br style="font-family: monospace;" />
<span style="font-family: monospace;">MariaDB [test]&gt; SELECT id,
COLUMN_LIST(sonderlocke) from dyni;</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------+--------------------------+</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| id&nbsp;&nbsp; |
COLUMN_LIST(sonderlocke) |</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------+--------------------------+</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">|&nbsp;&nbsp;&nbsp; 1 |
1,3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------+--------------------------+</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">1 row in set (0,00 sec)</span><br style="font-family: monospace;" />
<br style="font-family: monospace;" />
<span style="font-family: monospace;">MariaDB [test]&gt; ALTER TABLE
dyni ENGINE=InnoDB;</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">Query OK, 1 row affected (0,04
sec)</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">Records: 1&nbsp; Duplicates:
0&nbsp; Warnings: 0</span><br style="font-family: monospace;" />
<br style="font-family: monospace;" />
<span style="font-family: monospace;">MariaDB [test]&gt; SELECT
id,COLUMN_GET(sonderlocke,1 as char) from dyni;</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------+-----------------------------------+</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">| id&nbsp;&nbsp; |
COLUMN_GET(sonderlocke,1 as char) |</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------+-----------------------------------+</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">|&nbsp;&nbsp;&nbsp; 1 |
hallo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">+------+-----------------------------------+</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">1 row in set (0,00 sec)</span><br style="font-family: monospace;" />
<br style="font-family: monospace;" />
<span style="font-family: monospace;">MariaDB [test]&gt; ALTER TABLE
dyni ENGINE=PBXT;</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">Query OK, 1 row affected (0,05
sec)</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">Records: 1&nbsp; Duplicates:
0&nbsp; Warnings: 0</span><br style="font-family: monospace;" />
<br style="font-family: monospace;" />
<span style="font-family: monospace;">MariaDB [test]&gt; UPDATE dyni
SET sonderlocke=COLUMN_ADD(sonderlocke,2,"pbxt");</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">Query OK, 1 row affected (0,00
sec)</span><br style="font-family: monospace;" />
<span style="font-family: monospace;">Rows matched: 1&nbsp; Changed:
1&nbsp; Warnings: 0</span><br />
<br />
</p>
<br />
<br />
Damit ist der Schnelldurchlauf durch eines der kommenden Features von
MariaDB 5.3 schon am Ziel angelangt. Auf der TODO-Liste des Features
steht unter anderem noch die Möglichkeit die Keys (dynamic Columns) zu benamsen.<br />
Dieses Feature ist imho als Antwort auf die DocumentStore-Fraktion von
NoSQL zu verstehen. Auch wenn es nicht den Anspruch haben sollte
äquivalent zu den Möglichkeiten von i.e. BSON zu sein. Aber
für wen es reicht .. :)<br />
<br />
Viel Spaß<br />
Erkan<br />]]>
        
    </content>
</entry>

<entry>
    <title>Bughunter der ich bin?</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/05/bughunter-der-ich-bin.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.169</id>

    <published>2011-05-01T18:14:38Z</published>
    <updated>2011-05-01T18:36:50Z</updated>

    <summary> Ich bin der Meinung, dass es sich gehört, dass Blogs Kommentare zulassen. Ist dies nicht der Fall, wird aus einem Blog zu schnell ein authistisches Tagebuch. In diesem Blog fragt sich der Autor, ob er einen Bug in den...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[ Ich bin der Meinung, dass es sich gehört, dass Blogs Kommentare
zulassen. Ist dies nicht der Fall, wird aus einem Blog zu schnell ein
authistisches Tagebuch.<br />
In diesem <a href="http://www.twiedmann.de/sqlbackstube/mysql_procedure_performance">Blog</a>
fragt sich der Autor, ob er einen Bug in den neueren MySQL-Versionen
(&gt;5.1.x) gefunden hat:<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code>mysql&gt;SELECT
BENCHMARK(100, fibonacci(10000));<br />
</code><code class="red">ERROR 1690 (22003): DOUBLE value is out of
range in '(f1@1 + f2@3)' <br /></code></p><p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><code class="red">Uups, was ist das. Die MySQL Version 5.5.9 steigt mit einem
SQL-Fehler (ERROR 1690) aus. Ist dies ein Bug?<br />
</code></p>
<p class="text">Ganz im Gegenteil die Fehlermeldung ist hier genau
richtig. Denn die Fibonacci-Reihe übersteigt den
Definitionsbereich von DOUBLE. Das tat es schon in der 5.1.x und
früher. Nur jetzt gibt es eben einen Fehler .. was gut ist!<br />
Warum die genutzte Funktion überhaupt mit DOUBLE arbeitet ist mir
bei der Fibonacci-Reihe so oder so schleierhaft :/</p><p class="text"><br /></p><p class="text">BTW: Dies hat nichts mit der ursprünglichen Fragestellung des Autors über die Performance von Proceduren zu tun. Dazu will ich mich nicht äußern.<br /></p>]]>
        
    </content>
</entry>

<entry>
    <title>Winke Winke Lenz</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/04/winke-winke-lenz.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.161</id>

    <published>2011-04-05T13:03:13Z</published>
    <updated>2011-04-05T13:16:23Z</updated>

    <summary><![CDATA[Moinsen,Leser von planetmysql.org haben folgende Meldung schon lesen dürfen. Lenz Grimmer ist&nbsp; nicht mehr im Community Team von MySQL. Im Gegensatz zu anderen verlaesst Lenz nicht Oracle, sondern beschaeftigt sich mit neuen Themen innerhalb von Oracle.Auch wenn er sich freut,...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Moinsen,<br />Leser von planetmysql.org haben folgende <a href="http://opensourcedba.wordpress.com/2011/04/01/adios-lenz/">Meldung</a> schon lesen dürfen. <a href="http://www.lenzg.net/">Lenz Grimmer</a> ist&nbsp; nicht mehr im Community Team von MySQL. Im Gegensatz zu anderen verlaesst Lenz nicht Oracle, sondern beschaeftigt sich mit neuen Themen innerhalb von Oracle.<br />Auch wenn er sich freut, finde ich es selbstredend doof, dass so eine Mischung von Kompetenz und Symphatie eine Luecke zuruecklassen wird, welche schwer zu fuellen ist.<br />Alles Gute und bis Bald.<br />]]>
        
    </content>
</entry>

<entry>
    <title>This table type requires a primary key</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/03/this-table-type-requires-a-primary-key.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.160</id>

    <published>2011-03-29T23:01:16Z</published>
    <updated>2011-03-30T07:09:07Z</updated>

    <summary><![CDATA[ Gegeben: root@localhost [test]&gt; select version(); +------------+ | version()&nbsp; | +------------+ | 5.5.10-log | +------------+ 1 row in set (0.00 sec) Doing: root@localhost &gt; create table a (id int) engine=myisam; Query OK, 0 rows affected (0.01 sec) Ok das ist...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[ 

<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">


<br />
<ol>
</ol>
Gegeben:<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">root@localhost
[test]&gt; select version();<br />
+------------+<br />
| version()&nbsp; |<br />
+------------+<br />
| 5.5.10-log |<br />
+------------+<br />
1 row in set (0.00 sec)<br />
<br />
</p>
Doing:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">root@localhost &gt; create table a (id int) engine=myisam;<br />
Query OK, 0 rows affected (0.01 sec)<br />
</p>
Ok das ist nichts ungewöhnliches.<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">root@localhost &gt; create table aa (id int) engine=innodb;<br />
ERROR 1173 (42000): This table type requires a primary key<br />
</p>
<br />Hups das ist aber gar nicht usus einen PK zu fordern.<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">root@localhost &gt; create table aa (id int primary key) engine=innodb;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />
</p>
Und nein es handelt sich hier nicht um eine inkompatible Änderung
seitens MySQL, sondern meinereiner hat riesige Mengen von Code
umgeschrieben :)<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">#
diff mysql-5.5.10/storage/innobase/handler/ha_innodb.cc
mysql-5.5.10/storage/innobase/handler/ha_innodb.cc.old <br />
1635d1634<br />
&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
HA_REQUIRE_PRIMARY_KEY |<br />
</p>
Mir kam die Idee, da ich spätestens bei Row-Based-Replication
nicht Tabellen replizieren will, die <span style="font-style: italic;">keinen
</span>PK haben. Das wäre ja an sich wieder einen Blog wert:) Die
Änderung geht selbstredend für jede andere StorageEngine auch.<br />
<br />
Viel Spaß<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"></p>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"></p>
<br />
]]>
        
    </content>
</entry>

<entry>
    <title>GUUG-Frühjahrsfachgespräch 2011</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/03/guug-fruhjahrsfachgesprach-2011.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.159</id>

    <published>2011-03-29T22:28:00Z</published>
    <updated>2011-03-29T23:17:01Z</updated>

    <summary><![CDATA[Auf dem diesjährigen Frühjahrsfachgespräch hielten&nbsp; Lenz und ich Vorträge zu MySQL. Lenz hielt seinen Vortrag über Replikationstechniken und entfachte eine nette Diskussion zur Semisynchronous Replication. Mein Vortrag mit dem Titel Baukasten MySQL lies leider keinen Raum für Diskussionen:/Was ich an...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="konferenz" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Auf dem diesjährigen Frühjahrsfachgespräch hielten&nbsp; <a href="http://www.lenzg.net/">Lenz</a> und ich Vorträge zu MySQL. Lenz hielt seinen Vortrag über Replikationstechniken und entfachte eine nette Diskussion zur <i>Semisynchronous Replication</i>. Mein <a href="http://linsenraum.de/documents/baukasten_mysql.pdf">Vortrag</a> mit dem Titel Baukasten MySQL lies leider keinen Raum für Diskussionen:/<br /><br />Was ich an der GUUG so mag, ist der akademische Habitus. Die Workshops sind immer wieder ein Genuß. Nicht unbedingt, weil der Vortragende/Leitende zwangsläufig ein Spezialist seines Faches ist, sondern weil es immer eine handvoll erschreckend fitter Teilnehmer gibt, die durch ihre Anregungen, Einwände, Erläuterungen etc. dem Workshop(Vortrag) seine Tiefe geben :D<br /><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>xtrabackup or beware of the DDLs</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/02/xtrabackup-or-beware-of-the-ddls.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.152</id>

    <published>2011-02-21T14:59:03Z</published>
    <updated>2011-02-21T15:37:28Z</updated>

    <summary>Moin,ein paar (innobackupex/xtrabackup)Backups sind hier regelmäßig mit folgender Fehlermeldung abgebrochen:#v+InnoDB: Error: tablespace id is 849127 in the data dictionaryInnoDB: but in file ./bla/table_eav_bla.ibd it is 849130!#v-Dies lag daran, dass das hier zu backupende Schema von einer Applikation (Magento) permanent mit...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Moin,<br />ein paar (innobackupex/xtrabackup)Backups sind hier regelmäßig mit folgender Fehlermeldung abgebrochen:<br />#v+<br />InnoDB: Error: tablespace id is 849127 in the data dictionary<br />InnoDB: but in file ./bla/table_eav_bla.ibd it is 849130!<br />#v-<br />Dies lag daran, dass das hier zu backupende Schema von einer Applikation (Magento) permanent mit <i>[drop|create] table table_eav_bla </i>gefuettert wurde. Das brachte das Skript durcheinander. Der <a href="https://bugs.launchpad.net/percona-xtrabackup/+bug/722638">Bug</a> ist auch schon reportet. Sprich bei Backups ist derzeit darauf zu achten, dass keine DDLs ausgefuehrt werden. Das führt anscheinend zu einem Mismatch von Datadirectory und dem ibd-File. Da die Datei/Tabelle offensichtlich später neu erstellt und kopiert wurde.<br />So gesehen ist derzeit i.e. Magento nicht im laufenden Betrieb mit xtrabackup zu sichern. Es sei denn es werden keinen neuen Artikel eingestellt :)<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Konferenzen im 1. Halbjahr 2011</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2011/02/konferenzen-im-1-halbjahr-2011.html" />
    <id>tag:linsenraum.de,2011:/erkules//2.149</id>

    <published>2011-02-13T00:08:50Z</published>
    <updated>2011-02-14T10:59:41Z</updated>

    <summary>Nun da ich offensichtlich keine Antwort von Netways bekomme, aber das Programm schon steht, wird es Es wird im ersten Halbjahr dieses Jahres noch zwei Vorträge geben.Auf dem CLT halte ich einen Vortrag mit dem Titel LXC: Des Vanilla Kernels...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="konferenz" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="lxc" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[<strike>Nun da ich offensichtlich keine Antwort von Netways bekomme, aber das Programm schon steht, wird es</strike> Es wird im ersten Halbjahr dieses Jahres <strike>noch</strike> zwei Vorträge geben.<br />Auf dem CLT halte ich einen Vortrag mit dem Titel <a href="http://chemnitzer.linux-tage.de/2011/vortraege/652">LXC: Des Vanilla Kernels Container</a>.<br />Hier geht es um eine Virtualisierungslösung, welche anders als KVM, Xen und all die anderen schwerfälligen Lösungen mit minimalem Overhead (und Funktionsumfang:) funktionieren und nach meinem Dafürhalten sogar für Datenbanken geeignet sind.<br />Abgesehen von dem Vortrag <a href="http://chemnitzer.linux-tage.de/2011/vortraege/635">Datenbanken von MySQL zu PostgreSQL portieren</a> vom <a href="http://andreas.scherbaum.la/blog/">ads</a>. Ist im Gegensatz zum letzten Jahr ist MySQL gar nicht vertreten. Hmm ich werde mich da auf jeden Fall rein setzen und wehe er erzählt Bockmist ;)<br />Auf der GUUG gibt es mit <a href="http://www.guug.de/veranstaltungen/ffg2011/abstracts.html#3_2_1">Baukasten MySQL</a> von mir einen Vortrag zur Plugin-Architektur von MySQL/MariaDB und von <a href="http://www.lenzg.net/">Lenz</a> den Vortrag <a href="http://www.guug.de/veranstaltungen/ffg2011/abstracts.html#3_3_1">MySQL Replikationstechnologien</a>. <br />Im Gegensatz zur <a href="http://linsenraum.de/erkules/2010/11/doag-2010-vortragsfolien.html">DOAG</a> werde ich versuchen in der selben Zeit noch MySQL 5.5 abzuspeisen und etwas technischer werden .. Glück auf!<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>MySQL 5.5: Gehversuche</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/12/mysql-55-gehversuche.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.143</id>

    <published>2010-12-18T02:47:51Z</published>
    <updated>2010-12-18T04:17:36Z</updated>

    <summary> 5.5 ist GA! Auch ich will mir die Freiheit nehmen über die MySQL 5.5 zu berichten. Die neuen Features, welche meine Neugierde weckten, werden in einem anderen Blog zusammengefasst. Bereits in den Blogs hier und hier verglich ich PBXT...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[ <h1>5.5 ist GA!</h1>
Auch ich will mir die Freiheit nehmen über die MySQL 5.5
zu berichten. Die neuen Features, welche meine Neugierde weckten,
werden in einem anderen Blog zusammengefasst. <br />Bereits in den Blogs <a href="http://linsenraum.de/erkules/2010/12/pbxt-new-kid-on-the-block.html">hier</a>
und <a href="http://linsenraum.de/erkules/2010/12/pbxt-select.html">hier</a>
verglich ich PBXT vs InnoDB(Plugin 1.0.13) und MySQL&nbsp; 5.5.8 selbst kommt
mit dem Plugin 1.1.8. <br />
Was liegt näher, als die Gelegenheit zu nutzen und&nbsp; ein paar Tests
auf MySQL 5.5zu fahren?<br />
<br />
Für den Vergleich wurde wieder die unten stehende Tabelle mit
300.000.000 Rows genommen.<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">&nbsp;CREATE
TABLE
`rein`
(<br />
&nbsp; `id` int(11) NOT NULL AUTO_INCREMENT,<br />
&nbsp; `id2` int(11) NOT NULL,<br />
&nbsp; `id3` int(11) DEFAULT NULL,<br />
&nbsp; PRIMARY KEY (`id`),<br />
&nbsp; KEY `id2` (`id2`)<br />
) ENGINE=INNODB DEFAULT CHARSET=latin1 <br />
</p>
<h2><br />
</h2>
Wie im letzten Post zu PBXT vs InnoDB. Werden SELECTs und UPDATES
ausgeführt. Einmal über eine kleine Teilmenge (hot), sprich
der ersten Millionen Einträge der Tabelle und ein einmal über
die ganze Tabelle (uniform). Eine SELECT-Testreihe besteht aus
100.000.000 Statements und eine UPDATE-Testreihe aus 100.000
Statements. Im Gegensatz zu den Tests der letzten Blogs, laufen alle
Zugriffe über den PK.<br />
<br />
<h2>Start the fire</h2>
Ich habe es mir einfach gemacht und über die aktuelle 5.1.53 die
5.5.8 installiert. Die Einträge, welche zu 5.1.x Zeiten noch,
dafür sorgten, dass das interne InnoDB ignoriert wird und das
InnoDB-Plugin geladen sind zu entfernen. Schmerzlich musste ich auch
feststellen, dass <span style="font-family: Courier New,Courier,monospace;">SHOW INNODB STATUS</span>
nicht mehr funktioniert. Jetzt wurde durchgegriffen es hat <span style="font-family: Courier New,Courier,monospace;">SHOW ENGINE INNODB
STATUS</span> zu lernen:)<br />
<br />
Es gab immer zwei Durchläufe und der letzte (mit heißem
Cache) wurde gewertet.<br />
<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">SELECT
id3
from rein where ID=@id<br />
</p>
hot:<br />
<img style="width: 680px; height: 480px;" alt="select hot 51v55" src="http://linsenraum.de/erkules/png/select_hot_51vs55.png" /><br />
<br />
uniform:<br />
<img style="width: 680px; height: 480px;" alt="select uniform 51vs55" src="http://linsenraum.de/erkules/png/select_hot_51vs55.png" /><br />
Spontan keinen Grund auf 5.5 zu wechseln.<br />
<br />
Wie sieht es für UPDATEs aus:<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">UPDATE
rein SET id3=round(rand()*10000) where ID=@id<br />
</p>
hot:<br />
<img style="width: 680px; height: 480px;" alt="update hot 51vs55" src="http://linsenraum.de/erkules/png/update_hot_51vs55.png" /><br />
uniform:<br />
<br />
<img style="width: 680px; height: 480px;" alt="update uniform 51vs55" src="http://linsenraum.de/erkules/png/update_uniform_51vs55.png" /><br />
Autsch das tut weh. So gesehen gibt es gar keinen Grund auf 5.5
wechseln zu wollen.<br />
Nun gibt es noch die Variable <a href="http://mikaelronstrom.blogspot.com/2010/09/multiple-buffer-pools-in-mysql-55.html">innodb_buffer_pool_instances</a>.
Da ich mir noch die neuen Möglichkeiten aneignen muss, wurden dieTests auch mal mit innod_buffer_pool_instancs 4,8,16 durchgeführt. Der
Default von innodb_buffer_pool_instances ist bei 1.<br />
(Das Kürzel b4 gibt an wieviel BufferPoolInstanzen konfiguriert
sind. b4-&gt;4, b8-&gt;, b16-&gt;16)<br />
<br />
SELECT<br />
<hr style="width: 100%; height: 2px;">hot:<br />
<img style="width: 680px; height: 480px;" alt="select hot 51vs55 buffer" src="http://linsenraum.de/erkules/png/select_hot_51vs55buffer.png" /><br />
uniform:<br />
<img style="width: 680px; height: 480px;" alt="select uniform 51vs55buffer" src="http://linsenraum.de/erkules/png/select_uniform_51vs55buffer.png" /><br />
Keine großen Sprünge. 5.5 hat ab hoher concurrency die Nase
vorne. Mehrere Bufferpoolinstancen sind hier wohl förderlich.
Trotzalledem ist der gößtmögliche Durchsatz bei allen
mit einer concurrency von 64. Nach einer Ablösung von MySQL 5.1 sieht es beim maximalen Durchsatz nicht aus.<br />
<br />
UPDATE<br />
<hr style="width: 100%; height: 2px;">hot:<br />
<img style="width: 680px; height: 480px;" alt="update_hot_51vs55buffer" src="http://linsenraum.de/erkules/png/update_uniform_51vs55buffer.png" /><br />
uniform:<br />
<img style="width: 680px; height: 480px;" alt="update_hot_51vs55buffer" src="http://linsenraum.de/erkules/png/update_hot_51vs55buffer.png" /><br />
Das ist mal eine Hausnummer. <br />
Sprich bei diesem Workload und Konfiguration ist
innodb_buffer_pool_instances ein MUST. Sonst wird der Aufstieg zu 5.5 ein Abstieg *Schenkelklopfer*.<br />Zumindest kann ich mir gut Vorstellen, dass die Suche nach dem richtigen Wert für innodb_buffer_pool_instances ähnlich turbulent wird, wie schon die Suche nach dem richtigen Wert für innodb_thread_concurrency:)&nbsp; <br />
<br />
<hr style="width: 100%; height: 2px;"><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">#v+
innodb-setting<br />
innodb_buffer_pool_size = 20G<br />
innodb_flush_log_at_trx_commit = 0<br />
innodb_log_file_size = 512M<br />
innodb_log_files_in_group = 3<br />
innodb_file_per_table<br />
innodb_file_format=Barracuda<br />
# innodb_buffer_pool_instances from 1(default),4,8,16 <br />
# und nur bei 5.5<br />
innodb_buffer_pool_instances=4<br />
#v-<br />
</p>
2xCPUx4Cores Intel(R) Xeon(R) X5550@2.67GHz<br />96GBRam<br />
<br />
Viel Spaß<br />
Erkan<br />]]>
        
    </content>
</entry>

<entry>
    <title>PBXT: SELECT</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/12/pbxt-select.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.142</id>

    <published>2010-12-13T01:20:53Z</published>
    <updated>2010-12-18T20:46:16Z</updated>

    <summary><![CDATA[ Dieser Post führt den vorherigen Artikel über PBXT weiter. Diesmal werden mit unterschiedlicher Concurrency SELECTs auf die - 300.000.000 Rows enthaltene - Tabelle gelassen. Zur Erinnerung: &nbsp;CREATE TABLE `rein` ( &nbsp; `id` int(11) NOT NULL AUTO_INCREMENT, &nbsp; `id2` int(11)...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="pbxt" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysqlpbxt" label="mysql pbxt" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[ Dieser
Post führt den <a href="http://linsenraum.de/erkules/2010/12/pbxt-new-kid-on-the-block.html">vorherigen</a>
Artikel über PBXT weiter.<br />
Diesmal werden mit unterschiedlicher Concurrency SELECTs auf die -
300.000.000 Rows enthaltene - Tabelle gelassen. Zur Erinnerung:<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">&nbsp;CREATE
TABLE
`rein`
(<br />
&nbsp; `id` int(11) NOT NULL AUTO_INCREMENT,<br />
&nbsp; `id2` int(11) NOT NULL,<br />
&nbsp; `id3` int(11) DEFAULT NULL,<br />
&nbsp; PRIMARY KEY (`id`),<br />
&nbsp; KEY `id2` (`id2`)<br />
) ENGINE=PBXT DEFAULT CHARSET=latin1 <br />
</p>
<h2><font style="font-size: 1.25em;">Zur Ausgangstabelle:</font></h2>
<br />
Eine Info, die beim vorherigen Post hätte erwähnt werden
müssen ist die Größe der Tabelle.<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">PBXT:<br />
1.2G&nbsp;&nbsp;&nbsp; rein-5.xtr<br />
7.6G&nbsp;&nbsp;&nbsp; rein.xtd<br />
9.8G&nbsp;&nbsp;&nbsp; rein.xti<br />
</p>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">InnoDB:<br />
22G&nbsp;&nbsp;&nbsp;&nbsp; rein.ibd<br />
</p>
Während der PK der Tabelle wohlweislich aus 300.000.000
unterschiedlichen Werten besteht. ist dies beim scondary Index `id2`
nicht der Fall. Dieser hat Werte aus dem Bereich [1,1.000.000]
angenommen. So ist zu erwarten, dass jeder Wert 300 mal angenommen
wird. Dies ist für alle SELECTs, welche via `id2` gehen, wichtig zu wissen!;)<br />
<br />
Da die Datenmenge zu groß ist, habe ich mich entschieden die
Daten via <a href="http://de.wikipedia.org/wiki/Boxplot">Boxplots</a>
darzustellen. Diese Tests dienen nur sich dem Thema PBXT(InnoDB) zu nähern. Tests haben im Allgemeinen zu viele Freiheitsgrade um mehr als das zu liefern. Aber
dies sollte jedem Bekannt sein.<br />
<br />
<h2><font style="font-size: 1.25em;">SELECT</font></h2>
<br />
Die SELECT-Tests bestanden aus 100x1.000 Abfragen. Unterschieden wurde
zwischen hot und uniform. Während bei hot ein Definitionsbereich
von [1,10.000] existierte (für die WHERE-Bedingung), ging es bei
uniform über die ganze Tabelle [1,300.000.000]<br />
<hr style="width: 100%; height: 2px;"><br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">SELEC<img style="width: 680px; height: 480px;" alt="select pk hot" src="http://linsenraum.de/erkules/png/select_pk_hot.png" align="right" />T
id3 from rein where ID=@id<br />
</p>
<br />
Ich will mir nicht die Freiheit nehmen, die Daten zu interpretieren.
Bei diesem Test war ich überrascht, dass InnoDB nicht gnadenlos
gewann, da `id3` ja immer im selben Block wie der PK ist.<br />
<br />

<hr style="width: 100%; height: 2px;"><br /><p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">SELECT
id3 from rein where ID=@id<br />
</p>
<img style="width: 680px; height: 480px;" alt="select pk uniform" src="http://linsenraum.de/erkules/png/select_pk_uniform.png" align="right" /><br />
<br />
<br />PBXT schlägt sich erschreckend gut. Schön ist an der Graphik
zu sehen wie der Durchsatz für beide Engines einer Glockenkurve
gleich verläuft. Sollte dies mehr mit dem Server als mit den
Engines zu tun haben, dann freue ich mich schon auf Tests mit der MySQL
5.5 :)<br />
<br />

<hr style="width: 100%; height: 2px;"><br /><p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">SELECT
count(id3) from rein where id2=@id<br />
</p>
<br />
<img style="width: 680px; height: 480px;" alt="select second hot" src="http://linsenraum.de/erkules/png/select_second_hot.png" align="right" /><br />
<br />
<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><br />
</p>Das InnoDB
via secondary Index schlechter als PK abschneidet ist plausibel. Der Unterschied doch frappant.&nbsp; <br />

<br />
<hr style="width: 100%; height: 2px;"><br /><p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">SELECT
count(id3) from rein where id2=@id<br />
</p>
<img style="width: 680px; height: 480px;" alt="select second uniform" src="http://linsenraum.de/erkules/png/select_second_uniform.png" /><br /><br />
Wie zu erwarten geht der Durchsatz - alsbald auf alle 300.000.000 Rows
zugegriffen wird etwas runter. Eine Erklärung für das
Verhalten von könnte sein, dass PBXT gerade mit einigen
Hintergrundjobs beschäftigt war. Andere Testreihen (auf einem
anderen Rechner und anderer Version) hatten bei 128 keinen Drop im
Durchsatz.<br />
<hr>
<br />Ich für meinen Teil war/bin überrascht, wie gut sich PBXT
schlug. Gerade bei SELECTs via PK hätte ich erwartet, dass InnoDB
hier eindeutig die Nase vorne hat.<br />
<br />
<br />
Viel Spaß<br />
Erkan<br />]]>
        
    </content>
</entry>

<entry>
    <title>PBXT: New Kid on the Block [UPDATE]</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/12/pbxt-new-kid-on-the-block.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.140</id>

    <published>2010-12-08T23:58:58Z</published>
    <updated>2011-01-07T14:30:30Z</updated>

    <summary> PBXT ist eine weitere vielversprechende StorageEngine für MySQL. Eine richtige Einführung soll erst in fernerer Zukunft folgen, doch soll uns das nicht davon abhalten diese StorageEngine schon mal zu testen. Was bietet sich mehr an, als PBXT mit dem...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="pbxt" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysqlpbxt" label="mysql pbxt" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[ 
PBXT
ist
eine weitere vielversprechende StorageEngine für MySQL. Eine
richtige Einführung soll erst in fernerer Zukunft folgen, doch
soll uns das nicht davon abhalten diese StorageEngine schon mal zu
testen.<br />
Was bietet sich mehr an, als PBXT mit dem gegenwärtigen
Platzhirschen InnoDB zu vergleichen?!<br />
Zum Testen wurde die MySQL
5.1.53 verwendet. PBXT fand in der Version 1.5.02 Beta Verwendung. Ich
verwendete
die Beta, da ich in der 1.0.11-7 einen Bug vermutete.<br />
<h2><br /></h2>Doch vorweg einiges, was ich spontan gerne noch an Features bei PBXT sehen würde:<br /><br />
An das InnoDB-Plugin gewohnt, kann man schnell einiges vermissen,&nbsp;
was es bei PBXT nicht gibt. So wäre etwas der Art PBXT_TRX,
PBXT_LOCKS etc. (in Anal<a style="" href="http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_force_recovery"><code class="literal"></code></a>ogie zu InnoDB) hielfreich. Auch wäre
es
schön zu wissen was die Hintergrundthreads von PBXT gerade machen.
Ein Backuptool zum binären Sichern (aka xtrabackup/Innodb Hot
Backup), wie auch die Möglichkeit
Daten zu kompremieren (aka InnoDB-Barracuda) wären schön zu
haben. Ein Äquivalent zu <a href="http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_force_recovery">innodb_force_recovery</a>
habe ich mir auch zwei mal gewünscht.<br />
<h2><br /></h2><h2><b>Tests</b></h2><br />
Von PBXT habe ich quasi keine Ahnung. Hier gilt es noch viele Tests zu
fahren. Bei diesen Tests sollte nicht jedem Commit ein fsync() folgen,
da ich eher die StorageEngines als die Festplatten testen wollte.<br />
Folgende (PBXT/InnoDB)Config wurde verwendet.<br />
<br />
<ul>
<li>InnoDB-Plugin:<br />
innodb_buffer_pool_size = 20G<br />
innodb_flush_log_at_trx_commit = 2<br />
innodb_log_file_size = 512M<br />
innodb_log_files_in_group = 3<br />
innodb_file_per_table<br />
</li>
<li>PBXT:<br />
pbxt_trx_log_buffer_size=8M<br />
pbxt_index_cache_size=8G<br />
pbxt_data_log_threshold=256M<br />
pbxt_record_cache_size=12G<br />
pbxt_trx_log_cache_size=1G<br />
pbxt_flush_log_at_trx_commit=0<br />
pbxt_trx_log_threshold=128M<br />
pbxt_data_file_grow_size=50M<br />
pbxt_row_file_grow_size=10M<br />
pbxt_log_buffer_size=512M<br />
pbxt_data_log_cache_size=1G<br />
pbxt_checkpoint_frequency=64M<br />
pbxt_index_dirty_threshold=60<br />
pbxt_sweeper_priority=2<br />
</li>
</ul>
<br />
<h3><b>Autoincrement</b></h3>
InnoDB liebt Tabellen mit einen auto_increment PK. So hatte sich beim
ersten Test PBXT in einem Bereich zu schlagen, in dem InnoDB sehr gut
ist. <br />
Mit mysqlslap wurden über 8 parallele Verbindungen (mit 8
Verbindungen
hatte ich bis dato immer den besten Durchsatz auf der Maschine)
300.000.000 Zeilen in eine einfache Tabelle zu schreiben
(autocommit=ON).<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">&nbsp;CREATE
TABLE
`rein` (<br />
&nbsp; `id` int(11) NOT NULL AUTO_INCREMENT,<br />
&nbsp; `id2` int(11) NOT NULL,<br />
&nbsp; `id3` int(11) DEFAULT NULL,<br />
&nbsp; PRIMARY KEY (`id`),<br />
&nbsp; KEY `id2` (`id2`)<br />
) ENGINE=PBXT DEFAULT CHARSET=latin1 <br />
</p>
Dies wurde - um auch Daten für die Grafik zu haben - in 300 x
1.000.000 Inserts gesplittet. So beschreibt folgende Grafik wieviel
Sekunden pro 1.000.000 Inserts benötigt wurden. Sprich: Kleinere
Werte sind besser.<br />
<img style="width: 480px; height: 480px;" alt="Zeitverbrauch Insers PBXT vs. InnoDB" src="http://linsenraum.de/erkules/png//insert.png" align="left" /><br />
<br />
<br />
Die ersten paar Millionen Rows laufen für PBXT zwar wunderbar.
Aber dann sackt PBXT förmlich ein. Während InnoDB nahezu
konstant durchmarschirt.<br />
Trägt man auf der x-Achse die Inserts/Sekunde bekommt man sehr
schnell auch ein Gefühl für die Performance.<br />
<img alt="Rows/s" src="http://linsenraum.de/erkules/png//insert-row_pro_s.png" height="480" width="480" align="right" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Von "kleinen" Tabellen abgesehen, gewinnt hier PBXT kein Land.
Unangenehm sind die starken Schwankungen bei PBXT. Ob das an den
Hintergrundthreads lag und wie diese die Last verarbeiten, kann ich
nicht (hoffentlich noch nicht) sagen. Auffällig war allerdings,
dass PBXT das RAID10 stärker zum Anschlag brachte (war fast
durchgängig bei einer %util von 100%) als das InnoDB-Plugin. Mit
knapp über 16000 Inserts pro Sekunde ist PBXT auch nicht wirklich
langsam, aber über 60000 Inserts pro Sekunde bei InnoDB ist schon
entscheidend mehr.<br />
<br />
<h2><br /></h2><h2><b>UUID</b></h2><br />Doch wie
sieht es mit einem Workload aus, bei der InnoDB eben nicht so
schön skaliert? Nun wird als PK UUID() verwendet und zudem
noch ein Text-Column.<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">CREATE
TABLE
`reinUUID` (<br />
&nbsp; `uid` char(32) NOT NULL,<br />
&nbsp; `id` int(11) NOT NULL,<br />
&nbsp; `id2` int(11) NOT NULL,<br />
&nbsp; `mail` text,<br />
&nbsp; PRIMARY KEY (`uid`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1<br />
</p>
<br /><b>[UPDATE: Oli Sennhauser wies mich darauf hin, dass&nbsp;
innodb_flush_log_at_trx_commit = 2 nicht die beste Konfiguration für 
InnoDB ist. Daher wurde der Test für beide auf UUID-PK gehende Tests 
wiederholt. Wobei sowohl für innodb_flush_log_at_trx_commit, alsauch für
 pbxt_flush_log_at_trx_commit. <br />
i := Innodb, p:=pbxt die folgende Zahl gibt jeweils den Wert der Variable an.]</b><br /><br />
<img style="width: 480px; height: 480px;" alt="UUID-Insert-Vergleich" src="http://linsenraum.de/erkules/png//uuid-insert.png" align="left" /><br />
<br />
Hier ist ziemlich eindeutig zu sehen, wie InnoDB sich quasi
verabschiedet. Nach 16000000 Rows brach ich den Versuch dann schlicht und
ergeifend ab. <br />
PBXT hatte - im Vergleich zu InnoDB - keinerlei Probleme mit diesem
Workload. <br />
Um noch ein Gefühl für die Performance zu geben, auch hier
die selben Daten anders dargestellt. <br />
<br />
<img style="width: 480px; height: 480px;" alt="Insert pro Sekunde (UUID)" src="http://linsenraum.de/erkules/png/uuid-insert-pro-sek.png" align="right" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
&nbsp;<br />
An dieser Grafik erkennt man gut, das auch PBXT langsamer wird. Im
Vergleich zu InnoDB ist bei diesem Workload und dieser Config klar PBXT
überlegen und eine interessante Wahl.<br />
<br />
<br />
Beim nächsten mal werden UPDATEs und SELECTs auf PK und secondary
Indizes verglichen. Stay tuned:)<br />
<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>DOAG 2010 Vortragsfolien</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/11/doag-2010-vortragsfolien.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.137</id>

    <published>2010-11-22T01:08:44Z</published>
    <updated>2010-11-22T01:10:40Z</updated>

    <summary>Moinsen hier sind die Vortragsunterlagen für den den MySQL-Plugin-Vortrag auf der DOAG.Viel SpaßErkan...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="konferenz" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="vortrag" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Moinsen <a href="http://linsenraum.de/documents/mysql_plugin.pdf">hier</a> sind die Vortragsunterlagen für den den MySQL-Plugin-Vortrag auf der DOAG.<br /><br />Viel Spaß<br />Erkan<br /> ]]>
        
    </content>
</entry>

<entry>
    <title>DOAG 2010</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/11/doag-2010.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.135</id>

    <published>2010-11-18T07:36:41Z</published>
    <updated>2010-11-18T09:42:07Z</updated>

    <summary>Zwar ist die DOAG noch im vollen Gange, aber zumindest der MySQL-Track ist seit gestern abgeschlossen. Ich war von der schieren Groesse der Konferenz beeindruckt und der MySQL-Raum der vielleicht 50 Leute fasste wirkte auf den erste Blick etwas verloren....</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="konferenz" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="vortrag" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Zwar ist die DOAG noch im vollen Gange, aber zumindest der MySQL-Track ist seit gestern abgeschlossen. Ich war von der schieren Groesse der Konferenz beeindruckt und der MySQL-Raum der vielleicht 50 Leute fasste wirkte auf den erste Blick etwas verloren. <br />Oliver Sennhauser schaffte es mit seinem Vortrag "MySQL Architecturen fuer Oracle DBA's" den Raum zum Bersten zu bringen und legte den passenden Grundstein fuer Track. Der Vortrag von Konstatin Osipov fiel leider aus, so dass Lenz Grimmer in gewohnter souveraener Art Einsprang und ueber die Neuerungen von MySQL 5.5 zu Berichten wusste. (Ich freue mich drauf:). Ihm folgte Mathias Jung mit einer Einfuehrung in MySQL-Backupstrategien. Axiom seines Vortrages war die Unvereinbarkeit der verschiedenen StorageEngines welches ihn dazu fuehrte als einzig wahre Backupstrategie mysqldump und/oder einen Snapshot (beides auf einem Slave) anzubieten. (Hier mag man geteilter Meinung sein.) <br />Nach einer Pause sorgte Ronald Bradford mit seinem Vortrag "MySQL Idiosyncraises That Bites", bei vielen fuer grosse Augen indem er einen grossen Schwenk ueber Pitfalls beim Arbeiten mit MySQL machte. Abgeschlossen wurde der Tag mit meinem Vortrag .. naja. <br />Vom zweiten Tag weiss ich nicht viel zu Berichten, den Vortrag von Mario Beck verpasste ich schlicht und ergreifend, wurde aber mit dem Vortrag von Paul McCullagh ueber PBXT mehr als entschaedigt. Der technischste Vortrag erklaerte die Funktionsweise von PBXT und machte einen Ausblick auf weitere Entwicklungen wie einen 2. Level Cache fuer die Daten auf SSD und Replikation auf Engine-Level. Der Vortrag war so inspirierend, dass wir nicht nur die Mittagspause nutzten um weitere Features fuer PBXT durchzudiskutieren. Hier zeigte sich, dass das klare Design von PBXT vieles verdammt "einfach" zu implementieren macht \o/<br />Die restlichen Vortraege habe ich kaum verfolgen koennen.<br />Das Community-Treffen am Di Abend war sehr ueberschaubar und endete fuer einige mit einem netten Abendessen. <br />Alles in allem eine wohl gelungene Konferenz und definitiv ausbaufaehig. Da mir persoenlich zu teuer, hoffe ich naechstes Jahr wieder als Vortragender beiwohnen zu koennen und mehr Oragglers in Gespraeche zu verwickeln;)<br /><br /> <a href="javascript:PopUp('/konferenz/vortrag_details.php?tag=17.11.2010&amp;id=410540','Kongressplaner',770,544);"></a>]]>
        
    </content>
</entry>

<entry>
    <title>Klopf Klopf - Authentication Framework für MySQL</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/11/klopf-klopf---authentication-framework-fur-mysql.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.133</id>

    <published>2010-11-14T01:41:40Z</published>
    <updated>2010-11-14T01:45:00Z</updated>

    <summary><![CDATA[ Mit MariDB 5.2 - und seit kurzem 10. November (5.5.7-rc) auch mit MySQL - kommt das Pluggable&nbsp;Authentication&nbsp;Framework. Hiermit können weitere Loginmechanismen für MySQL implementiert werden. So kommt MariaDB mit - dem nicht aktivierten -&nbsp; socket_peercred Plugin. Dieses ermöglicht den...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[ Mit MariDB 5.2 - und seit kurzem 10. November (5.5.7-rc) auch mit MySQL
- kommt das Pluggable&nbsp;Authentication&nbsp;Framework. Hiermit
können weitere Loginmechanismen für MySQL implementiert
werden. So kommt MariaDB mit - dem nicht aktivierten -&nbsp;
socket_peercred Plugin. Dieses ermöglicht den Usern sich via dem
Unixaccount zu authentifizieren. Das Plugin schaut einfach nach, unter
welcher UID der sich verbindende (mysql)-Prozess (via getsockopt)
läuft. Dieser Username gilt als authentifiziert&nbsp; Da ich
hierzu keine Doku fand und ich schon am INSTALL scheiterte, ein
schnelles Howto:<code class="highlight fixed" style="white-space: pre-wrap;"></code><br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">INSTALL
PLUGIN socket_peercred SONAME 'auth_socket.so';<br />
</p>
Ab sofort können User mit diesem PLUGIN authetifiziert werden.
I.e.:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">CREATE
USER erkan&nbsp; IDENTIFIED VIA socket_peercred;<br />
</p>
Und nun nicht erschrecken, die Password-Spalte ist leer.<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">MariaDB
[(none)]&gt; select user,host,password from mysql.user where
user='erkan';<br />
+-------+------+----------+<br />
| user&nbsp; | host | password |<br />
+-------+------+----------+<br />
| erkan | %&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
+-------+------+----------+<br />
</p>
Einloggt werden wird trotzalledem nicht:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">mariatestbox:/#
mysql -u erkan<br />
ERROR 1045 (28000): Access denied for user 'erkan'@'localhost' (using
password: NO)<br />
</p>
Aber als UnixUser erkan (ja der erkan ist einer \o/)<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">mariatestbox:/#
su - erkan<br />
erkan@mariatestbox:~$ mysql -u erkan<br />
Welcome to the MariaDB monitor.&nbsp; Commands end with ; or \g.<br />
[snip]<br />
MariaDB [(none)]&gt; \s<br />
--------------<br />
mysql&nbsp; Ver 14.16 Distrib 5.2.2-MariaDB-gamma, for debian-linux-gnu
(x86_64) using readline 5.1<br />
<br />
Connection id:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 37<br />
Current database:<br />
Current
user:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 102);">erkan@localhost</span><br style="color: rgb(0, 0, 102);" />
</p>
Um einen Überblick zu behalten, welche User nun via welchem Plugin
verwaltet werden, muss bei obigen SELECT nur eine weitere Spalte
abgefragt werden:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">select
user,host,password,plugin from mysql.user where user='erkan';<br />
+-------+------+----------+-----------------+<br />
| user&nbsp; | host | password |
plugin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
+-------+------+----------+-----------------+<br />
| erkan | %&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |
socket_peercred |<br />
+-------+------+----------+-----------------+<br />
</p>
Viel Spaß<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"></p>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"></p>
<br />
]]>
        
    </content>
</entry>

<entry>
    <title>The more you ignore me, the closer I get - Plugins fürs Netzwerken</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/11/the-more-you-ignore-me-the-closer-i-get.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.131</id>

    <published>2010-11-03T22:48:13Z</published>
    <updated>2010-11-04T00:23:04Z</updated>

    <summary>Theoretisch unterbaut vom Kleine-Welt-Phänomen und etwas Graphentheorie erquicken sich &quot;Soziale&quot; Netzwerke großer Beliebtheit. Mit Hilfe von Graphen können solche Strukturen aufgezeichnet und bearbeitet/analysiert werden. Selbstredend gibt es mit Neo4j auch eine NoSQL-Version mit der Graphen gebaut werden können. Mit OQGraph...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Theoretisch unterbaut vom <a href="http://de.wikipedia.org/wiki/Kleine-Welt-Ph%C3%A4nomen">Kleine-Welt-Phänomen</a>
und etwas Graphentheorie erquicken sich "Soziale" Netzwerke
großer Beliebtheit. Mit Hilfe von Graphen können solche
Strukturen aufgezeichnet und bearbeitet/analysiert werden. Selbstredend
gibt es
mit <a href="http://neo4j.org/">Neo4j</a> auch eine NoSQL-Version mit
der Graphen gebaut werden können. <br />
Mit <a href="http://openquery.com/products/graph-engine">OQGraph</a>
existiert auch für MySQL ein Plugin, welches sich diesem Thema
gewidmet hat. Der Einfachheit halber wurde zum Vorführen
die MariaDB 5.2.2(gamma) verwendet. Diese hat den Vorteil, dass das
SE-Plugin schon mitgeliefert wird und das Compilieren entfällt.
(Auch wenn es noch via <span style="font-family: Courier New,Courier,monospace;">INSTALL PLUGIN
oqgraph SONAME 'ha_oqgraph.so';</span> installiert/eingebunden werden
muss.)<br />
Doch vorab Graphentheorie <span style="font-style: italic;">light</span>:<br />
Ein Graph <span style="font-style: italic;">G(V<small>ertex</small>,E<small>dge</small>)
</span>besteht aus Knoten (<span style="font-style: italic;">V</span>)
und sie verbindende Kanten/Wege (E). Mit OQGraph hat man einen
gerichteten Graph, sprich jede Kante/Weg hat eine Richtung. Auch
Schlingen sind möglich, also Wege die ein und den selben Knoten
als Anfangs- und Endpunkt haben. Kurzum jede Row welche in eine
Tabelle (ENGINE=OQGRAPH) eingefügt wird entspricht einer Kante und
definiert somit zwei Knoten (wenn es keine Schlinge ist:).<br />
Doch erst mal einen Schritt zurück. Oben haben wir das Plugin
geladen, als StorageEngine-Plugin haben wir nun die Möglichkeit
Tabellen vom Engine-Typ OQGraph zu erstellen. Die Tabellenstruktur ist
dabei vorgegeben und einzuhalten. Sonst gibt es eine Fehlermeldung:<br />
<ol>
</ol>
<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">MariaDB
[graph]&gt; create table failure (id int) engine=oqgraph;<br />
ERROR 1005 (HY000): Can't create table 'graph.failure' (errno: 145)<br />
</p>
<br />
Hier die vorgegebene Struktur<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">
</p>
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">CREATE
TABLE graph (<br />
&nbsp;&nbsp;&nbsp; latch&nbsp;&nbsp; SMALLINT&nbsp; UNSIGNED NULL,<br />
&nbsp;&nbsp;&nbsp; origid&nbsp; BIGINT&nbsp;&nbsp;&nbsp; UNSIGNED NULL,<br />
&nbsp;&nbsp;&nbsp; destid&nbsp; BIGINT&nbsp;&nbsp;&nbsp; UNSIGNED NULL,<br />
&nbsp;&nbsp;&nbsp; weight&nbsp; DOUBLE&nbsp;&nbsp;&nbsp; NULL,<br />
&nbsp;&nbsp;&nbsp; seq&nbsp;&nbsp;&nbsp;&nbsp; BIGINT&nbsp;&nbsp;&nbsp;
UNSIGNED NULL,<br />
&nbsp;&nbsp;&nbsp; linkid&nbsp; BIGINT&nbsp;&nbsp;&nbsp; UNSIGNED NULL,<br />
&nbsp;&nbsp;&nbsp; KEY (latch, origid, destid) USING HASH,<br />
&nbsp;&nbsp;&nbsp; KEY (latch, destid, origid) USING HASH<br />
&nbsp; ) ENGINE=OQGRAPH;<br />
<br />
</p>
Doch fangen wir einfach mal an. Beispiele nach WerKenntWen-Manier sind
wohl etwas abgedroschen. Diese Technik kann auch für z. B.
Routinganalyse genutzt werden. Für unser Beispiel nehmen wir uns
Straßen zum Vorbild. Folgendes wollen wir abbilden:<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="stadt.png" src="http://linsenraum.de/erkules/png/stadt.png" class="mt-image-none" style="" height="275" width="390" /></span><br /><img src="stadt.png" alt="stadt-bild" style="width: 390px; height: 275px;" /><br />
Wir haben 8 befahrene Straßen und eine davon in zwei Richtungen,
dass ergibt 9 Rows/Kanten. (OQGraph kennt nur gerichtete Kanten.)&nbsp;
Zum Einfügen einer Kante (und damit der Definition der Knoten)
reichen die spalten orig<small style="font-style: italic;">in</small>id
und dest<small style="font-style: italic;">ination</small>id.<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">INSERT
INTO stadt (origid,destid) VALUES
(1,2),(2,3),(4,1),(2,5),(5,2),(3,6),(5,4),(6,5),(6,7);<br />
</p>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"></p>
Indem wir bei Abfragen latch setzen, sagen wir der Engine welche
Informationen wir aus dem Graphen wollen, sprich welche interne
Funktion ausgeführt wird. Zum Beispiel latch=0 entspricht keiner
Funktion, holt die Daten aus dem Graphen. Das Ergebnis erhält die
Spalte linkid. Hier fragen wir schlicht, welches sind die nächsten Kreuzungen von 6 ausgehend,<span style="font-family: Courier New,Courier,monospace;"> <br />
<br />
</span>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">MariaDB
[graph]&gt; select linkid from stadt&nbsp; where origid=6 and latch=0 ;<br />
+--------+<br />
| linkid |<br />
+--------+<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 |<br />
+--------+<br />
</p>
Wollen wir den kürzesten Weg, so setzen wir latch=1 via seq
bekommen wir noch die einzelnen Schritte:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">MariaDB
[graph]&gt; select linkid,seq from stadt&nbsp; where origid=6 and
destid=3 and latch=1 ;<br />
+--------+------+<br />
| linkid | seq&nbsp; |<br />
+--------+------+<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 |&nbsp;&nbsp;&nbsp; 0 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 |&nbsp;&nbsp;&nbsp; 1 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 |&nbsp;&nbsp;&nbsp; 2 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 |&nbsp;&nbsp;&nbsp; 3 |<br />
+--------+------+</p>
Der kürzeste Weg von 5 nach 2 ist offensichtlich<span style="font-family: Courier New,Courier,monospace;"> </span>der
direkte.<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">MariaDB
[graph]&gt; select linkid,seq from stadt&nbsp; where origid=5 and
destid=2 and latch=1 ;<br />
+--------+------+<br />
| linkid | seq&nbsp; |<br />
+--------+------+<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 |&nbsp;&nbsp;&nbsp; 0 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 |&nbsp;&nbsp;&nbsp; 1 |<br />
+--------+------+<br />
</p>
Via weight (default=1) werden einzelne Wege gewichtet. Je mehr desto
ungünstiger:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">MariaDB
[graph]&gt; update stadt set weight=10 where origid=5 and destid=2;<br />
Query OK, 1 row affected (0.00 sec)<br />
Rows matched: 1&nbsp; Changed: 1&nbsp; Warnings: 0<br />
<br />
MariaDB [graph]&gt; select linkid,seq from stadt&nbsp; where origid=5
and destid=2 and latch=1 ;<br />
+--------+------+<br />
| linkid | seq&nbsp; |<br />
+--------+------+<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 |&nbsp;&nbsp;&nbsp; 0 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 |&nbsp;&nbsp;&nbsp; 1 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp; 2 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 |&nbsp;&nbsp;&nbsp; 3 |<br />
+--------+------+<br />
4 rows in set (0.00 sec)<br />
<br />
</p>
Und schon ist der direkte Weg so ungünstig, dass der Umweg um den
Häuserblock sich lohnt. latch=2 tut so, als wäre für
alle weight=1:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">MariaDB
[graph]&gt; select linkid,seq from stadt&nbsp; where origid=5 and
destid=2 and latch=2 ;<br />
+--------+------+<br />
| linkid | seq&nbsp; |<br />
+--------+------+<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 |&nbsp;&nbsp;&nbsp; 0 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 |&nbsp;&nbsp;&nbsp; 1 |<br />
+--------+------+<br />
<br />
</p>
<br />
Es ist auch möglich herauszubekommen, welche Nodes/Kreuzungen zwei
Kanten/Straßen entfernt sind:<br /><br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">MariaDB
[graph]&gt; select linkid,weight from stadt&nbsp; where origid=1&nbsp;
and latch=2 and weight=2;<br />
+--------+--------+<br />
| linkid | weight |<br />
+--------+--------+<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 |<br />
+--------+--------+<br />
</p>
Arbeiten mit OQGraph mach schon Spaß, doch es gibt noch eine
Anzahl an Limitierungen. So zum Beispiel Table Locking, keine
Transaktionen und in Memory only. <a href="http://openquery.com/graph/doc">OpenQuery</a> sucht nach
Sponsoren, um diese Limitierungen (Daten auf Storage) zu beheben.<br />
<br />
Für alle deren Englisch so miserabel wie meins ist:<br />
<div style="margin-left: 40px; font-style: italic;">If you have a need
for persistence, more speed on larger datasets, and increased storage
efficiency, please contact <a href="http://openquery.com/contact">Open
Query</a>. You'll probably want the backend storage to be on SSD, but
HD will technically work. The pricing for that edition is simple, $/EUR
5000.&nbsp; Licensing also GPLv2+&nbsp;unless you have other needs.<br />
<span style="font-style: italic;"><br />
</span></div>
<div style="margin-left: 40px;"><span style="font-style: italic;"><span style="font-style: italic;"></span></span>Damit ist nicht gemeint,
dass schon etwas existiert. Musste selbst im #irc nachfragen, da ich
dies vermutet hatte:)<br />
Ganz im Gegenteil wird nach Sponsoren gesucht. Das war ein kurzer
Einblick. Auf die Dokumentation ist verlinkt und viel Spaß beim
selber Spielen;)<br />
</div><div><br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Vortrag auf der DOAG</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/11/vortrag-auf-der-doag.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.129</id>

    <published>2010-11-02T09:28:22Z</published>
    <updated>2010-11-02T09:36:30Z</updated>

    <summary>Moinsen,werde am 16.11 auf der DOAG über das Pluginkonzept von MySQL, wie einige Plugins referieren dürfen.Geplant ist ein managertauglicher Vortrag:)...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="konferenz" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Moinsen,<br />werde am 16.11 auf der DOAG über das Pluginkonzept von MySQL, wie einige Plugins <a href="http://mydoag.doag.org/konferenz/vortrag_details.php?id=409892">referieren</a> dürfen.<br />Geplant ist ein managertauglicher Vortrag:)<br /><br /> ]]>
        
    </content>
</entry>

<entry>
    <title>Q4M: Schlange stehen mit MySQL</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/10/q4m-schlange-stehen-mit-mysql.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.123</id>

    <published>2010-10-07T23:05:58Z</published>
    <updated>2010-10-07T23:12:54Z</updated>

    <summary><![CDATA[ Q4M (Queue for MySQL) ist ein StorageEngine (SE-Plugin) f&uuml;r MySQL, welches sich der sicheren &Uuml;bertragung und asynchronem Queing von Nachrichten (Rows) verschrieben hat. Queuing selbst erf&auml;hrt sp&auml;testens seitdem es auch eine NoSQL-Implementierung (RabbitMQ) gibt, den entsprechenden Hype:) Selbst hatte...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[ 
Q4M (Queue for MySQL) ist ein StorageEngine (SE-Plugin) f&uuml;r MySQL,
welches sich der sicheren &Uuml;bertragung und asynchronem Queing von
Nachrichten (Rows)
verschrieben hat. Queuing selbst erf&auml;hrt sp&auml;testens seitdem
es auch eine NoSQL-Implementierung (RabbitMQ) gibt, den entsprechenden
Hype:) <br>
Selbst hatte ich noch nicht das Vergn&uuml;gen eine
Verwendung daf&uuml;r zu haben. Wer sch&ouml;ne Verwendungsbeispiele
hat bitte posten. <br>
Die offizielle <a href="http://q4m.31tools.com/install.php">Installation</a>
werde ich&nbsp; vereinfachen und hier auf ein Beispiel f&uuml;r
MySQL(5.1.41-3ubuntu12.6) auf
Ubuntu runterbrechen. Genaugenommen ben&ouml;ten wir nur das SE-Plugin,
welche wir in das plugin_dir unserer Installation kopieren
m&uuml;&szlig;en.<br>
<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">mysql&gt;
select
VARIABLE_VALUE
from
information_schema.GLOBAL_VARIABLES
WHERE
VARIABLE_NAME='plugin_dir';<br>
+-----------------------+<br>
| VARIABLE_VALUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>
+-----------------------+<br>
| /usr/lib/mysql/plugin |<br>
+-----------------------+<br>
1 row in set (0.00 sec)<br>
</p>
Von der Website holen wir das passende tar-File. Aus diesem brauchen
wir
nur die libqueue_engine.so welche nach <span
style="font-family: Courier New,Courier,monospace;">plugin_dir</span>
kopiert wird.<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">&gt;
wget
http://q4m.31tools.com/dist/old/mysql-5.1.41-linux-x86_64-glibc23-with-fast-mutexes-q4m-0.8.9.tar.gz<br>
&gt; tar xfz
mysql-5.1.41-linux-x86_64-glibc23-with-fast-mutexes-q4m-0.8.9.tar.gz<br>
&gt; cp q4m-0.8.9-linux-x86_64/libqueue_engine.so /usr/lib/mysql/plugin<br>
</p>
Nach Installation ist noch die Datei install.sql auszuf&uuml;hren.
install.sql hat folgenden Inhalt.<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">INSTALL
PLUGIN
queue
SONAME
'libqueue_engine.so';<br>
CREATE FUNCTION queue_wait RETURNS INT SONAME 'libqueue_engine.so';<br>
CREATE FUNCTION queue_end RETURNS INT SONAME 'libqueue_engine.so';<br>
CREATE FUNCTION queue_abort RETURNS INT SONAME 'libqueue_engine.so';<br>
CREATE FUNCTION queue_rowid RETURNS INT SONAME 'libqueue_engine.so';<br>
CREATE FUNCTION queue_set_srcid RETURNS INT SONAME 'libqueue_engine.so';<br>
</p>
Neben der Installation des Plugins (erste Zeile), werden nocht die UDFs
<span style="font-family: Courier New,Courier,monospace;">queue_wait()</span>,
<span style="font-family: Courier New,Courier,monospace;">queue_end()</span>,
<span style="font-family: Courier New,Courier,monospace;">queue_abort()</span>,
<span style="font-family: Courier New,Courier,monospace;">queue_rowid()
</span>und <span style="font-family: Courier New,Courier,monospace;">queue_set_srcid()</span>
installiert. Zur Kontrolle:<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">mysql&gt;
show
plugins;<br>
+------------+----------+----------------+--------------------+---------+<br>
| Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Status&nbsp;&nbsp; |
Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |
Library&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
License
|<br>
+------------+----------+----------------+--------------------+---------+<br>
| binlog&nbsp;&nbsp;&nbsp;&nbsp; | ACTIVE&nbsp;&nbsp; | STORAGE ENGINE
|
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
GPL&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
| partition&nbsp; | ACTIVE&nbsp;&nbsp; | STORAGE ENGINE |
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
GPL&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
| ARCHIVE&nbsp;&nbsp;&nbsp; | ACTIVE&nbsp;&nbsp; | STORAGE ENGINE |
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
GPL&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
| BLACKHOLE&nbsp; | ACTIVE&nbsp;&nbsp; | STORAGE ENGINE |
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
GPL&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
| CSV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ACTIVE&nbsp;&nbsp; |
STORAGE ENGINE |
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
GPL&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
| FEDERATED&nbsp; | DISABLED | STORAGE ENGINE |
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
GPL&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
| MEMORY&nbsp;&nbsp;&nbsp;&nbsp; | ACTIVE&nbsp;&nbsp; | STORAGE ENGINE
|
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
GPL&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
| InnoDB&nbsp;&nbsp;&nbsp;&nbsp; | ACTIVE&nbsp;&nbsp; | STORAGE ENGINE
|
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
GPL&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
| MyISAM&nbsp;&nbsp;&nbsp;&nbsp; | ACTIVE&nbsp;&nbsp; | STORAGE ENGINE
|
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
GPL&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
| MRG_MYISAM | ACTIVE&nbsp;&nbsp; | STORAGE ENGINE |
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
GPL&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
<span style="color: rgb(102, 0, 204);">|
QUEUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ACTIVE&nbsp;&nbsp; | STORAGE
ENGINE | libqueue_engine.so | GPL&nbsp;&nbsp;&nbsp;&nbsp; |</span><br>
+------------+----------+----------------+--------------------+---------+<br>
</p>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">mysql&gt;
select
*
from
mysql.func;<br>
+-----------------+-----+--------------------+----------+<br>
|
name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
| ret |
dl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|
type&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
+-----------------+-----+--------------------+----------+<br>
| queue_wait&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 2 |
libqueue_engine.so | function |<br>
| queue_end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 2 |
libqueue_engine.so | function |<br>
| queue_abort&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 2 |
libqueue_engine.so | function |<br>
| queue_rowid&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 2 |
libqueue_engine.so | function |<br>
| queue_set_srcid |&nbsp;&nbsp; 2 | libqueue_engine.so | function |<br>
+-----------------+-----+--------------------+----------+<br>
</p>
Trickfrage: Warum wird Q4M nicht funktionieren, wenn MySQLd mit <em>skip</em>-<em>grant</em>-<em>tables
</em>gestartet wird? :)<br>
<br>
Nun sind Tabellen mit der Engine <span
style="font-family: Courier New,Courier,monospace;">Queue</span>
erstellbar. Jede dieser Tabelle stellt eine Queue dar. Wobei die SE <span
style="font-family: Courier New,Courier,monospace;">Queue</span> weder
Indizes, noch UPDATEs oder REPLACEs beherrscht. Auch binlog aka
Replikation wird nicht unterst&uuml;tzt. <br>
Rows/Nachrichten werden
durch gewohnte INSERTs in die Tabelle(n) geschrieben. Die installierten
UDFs bringen die Abfrage in den Queue(Owner)-Modus.
In
diesem
wird sicher gestellt, dass eine Nachricht welche abgholt
- <span style="font-family: Courier New,Courier,monospace;">queue_wait()</span>
- wird von dem <span
style="font-family: Courier New,Courier,monospace;">queue_wait()</span>
einer anderen Verbindung nicht mehr
gesehen wird und die Abholgung
endg&uuml;ltig vollzogen (rows_removed) ist, wenn ein weiteres <span
style="font-family: Courier New,Courier,monospace;">queue_wait()</span>
oder&nbsp;
<span style="font-family: Courier New,Courier,monospace;">queue_end()</span>
abgesetzt wird.<br>
Ein <span style="font-family: Courier New,Courier,monospace;">queue_abort()
</span>oder sonst ein Abbruch der Verbindung
bel&auml;&szlig;t die Nachricht/Row in der Queue/Tabelle und macht
diese f&uuml;r die n&auml;chste Abfrage wieder sichtbar.<br>
<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">1.client&gt;
create
table
message_q (num int not null, poster varchar(255), message
varchar(255)) <span style="color: rgb(0, 0, 102);">engine=queue</span>;<br>
Query OK, 0 rows affected (0.03 sec)<br>
<br>
1.client&gt; insert into message_q values(1,'mama','komm
essen'),(2,'papa','pflanze einen
baum'),(3,'chef','%&amp;#%$'),(4,'kind','spielen');<br>
Query OK, 4 rows affected (0.00 sec)<br>
Records: 4&nbsp; Duplicates: 0&nbsp; Warnings: 0</p>
Wir reservieren uns im ersten Client die erste Zeile der Queue:<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">1.client&gt;
select
*
from message_q where queue_wait('message_q');<br>
+-----+--------+------------+<br>
| num | poster | message&nbsp;&nbsp;&nbsp; |<br>
+-----+--------+------------+<br>
|&nbsp;&nbsp; 1 | mama&nbsp;&nbsp; | komm essen |<br>
+-----+--------+------------+<br>
1 row in set (0.00 sec)</p>
Wir haben die erste Nachricht und sagen der Engine, dass wir diese
erhalten haben:<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">1.client&gt;
select
queue_end('message_q');<br>
+------------------------+<br>
| queue_end('message_q') |<br>
+------------------------+<br>
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1
|<br>
+------------------------+<br>
1 row in set (0.00 sec)</p>
Im zweiten Client reservieren wir nun die n&auml;chste Nachricht:<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">2.client&gt;
select
*
from message_q where queue_wait('message_q');<br>
+-----+--------+--------------------+<br>
| num | poster |
message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
+-----+--------+--------------------+<br>
|&nbsp;&nbsp; 2 | papa&nbsp;&nbsp; | pflanze einen baum |<br>
+-----+--------+--------------------+<br>
1 row in set (0.00 sec)<br>
</p>
Es ist - wie zu erwarten war die zweite Nachricht.&nbsp; Im ersten
Client
holen wir nun wieder eine Nachricht. Es ist die dritte Nachricht. Zu
beachten ist, dass der zweite Client (oben) die Nachricht noch nicht
endg&uuml;ltig abgeholt hat.<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">1.client&gt;
select
*
from message_q where queue_wait('message_q');<br>
+-----+--------+---------+<br>
| num | poster | message |<br>
+-----+--------+---------+<br>
|&nbsp;&nbsp; 3 | chef&nbsp;&nbsp; | %&amp;#%$&nbsp;&nbsp; |<br>
+-----+--------+---------+<br>
1 row in set (0.00 sec)</p>
Der zweite Client gibt die Reservierung auf und holt die Nachricht
nicht ab.<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">2.client&gt;
select
queue_abort('message_q');<br>
+--------------------------+<br>
| queue_abort('message_q') |<br>
+--------------------------+<br>
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1
|<br>
+--------------------------+<br>
1 row in set (0.00 sec)</p>
Woraufhin der erste Client mit einem queue_wait() die eben abgeholte
Nachricht drei als abgeholt meldet und sich die nun wieder freie
zweite Nachricht reserviert.<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">1.client&gt;
select
*
from message_q where queue_wait('message_q');<br>
+-----+--------+--------------------+<br>
| num | poster |
message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
+-----+--------+--------------------+<br>
|&nbsp;&nbsp; 2 | papa&nbsp;&nbsp; | pflanze einen baum |<br>
+-----+--------+--------------------+<br>
1 row in set (0.00 sec)<br>
<br>
</p>
Sollte die Queue leer sein, blockiert/wartet queue_wait() bis eine
Eingabe kommt. Der Default liebt bei 60 Sekunden, kann aber selbst
definiert werden.<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">1.client&gt;
select
*
from message_q where queue_wait('message_q',3);<br>
Empty set (2.62 sec)<br>
</p>
Q4M beherrscht auch Vergleichsoperatoren (f&uuml;r nicht
Strings/Blobs). <br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">1.client&gt;
select
*
from message_q where queue_wait('message_q:<span
style="color: rgb(0, 0, 102);">num=3</span>');<br>
+-----+--------+---------+<br>
| <span style="color: rgb(0, 0, 102);">num</span> | poster | message |<br>
+-----+--------+---------+<br>
|&nbsp;&nbsp; <span style="color: rgb(0, 0, 102);">3</span> |
chef&nbsp;&nbsp; | %&amp;#%$&nbsp;&nbsp; |<br>
+-----+--------+---------+<br>
1 row in set (0.00 sec)<br>
<br>
</p>
Mit SHOW ENGINE QUEUE STATUS ist ein &Uuml;berblick &uuml;ber die
Statusvariablen der Queue-Engine zu erhalten.<br>
<p
style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">mysql&gt;
show engine queue status\G<br>
*************************** 1. row ***************************<br>
&nbsp; Type: QUEUE<br>
&nbsp; Name: <br>
Status: <br>
I/O calls<br>
------------------------------------<br>
sys_read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1<br>
sys_write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14<br>
sys_sync&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14<br>
read_cachehit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
0<br>
<br>
Writer thread<br>
------------------------------------<br>
append&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3<br>
remove&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10<br>
<br>
Conditional subscription<br>
------------------------------------<br>
evaluation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5<br>
compile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1<br>
compile_cachehit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
0<br>
<br>
High-level stats<br>
------------------------------------<br>
rows_written&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12<br>
rows_removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10<br>
queue_wait&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12<br>
queue_end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3<br>
queue_abort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1<br>
queue_rowid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
0<br>
queue_set_srcid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
0<br>
<br>
</p>
Bei Q4M handelt es sich um eine nette spezialisierte Engine. Zwar wurde
hier nicht die aktuellste Version vorgestellt, doch zum Spielen reicht
es allemal. Mit<span style="font-family: Courier New,Courier,monospace;">
q4m-forward</span>&nbsp; bietet Q4M zudem Nachrichten von
einem MySQLd zum n&auml;chsten Server <span
style="font-family: Courier New,Courier,monospace;"></span>
zu &uuml;bermitteln. Einiges ist noch im <a
href="http://q4m.31tools.com/tutorial.php">Tutorial</a> nachzulesen.
Viel Spa&szlig;:)<br>
<br>]]>
        
    </content>
</entry>

<entry>
    <title>AppArmor, Ubuntu, MySQL und InnoDB-Plugin </title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/09/apparmor-ubuntu-mysql-und-innodb-plugin.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.118</id>

    <published>2010-09-08T22:34:00Z</published>
    <updated>2010-09-08T23:28:59Z</updated>

    <summary>Da ich von dem InnoDB-Plugin sehr begeistert bin, konfiguriere ich es - wenn möglich - nach jeder Paketinstallation. Das OS meines neuen Rootservers (Ubuntu 10.04) kommt mit MySQL 5.1.41-3ubuntu12.6, so muß nur folgendes in die /etc/mysql/my.cnf eingefügt werden um das...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[<p>Da ich von dem InnoDB-Plugin sehr begeistert bin, konfiguriere ich es - wenn möglich - nach jeder Paketinstallation. <br />Das OS meines neuen Rootservers (Ubuntu 10.04) kommt mit MySQL 5.1.41-3ubuntu12.6, <br />so muß nur folgendes in die /etc/mysql/my.cnf eingefügt werden um das InnoDB-Plugin zu aktivieren.<br /><br /><br />
<font style="background-color: rgb(240, 192, 172);"><tt></p>

<p>ignore-builtin-innodb<br /><br />plugin-load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so<br />
</tt></font><br />
<br /><br />(Es handelt sich um zwei Zeilen, die erste verhindert das Laden der internen InnoDB-Engine und die zweite Zeile lädt das Plugin.)<br /><br />So die Theorie, doch im Errorlog ist folgendes zu lesen:<br /><br /><br />
<font style="background-color: rgb(240, 192, 172);"><tt><br />
<br />100909&nbsp; 0:16:27 [ERROR] Can't open shared library '/usr/lib/mysql/plugin/ha_innodb_plugin.so' (errno: 0 failed to map segment from shared object: Permission denied)<br />
</tt></font><br />
<br /><br />Hier verbietet AppArmor mmap auf das InnoDB-Plugin. Selbstredend kann auf AppArmor&nbsp; verzichtet und deaktiviert werden. (Dienst stoppen und aus dem Runlevel entfernen.)<br /></p>

<p>Soll AppArmor aber weiter genutzt werden, ist es notwendig die Konfiguration anzupassen:) <br />
Der (/usr/sbin/)mysqld hat laut /etc/apparmor.d/usr.sbin.mysqld bereits Zugriff auf <br />&nbsp; /var/lib/mysql/** rwk,<br /><br /><br />
Sprich folgende Zeile hinzufügen:<br />
<font style="background-color: rgb(240, 192, 172);"><tt><br />
<br />&nbsp;/usr/lib/mysql/plugin/* m,<br />
</tt></font><br />
<br />AppArmor reloaden und Spaß haben :)<br /><br /><br /> </p>]]>
        
    </content>
</entry>

<entry>
    <title>SELECT UUID() aber nur wenn ohne Replikation!</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/08/select-uuid-aber-nur-wenn-ohne-replikation.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.113</id>

    <published>2010-08-22T22:44:55Z</published>
    <updated>2010-08-22T22:58:39Z</updated>

    <summary>Ich musste wahrlich schmunzeln, denn dieser Blog ist so lesbar, dass bei einer aktiven Replikation kein SELECT UUID() möglich ist. Ohne jetzt auf aktive und passive Replikation eingehen zu wollen - vor allem weil ich von der Begrifflichkeit überfordert bin...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Ich musste wahrlich schmunzeln, denn <a href="http://www.yourhelpcenter.de/2010/07/mysql-eindeutige-id-uid-erzeugen/">dieser Blog</a> ist so lesbar, dass bei einer aktiven Replikation kein SELECT UUID() möglich ist. Ohne jetzt auf aktive und passive Replikation eingehen zu wollen - vor allem weil ich von der Begrifflichkeit überfordert bin - können via/mit UUID() veränderte Daten - Hierfür ist SELECT nicht der erste Kandidat - repliziert werden.<br />Merke: MySQL kann mehr als SBR.<br />RTFM :)<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Als sich nach einem Update von Etch auf Lenny die MySQL-Replikation verabschiedete.</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/07/als-sich-nach-einem-update-von-etch-auf-lenny-die-mysql-replikation-verabschiedete.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.107</id>

    <published>2010-07-01T20:30:26Z</published>
    <updated>2011-01-19T15:05:33Z</updated>

    <summary>Dieser Blog beschreibt, wie das Ignorieren von Warnings und Verlassen auf Default(s|namen) die Replikation lahmlegte und warum trotzdem die Replikation nicht neu aufgebaut werden musste.Und alles weil die Benamsung von den relay_log_files und dem dazugehörigen Index sich geändert hat.Was war...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Dieser Blog beschreibt, wie das Ignorieren von Warnings und Verlassen auf Default(s|namen) die Replikation lahmlegte und warum trotzdem die Replikation nicht neu aufgebaut werden musste.<br />Und alles weil die Benamsung von den relay_log_files und dem dazugehörigen Index sich geändert hat.<br /><br />Was war geschehen:<br />Nach dem Distupgrade eines Slaves von Etch auf Lenny (hier in einem Testsystem nachgestellt) wird unter anderem MySQL upgedated:<br /><br /><font style="background-color: rgb(240, 192, 172);"><tt>
Preparing to replace mysql-server-5.0 5.0.32-7etch12 (using .../mysql-server-5.0_5.0.51a-24+lenny4_i386.deb) ...</tt></font>
<br /><br />Der darauffolgende Start des MySQLd füllte das Errorlog wie folgt:<br /><br />
<font style="background-color: rgb(240, 192, 172);"><tt>
100630&nbsp; 1:19:06 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use<br />+'--relay-log=mysqld-relay-bin' to avoid this problem.<br />100630&nbsp; 1:19:06 [ERROR] Failed to open the relay log './slave1-relay-bin.000002' (relay_log_pos 408)<br />100630&nbsp; 1:19:06 [ERROR] Could not find target log during relay log initialization<br />100630&nbsp; 1:19:06 [ERROR] Failed to initialize the master info structure<br />100630&nbsp; 1:19:06 [Note] mysqld: ready for connections.
</tt></font>

<br /><br />Vorneweg gesagt: Hätte ich die Warnings beherzigt, wäre es nicht zu dem Problem gekommen.<br />Die Default-Benamsung der RelayLogs hat sich zwischen den Versionen geädert.<br />Hier die Relevanten Files:<br /><br />1. Für Debian 4.0<br />relay-log.info<br />slave4-relay-bin.index<br />slave4-relay-bin.000002<br /><br />2. Für Debian 5.0<br />relay-log.info<br />mysqld-relay-bin.index<br />mysqld-relay-bin.000003<br /><br />Sprich in Etch (4.0) wurde noch der Hostname im Dateinamen der RelayLogs mit eingearbeitet. In Lenny (5.0) wird statt des hostname das formschöne mysqld verwendet.<br /><br />Nach einem Update schaut MySQL nun im in der relay-log.info. Dieser Name hat sich nicht geändert, wird damit nicht neu erstellt und enthält noch die Dateien/Einträge, welche es auch schon vor dem Update hatte.<br />Damit es nicht falsch verstanden wird. Die Daten wollen wir auch behalten! Immerhin sind dies Daten, die der SQL-Thread der Replikation noch einspielen soll.<br /><br />Schauen wir mal auf diesem Testsystem nach.<br /><br />
<font style="background-color: rgb(240, 192, 172);"><tt>

# cat relay-log.info<br />./slave4-relay-bin.000002<br />408<br />mysql-bin.000009<br />13977
</tt></font>

<br /><br /><br />Um ./slave4-relay-bin.000002 zu finden schaut MySQL nun im neu erstellten mysqld-relay-bin.index nach, welcher selbst nur Einträge ala mysqld-relay.bin.... hat, anstatt wie noch vor dem Upgrade in (dem alten) slave4-relay-bin.index.<br />Daher kommt es dann zu der Fehlermeldung.<br /><br />
<font style="background-color: rgb(240, 192, 172);"><tt>

100630&nbsp; 1:19:06 [ERROR] Failed to open the relay log './slave1-relay-bin.000002' (relay_log_pos 408)
</tt></font>

<br /><br />Das heisst nicht, das die Datei nicht im Filesystem existiert. Es heisst schlicht, sie steht nicht in der (neuen) IndexDatei:)<br /><br />Das beherzte Setzen von relay-log in der my.cnf hätte mich vor obigen Ärger bewahrt.<br /><br />Aber anstatt die Replikation *neu* Aufzubauen, reicht es die neue Index-Datei (mysqld-relay-bin.index) um die Informationen zu den alten Dateien zu erweitern.<br />Dazu einfach den Inhalt der slave4-relay-bin.index an den Anfang der mysqld-relay-bin.index schreiben.<br />Dann kennt MySQL auch die alten RelayLogs.<br /><br />Moral: Don't ignore the Warnings!<br />:)<br /><br /> ]]>
        
    </content>
</entry>

<entry>
    <title>KILLen reicht doch!</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/05/killen-reicht-doch.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.98</id>

    <published>2010-05-16T20:11:32Z</published>
    <updated>2010-07-04T15:18:29Z</updated>

    <summary>Diese Weisheit scheint den &quot;Killerspielen&quot; entnommen und so manch ein Pädagoge mag seine Warnung bestätigt finden, dass dem Spielen analoge Verhaltensmuster in anderen Kommunikationsfeldern wirkkräfig werden.Nun denn:In letzter Zeit habe ich mich mit init-Skripten beschäftigt und bin über die Konstruktion...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Diese Weisheit scheint den "Killerspielen" entnommen und so manch ein Pädagoge mag seine Warnung bestätigt finden, dass dem Spielen analoge Verhaltensmuster in anderen Kommunikationsfeldern wirkkräfig werden.<br /><br />Nun denn:<br />In letzter Zeit habe ich mich mit init-Skripten beschäftigt und bin über die Konstruktion gestolpert, dass MySQL via <i>mysqladmin shutdown</i> herunter gefahren werden soll.<br />So portabel diese Konstruktion auch ist, es passiert nichts anderes als bei einem (weniger portablem) <i>kill -TERM</i> (<a href="http://dev.mysql.com/doc/refman/5.1/en/server-shutdown.html">Doku</a>).<br />IMHO *das* Argument gegen  <i>mysqladmin shutdown </i>ist:<br /><font style="background-color: rgb(240, 192, 172);"><tt>ERROR 1040 (HY000): Too many connection</tt></font><br />Sprich: mysqladmin kann sich nicht mal mit dem mysqld verbinden um diesen herunter zu fahren.<br />Beim nächsten mysql-blog wird dann gezeigt, wann obige Pädagogen Recht bekommen und KILL eben doch keine Lösung ist ;-)<br /><br /><br /> <div><br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Und wer hilft jetzt beim Migrieren von Oraggle auf MySQL?</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/03/und-wer-hilft-jetzt-beim-migrieren-von-oraggle-auf-mysql.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.85</id>

    <published>2010-03-08T22:51:24Z</published>
    <updated>2010-07-04T15:19:17Z</updated>

    <summary><![CDATA[Gegeben folgende Seiten:http://web.archive.org/web/20080502185553/http://www.mysql.com/why-mysql/migration/undhttp://www.mysql.com/why-mysql/migration/Auf beiden Seiten wird Oracle gefunden. Tipp: Die Differenz, die Differenz!&nbsp; :-D...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Gegeben folgende Seiten:<br /><a href="http://web.archive.org/web/20080502185553/http://www.mysql.com/why-mysql/migration/">http://web.archive.org/web/20080502185553/http://www.mysql.com/why-mysql/migration/</a><br />und<br /><a href="http://www.mysql.com/why-mysql/migration/">http://www.mysql.com/why-mysql/migration/</a><br /><br />Auf beiden Seiten wird Oracle gefunden. <br /><br />Tipp: Die Differenz, die Differenz!&nbsp; :-D<br /> <div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>information_schema dumpen?!</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/03/information-schema-dumpen.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.82</id>

    <published>2010-03-07T00:28:54Z</published>
    <updated>2010-03-07T03:28:59Z</updated>

    <summary>Etwas irritiert war ich über die doch offensichtliche Sinnlosigkeit das information_schema zu dumpen. Etwas was phpMyAdmin explizit anbieten soll.Das information_schema ist dem /proc unter Linux vergleichbar. Es wird nichts weiter gemacht, als Informationen zu aggregieren. Anders als /proc, in dem...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Etwas irritiert war ich über die doch offensichtliche Sinnlosigkeit das information_schema zu dumpen. Etwas was phpMyAdmin explizit anbieten soll.<br />Das information_schema ist dem /proc unter Linux vergleichbar. Es wird nichts weiter gemacht, als Informationen zu aggregieren. Anders als /proc, in dem einige Werte gesetzt werden können, ist das information_schema read only. <br />Sprich information_schema zu dumpen hat keinen Sinn, weil sich <br /><br />1. die Informationen eh aus der laufenden Datenbank ergeben und<br />2. das information_schema - wie schon erwähnt - nicht beschreibbar ist. <br /><blockquote><br />mysql&gt; insert into ENGINES values('erkan','YES',NULL,'NO','NO','NO');<br />ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'<br /><br /></blockquote>Angst insofern "kaputte" Dumps zu haben, als dass diese nicht mehr eingespielt werden können, brauch mensch nicht. <br />Mysqldump ignoriert das information_schema defaultmäßig. <br /><blockquote><br /></blockquote><blockquote>mysqldump does not dump the INFORMATION_SCHEMA database by default. As of MySQL 5.1.38, mysqldump dumps INFORMATION_SCHEMA if you name it explicitly on the command line, although currently you must also use the --skip-lock-tables option. Before 5.1.38, mysqldump silently ignores INFORMATION_SCHEMA even if you name it explicitly on the command line.<br /></blockquote><br />Nun ab 5.1.38 ist das <i>explizite </i>Dumpen vom information_schema möglich.<br /><br /><font style="font-size: 1.25em;">Warum</font><font style="font-size: 1.25em;"> s<font style="font-size: 0.8em;"><font style="font-size: 1.25em;">ollte man das information_schema dumpen</font><font style="font-size: 1.25em;">?</font><br /><br /></font></font>Das information_schema bietet eine Menge Informationen der Datenbank kompakt an, welche andererseits umständlicher zusammengetragen werden müssten.<br />Neben Informationen über das Datenbanklayout, finden sich sich auch die Konfigurationsparameter des laufenden Prozesses, Statistiken der Tabellen usw. <br />Mit dem Dump vom information_schema erhält man all diese Informationen auf eine einfache und kompakte Weise. <br />So können regelmäßige Dumps des information_schema weniger zu Backupzwecken, als zum Monitoren und Archivieren von Datenbankinformationen dienen.<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Partitinionierung .. was eine Gaudi</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/02/partitinionierung-was-eine-gaudi.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.78</id>

    <published>2010-02-18T20:29:27Z</published>
    <updated>2010-07-04T15:20:02Z</updated>

    <summary><![CDATA[Partitionierung gibt es seit MySQL 5.1. Eine sehr praktische Technik mit Eigenheiten:Gewohnt jeder Tabelle einen PK zu geben, aber nicht nach dem PK, sondern nach einer anderen Spalte - hier jahr - zu partitionieren, antwortet MySQL wiefolgt:mysql&gt; create table au...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Partitionierung gibt es seit MySQL 5.1. Eine sehr praktische Technik mit Eigenheiten:<br /><br />Gewohnt jeder Tabelle einen PK zu geben, aber nicht nach dem PK, sondern nach einer anderen Spalte - hier jahr - zu partitionieren, antwortet MySQL wiefolgt:<br /><br /><blockquote><br />mysql&gt; create table au ( id int not
null auto_increment key, jahr
date, wichtig int) engine=myisam partition by range(year(jahr))<br />

(PARTITION p0 VALUES LESS THAN(2000), <br />

PARTITION p1 VALUES LESS THAN(2005), <br />

PARTITION p2 VALUES LESS THAN(2010), <br />

PARTITION p3 VALUES LESS THAN(MAXVALUE));<br />
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function<br /></blockquote>Hierbei handelt es sich um eine dokumentierte Einschränkung:<br /><br /><blockquote>All columns used in the partitioning expression for a partitioned table
must be part of every unique key that the table may have .. <a href="http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html">RTFM</a>&nbsp; <br /><br /></blockquote><blockquote></blockquote>Sprich ein UNIQUE Index über (id,date) würde nicht mehr zu einer Fehlermeldung führen: <br /><br /><blockquote>mysql&gt; create table au ( id int not null auto_increment, jahr date, wichtig int,&nbsp; primary key&nbsp; `aaa` (id,jahr)) engine=myisam partition by range(year(jahr))<br />(PARTITION p0 VALUES LESS THAN(2000), <br />PARTITION p1 VALUES LESS THAN(2005), <br />PARTITION p2 VALUES LESS THAN(2010), <br />PARTITION p3 VALUES LESS THAN(MAXVALUE));<br />Query OK, 0 rows affected (0,01 sec)<br /><br /></blockquote><blockquote></blockquote>Gut! Nun ist aber id nicht mehr UNIQUE .. schlecht! <br /><br />Den einzigen Würgaround, den ich bis dato gefunden habe, ist die Checks auf UNIQUE in eine andere Tabelle auszulagern und mit einem Trigger zu "prüfen".<br /><br /><blockquote>mysql&gt; CREATE TABLE id_check (id int KEY);<br />Query OK, 0 rows affected (0,01 sec)<br />mysql&gt; CREATE TRIGGER `unique_chk_trg` BEFORE INSERT ON au FOR EACH ROW INSERT INTO id_check VALUES(NEW.id);<br />Query OK, 0 rows affected (0,00 sec)<br /></blockquote>Desgleichen noch für UPDATE und DELETE. Diese Lösung kostet natürlich Performance und die Trigger werden z.B. bei einem TRUNCATE nicht abgefeuert.<br /><br /><u><font style="font-size: 1.25em;">Wieso Weshalb Warum</font> (ist das so?)</u><br /><br />Ein Blick ins Dateisystem zeigt, warum - wenn vorhanden - via UNIQUE Indizes partitioniert werden muss.<br /><blockquote>&gt; ls -1 au*I<br />au#P#p0.MYI<br />au#P#p1.MYI<br />au#P#p2.MYI<br />au#P#p3.MYI<br /></blockquote>Dies war der Grund warum ENGINE=MyISAM verwendet wurde (was man eigentlich nicht mehr will).&nbsp; Bei MyISAM sind die Indexdateien (MYI) im Dateisystem sichtbar und man erkennt hier, dass die vier Partitionen separate Index-Dateien haben. Würden nun UNIQUE-Indizes nicht Teil der Partitionierungslogik sein, könnte über die disjunkten Dateien hinweg nicht mehr garantiert werden, dass UNIQUE Indizes weiterhin UNIQUE sind.<br /><br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Fun mit civicrm</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/02/fun-mit-civicrm.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.76</id>

    <published>2010-02-10T22:15:03Z</published>
    <updated>2010-07-04T15:21:17Z</updated>

    <summary>Heute schlug eine nette Query aus civicrm in #mysql.de auf SELECT DISTINCT UPPER(LEFT(contact_a.sort_name, 1)) as sort_name FROM civicrm_contact contact_a LEFT JOIN civicrm_group_contact `civicrm_group_contact-101` ON contact_a.id = `civicrm_group_contact-101`.contact_id LEFT JOIN civicrm_group_contact `civicrm_group_contact-102` ON contact_a.id = `civicrm_group_contact-102`.contact_id LEFT JOIN civicrm_group_contact `civicrm_group_contact-46` ON...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="civicrm" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[Heute schlug eine nette Query aus <a href="http://civicrm.org/">civicrm</a> in #mysql.de auf<br /><br /><pre><span class="pygment"> </span><span class="pygmentk">SELECT</span><span class="pygment"> </span><span class="pygmentk">DISTINCT</span><span class="pygment"> </span><span class="pygmentnf">UPPER</span><span class="pygmentp">(</span><span class="pygmentk">LEFT</span><span class="pygmentp">(</span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">sort_name</span><span class="pygmentp">,</span><span class="pygment"> </span><span class="pygmentmi">1</span><span class="pygmentp">))</span><span class="pygment"> </span><span class="pygmentk">as</span><span class="pygment"> </span><span class="pygmentn">sort_name</span><span class="pygment">  </span><br /><span class="pygmentk">FROM</span><span class="pygment"> </span><span class="pygmentn">civicrm_contact</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygment">  </span><br /><span class="pygment">  </span><span class="pygmentk">LEFT</span><span class="pygment"> </span><span class="pygmentk">JOIN</span><span class="pygment"> </span><span class="pygmentn">civicrm_group_contact</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-101`</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentk">ON</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-101`</span><span class="pygmentp">.</span><span class="pygmentn">contact_id</span><span class="pygment">    </span><br /><span class="pygment">  </span><span class="pygmentk">LEFT</span><span class="pygment"> </span><span class="pygmentk">JOIN</span><span class="pygment"> </span><span class="pygmentn">civicrm_group_contact</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-102`</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentk">ON</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-102`</span><span class="pygmentp">.</span><span class="pygmentn">contact_id</span><span class="pygment">    </span><br /><span class="pygment">  </span><span class="pygmentk">LEFT</span><span class="pygment"> </span><span class="pygmentk">JOIN</span><span class="pygment"> </span><span class="pygmentn">civicrm_group_contact</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-46`</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentk">ON</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-46`</span><span class="pygmentp">.</span><span class="pygmentn">contact_id</span><span class="pygment">    </span><br /><span class="pygment">  </span><span class="pygmentk">LEFT</span><span class="pygment"> </span><span class="pygmentk">JOIN</span><span class="pygment"> </span><span class="pygmentn">civicrm_group_contact</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-60`</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentk">ON</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-60`</span><span class="pygmentp">.</span><span class="pygmentn">contact_id</span><span class="pygment">    </span><br /><span class="pygment">  </span><span class="pygmentk">LEFT</span><span class="pygment"> </span><span class="pygmentk">JOIN</span><span class="pygment"> </span><span class="pygmentn">civicrm_group_contact</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-6`</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentk">ON</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-6`</span><span class="pygmentp">.</span><span class="pygmentn">contact_id</span><span class="pygment">    </span><br /><span class="pygment">  </span><span class="pygmentk">LEFT</span><span class="pygment"> </span><span class="pygmentk">JOIN</span><span class="pygment"> </span><span class="pygmentn">civicrm_group_contact</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-94`</span><span class="pygment"> </span><br /><span class="pygment">   </span><span class="pygmentk">ON</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-94`</span><span class="pygmentp">.</span><span class="pygmentn">contact_id</span><span class="pygment">    </span><br /><span class="pygment">  </span><span class="pygmentk">LEFT</span><span class="pygment"> </span><span class="pygmentk">JOIN</span><span class="pygment"> </span><span class="pygmentn">civicrm_group_contact</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-95`</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentk">ON</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-95`</span><span class="pygmentp">.</span><span class="pygmentn">contact_id</span><span class="pygment">    </span><br /><span class="pygment">  </span><span class="pygmentk">LEFT</span><span class="pygment"> </span><span class="pygmentk">JOIN</span><span class="pygment"> </span><span class="pygmentn">civicrm_group_contact</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-97`</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentk">ON</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-97`</span><span class="pygmentp">.</span><span class="pygmentn">contact_id</span><span class="pygment">    </span><br /><span class="pygment">  </span><span class="pygmentk">LEFT</span><span class="pygment"> </span><span class="pygmentk">JOIN</span><span class="pygment"> </span><span class="pygmentn">civicrm_group_contact</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-99`</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentk">ON</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-99`</span><span class="pygmentp">.</span><span class="pygmentn">contact_id</span><span class="pygment">    </span><br /><span class="pygment">  </span><span class="pygmentk">LEFT</span><span class="pygment"> </span><span class="pygmentk">JOIN</span><span class="pygment"> </span><span class="pygmentn">civicrm_group_contact_cache</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact_cache_6`</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentk">ON</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact_cache_6`</span><span class="pygmentp">.</span><span class="pygmentn">contact_id</span><span class="pygment">   </span><br /><span class="pygmentk">WHERE</span><span class="pygment">  </span><br /><span class="pygment">  </span><span class="pygmentp">(</span><span class="pygment"> </span><br /><span class="pygment">   </span><span class="pygmentp">(</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-6`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentmi">6</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">     </span><span class="pygmentk">AND</span><span class="pygment"> </span><br /><span class="pygment">      </span><span class="pygmentss">`civicrm_group_contact-6`</span><span class="pygmentp">.</span><span class="pygmentn">status</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygments2">"Added"</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">     </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">     </span><span class="pygmentk">OR</span><span class="pygment"> </span><br /><span class="pygment">     </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact_cache_6`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmento">=</span><span class="pygment"> </span><span class="pygmentmi">6</span><span class="pygment"> </span><br /><span class="pygment">     </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentp">)</span><span class="pygment"></span><br /><span class="pygment">   </span><span class="pygmentp">)</span><span class="pygment">  </span><br /><span class="pygment">   </span><span class="pygmentk">AND</span><span class="pygment">  </span><br /><span class="pygment">   </span><span class="pygmentp">(</span><span class="pygment">  </span><br /><span class="pygment">    </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-6`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentmi">6</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">    </span><span class="pygmentk">AND</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-6`</span><span class="pygmentp">.</span><span class="pygmentn">status</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygments2">"Added"</span><span class="pygmentp">)</span><span class="pygment"></span><br /><span class="pygment">   </span><span class="pygmentp">)</span><span class="pygment">  </span><br /><span class="pygment">   </span><span class="pygmentk">OR</span><span class="pygment">  </span><br /><span class="pygment">   </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-46`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentmi">46</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">   </span><span class="pygmentk">AND</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-46`</span><span class="pygmentp">.</span><span class="pygmentn">status</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygments2">"Added"</span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">   </span><span class="pygmentp">)</span><span class="pygment">  </span><br /><span class="pygment">  </span><span class="pygmentk">OR</span><span class="pygment">  </span><br /><span class="pygment">   </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-60`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentmi">60</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">   </span><span class="pygmentk">AND</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-60`</span><span class="pygmentp">.</span><span class="pygmentn">status</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygments2">"Added"</span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">  </span><span class="pygmentp">)</span><span class="pygment"> </span><span class="pygmentk">OR</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-94`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentmi">94</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">  </span><span class="pygmentk">AND</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-94`</span><span class="pygmentp">.</span><span class="pygmentn">status</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygments2">"Added"</span><span class="pygmentp">)</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment">  </span><br /><span class="pygment">  </span><span class="pygmentk">OR</span><span class="pygment">  </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-95`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentmi">95</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">  </span><span class="pygmentk">AND</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-95`</span><span class="pygmentp">.</span><span class="pygmentn">status</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygments2">"Added"</span><span class="pygmentp">)</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment">  </span><br /><span class="pygment">  </span><span class="pygmentk">OR</span><span class="pygment">  </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-97`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentmi">97</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">  </span><span class="pygmentk">AND</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-97`</span><span class="pygmentp">.</span><span class="pygmentn">status</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygments2">"Added"</span><span class="pygmentp">)</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment">  </span><br /><span class="pygment">  </span><span class="pygmentk">OR</span><span class="pygment">  </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-99`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentmi">99</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">  </span><span class="pygmentk">AND</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-99`</span><span class="pygmentp">.</span><span class="pygmentn">status</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygments2">"Added"</span><span class="pygmentp">)</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment">   </span><br /><span class="pygment">  </span><span class="pygmentk">OR</span><span class="pygment">  </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-101`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentmi">101</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">  </span><span class="pygmentk">AND</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-101`</span><span class="pygmentp">.</span><span class="pygmentn">status</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygments2">"Added"</span><span class="pygmentp">)</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment">  </span><br /><span class="pygment">  </span><span class="pygmentk">OR</span><span class="pygment">  </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-102`</span><span class="pygmentp">.</span><span class="pygmentn">group_id</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygment"> </span><span class="pygmentmi">102</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment"> </span><br /><span class="pygment">  </span><span class="pygmentk">AND</span><span class="pygment"> </span><span class="pygmentss">`civicrm_group_contact-102`</span><span class="pygmentp">.</span><span class="pygmentn">status</span><span class="pygment"> </span><span class="pygmentk">IN</span><span class="pygment"> </span><span class="pygmentp">(</span><span class="pygments2">"Added"</span><span class="pygmentp">)</span><span class="pygment"> </span><span class="pygmentp">)</span><span class="pygment">  </span><span class="pygmentp">);</span><br /><br />Was sich die Entwickler dabei dachten ist mir nicht klar, denn es ist nichts anderes als<br /><br /><span class="pygment"></span><span class="pygmentk">SELECT</span><span class="pygment"> </span><span class="pygmentk">DISTINCT</span><span class="pygment"> </span><span class="pygmentnf">UPPER</span><span class="pygmentp">(</span><span class="pygmentk">LEFT</span><span class="pygmentp">(</span><span class="pygmentn">contact_a</span><span class="pygmentp">.</span><span class="pygmentn">sort_name</span><span class="pygmentp">,</span><span class="pygment"> </span><span class="pygmentmi">1</span><span class="pygmentp">))</span><span class="pygment"> </span><span class="pygmentk">as</span><span class="pygment"> </span><span class="pygmentn">sort_name</span><span class="pygment">  </span><br /><span class="pygmentk">FROM</span><span class="pygment"> </span><span class="pygmentn">civicrm_contact</span><span class="pygment"> </span><span class="pygmentn">contact_a</span><span class="pygment"></span>;<br /><br />Sprich die Menge aller Großbuchstaben des ersten Buchstaben von sort_name.<br /><br />*kopfkratz*<br /><br />Danke an Rince der mit der Query in #mysql.de aufschlug.<br />Wer Lust hat ist gerne eingeladen auch im irc aufzuschlagen:)<br /></pre><br /> ]]>
        
    </content>
</entry>

</feed>
