<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Kommentare zu: Perl MySQL Backup</title>
	<atom:link href="http://www.butschek.de/fachartikel/perl-mysql-backup/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.butschek.de</link>
	<description>Linux, Server &#38; Co</description>
	<lastBuildDate>Wed, 11 Jan 2012 07:17:12 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>Von: Michael Butschek</title>
		<link>http://www.butschek.de/fachartikel/perl-mysql-backup/#comment-436</link>
		<dc:creator>Michael Butschek</dc:creator>
		<pubDate>Wed, 11 Jan 2012 07:17:12 +0000</pubDate>
		<guid isPermaLink="false">http://www.butschek.de/?page_id=228#comment-436</guid>
		<description>PS: Ist es euch schon mal passiert, dass ihr so einen Text (wie ich eben im Kommentar) geschrieben habt und beim Absenden kam dann eine Fehlermeldung und der Text war weg? Wenn ja versteht ihr, warum ich es nicht mag, die Datenbank zu stoppen und dem Anwender damit eine Fehlermeldung zu präsentieren :-)</description>
		<content:encoded><![CDATA[<p>PS: Ist es euch schon mal passiert, dass ihr so einen Text (wie ich eben im Kommentar) geschrieben habt und beim Absenden kam dann eine Fehlermeldung und der Text war weg? Wenn ja versteht ihr, warum ich es nicht mag, die Datenbank zu stoppen und dem Anwender damit eine Fehlermeldung zu präsentieren <img src='http://www.butschek.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Michael Butschek</title>
		<link>http://www.butschek.de/fachartikel/perl-mysql-backup/#comment-435</link>
		<dc:creator>Michael Butschek</dc:creator>
		<pubDate>Wed, 11 Jan 2012 07:16:04 +0000</pubDate>
		<guid isPermaLink="false">http://www.butschek.de/?page_id=228#comment-435</guid>
		<description>Die &quot;Alternative&quot; ist keine echte Alternative. Bei geplanten Wartungen, zu denen der Server aus dem Produktivbetrieb genommen wird, mache ich es auch so. Aber bei einem Produktivserver geht das nicht.

Nehmen wir eine halbwegs aktuelle SATA2 Platte, die schafft um die 70 MByte/s. Das Kopieren von 10 Gigabyte Daten dauert dann selbst unterschiedlichen Quell- und Zielplatten im Optimalfall 2,5 Minuten.

Stell dir vor, zehntausende Webseiten eines großen Hosters würden jede Nacht für 2,5 Minuten nur &quot;Error: Can&#039;t connect to MySQL&quot; statt der Webseiten anzeigen. Alle Blogs, alle Typo3-Seiten, alle Portale, Scripte, also einfach fast alles.

Stell dir vor, große Webauftritte (nennen wir mal Facebook, Twitter, heise.de &amp; Co) würden 1x pro Nacht für 2,5 Minuten &quot;Error: Can&#039;t connect to MySQL&quot; anzeigen. Wie peinlich wäre das wohl für die Betreiber.

Außerdem sind vernünftige SLA damit nicht erreichbar. Bei einer Backupzeit von 2,5 Minuten ergibt das selbst bei kurzen Monaten eine Gesamtausfallzeit von über 60 Minuten, im Jahr hätten wir so über 15 Stunden Ausfall wegen dem MySQL-Backup. Die Verfügbarkeit würde also nur wegen dem Backup auf 99,8% sinken. Damit wären weder 99,9% noch 99,99% möglich, was viele Hoster versprechen und viele Kunden fordern.

Ein Rsync kopiert nur veränderte Daten und ist damit im Schnitt deutlich schneller als ein cp und dank dem Lock steht die Datenbank für diese kurze Dauer nur zum Schreiben nicht bereit, kann aber weiterhin alle Daten anzeigen. Damit haben wir keine Fehlermeldungen. So muss es sein :-)

Natürlich - so der jetzt vermutlich kommende Einwand - sind die Daten eines kleinen Privatservers nicht so groß und daher geht es schneller und stellt kein Problem dar. In diesem Fall kann man die stop-cp-start Methode durchaus anwenden, dennoch finde ich es auch bei kleinen Seiten unprofessionell, wenn sie einem Besucher plötzlich kurz eine Fehlerseite anzeigen, weil das Backup läuft. Dann würde ich doch eher den MySQL Dump empfehlen.</description>
		<content:encoded><![CDATA[<p>Die &#8220;Alternative&#8221; ist keine echte Alternative. Bei geplanten Wartungen, zu denen der Server aus dem Produktivbetrieb genommen wird, mache ich es auch so. Aber bei einem Produktivserver geht das nicht.</p>
<p>Nehmen wir eine halbwegs aktuelle SATA2 Platte, die schafft um die 70 MByte/s. Das Kopieren von 10 Gigabyte Daten dauert dann selbst unterschiedlichen Quell- und Zielplatten im Optimalfall 2,5 Minuten.</p>
<p>Stell dir vor, zehntausende Webseiten eines großen Hosters würden jede Nacht für 2,5 Minuten nur &#8220;Error: Can&#8217;t connect to MySQL&#8221; statt der Webseiten anzeigen. Alle Blogs, alle Typo3-Seiten, alle Portale, Scripte, also einfach fast alles.</p>
<p>Stell dir vor, große Webauftritte (nennen wir mal Facebook, Twitter, heise.de &#038; Co) würden 1x pro Nacht für 2,5 Minuten &#8220;Error: Can&#8217;t connect to MySQL&#8221; anzeigen. Wie peinlich wäre das wohl für die Betreiber.</p>
<p>Außerdem sind vernünftige SLA damit nicht erreichbar. Bei einer Backupzeit von 2,5 Minuten ergibt das selbst bei kurzen Monaten eine Gesamtausfallzeit von über 60 Minuten, im Jahr hätten wir so über 15 Stunden Ausfall wegen dem MySQL-Backup. Die Verfügbarkeit würde also nur wegen dem Backup auf 99,8% sinken. Damit wären weder 99,9% noch 99,99% möglich, was viele Hoster versprechen und viele Kunden fordern.</p>
<p>Ein Rsync kopiert nur veränderte Daten und ist damit im Schnitt deutlich schneller als ein cp und dank dem Lock steht die Datenbank für diese kurze Dauer nur zum Schreiben nicht bereit, kann aber weiterhin alle Daten anzeigen. Damit haben wir keine Fehlermeldungen. So muss es sein <img src='http://www.butschek.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Natürlich &#8211; so der jetzt vermutlich kommende Einwand &#8211; sind die Daten eines kleinen Privatservers nicht so groß und daher geht es schneller und stellt kein Problem dar. In diesem Fall kann man die stop-cp-start Methode durchaus anwenden, dennoch finde ich es auch bei kleinen Seiten unprofessionell, wenn sie einem Besucher plötzlich kurz eine Fehlerseite anzeigen, weil das Backup läuft. Dann würde ich doch eher den MySQL Dump empfehlen.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Michael</title>
		<link>http://www.butschek.de/fachartikel/perl-mysql-backup/#comment-433</link>
		<dc:creator>Michael</dc:creator>
		<pubDate>Wed, 11 Jan 2012 01:24:54 +0000</pubDate>
		<guid isPermaLink="false">http://www.butschek.de/?page_id=228#comment-433</guid>
		<description>Danke für den Tipp. Möchte die Backup-Performance noch erhöhen und werde es mit rsync mal probieren.

Eine weitere Alternative um lock Probleme etc. zu umgehen: 
/etc/init.d/mysql stop
cp /var/lib/mysql/* -R /var/backups/mysql/
/etc/init.d/mysql stop

deutlich schneller als ein sql dump.</description>
		<content:encoded><![CDATA[<p>Danke für den Tipp. Möchte die Backup-Performance noch erhöhen und werde es mit rsync mal probieren.</p>
<p>Eine weitere Alternative um lock Probleme etc. zu umgehen:<br />
/etc/init.d/mysql stop<br />
cp /var/lib/mysql/* -R /var/backups/mysql/<br />
/etc/init.d/mysql stop</p>
<p>deutlich schneller als ein sql dump.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Anton</title>
		<link>http://www.butschek.de/fachartikel/perl-mysql-backup/#comment-63</link>
		<dc:creator>Anton</dc:creator>
		<pubDate>Mon, 15 Feb 2010 17:07:44 +0000</pubDate>
		<guid isPermaLink="false">http://www.butschek.de/?page_id=228#comment-63</guid>
		<description>Spontaner Gedanke bzgl. der &quot;nur MyISAM&quot;-Problematik:

InnoDB unterstützt &quot;per Table&quot;-Tablespaces&quot;:

http://dev.mysql.com/doc/refman/5.0/en/multiple-tablespaces.html

Damit könnte man das Skript auch mit InnoDB einsetzen.

Zumal wird die zentrale ibdata-Datei nicht unnötig aufgebläht, wenn man Dateien löscht.</description>
		<content:encoded><![CDATA[<p>Spontaner Gedanke bzgl. der &#8220;nur MyISAM&#8221;-Problematik:</p>
<p>InnoDB unterstützt &#8220;per Table&#8221;-Tablespaces&#8221;:</p>
<p><a href="http://dev.mysql.com/doc/refman/5.0/en/multiple-tablespaces.html" rel="nofollow">http://dev.mysql.com/doc/refman/5.0/en/multiple-tablespaces.html</a></p>
<p>Damit könnte man das Skript auch mit InnoDB einsetzen.</p>
<p>Zumal wird die zentrale ibdata-Datei nicht unnötig aufgebläht, wenn man Dateien löscht.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Philipp Tobler</title>
		<link>http://www.butschek.de/fachartikel/perl-mysql-backup/#comment-62</link>
		<dc:creator>Philipp Tobler</dc:creator>
		<pubDate>Mon, 18 Jan 2010 15:31:44 +0000</pubDate>
		<guid isPermaLink="false">http://www.butschek.de/?page_id=228#comment-62</guid>
		<description>Wir betreiben MySQL auf Solaris und ZFS, welches sich für Backupszenarien sehr eignet. In diesem Fall beschränkt sich ein Backup auf das Locken der DBs, zfs snapshot und zum Schluss Unlock. Das ganze dauert ein paar wenige Sekunden!

Hier meine abgewandelte Scriptvariante:

#!/usr/bin/perl
use DBI;
use POSIX qw(strftime);

##
## CONFIGURATION
##

## WARNING: USE ONLY WITH MyISAM!

my $MYSQL_HOST = &quot;localhost&quot;;
my $MYSQL_USER = &quot;backup&quot;;
my $MYSQL_PASS = &quot;XXXXXXXX&quot;;
my $ZFS_DATASET = &quot;datapool/export/db/myisam&quot;;

##
## END OF CONFIGURATION
##

my $SNAP_CMD = &quot;/usr/sbin/zfs snapshot&quot;;
# define a meaningful snapshot name including date and time
my $SNAP_SUFFIX = strftime &quot;mysqlbackup-%Y-%m-%d-%H%M&quot;, localtime;

# Open Database
my @DSN  = (&#039;DBI:mysql:host=&#039;.$MYSQL_HOST, $MYSQL_USER , $MYSQL_PASS);
my $DB = DBI-&gt;connect(@DSN) &#124;&#124; exit 1;

# Output
print stdout &quot;===============================================================================n&quot;;
print stdout &quot;MYSQL BINARY BACKUPn&quot;;
print stdout &quot;===============================================================================n&quot;;
print stdout &quot;n&quot;;
print stdout &quot;-------------------------------------------------------------------------------n&quot;;
print stdout &quot;Flush and lock tables, take ZFS snapshot, unlock tablesn&quot;;
print stdout &quot;-------------------------------------------------------------------------------n&quot;;
print stdout &quot;n&quot;;

# Flush, Lock, ZFS snapshot, Unlock
$RESULT = $DB-&gt;prepare(&#039;FLUSH TABLES WITH READ LOCK;&#039;);
$RESULT-&gt;execute();
system($SNAP_CMD.&#039; &#039;.$ZFS_DATASET.&#039;@&#039;.$SNAP_SUFFIX);
$RESULT = $DB-&gt;prepare(&#039;UNLOCK TABLES;&#039;);
$RESULT-&gt;execute();

# Output
print stdout &quot;n&quot;;
print stdout &quot;-------------------------------------------------------------------------------n&quot;;
print stdout &quot;MySQL Backup done.n&quot;;
print stdout &quot;-------------------------------------------------------------------------------n&quot;;

# End of script
$DB-&gt;disconnect();</description>
		<content:encoded><![CDATA[<p>Wir betreiben MySQL auf Solaris und ZFS, welches sich für Backupszenarien sehr eignet. In diesem Fall beschränkt sich ein Backup auf das Locken der DBs, zfs snapshot und zum Schluss Unlock. Das ganze dauert ein paar wenige Sekunden!</p>
<p>Hier meine abgewandelte Scriptvariante:</p>
<p>#!/usr/bin/perl<br />
use DBI;<br />
use POSIX qw(strftime);</p>
<p>##<br />
## CONFIGURATION<br />
##</p>
<p>## WARNING: USE ONLY WITH MyISAM!</p>
<p>my $MYSQL_HOST = &#8220;localhost&#8221;;<br />
my $MYSQL_USER = &#8220;backup&#8221;;<br />
my $MYSQL_PASS = &#8220;XXXXXXXX&#8221;;<br />
my $ZFS_DATASET = &#8220;datapool/export/db/myisam&#8221;;</p>
<p>##<br />
## END OF CONFIGURATION<br />
##</p>
<p>my $SNAP_CMD = &#8220;/usr/sbin/zfs snapshot&#8221;;<br />
# define a meaningful snapshot name including date and time<br />
my $SNAP_SUFFIX = strftime &#8220;mysqlbackup-%Y-%m-%d-%H%M&#8221;, localtime;</p>
<p># Open Database<br />
my @DSN  = (&#8216;DBI:mysql:host=&#8217;.$MYSQL_HOST, $MYSQL_USER , $MYSQL_PASS);<br />
my $DB = DBI-&gt;connect(@DSN) || exit 1;</p>
<p># Output<br />
print stdout &#8220;===============================================================================n&#8221;;<br />
print stdout &#8220;MYSQL BINARY BACKUPn&#8221;;<br />
print stdout &#8220;===============================================================================n&#8221;;<br />
print stdout &#8220;n&#8221;;<br />
print stdout &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-n&#8221;;<br />
print stdout &#8220;Flush and lock tables, take ZFS snapshot, unlock tablesn&#8221;;<br />
print stdout &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-n&#8221;;<br />
print stdout &#8220;n&#8221;;</p>
<p># Flush, Lock, ZFS snapshot, Unlock<br />
$RESULT = $DB-&gt;prepare(&#8216;FLUSH TABLES WITH READ LOCK;&#8217;);<br />
$RESULT-&gt;execute();<br />
system($SNAP_CMD.&#8217; &#8216;.$ZFS_DATASET.&#8217;@&#8217;.$SNAP_SUFFIX);<br />
$RESULT = $DB-&gt;prepare(&#8216;UNLOCK TABLES;&#8217;);<br />
$RESULT-&gt;execute();</p>
<p># Output<br />
print stdout &#8220;n&#8221;;<br />
print stdout &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-n&#8221;;<br />
print stdout &#8220;MySQL Backup done.n&#8221;;<br />
print stdout &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-n&#8221;;</p>
<p># End of script<br />
$DB-&gt;disconnect();</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Jürgen Lerch</title>
		<link>http://www.butschek.de/fachartikel/perl-mysql-backup/#comment-61</link>
		<dc:creator>Jürgen Lerch</dc:creator>
		<pubDate>Sun, 09 Aug 2009 13:27:47 +0000</pubDate>
		<guid isPermaLink="false">http://www.butschek.de/?page_id=228#comment-61</guid>
		<description>Moin Moin ...

.. genau einen solchen Ansatz habe ich gebraucht für unser Projekt, das bei einem Datenbankausfall fatale folgen hätte und daher stündlich gesichert wird. Bisher hatte ich das auch immer im laufenden Betrieb mit PHP gemacht, hatte aber zu den Zeiten immer einen erhöhten LOAD auf dem Server. Ich habe dies nun mit deinem Ansatz geändert und beobachtet. Ich konnte keinen wesentliche Erhöhung des LOAD nun feststellen, und das Backup geht nun auch innerhalb von Sekunden, ohne das das Projekt beeinträchtigt wird. Super Sache ... Ich sag ganz herzlich DANKE

Gruß Jürgen</description>
		<content:encoded><![CDATA[<p>Moin Moin &#8230;</p>
<p>.. genau einen solchen Ansatz habe ich gebraucht für unser Projekt, das bei einem Datenbankausfall fatale folgen hätte und daher stündlich gesichert wird. Bisher hatte ich das auch immer im laufenden Betrieb mit PHP gemacht, hatte aber zu den Zeiten immer einen erhöhten LOAD auf dem Server. Ich habe dies nun mit deinem Ansatz geändert und beobachtet. Ich konnte keinen wesentliche Erhöhung des LOAD nun feststellen, und das Backup geht nun auch innerhalb von Sekunden, ohne das das Projekt beeinträchtigt wird. Super Sache &#8230; Ich sag ganz herzlich DANKE</p>
<p>Gruß Jürgen</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Mike</title>
		<link>http://www.butschek.de/fachartikel/perl-mysql-backup/#comment-60</link>
		<dc:creator>Mike</dc:creator>
		<pubDate>Wed, 20 May 2009 13:21:26 +0000</pubDate>
		<guid isPermaLink="false">http://www.butschek.de/?page_id=228#comment-60</guid>
		<description>Ich möchte nochmal einen Satz unterstreichen, der im Text nicht so deutlich rüber kommt: &lt;strong&gt;Das Script ist nur brauchbar, wenn als Storage Engine MyISAM zum Einsatz kommt!&lt;/strong&gt;

MyISAM speichert jede Tabelle in einer Datei, daher geht das mit dem RSync und Lock noch, wenn keine Mega-Tabellen dabei sind. Bei InnoDB dagegen werden alle Daten des gesamten Datenbankservers in einer Datei gespeichert, womit der Rsync bei JEDEM Update-Query alle Daten erneut kopieren muss - der Lock würde so viel zu lange dauern.</description>
		<content:encoded><![CDATA[<p>Ich möchte nochmal einen Satz unterstreichen, der im Text nicht so deutlich rüber kommt: <strong>Das Script ist nur brauchbar, wenn als Storage Engine MyISAM zum Einsatz kommt!</strong></p>
<p>MyISAM speichert jede Tabelle in einer Datei, daher geht das mit dem RSync und Lock noch, wenn keine Mega-Tabellen dabei sind. Bei InnoDB dagegen werden alle Daten des gesamten Datenbankservers in einer Datei gespeichert, womit der Rsync bei JEDEM Update-Query alle Daten erneut kopieren muss &#8211; der Lock würde so viel zu lange dauern.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Mark</title>
		<link>http://www.butschek.de/fachartikel/perl-mysql-backup/#comment-59</link>
		<dc:creator>Mark</dc:creator>
		<pubDate>Wed, 20 May 2009 10:54:05 +0000</pubDate>
		<guid isPermaLink="false">http://www.butschek.de/?page_id=228#comment-59</guid>
		<description>Hallo,

eine tolle Idee. Genau das was ich suche um eine Downtime von mittlerweile über 20 Minuten in den frühen Morgenstunden zu umgehen. Ich werde es mir bei Zeiten einmal anschauen und umsetzten.</description>
		<content:encoded><![CDATA[<p>Hallo,</p>
<p>eine tolle Idee. Genau das was ich suche um eine Downtime von mittlerweile über 20 Minuten in den frühen Morgenstunden zu umgehen. Ich werde es mir bei Zeiten einmal anschauen und umsetzten.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

