Zum Backup meiner Datenbanken benutze ich schon seit Jahren MyDumper und das MyLoader-Tool. Der grosse Vorteil von MyDumper neben der Geschwindigkeit durch Parallelisierung ist, dass alle Datenbanktabellen in einzelnen Dateien vorliegen und so leicht modifiziert werden könnten.
Höhere Geschwindigkeit bedeutet auch, dass man öfter Backups machen kann (bei mir alle vier Stunden).
MyDumper muss selber übersetzt werden, wenn es nicht in der Distribution dabei ist. Den Anfang bildet dass Holen des Quelltextes:
$ git clone https://github.com/maxbube/mydumper.git mydumper.git
Danach setzen wir die Variablen für das Übersetzen des Quelltextes.
$ export CC=/home/dirk/workspace/sclgcc.bash
$ export CXX=/home/dirk/workspace/sclc++.bash
$ export MAKEFLAGS="-j $(lscpu | awk '/^CPU\(s\)/ {print $2}')"
Die ersten beiden Variablen habe ich im gestrigen Artikel erwähnt.
Die MAKEFLAGS
sorgen dafür, dass make
mit mehreren Threads arbeitet. Ich nehme dafür die Anzahl der CPUs, die mir das System meldet.
$ yum install glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel
Nachdem wir neben dem C++ Compiler, Make und CMake die Vorbedingungen installiert haben, kann es auch schon losgehen.
$ cd /home/dirk/workspace/mydumper.git
$ git clean -dfx
$ cmake . -DMYSQL_LIBRARIES_mariadb:FILEPATH=/usr/lib64/libmariadbclient.a -DWITH_SSL=OFF -DBUILD_DOCS=off
$ make
$ sudo make install
Das "git clean" räumt unter anderem die Reste von alten Übersetzungsversuchen auf. Guckt Euch bitte die Parameter gut an, bevor Ihr das in Repos macht, in denen Ihr Schreibrechte besitzt.
Da auf meinen Servern die aktuelle stabile Version von MariaDB arbeitet und ich ebenfalls den MariaDB-Client installiert habe, muss cmake
das auch mitteilen.
Der Backup-User benätigt in der Datenbank "nur" Select-, Reload und Lock Tables Berechtigungen.
CREATE USER 'b2'@'localhost' IDENTIFIED VIA mysql_native_password USING 'kryptisches Passwort';
GRANT SELECT, RELOAD, LOCK TABLES ON *.* TO 'backup'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
Nachdem jetzt alles fertig ist, kann das folgende Backupskript seinen Dienst tun.
#!/bin/bash
# db-backup.bash
set -o errexit
BACKUPDB_DIR="/srv/bak/dumps"
DB_USERNAME="backup"
DB_PASSWORD="kryptisches Passwort"
THREADS=$(lscpu | awk '/^CPU\(s\)/ {print $2}')
cd ${BACKUPDB_DIR}
/usr/local/bin/mydumper --user ${DB_USERNAME} --password ${DB_PASSWORD} --threads ${THREADS}
find ${BACKUPDB_DIR} -type d -name 'export*' -mtime +1 -exec xargs rm -r '{}' \+
WICHTIG: Am Ende des Skripts werden alle Backups gelöscht, die älter sind als ein Tag.