Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
dbcopy - inkrementelle Datenbankkopie
Möchte man die Datenbank sichern oder auf einem zweiten System zur Verfügung haben stößt man bei Verwendung von mysqldump auf Schwierigkeiten (Systemlast, Zeitprobleme des vzlogger) die mit dbcopy umgangen werden können.
Dbcopy ist Teil einer VZ-Standardinstallation und unter /var/www/volkszaehler.org/misc/tools/ zu finden. Es hat aber sein eigenes Repository auf github.
Für das kopieren der Daten ist eine zweite, verfügbare Datenbankapplikation Grundvoraussetzung. Sie muss SQL-Kompatibel sein. Am zuverlässigsten ist daher eine weitere MySQL-Installation die über Netzwerkwerk erreichbar ist, z.B. bei einem Webhoster. Alternativ bieten sich aber auch die DB eines NAS (z.B. Maria-DB auf Synology) oder SQLite an. SQLite ist als Backuplösung besonders interessant weil die Datenbank in einer einzelnen Datei abgelegt wird die einfach kopiert werden kann.
Installation
In der Standardinstallation ist dbcopy über php direkt nutzbar.
php /var/www/volkszaehler.org/misc/tools/dbcopy.php backup
Möchte man dbcopy von der Kommandozeile aus starten muss erst die Berechtigung gesetzt werden:
sudo chmod +x /var/www/volkszaehler.org/misc/tools/dbcopy.php
Sollte dbcopy doch nicht auf dem System verfügbar sein kann das mit
git clone git://github.com/andig/dbcopy
nachgeholt werden. Um Einsatzbereitschaft herzustellen müssen die Abhängigkeiten aufgelöst werden
sudo composer install
MySQL
Bei der MYSQL-Datenbankapplikaion muss eine Datenbank und ein Nutzer mit ausreichenden Rechten angelegt werden. Insbesondere ist darauf zu achten das der User Schreibrechte hat und auch von außerhalb zugreifen darf. Manche Webhoster lassen allerdings nur localhost-Zugriffe auf MySQL zu.
SQLite
Kann auch als zweite Datenbankapplikation auf dem selben System installiert werden.
sudo apt-get install sqlite3 php5-sqlite
Konfiguration
Es empfiehlt sich nicht die Konfigurationsdatei /var/www/volkszaehler.org/misc/tool/dbcopy.json direkt zu ändern. Das kann bei späteren Updates der Middleware zu Problemen führen. Daher:
sudo cp /var/www/volkszaehler.org/misc/tool/dbcopy.json /etc/dbcopy.json
Und
sudo nano /etc/dbcopy.json
{ "source": { // source database connection "driver": "pdo_mysql", "host": "localhost", "user": "travis", "password": "", "dbname": "volkszaehler" },
Dies ist der Teil in dem der Zugang zur Quelldatenbank konfiguriert wird.
„driver“: pdo_mysql bei einer Mysql Datenbank, bei einer SQlite Datenbank pdo_sqlite, Standardmäßig läuft der Volkszähler mit einer MySql Datenbank
„host“: localhost wenn sich die Datenbank auf dem gleichen System befindet, ansonsten ip Adresse zum entfernten System
„user“: Benutzername der Mysql Datenbank
„password“: Passwort des Benutzers der Mysql Datenbank
Die Parameter host, user und password sind nur nötig wenn es sich um eine MySql Datenbank handelt
"target": { // target database connection "driver": "pdo_sqlite", "path": "sqlite.db3", // path is only used if driver = pdo_sqlite "host": "localhost", "user": "travis", "password": "" "dbname": "backup" },
Dies ist der Teil in dem der Zugang zur Ziel Datenbank konfiguriert wird. Hier handelt es sich um die selben parameter wie bei der Quell Datenbank, nur eben für die Zieldatenbank. Zusätzlich gibt es den Parameter
„path“: dieser ist nur notwendig wenn es sich um eine Sqlite Datenbank handelt und gibt an an welche Stelle die Datenbank Datei gesichert werden soll.
Auch hier gilt wieder, die Parameter host, user und password sind nur nötig wenn es sich um eine MySql Datenbank handelt
"tables": [ // table configuration (optional) // ------------------------------ // table name // tables will be processed in the order they are mentioned: // - foreign keys on target will be dropped // - if a table is not listed here, it will not be touched // transfer mode // skip: table will not be copied // copy: entire table will be truncated on target and copied from source // pk: selective copy by primary key. only data not present on target // will be copied from source. { "name": "entities", "mode": "copy" }, { "name": "properties", "mode": "copy" }, { "name": "entities_in_aggregator", "mode": "copy" }, { "name": "data", "mode": "pk" }, { "name": "aggregate", "mode": "skip" } ] }
Dies ist der Bereich in dem festgelegt wird welche Tabellen wie gesichert werden. Die Tabelle aggregate ist in der Standard-Konfig ausgeblendet („skip“). Für ein Backup sind diese Daten nicht interessant weil redundant. Im Falle eines rückgespielten Backups ohne Datensätze in aggreagte wird die Tabelle einfach aus data frisch befüllt. Auf einer zweite Middleware sind die Daten aber durchaus von Interesse. Ist auf dem primären System vzcompress im Einsatz und auf dem sekundären System ebenfalls gewünscht, müsste dies lokal wiederholt werden. Möchten man also die Tabelle aggregate mit sichern, dann muss man skip in pk ändern.
Zieldatenbank erstellen
/var/www/volkszaehler.org/misc/tool/dbcopy.php create -c /etc/dbcopy.json
Daten kopieren
/var/www/volkszaehler.org/misc/tool/dbcopy.php backup -c /etc/dbcopy.json
Erfolgreiche Kopie:
entities: copying 9 rows (overwrite) [============================] 100% 1 sec/1 sec 9 rows properties: copying 66 rows (overwrite) [============================] 100% 1 sec/1 sec 66 rows entities_in_aggregator: copying 7 rows (overwrite) [============================] 100% 1 sec/1 sec 7 rows data: copying 2258 rows (partial copy) [============================] 100% 40 secs/40 secs 2261 rows aggregate: skipping
Cronjob
Wenn die manuelle Kopie erfolgreich war kann ein cronjob eingerichtet werden. Z.B. täglich:
0 2 * * * /usr/bin/php /var/www/volkszaehler.org/misc/tool/dbcopy.php backup -c /etc/dbcopy.json > /dev/null