MySQL Dump mit Skript ausführen

Andreas Preuss
05-06-2018 17:07

Auch von Datenbanken sollten regelmässig Backups erstellt werden. Um ein Backup einer Datenbank oder gleich mehreren anzulegen empfiehlt sich mysqldump. Es gibt auch die Möglichkeit ein Backup mit phpmyadmin oder ähnlichen Frontends anzufertigen. Allerdings müssen diese oft extra installiert werden und bei umfangreichen Datenbanken stösst man schnell an Einschränkungen wie z.B PHP-Timeouts. Mysql/MariaDB bringt bei der Installation schon die nötigen Backup-Tools mit. Daher müssen diese nicht extra installiert werden.
Das dump_databases.sh - Script sichert mittels mysqldump alle bekannten Datenbanken (db1_1, db2_2 und db3_3 ...) in /root/mysql_backup in den Unterordner /act und rotiert ggf. vorher /act nach /prev.
Scriptdatei: dump_databases.sh in /root/

#!/bin/bash

# variables
cnf_file="/root/.mysql_dump.cnf"
save_to="/root/mysql_backup"
db_directory=$1
db_list="db1_1 db2_2 db3_3"

# check if save directory exists
if [ ! -d ${save_to} ]; then
	mkdir -p ${save_to}
fi

# set rights for it
chmod 0700 ${save_to}

# log start
date +"%Y-%m-%d %H:%M:%S: *** starting db backup script" >> ${save_to}/dump.log

# check if 'prev' directory exists
if [ -d "${save_to}/prev" ]; then

	# delete previous backup
	date +"%Y-%m-%d %H:%M:%S: delete /prev" >> ${save_to}/dump.log
	rm -fR ${save_to}/prev
fi

# check if 'act' directory exists
if [ -d "${save_to}/act" ]; then

	# move actual to previous backup
	date +"%Y-%m-%d %H:%M:%S: move /act to /prev" >> ${save_to}/dump.log
	mv ${save_to}/act ${save_to}/prev
fi

# create 'act' directory
date +"%Y-%m-%d %H:%M:%S: create /act" >> ${save_to}/dump.log
mkdir -p ${save_to}/act

# run through db directory
for db_name in ${db_list}; do

    # if name of db exists as directory
	if [[ -d "${db_directory}/${db_name}" ]]; then

		# append log
		date +"%Y-%m-%d %H:%M:%S: dump ${db_name} to /act" >> ${save_to}/dump.log
		
		# Je nach Serverauslastung und Datenbankgroesse gibt es unterschiedliche Möglichkeiten (plain, gzip, xz, bzip2) das SQL zu komprimieren.
                # Aus eigenen Messungen einer 5GB und 200GB großen, bereits teilkomprimierten DB ist xz -1 der beste Kompromiss aus Kompressionlevel 
                # und -geschwindigkeit (Auf -1 ist xz 3x schneller als bzip2 bei nur ca. 9% größerem Archiv.). 
                # Daher ist das auch standardmässig im Script voreingestellt. Falls eine andere Kompression gewünscht ist, einfach die jeweilige Zeile 
                # in der dump_databases.sh ein- und alle andere auskommentieren, bzw. ändern

		# dump db plain to sql file
		# mysqldump --defaults-file=${cnf_file} --no-create-db --no-create-info --skip-comments ${db_name} > ${save_to}/act/${db_name}.sql 2>> ${save_to}/dump.log

		# dump db to gzip file (very fast, low compression)
		# mysqldump --defaults-file=${cnf_file} --no-create-db --no-create-info --skip-comments ${db_name} | gzip > ${save_to}/act/${db_name}.sql.gz 2>> ${save_to}/dump.log

		# dump db to xz file (normal to very slow, great compression)
		mysqldump --defaults-file=${cnf_file} --no-create-db --no-create-info --skip-comments ${db_name} | xz -1 > ${save_to}/act/${db_name}.sql.xz 2>> ${save_to}/dump.log

		# dump db to bzip2 file (slow, good compression)
		# mysqldump --defaults-file=${cnf_file} --no-create-db --no-create-info --skip-comments ${db_name} | bzip2 > ${save_to}/act/${db_name}.sql.bz2 2>> ${save_to}/dump.log
	fi
done


# log finish
date +"%Y-%m-%d %H:%M:%S: finished db backup script" >> ${save_to}/dump.log

exit 0

ausführen als root:

Folgendes ist als als root allerdings vorher durchzuführen, damit mysqldump per crontab gestartet wird. Ggf. muss die Angabe zum Pfad des MySQL-Verzeichnisses (default: /var/lib/mysql ) im folgeden angepasst werden. Das Script braucht den Pfad um vor dem Dump zu prüfen, welche der DBs existiert.

cd ~
 
# Optional externer Download des Scripts vom anderen Server (for root only)
# wget -nv -N http://my_own_github_archive.int/debianinstall/server/dump_databases.sh

chmod 0700 dump_databases.sh
chmod +x dump_databases.sh

# create crontab.txt to define CronJobs
printf "# dumping databases mondays and fridays at 03:00\n" >> /root/crontab.txt
printf "0  3 * * 1 /root/dump_databases.sh /var/lib/mysql > /dev/null 2>&1\n" >> /root/crontab.txt
printf "0  3 * * 5 /root/dump_databases.sh /var/lib/mysql > /dev/null 2>&1\n" >> /root/crontab.txt
 
# set crontab configruation with crontab.txt (list actual config with crontab -l)
crontab crontab.txt
 
# create .mysql_dump.cnf and make it only accessable to root (don't write a password in command line, edit it in file)
printf "[client]\n" > /root/.mysql_dump.cnf
printf "host     = localhost\n" >> /root/.mysql_dump.cnf
printf "user     = root\n" >> /root/.mysql_dump.cnf
printf "password = \n" >> /root/.mysql_dump.cnf
printf "socket   = /var/run/mysqld/mysqld.sock" >> /root/.mysql_dump.cnf
chmod 0600 .mysql_dump.cnf

In der erstellten .mysql_dump.cnf bitte manuell das MySQL-Passwort setzen: /root/.mysql_dump.cnf
[client]
host = localhost
user = root
password = Mein_Passwort
socket = /var/run/mysqld/mysqld.sock

Tags: Backup, Bash, Cronjob, Debian, Linux, mySQL Server, Shell
Durchschnittliche Bewertung: 0 (0 Abstimmungen)

Es ist möglich, diese FAQ zu kommentieren.