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

<channel>
	<title>PHP / MySQL / Linux Stories &#187; mysql</title>
	<atom:link href="http://xfragger.de/category/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://xfragger.de</link>
	<description>Meine Erfahrungen in der Webentwicklerwelt</description>
	<lastBuildDate>Wed, 03 Nov 2010 06:35:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>MySQL: Index über mehrere Spalten</title>
		<link>http://xfragger.de/246/mysql-index-uber-mehrere-spalten</link>
		<comments>http://xfragger.de/246/mysql-index-uber-mehrere-spalten#comments</comments>
		<pubDate>Wed, 21 Apr 2010 19:41:58 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[optimierung]]></category>
		<category><![CDATA[query optimierung]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=246</guid>
		<description><![CDATA[Ich habe bereits mehrfach mitbekommen, dass anscheinend kaum jemand weiß, dass man Indizes auch über mehrere Spalten anlegen kann. Zuerst sollte erwähnt werden, dass MySQL im Normalfall pro Query nur EINEN pro Tabelle Index auf einmal nutzen kann (es gibt Ausnahmen, merged-index, aber nur unter bestimmten Umständen in bestimmten Queries). Ein Beispiel für den Einsatz [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe bereits mehrfach mitbekommen, dass anscheinend kaum jemand weiß, dass man Indizes auch über mehrere Spalten anlegen kann.</p>
<p>Zuerst sollte erwähnt werden, dass MySQL im Normalfall pro Query nur EINEN pro Tabelle Index auf einmal nutzen kann (es gibt Ausnahmen, merged-index, aber nur unter bestimmten Umständen in bestimmten Queries).</p>
<p>Ein Beispiel für den Einsatz eines Index über mehrere Spalten, wäre z.B. das folgende:</p>
<p><span id="more-246"></span>Eine Tabelle, in welcher Nachrichten zwischen Benutzern aufbewahrt werden, folgende Spalten sind vorhanden:</p>
<p>ID (int), receiverUserID(int), senderUserID(int), subject(varchar), text(text), time(int)</p>
<p>Wollen wir nun alle Nachrichten finden, die User 123 an User 234 geschickt hat und das Ergebnis noch nach Zeit sortieren, brauchen wir folgendes Query:</p>
<pre>
SELECT ID, subject, text, time
FROM message
WHERE receiverUserID = 234 AND senderUserID = 123
ORDER BY time ASC
</pre>
<p>Zuerst fällt auf, dass man die Nachrichten nach ID sortieren kann, was im Normalfall besser ist, als nach time, da wir davon ausgehen, dass die ID sich von Nachricht zu Nachricht um eins erhöht und die neusten somit die höchsten IDs haben.</p>
<p>Ohne das Wissen, dass es mehrspaltige Indizes gibt, würde man einen Index auf receiverUserID oder senderUserID legen, alternativ sogar beides, allerdings würde MySQL dann nur einen von beiden nutzen.<br />
Also legt man einen über beide an, was bei großen Datenmengen einen extremen Geschwindigkeitsschub bringen kann.</p>
<p>Um die Sortierung nun auch noch über den Index zu regeln, könnten man als dritte Spalte nun noch die ID in den Index aufnehmen, was allerdings nur sinnig ist, wenn man davon ausgeht, dass das Ergebnis wirklich viele Ergebnisse erzielen wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/246/mysql-index-uber-mehrere-spalten/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>High Performance MySQL Konfiguration &#8211; my.cnf</title>
		<link>http://xfragger.de/243/high-performance-mysql-konfiguration-my-cnf</link>
		<comments>http://xfragger.de/243/high-performance-mysql-konfiguration-my-cnf#comments</comments>
		<pubDate>Fri, 02 Apr 2010 10:37:38 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[high performance]]></category>
		<category><![CDATA[konfiguration]]></category>
		<category><![CDATA[my.cnf]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=243</guid>
		<description><![CDATA[Ich beschäftige mich aus beruflichen Gründen schon recht lange mit der Thematik und möchte das gesammelte Wissen nun mal niederschreiben. Es gibt definitiv keine Konfiguration, die allgemeingültig ist, aber ich versuche hiermit eine Hilfestellung zu geben, wie man die besten Werte für die eigenen Bedürfnisse findet. Nicht nur der Server spielt eine Rolle, auch die [...]]]></description>
			<content:encoded><![CDATA[<p>Ich beschäftige mich aus beruflichen Gründen schon recht lange mit der Thematik und möchte das gesammelte Wissen nun mal niederschreiben.</p>
<p>Es gibt definitiv keine Konfiguration, die allgemeingültig ist, aber ich versuche hiermit eine Hilfestellung zu geben, wie man die besten Werte für die eigenen Bedürfnisse findet.</p>
<p>Nicht nur der Server spielt eine Rolle, auch die Storage-Engine, um sich viel Stress zu ersparen, sollte man im vorraus planen, was man braucht und für welche Engine man sich entscheidet. Auch hier gibt es keine Universallösung, jede hat ihre Vor- und Nachteile, aber darauf will ich in diesem Eintrag nicht eingehen.</p>
<p>Da ich für das aktuell laufende Projekt nur InnoDB einsetze, beziehen sich die Ratschläge auf eine reine InnoDB Konfiguration und sollten ab MySQL Version 5.0 funktionieren.</p>
<p><span id="more-243"></span>&#8220;<strong>innodb_dirty_pages_pct</strong>&#8221;<br />
Gibt an, wie viele  InnoDB-Buffer-Pages im RAM vorhanden sein dürfen, ohne auf Festplatte geschrieben worden zu sein. Standard ist 90%, was für die meisten Umgebungen absolut OK sein sollte.</p>
<p>&#8220;<strong>thread_cache_size</strong>&#8221;<br />
Wie viele Threads dürfen sich im Cache befinden? Jede Verbindung zum Server braucht einen eigenen Thread, ist die Verbindung beendet, kann der Thread im Cache gelagert werden und steht der nächsten Verbindung zur Verfügung. Threads zu erstellen ist unnötiger Overhead, &#8220;SHOW GLOBAL STATUS&#8221; auf der MySQL Konsole gibt in der Variable &#8220;threads_created&#8221; aus, wie viele Threads erstellt werden. Dieser Wert sollte um maximal 10 pro Sekunde steigen, steigt er schneller, kann der Thread-cache vergrößert werden.</p>
<p>&#8220;<strong>table_definition_cache</strong>&#8221;<br />
Sollte größer oder gleich der Anzahl der vorhandenen Tabellen sein um unnötigen I/O Overhead zu ersparen.</p>
<p>&#8220;<strong>innodb_open_files</strong>&#8221;<br />
Sollte größer oder gleich der Anzahl der vorhandenen .ibd Dateien im MySQL-Datenverzeichnis sein (bei Debian meistens /var/lib/mysql).</p>
<p>&#8220;<strong>innodb_log_buffer_size</strong>&#8221;<br />
Die globale Variable &#8220;innodb_os_log_written&#8221; hilft hier bei der Ermittlung eines sinnvollen Wertes, der Wert sollte nicht zu schnell steigen, hier kann I/O Performance gewonnen werden.</p>
<p>&#8220;<strong>skip_name_resolve</strong>&#8221;<br />
Sollte aktiv sein, damit nicht für jeden Client 2 DNS-Lookups stattfinden, gleichzeitig bedeutet dies, dass Berechtigungen nur noch auf IP und nicht auf Hostnamen-Ebene verteilt werden können.</p>
<p>&#8220;<strong>innodb_flush_method</strong>&#8221;<br />
Falls ein Hardware-Raid mit ordentlichem Cache und Battery-Backup genutzt wird, sollte hier 0_direct eingestellt werden, um zu verhindern, dass OS-Buffer genutzt werden, welche das Logfile unbrauchbar machen könnten, wenn der Server abstürzt.</p>
<p>&#8220;<strong>innodb_flush_log_at_trx</strong>&#8221;<br />
Sollte auf 1 gestellt werden, damit jede beendete Transaktion sofort im Binarylog landet, um Datenverlust zu verhindern, falls der Server abstürzt. Der Wert 1 ist der beste Kompromiss zwischen Performance und Datensicherheit!</p>
<p>Diverse Key-Buffers und andere Caches (ausgenommen dem Query-Cache) können sehr klein gehalten werden (nicht abschalten, MySQL nutzt MyISAM für die Metatabellen). Hier würde nur sinnlos RAM belegt werden!</p>
<p>Auf Linux-Systemen sollte die <strong>swappiness</strong> noch auf 0 oder 1 gestellt werden, um zu verhindern, dass der Kernel MySQL Buffers in den SWAP-Space verschiebt, falls diese länger nicht genutzt werden. Swap-I/O ist weitaus schlimmer als normaler HDD-I/O, da MySQL &#8220;denkt&#8221; es würde mit schnellem RAM arbeiten, welcher in Wirklichkeit aber auf der HDD im Swap zu finden ist. Auf Debian-Systemen kann man diesen Wert mittels /etc/sysctl.conf setzen (vm.swappiness = 0) und danach &#8220;sysctl -p&#8221; ausführen.</p>
<p>Der restlich verfügbare Arbeitsspeicher sollte dem <strong>InnoDB-Buffer-Pool</strong> zur Verfügung gestellt werden, ist dieser groß genug, kann auf nahezu alle HDD-Leseabfragen verzichtet werden und es entsteht nahezu nur noch Schreib-I/O.</p>
<p>Es gibt noch weitere Einstellungen bezüglich des InnoDB-Tablespace und allgemeinen Einstellungen, falls hier noch Intresse besteht, hinterlasst nen Kommentar, werde dann versuchen zeitnah einen weiteren Beitrag zu schreiben.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/243/high-performance-mysql-konfiguration-my-cnf/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objekte serialisiert in einer MySQL Datenbank ablegen</title>
		<link>http://xfragger.de/223/objekte-serialisiert-in-einer-mysql-datenbank-ablegen</link>
		<comments>http://xfragger.de/223/objekte-serialisiert-in-einer-mysql-datenbank-ablegen#comments</comments>
		<pubDate>Fri, 22 Jan 2010 15:46:14 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[serialize]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=223</guid>
		<description><![CDATA[Die Meinungen, ob man komplette Objekte ablegen sollte oder nicht, gehen sehr auseinander. Dagegen spricht zum Beispiel, dass man nicht mehr nach Inhalten in einem Objekt suchen kann oder immer der komplette Text neugeschrieben werden muss, auch wenn man nur eine Zahl ändert. Dafür spricht auch einiges, jedenfalls geht es mir darum, dass ich heute [...]]]></description>
			<content:encoded><![CDATA[<p>Die Meinungen, ob man komplette Objekte ablegen sollte oder nicht, gehen sehr auseinander.<br />
Dagegen spricht zum Beispiel, dass man nicht mehr nach Inhalten in einem Objekt suchen kann oder immer der komplette Text neugeschrieben werden muss, auch wenn man nur eine Zahl ändert. Dafür spricht auch einiges, jedenfalls geht es mir darum, dass ich heute vor einem Problem stand.<br />
<span id="more-223"></span><br />
Folgendes Konstrukt habe ich serialisiert (mittels serialize), in ein utf8-unicode-ci TEXT Feld gespeichert. Nach dem auslesen beschwerte sich unserialize über ungültige Daten und mit dem Objekt war nichts mehr anzufangen.</p>
<pre>
class Address {
  /*diverse Properties, hauptsächlich Strings*/
}
class MethodSpecial extends Method {
  /*diverse andere Properties*/
}
abtract class Method {
  protected $address;
  public function setAddress(Address $address){
    $this-&gt;address = $address;
  }
}

$address = new Address(.....);
$method = new SpecialMethod(....);
$method-&gt;setAddress($address);

$string = serialize($method);
</pre>
<p>Gibt man $string mit einem einfachen echo aus, fällt auf, dass hier komische Sonderzeichen vorhanden sind, speichert man das ganze in ein TEXT Feld in einer Tabelle, werden aus diesen Zeichen Sternchen. Das unserialize schlägt fehl.</p>
<p>Nun gibt es zwei Ansätze, dieses Problem zu lösen:<br />
1. base64_encode und base64_decode: einfach den String vorher kodieren und dann speichern, beim auslesen dann erst dekodieren und danach deserialisieren.<br />
2. GLOB bzw. BLOB statt TEXT als Feldtyp nutzen (nicht von mir getestet, der Tip wurde mit von einem Bekannten gegeben)</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/223/objekte-serialisiert-in-einer-mysql-datenbank-ablegen/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Case-Sensitivity in MySQL</title>
		<link>http://xfragger.de/191/case-sensitivity-in-mysql</link>
		<comments>http://xfragger.de/191/case-sensitivity-in-mysql#comments</comments>
		<pubDate>Sat, 21 Nov 2009 20:16:42 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[case sensitivity]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=191</guid>
		<description><![CDATA[Konnte es selbst nicht glauben, aber ich war aus irgendeinem Grund sehr lange der Meinung, dass Queries mit &#8220;WHERE field = &#8216;value&#8217;&#8221; case-sensitiv sind und &#8220;WHERE LIKE &#8216;value&#8217;&#8221; nicht. Die Annahme ist komplett Falsch und es hängt alleine vom Charset (Collation) des Datenbankfeldes ab. Die meisten Standardcharset haben ein &#8220;_ci&#8221; am Ende ihres Namens, dies [...]]]></description>
			<content:encoded><![CDATA[<p>Konnte es selbst nicht glauben, aber ich war aus irgendeinem Grund sehr lange der Meinung, dass Queries mit &#8220;WHERE field = &#8216;value&#8217;&#8221; case-sensitiv sind und &#8220;WHERE LIKE &#8216;value&#8217;&#8221; nicht. Die Annahme ist komplett Falsch und es hängt alleine vom Charset (Collation) des Datenbankfeldes ab. Die meisten Standardcharset haben ein &#8220;_ci&#8221; am Ende ihres Namens, dies steht für &#8220;case-insensitive&#8221;. <span id="more-191"></span><br />
Beim genaueren &#8220;darüber-nachdenken&#8221; viel mir auf, dass es meistens absolut ausreichend ist, wenn das Query nicht case-sensitiv ist, weshalb ich mir anscheinend nie gedanken darüber machte. Nun gibt es zwei Möglichkeiten, wie man explizit nach Groß- oder Kleinschreibung sucht. Entweder man erstellt das Datenbankfeld bereits in einem binären Datentyp (z.B. latin1_bin oder utf8_bin) oder man baut sein Query ein wenig um.</p>
<p>Welche Möglichkeit man nutzt, hängt davon, ob man eben einfach nur ein kurzes Query abfeuern will oder ob es für die Applikation an sich nötig ist.<br />
Problem an der zweiten Lösung ist, dass diese immer in einem Full-table-scan endet, da jedes Textfeld in einen binären Datentyp umgewandelt werden muss, um zu suchen. Hier ein Beispiel:</p>
<pre>
SELECT * FROM data
WHERE field COLLATE utf8_bin = 'Abc'
</pre>
<p>Umgekehrt geht das ganze natürlich auch, falls man case-unsnsitiv in einem binären Datentyp suchen will.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/191/case-sensitivity-in-mysql/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Peformanceoptimierung: GROUP BY</title>
		<link>http://xfragger.de/179/sql-peformanceoptimierung-group-by</link>
		<comments>http://xfragger.de/179/sql-peformanceoptimierung-group-by#comments</comments>
		<pubDate>Mon, 07 Sep 2009 10:03:41 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[group by]]></category>
		<category><![CDATA[optimierung]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=179</guid>
		<description><![CDATA[Wenn möglich, sollte GROUP BY normalerweise verhindert werden. Es sorgt in (fast) jedem Fall für temp-Tables, die den Server unter Umständen recht schnell an seine Grenzen treiben (RAM, CPU). Oft kann man hier auf simple Subselects (oder Derived-Queries) zurückgreifen, um an die gewünschten Infos zu kommen. Für den Fall, dass ein GROUP BY aber sein [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn möglich, sollte GROUP BY normalerweise verhindert werden. Es sorgt in (fast) jedem Fall für temp-Tables, die den Server unter Umständen recht schnell an seine Grenzen treiben (RAM, CPU). Oft kann man hier auf simple Subselects (oder Derived-Queries) zurückgreifen, um an die gewünschten Infos zu kommen.</p>
<p>Für den Fall, dass ein GROUP BY aber sein muss, das Ergebnis aber keiner Sortierung bedarf, sollte man  ein ORDER BY NULL hinzufügen, da MySQL das grupperte Ergebnis sortiert, durch das Sortieren nach NULL, verhindert man dies und kann das Query unter Umständen noch beschleunigen.</p>
<pre>
SELECT a, COUNT(b) FROM test_table GROUP BY a ORDER BY NULL;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/179/sql-peformanceoptimierung-group-by/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Loadbalance Mysql Slaves</title>
		<link>http://xfragger.de/95/loadbalance-mysql-slaves</link>
		<comments>http://xfragger.de/95/loadbalance-mysql-slaves#comments</comments>
		<pubDate>Tue, 30 Dec 2008 01:26:55 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[mysql loadbalancing php]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=95</guid>
		<description><![CDATA[Hat man mehrere Slaves desselben Masterservers im Einsatz und will die Abfragen einigermaßen gleichmäßig verteilen (bzw. stärkeren Servern mehr Last zuweisen), muss man sich PHP-Technisch einen Weg einfallen lassen. Sicher, es gibt auch die Möglichkeit Hardwarebalancer zu nutzen, aber ich persönlich halte es für überflüssig zwei- bis viertausen Euro für so ein Gerät auszugeben. Folgender [...]]]></description>
			<content:encoded><![CDATA[<p>Hat man mehrere Slaves desselben Masterservers im Einsatz und will die Abfragen einigermaßen gleichmäßig verteilen (bzw. stärkeren Servern mehr Last zuweisen), muss man sich PHP-Technisch einen Weg einfallen lassen. Sicher, es gibt auch die Möglichkeit Hardwarebalancer zu nutzen, aber ich persönlich halte es für überflüssig zwei- bis viertausen Euro für so ein Gerät auszugeben. Folgender Code erledigt die Aufgabe für uns:<span id="more-95"></span><br />
Hier werden die 2 Slaves in einem Verhältnis von 50 zu 20 angesprochen, im Beispiel wird davon ausgegangen, dass alle Server dieselben User/Passwörter/Ports haben.</p>
<pre>
        /**
         * clusterName
         *  -&gt; master / slave[Number[0,1,n]
         *  --&gt; host
         *  --&gt; port (optional)
         *  --&gt; prio (only for slave, &gt;0)
         */
        $databaseClusters = array(
                "main" =&gt; array(   /* Clustername */
                        "master" =&gt; array(
                                "host" =&gt; "10.0.0.100",
                                 ),
                        ),
                        "slave1" =&gt; array(
                                "host" =&gt; "10.0.0.101",
                                "prio" =&gt; 50,  /*mehr Last*/
                                 ),
                        ),
                        "slave2" =&gt; array(
                                "host" =&gt; "10.0.0.102",
                                "prio" =&gt; 20, /*weniger Last*/
                                 ),
                        ),
        );
</pre>
<pre>
function getSlave($cluster)
        {
                // gibt es nur einen Server im Array, wird dieser zurückgeliefert
                if(count($databaseClusters[$cluster]) == 1)
                {
                        return "master";
                }
                else
                {
                        $slaves = array();
                        $sum = 0;
                        for($i = 0; $i &lt; count($databaseClusters[$cluster]); $i++)
                        {
                                for($h = 0; $h &lt;= $databaseClusters[$cluster][&quot;slave$i&quot;][&quot;prio&quot;]; $h++)
                                {
                                         array_push($slaves, &quot;slave$i&quot;);
                                }
                                $sum += $databaseClusters[$cluster][&quot;slave$i&quot;][&quot;prio&quot;];
                        }
                        return $slaves[rand(0,$sum)];
                }
        }
</pre>
<p>Es wird ein Array erstellt, worin der erste Server 50 mal und der zweite 20 mal Vertreten ist, dann wird ein Zufälliges Element (0-69) herausgepickt. Es gibt gewiss andere Methoden, aber diese Funktioniert für uns einwandfrei, bin aber immer für bessere Vorschläge offen!</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/95/loadbalance-mysql-slaves/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Kernel 2.6.18 (Debian/Etch) vs 2.6.24 (Ubuntu/Hardy)</title>
		<link>http://xfragger.de/54/kernel-2618-debianetch-vs-2624-ubuntuhardy</link>
		<comments>http://xfragger.de/54/kernel-2618-debianetch-vs-2624-ubuntuhardy#comments</comments>
		<pubDate>Fri, 17 Oct 2008 23:13:33 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux allgemein]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[2.6.18]]></category>
		<category><![CDATA[2.6.24]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=54</guid>
		<description><![CDATA[Beim analysieren der Auslastungen, der verschienden Server, viel uns auf, dass 2 unserer Datenbankserver, welche exakt die gleiche Aufgabe bei exakt gleicher Belastung, zwar in etwa die gleiche Load hatten, die CPU Last aber stark differierte. Server 1 (Kernel 2.6.18) Server 2 (Kernel 2.6.24) Hier ist noch zu erwähnen, dass 100% CPULast bedeutet, dass alle [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">Beim analysieren der Auslastungen, der verschienden Server, viel uns auf, dass 2 unserer Datenbankserver, welche exakt die gleiche Aufgabe bei exakt gleicher Belastung, zwar in etwa die gleiche Load hatten, die CPU Last aber stark differierte.<br />
<span id="more-54"></span><br />
Server 1 (Kernel 2.6.18)<br />
<a href="http://xfragger.de/wp-content/uploads/2008/10/lodbs4.png" rel="lightbox[54]"><img class="aligncenter size-full wp-image-55" src="http://xfragger.de/wp-content/uploads/2008/10/lodbs4.png" alt="" /></a></p>
<p style="text-align: center;">Server 2 (Kernel 2.6.24)<br />
<a href="http://xfragger.de/wp-content/uploads/2008/10/lodbs51.png" rel="lightbox[54]"><img class="aligncenter size-full wp-image-58" src="http://xfragger.de/wp-content/uploads/2008/10/lodbs51.png" alt="" width="605" height="182" /></a></p>
<p>Hier ist noch zu erwähnen, dass 100% CPULast bedeutet, dass alle 8 Kerne ausgelastet sind, also 8*100%.</p>
<p>Nach genauerer Analyse, stellten wir fest, dass die 8 CPU-Kerne auf Server 2 ziemlich gleichmäßig ausgelastet wurden (15-20%), auf Server 1 bekam allerdings nur der erste Kern eine Last von bis zu 100%.<br />
Grund hierfür ist (sehr wahrscheinlich), dass der neuere Kernel Threading unterstützt, der alte zwar auch, aber nicht in einem für MySQL nutzbarem Rahmen.</p>
<p>Rechnet man nun die CPU-Last auf Server 2 (neuer Kernel) mal 8 (pro CPUKern), stellt man fest, dass das Ergebnis in etwa der Last des ersten CPU Kerns von Server 1 (alter Kernel) entspricht.</p>
<p>Fazit: in absehbarer Zeit wird Server 1 auf Debian/Lenny upgegraded.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/54/kernel-2618-debianetch-vs-2624-ubuntuhardy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mehrere MySQL Instanzen auf einem Server</title>
		<link>http://xfragger.de/19/mehrere-mysql-instanzen-auf-einem-server</link>
		<comments>http://xfragger.de/19/mehrere-mysql-instanzen-auf-einem-server#comments</comments>
		<pubDate>Sat, 06 Sep 2008 14:45:09 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://www.xfragger.de/?p=19</guid>
		<description><![CDATA[Die täglichen MySQL Backups sollte nicht mehr auf den Produktivservern geschehen, also wurde ein Dump-Server angeschafft, der die verschiedenen MySQL-Server (Master-Slave-Verbund + diverse &#8220;Hilfsserver&#8221;), einfach repliziert. Hier können dann täglich Dumps gezogen werden. Das Problem, das auftrat und, meiner Meinung nach, nur schlecht Dokumentiert ist, ist das Betreiben von mehreren, unabhängigen MySQL Instanzen auf einerm [...]]]></description>
			<content:encoded><![CDATA[<p>Die täglichen MySQL Backups sollte nicht mehr auf den Produktivservern geschehen, also wurde ein Dump-Server angeschafft, der die verschiedenen MySQL-Server (Master-Slave-Verbund + diverse &#8220;Hilfsserver&#8221;), einfach repliziert. Hier können dann täglich Dumps gezogen werden.</p>
<p>Das Problem, das auftrat und, meiner Meinung nach, nur schlecht Dokumentiert ist, ist das Betreiben von mehreren, unabhängigen MySQL Instanzen auf einerm Server.<span id="more-19"></span></p>
<p>Das normale Datenverzeichnis &#8220;/var/lib/mysql&#8221; muss &#8220;aufgeteilt&#8221; werden, für jede Instanz, ein Unterverzeichnis: /var/lib/mysql/db1 &#8211; db5</p>
<p>Dasselbe geschiet mit den Konfigurationsverzeichnissen: /etc/mysql/db1 &#8211; db5</p>
<p>Das init.d Script /etc/init.d/mysql muss für jede Instanz einmal vorhanden sein (/etc/init.d/mysql_db1 &#8211; mysql_db5) und danach angepasst werden. Ich führe hier NUR die Änderungen auf, der Rest bleibt, wie er vorher schon war:</p>
<blockquote><p><span class="Code"><strong>export HOME=/etc/mysql_db1</strong></span></p>
<p><span class="Code"><strong></strong></span><span class="Code"> if [ ! -r <strong>/etc/mysql_db1/my.cnf</strong> ]; then<br />
log_warning_msg &#8220;$0: WARNING: <strong>/etc/mysql_db1/my.cnf</strong> (&#8230;)&#8221;<br />
echo &#8220;WARNING: <strong>/etc/mysql_db1/my.cnf</strong> cannot be read. (&#8230;)&#8221; | $ERR_LOGGER<br />
fi </span></p>
<p><span class="Code">/usr/bin/mysqld_safe <strong>&#8211;log-bin=mysql-bin-db1.log &#8211;datadir=/var/lib/mysql/db1 &#8211;socket=/var/run/mysqld/mysqld_db1.sock &#8211;port=3307</strong> &gt; /dev/null 2&gt;&amp;1 &amp; </span></p>
<p><span class="Code"> output=$(<strong>/etc/mysql_db1/debian-start</strong>) </span></p>
<p><span class="Code">if [ -f <strong>/etc/mysql_db1/debian-log-rotate.conf</strong> ]; then<br />
echo &#8220;<strong>/etc/mysql_db1/debian-log-rotate.conf </strong>is (..)&#8221; | $ERR_LOGGER -p daemon.info<br />
fi </span></p></blockquote>
<p>Nachteil hierbei ist, dass mysql nicht mehr über /etc/init.d/mysql_db1 stop zu stoppen ist. Der Prozess muss gekillt werden (kill [PID]), wodurch er runterfährt. Der Port muss für jede Instanz ein anderer sein.</p>
<p>In der my.cnf der jeweiligen Instanzen müssen noch alle Pfade, sowie Ports angepasst werden.</p>
<p>Will man sich mit der Konsole verbinden, muss ein zusätzlicher Parameter hinzugefügt werden.</p>
<blockquote><p>mysql -uUSER -pPASS &#8211;socket=/var/run/mysql_db1.sock</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/19/mehrere-mysql-instanzen-auf-einem-server/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

