<?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>Elmars Notizen &#187; Backup</title>
	<atom:link href="http://www.elmar-baumann.de/blog/tag/backup/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.elmar-baumann.de/blog</link>
	<description>Software, Programmieren, Sonstiges</description>
	<lastBuildDate>Mon, 16 Jan 2012 18:25:43 +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>Daten sichern mit rsync</title>
		<link>http://www.elmar-baumann.de/blog/2009/02/24/daten-sichern-mit-rsync/</link>
		<comments>http://www.elmar-baumann.de/blog/2009/02/24/daten-sichern-mit-rsync/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 22:02:00 +0000</pubDate>
		<dc:creator>Elmar</dc:creator>
				<category><![CDATA[Programme]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[rsync]]></category>

		<guid isPermaLink="false">http://www.elmar-baumann.de/blog/?p=168</guid>
		<description><![CDATA[Täglich sichert das Programm rsync automatisch neue und veränderte Dateien verschiedener Verzeichnisse auf eine externe Festplatte. Wichtige Dateien, wie jene von Programmier-Projekten, überführe ich in eine Versions-Verwaltung, so benötige ich keine Backup-Versionen. Habe ich eine Datei gelöscht von den zu sichernden Verzeichnissen, wird diese von der externen Backup-Festplatte ebenfalls gelöscht: Auf der Backup-Festplatte sind Spiegel [...]]]></description>
			<content:encoded><![CDATA[<p>Täglich sichert das Programm <span class="product">rsync</span> automatisch neue und veränderte Dateien verschiedener Verzeichnisse auf eine externe Festplatte.<br />
<span id="more-168"></span><br />
Wichtige Dateien, wie jene von Programmier-Projekten, überführe ich in eine Versions-Verwaltung, so benötige ich keine Backup-Versionen. Habe ich eine Datei gelöscht von den zu sichernden Verzeichnissen, wird diese von der externen Backup-Festplatte ebenfalls gelöscht: Auf der Backup-Festplatte sind Spiegel der gesicherten Verzeichnisse.</p>
<p>Zum Sichern schrieb ich ein Bash-Skript. Es liest aus einer Konfigurationsdatei die Namen der Quell- und Zielverzeichnisse und die Namen von Dateien mit Mustern von Dateien, die nicht gesichert werden sollen, beispielsweise Temporärverzeichnisse oder Cache-Verzeichnisse. Das Skript:</p>
<pre>#!/bin/sh
#
# Author  : Elmar Baumann
# Date    : 2006/05/05
# Requires: rsync, Konfigurationsdatei $CONF
# Doc     : Synchronisiert Dateien auf ein externes Backupmedium
#
#           Aufruf ohne Parameter
#
###############################################################################

SCRIPT=$(basename $0)

# Mountpoint für externes Backupmedium
BACKUP_MOUNTPOINT=/mnt/backup

# Konfigurationsdatei
CONF=${HOME}/conf/backup-directories.conf

# Spalte in der Konfigurationsdatei mit Quellverzeichnissen
COLUMN_SOURCE=1

# Spalte in der Konfigurationsdatei mit Zielverzeichnissen
COLUMN_TARGET=2

# Spalte in der Konfigurationsdatei mit Exclude-Pattern-Dateien
COLUMN_EXCLUDE=3

# Logdatei
LOGFILE=${HOME}/log/${SCRIPT}.txt

# Zeilenumbruch als Fieldseparator
IFS="
"

# Optionen für rsync
RSYNC_OPTIONS="
--archive
--delete
--delete-excluded
"

###############################################################################

function print_date() {
    date +"%d.%m.%Y, %H:%M:%S Uhr"
}

function print_started() {
    echo "${SCRIPT}: $(print_date) Sichere Dateien auf '${BACKUP_MOUNTPOINT}'..." \
    | tee $LOGFILE
}

function print_finished() {
    echo "${SCRIPT}: $(print_date) Fertig. Logdatei: '${LOGFILE}'" \
    | tee -a $LOGFILE
}

function mount_backup_medium() {
    umount $BACKUP_MOUNTPOINT 2&gt; /dev/null
    mount $BACKUP_MOUNTPOINT
    if [ $? != 0 ]
    then
        echo "${SCRIPT}: '${BACKUP_MOUNTPOINT}' laesst sich nicht einhaengen!" &gt;&amp;2
        exit 1
    fi
}

function umount_backup_medium() {
    sync
    umount $BACKUP_MOUNTPOINT
}

function trim() {
    echo $1 | sed -e 's/^ *//;s/ *$//'
}

function shrink_blanks {
    echo $1 | sed 's/  */ /g'
}

function get_column_of_line() {
    local line=$(shrink_blanks $1)
    local column=$2

    trim $(echo $line | cut -d " " -f $column)
}

function backup() {
    for line in $(cat $CONF | grep -v '^#.*')
    do
        source=$(get_column_of_line $line $COLUMN_SOURCE)
        target=$(get_column_of_line $line $COLUMN_TARGET)
        exclude=$(get_column_of_line $line $COLUMN_EXCLUDE)

        rsync $RSYNC_OPTIONS \
            --exclude-from=$exclude \
            $source \
            $target \
            2&gt;&amp;1 \
            | tee -a $LOGFILE
    done
}

###############################################################################

print_started
mount_backup_medium
backup
umount_backup_medium
print_finished</pre>
<p>Die Konfigurationsdatei sieht so aus — zwischen den Verzeichnis- und Dateinamen stehen Leerzeichen:</p>
<pre># Quelle         Ziel                   Patterndatei für Ausschluss
#
/home/elmar      /mnt/backup/linuxhome  /home/elmar/conf/backup-exclude-patterns-home.conf
/mnt/bilder      /mnt/backup            /home/elmar/conf/backup-exclude-patterns-bilder.conf
/mnt/daten       /mnt/backup            /home/elmar/conf/backup-exclude-patterns-daten.conf
/mnt/doku        /mnt/backup            /home/elmar/conf/backup-exclude-patterns-doku.conf
/mnt/multimedia  /mnt/backup            /home/elmar/conf/backup-exclude-patterns-multimedia.conf</pre>
<p>Ich lasse rsync <em>nicht</em> alle gesicherten Dateien ausgeben, in der langen Ausgabe übersähe ich Fehlermeldungen, beispielsweise Dateien, die nicht gelesen, geschrieben oder gelöscht werden können.</p>
<p>Die externe Backup-Festplatte ist nur während des Sicherns eingeschaltet, ich sollte nach dem Ausschalten die Kabel herausziehen, so beschädigt eine hohe Überspannung nicht die Festplatte.</p>
<p>Das Skript starte ich durch Aufruf, <em>nicht</em> automatisch beim Einschalten der Backup-Festplatte, diese könnte ich einschalten, veränderte oder gelöschte Dateien wieder herzustellen. Ich gebe den Alias &#8216;s&#8217; ein und drücke die Enter-Taste.</p>
<p>Jedes Jahr brenne ich die Daten auf zwei Sätze DVDs gleichen Inhalts und guter Qualität von verschiedenen Herstellern, aktuell einen Satz auf <strong>Verbatim Archival Grade</strong>, den anderen auf <strong>Plextor DVD+R</strong>, hergestellt von <strong>Taiyo Yuden</strong>. Der Brenner ist auf 4-fache Geschwindigkeit eingestellt anstelle 16-facher. Die DVDs beider Sätze stecken in Hängeregister-DVD-Hüllen lichtdichter Koffer, ein Satz lagert außer Haus. Die Dateinamen jeder DVD stehen auf der Festplatte in einer komprimierten Textdatei des gleichen Namens wie das <q>DVD-Label</q>.</p>
<p>Zum vollständigen Rücksichern sind im Skript die Variablen <code>target</code> und <code>source</code> zu vertauschen &#8211; vielleicht erweitere ich es um diese Option: Das Skript wird bei gesetzter Option Spalte 2 der Konfigurationsdatei für <code>source</code> auswählen und die Spalte 1 für <code>target</code>: <code>COLUMN_SOURCE=2</code> und <code>COLUMN_TARGET=1</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elmar-baumann.de/blog/2009/02/24/daten-sichern-mit-rsync/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL-Datenbanken wiederherstellen</title>
		<link>http://www.elmar-baumann.de/blog/2008/12/07/mysql-datenbankenwiederherstellen/</link>
		<comments>http://www.elmar-baumann.de/blog/2008/12/07/mysql-datenbankenwiederherstellen/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 17:49:18 +0000</pubDate>
		<dc:creator>Elmar</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysqldump]]></category>
		<category><![CDATA[Restore]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.elmar-baumann.de/blog/?p=55</guid>
		<description><![CDATA[Im letzten Artikel beschrieb ich, wie ich meine MySQL-Datenbanken sichere mit dem Programm mysqldump. Für jede Sicherung gilt das Prinzip: Prüfe, ob die Sicherung in Ordnung ist! Für MySQL-Datenbanken bedeutet das: Schreibe das Backup in eine andere MySQL-Datenbank und prüfe, ob der Inhalt in Ordnung ist. Einsgepielt wird eine mysqldump-Sicherung mit folgendem Befehl: cat datenbank-Fri.sql.gz [...]]]></description>
			<content:encoded><![CDATA[<p>Im letzten Artikel <a href="http://www.elmar-baumann.de/blog/2008/12/03/mysql-datenbanken-sichern-artikel-von-weblogs-wikis-content-management-systemen-sichern/">beschrieb</a> ich, wie ich meine MySQL-Datenbanken sichere mit dem Programm <span class="product">mysqldump</span>. Für jede Sicherung gilt das Prinzip: <strong>Prüfe, ob die Sicherung in Ordnung ist!</strong><br />
<span id="more-55"></span><br />
Für MySQL-Datenbanken bedeutet das: Schreibe das Backup in eine <strong>andere</strong> MySQL-Datenbank und prüfe, ob der Inhalt in Ordnung ist. <q>Einsgepielt</q> wird eine mysqldump-Sicherung mit folgendem Befehl:</p>
<pre>cat datenbank-Fri.sql.gz | gzip -d | mysql andere_datenbank</pre>
<p>Im Beispiel schreibt das Programm <strong>mysql</strong> den Inhalt der Datenbank <code>datenbank-Fri.sql.gz</code> in die Datenbank <code>andere_datenbank</code> . <code>datenbank-Fri.sql.gz</code> wurde geschrieben von <strong>mysqldump</strong> und komprimiert mit <strong>gzip</strong>,</p>
<p>Bislang prüfte ich einmalig für eine Datenbank <q>per Durchsicht</q>: Ich konfigurierte beispielsweise das Weblog so, dass es die andere Datenbank benutzte. Anschließend rief ich ein paar Seiten auf und klickte auf ein paar Links. Wollte ich den Inhalt genau prüfen, würde ich ein Tool suchen oder schreiben, das die Tabellen und Inhalte zweier Datenbanken <strong>automatisch</strong> vergleicht und bei Abweichungen mich per E-Mail informiert.</p>
<p>Ob eine <q>aufgespielte</q> Sicherung nach Umzug auf einen anderen Webserver sofort funktioniert, hängt ab davon, wie das Weblog, Content Management-System oder Wiki  URLs behandeln. <span class="product">WordPress</span> beispielsweise schreibt in die Tabelle <code>options</code> den <strong>URL des Blogs</strong> in die Spalte <code>option_value</code> in die Zeilen, für die die Spalte <code>option_name</code> die Werte <code>siteurl</code> und <code>home</code> enthält. Dieser sollte überprüft und gegebenenfalls geändert werden. Das gleiche gilt für die Option <code>upload_url_path</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elmar-baumann.de/blog/2008/12/07/mysql-datenbankenwiederherstellen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL-Datenbanken sichern</title>
		<link>http://www.elmar-baumann.de/blog/2008/12/03/mysql-datenbanken-sichern-artikel-von-weblogs-wikis-content-management-systemen-sichern/</link>
		<comments>http://www.elmar-baumann.de/blog/2008/12/03/mysql-datenbanken-sichern-artikel-von-weblogs-wikis-content-management-systemen-sichern/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 19:57:16 +0000</pubDate>
		<dc:creator>Elmar</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysqldump]]></category>

		<guid isPermaLink="false">http://www.elmar-baumann.de/blog/?p=27</guid>
		<description><![CDATA[Etliche Weblogs, Wikis und Content Management-Systeme speichern den Inhalt &#8211; alles was ich schreibe &#8211; in MySQL-Datenbanken. MySQL-Datenbanken sind Dateien auf der Festplatte eines Webservers, diesen besitzt ein Internet-Dienstleister. Spätestens nach einem Wechsel des Webservers will ich den Inhalt der alten Datenbanken einfügen in neue MySQL-Datenbanken mit wenig Aufwand. Dazu sichere ich die Datenbanken des [...]]]></description>
			<content:encoded><![CDATA[<p>Etliche Weblogs, Wikis und Content Management-Systeme speichern den Inhalt &#8211; alles was ich schreibe &#8211; in <span class="product">MySQL</span>-Datenbanken. <strong>MySQL</strong>-Datenbanken sind Dateien auf der Festplatte eines Webservers, diesen besitzt ein Internet-Dienstleister.</p>
<p>Spätestens nach einem Wechsel des Webservers will ich den Inhalt der alten Datenbanken einfügen in neue MySQL-Datenbanken mit <strong>wenig Aufwand</strong>.<br />
<span id="more-27"></span><br />
Dazu sichere ich die Datenbanken des Webservers auf meinen <strong>lokalen Rechner</strong>. Weitere Gründe für die lokale Sicherung:</p>
<ol>
<li>Die Datenbank könnte beschädigt werden und nicht mehr (vollständig) wiederhergestellt</li>
<li>Cracker und  Schadsoftware könnten die Datenbank <q>verändern</q></li>
<li>Der Internet-Dienstleister könnte seinen Dienst einstellen ohne dass ich vorher meine Daten auf irgend eine Weise <q>retten</q> kann</li>
</ol>
<p>In einem Artikel über die Prinzipien der Datensicherung <a href="http://www.elmar-baumann.de/fotografie/tipps/computer/dateimanagement/backup-02.html">schrieb</a> ich, Backups sollen automatisch ablaufen. Bei mir sieht das so aus:</p>
<ol>
<li>Einmal <strong>täglich</strong> sichert <strong>auf dem Webserver</strong> das Programm <span class="product">mysqldump</span> meine MySQL-Datenbanken mit den kompletten Einfügebefehlen</li>
<li>Nach einer Woche wird die älteste Sicherung überschrieben, es existieren bis zu 7 Sicherungen, eine für jeden Wochentag</li>
<li>Auf meinem lokalen Rechner ruft Cron <strong>täglich</strong> <strong>(automatisch</strong>) ein Skript auf; dieses veranlasst auf dem Webserver SQL-Dumps (1.) und speichert die SQL-Dumps auf die lokale Festplatte</li>
<li>Inhalte, die das Weblog, Wiki, Content Management-System nur auf die Webserver-Festplatte speichern und nicht in die Datenbank, werden heruntergeladen und auf die lokale Festplatte gespeichert, sofern noch nicht geschehen oder diese auf dem Webserver modifiziert wurden</li>
<li>Die Daten der lokalen Festplatte werden täglich auf eine externe Festplatte gesichert, die nur während der Sicherung eingeschaltet ist; wäre Geld kein Thema, würde ich die lokale Festplatte auf ein LTO 4-Streamerband sichern lassen</li>
</ol>
<p>Der Webserver muss folgende Programme anbieten und auf irgend eine Weise ausführen lassen:</p>
<ul>
<li> <strong>mysqldump</strong></li>
<li><strong>gzip</strong>, die Komprimierung von mysqldump könnte nicht funktionieren</li>
<li><strong>mail</strong></li>
</ul>
<p>Dies berücksichtige ich bei der Auswahl eines Webservers.</p>
<p>Besser ist ein Webserver, bei dem ich zeitgesteuert Programme ausführen lassen kann, es reicht aber einer, der CGI-Skripte erlaubt, unter anderem Bash-Skripte, die sich für diese Aufgabe eignen.</p>
<p>Für den SQL-Dump schrieb ich zwei Bash-Skripte: Eines, das die Datenbank sichert und bei Fehlern eine E-Mail schickt und ein anderes, das für alle Datenbanken dieses Skript aufruft. Sie können beide herunterladen:</p>
<ol>
<li><a href="/blog/wp-content/uploads/mysqldump.sh.txt">Skript, das eine Datenbank sichert</a></li>
<li><a href="/blog/wp-content/uploads/mysqldumpdbs.sh.txt">Skript, das für alle Datenbanken Skript 1 aufruft</a></li>
</ol>
<p>Aus den Skripten löschte ich: Skript 1 verlangt ein Passwort, wird keines oder ein falsches überreicht, unternimmt es nichts und Skript 2 ruft Skript 1 mit einem Passwort auf.</p>
<p>Das Skript, das <strong>cron</strong> täglich aufruft auf meinem lokalen Rechner, ruft das CGI-Skript 2 auf mit dem Webbrowser lynx und dem Parameter <code>--dump</code>. <strong>Lynx</strong> zeigt die Skriptausgabe an und beendet sich, die Ausgabe wird umgeleitet in eine Logdatei.</p>
<p>Die Dateien, die im Dateisystem der Webserver-Festplatte gespeichert sind &#8211; die <strong>WordPress</strong>-, <strong>MediaWiki</strong>-, &#8230; -Installationsverzeichnisse &#8211; sowie die mysqldump-Backupdateien spiegelt das Perl-Skript <span class="product">mirror</span> auf meine lokale Rechnerfestplatte (täglich aufgerufen durch <strong>cron</strong>). Es gibt weitere Programme, die Dateien eines Webservers spiegeln können, spontan fallen mir diese ein: <span class="product">wget</span> und <span class="product">ncftp</span>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elmar-baumann.de/blog/2008/12/03/mysql-datenbanken-sichern-artikel-von-weblogs-wikis-content-management-systemen-sichern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

