§ mysqldump备份恢复


本文介绍GreatSQL数据库如何采用 mysqldump 进行备份恢复。

mysqldump 是GreatSQL数据库自带的逻辑备份工具,可以实现对整个数据库、单库、单表,以及表中部分数据进行备份等多种方式。

§ 全库备份

运行 mysqldump 时指定 -A / --all-databases 参数可以备份全库数据,如果还要备份存储过程、存储函数、视图、event时,还需要再指定 --triggers --routines --events 这三个参数:

mysqldump -S/data/GreatSQL/mysql.sock -A --triggers --routines --events > /backup/GreatSQL/fullbackup-`date +'%Y%m%d'`.sql
1

这就完成了备份全部数据,并且备份触发器、存储函数、event等其他元数据。

如果不想备份触发器、存储函数、event的话,则去掉上述几个选项 --triggers --routines --events

通常,在进行逻辑备份时,还会利用管道同步压缩,使得备份文件更小:

mysqldump -S/data/GreatSQL/mysql.sock -A --triggers --routines --events | gzip > /backup/GreatSQL/fullbackup-`date +'%Y%m%d'`.sql.gz
1

§ 单库备份

export db="greatsql"

mysqldump -S/data/GreatSQL/mysql.sock --triggers --routines --events -B ${db} | gzip > /backup/GreatSQL/${db}-`date +'%Y%m%d'`.sql.gz
1
2
3

如果不是备份全库数据,此时可能会有如下提示:

Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
1

大意是本次是部分数据备份,无法用于全量恢复,因此加上 gtid_purged 有一定风险,建议手动加上选项 --set-gtid-purged=OFF

这个选项建议不要加上,如果本次的逻辑备份文件用于后面的恢复时,再利用sed去掉 gtid_purged 信息,或者恢复之前先记录当时的 gtid_purged 信息,恢复结束后再还原回去。

§ 单表备份

export db="greatsql"
export table="t1"

mysqldump -S/data/GreatSQL/mysql.sock --triggers --routines --events ${db} ${table} | gzip > /backup/GreatSQL/${db}-${table}-`date +'%Y%m%d'`.sql.gz
1
2
3
4

§ 只备份部分数据

运行 mysqldump 时,加上 -w / --where 选项,可以指定 WHERE过滤条件,达到只备份某一部分数据的目的,例如:

export db="greatsql"
export table="t1"

# 只备份单表的部分数据
mysqldump -S/data/GreatSQL/mysql.sock -w "id>=10000" ${db} ${table} > /backup/GreatSQL/${db}-${table}-partial-`date +'%Y%m%d'`.sql

# 备份单库所有表的部分数据
mysqldump -S/data/GreatSQL/mysql.sock -f -w "id>=10000" -B ${db} > /backup/GreatSQL/${db}-partial-`date +'%Y%m%d'`.sql
1
2
3
4
5
6
7
8

如果个别表没有where条件中指定的列名,则会报告类似下面的错误:

mysqldump: Couldn't execute 'SELECT /*!40001 SQL_NO_CACHE */ * FROM `t4` WHERE id>=1000000': Unknown column 'id' in 'where clause' (1054)
1

加上选项 -f / --force 后,备份任务依然可以继续,不影响后面其他表的备份。

§ 逻辑备份恢复

mysqldump 逻辑备份文件恢复时很简单,只需调用mysql客户端执行恢复,有两种方式:

在mysql客户端工具里,执行 SOURCE 指令导入SQL文件,这种方式的缺点是终端会一直输出执行的结果,很不友好。用法是:

USE db;
SOURCE path/file.sql;
1
2

例如:

USE greatsql;
SOURCE /backup/GreatSQL/greatsql-20230830.sql;
1
2

小贴士

如果要恢复的SQL文件中不包含 USE db 这样切换到指定库名的话,就需要先自己手动执行 USE db 这个操作。

或者利用命令行的重定向方式:

mysql -f -S/data/GreatSQL/mysql.sock greatsql < /backup/GreatSQL/greatsql-20230830.sql;
1

小贴士

如果要恢复的SQL文件中不包含 USE db 这样切换到指定库名的话,就需要在调用mysql客户端时指定相应的库名greatsql,下同。

又或者在操作系统命令行模式下,直接用管道方式导入SQL文件:

cat /backup/GreatSQL/greatsql-20230830.sql | mysql -f -S/data/GreatSQL/mysql.sock greatsql
1

甚至还可以利用 sed 提取实现只恢复部分数据。

例1:提取备份文件中,数据库db1到db2之间的所有数据,即只恢复db1这个库

export DB1="db1"
export DB2="db2"

sed -n "/^-- Current Database: \`$DB1\`/,/^-- Current Database: \`$DB2\`/p" /backup/GreatSQL/greatsql-20230830.sql | mysql -f -S/data/GreatSQL/mysql.sock
1
2
3
4

例2:提取备份文件中,数据表tb1到tb2之间的所有数据,即只恢复tb1这个表

export TB1="tb1"
export TB2="tb2"

sed -n "/^-- Table structure for table \`$TB1\`/,/^-- Table structure for table \`$TB2\`/p" /backup/GreatSQL/greatsql-20230830.sql | mysql -f -S/data/GreatSQL/mysql.sock greatsql
1
2
3
4

例3:向 sed 传递参数,只提取指定行号的数据:

sed -n "100,200p" /backup/GreatSQL/greatsql-20230830.sql | mysql -f -S/data/GreatSQL/mysql.sock greatsql
1

即:提取备份文件中第100-200行之间的数据进行恢复。

更多关于 mysqldump 更详细说明详见文档:mysqldump (opens new window)

从GreatSQL 8.0.32-25版本开始,mysqldump支持加密备份,详情见文档:mysqldump备份加密

参考资料:

扫码关注微信公众号

greatsql-wx