MySQL整数据库备份过程,以MariaDB 10.4为例。
备份
安装工具
1 2 |
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash apt install mysql-client |
执行备份
如果数据库在本机,启用了UNIX Socket连接方式,那么不需要提供鉴权:
1 |
mysqldump --all-databases | gzip > dump.sql.gz |
如果数据库需要鉴权,那么我们首先创建一个只读的用户:
1 2 3 |
create user 'mysql-backup-user'@'backup.server.ip.address' identified via mysql_native_password using PASSWORD("super-secret-passw0rd"); grant SELECT, SHOW VIEW, LOCK TABLES on *.* to 'mysql-backup-user'@'backup.server.ip.address'; flush privileges; |
然后在远端执行备份:
1 |
mysqldump --host="mysql.server.address" --user="mysql-backup-user" --password="super-secret-passw0rd" --all-databases | gzip > dump.sql.gz |
分别备份每个数据库
考虑到把所有数据库备份到同一个文件不够scalable,我们可以先查询一下有哪些数据库,然后逐个备份。为了减小文件大小,加入了gzip压缩功能。(本来想用xz的,但是xz实在太吃CPU。)
最后完成的脚本是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#!/bin/bash set -Eeuo pipefail MYSQL_HOST="your.server.ip" MYSQL_USER="mysql-backup-user" MYSQL_PASSWORD="super-secret-passw0rd" export TZ=UTC cd "$( dirname "${BASH_SOURCE[0]}" )" rm -rf --one-file-system backup mkdir -p backup date "+%s%N" | cut -b1-13 > backup/timestamp.txt databases=$(echo "SHOW DATABASES;" | mysql --host="$MYSQL_HOST" --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" --skip-column-names --silent) while IFS= read -r database; do echo -n "[$database] " case "$database" in "information_schema" | "performance_schema" ) echo "Skipped" ;; * ) filename="backup/$database.sql.gz" start=`date +%s` mysqldump --host="$MYSQL_HOST" --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" "$database" | gzip > $filename end=`date +%s` echo "Generated" `stat -c "%s" $filename` "bytes in $((end-start)) seconds" ;; esac done <<< "$databases" echo "Done." |
在Docker内执行备份
我有一台服务器上有个Docker里面运行的Duplicati 2,它可以在执行备份之前触发一个脚本来实现自动导出MySQL数据库内容,但是Duplicati 2的官方容器里面没有操作数据库的工具。那么我们可以workaround一下:
启动Duplicati 2
1 |
docker run --name=duplicati --restart-always -v /:/host -v /path/to/duplicati/config:/data -p 8200:8200 duplicati/duplicati:latest |
执行备份
1 |
chroot /host mysqldump --host="mysql.server.address" --user="mysql-backup-user" --password="super-secret-passw0rd" --all-databases | gzip > /path/to/backup/destination/dump.sql.gz |
参考:
也可以考虑直接 tar 整个 MySQL 数据目录(