验证 mysqldump 备份没有损坏

sam*_*sam 9 mysql innodb mysqldump backup restore

我们有一个 cron 任务使用来备份我们的数据库mysqldump- 我主要担心的是损坏,没有每次手动导入和检查备份,检查/验证备份是否无损坏的最佳方法是什么?

背景:我们正在运行 mysql 5.5.* 和 InnoDB。我们mysqldump直接从服务器运行。我们目前没有使用主/从或主/主,但如果有帮助,可以更改。DB 目前小于 1mb,在可预见的未来将小于 50mb,因此在这种情况下确实不需要考虑规模。

Rol*_*DBA 6

您需要考虑两件事

备份过程

确实没有什么可以替代进行还原。这只是 mysqldump 的重播。如果您需要执行PITR,您可能需要针对适用的二进制日志运行mysqlbinlog并在所需的日期和时间之前播放事件。

您应该定期执行此操作,以防 mysqldump 所在的磁盘损坏或 mysqldump 包含 BLOB 中的字符序列,从而无法恢复。

备份完整性

您应该能够毫无问题地启动 mysqld。mysqld 运行后,您需要测试每个表的可用性。您可以通过运行此查询来做到这一点:

SELECT CONCAT('CHECK TABLE ',dbtb,';') FROM
(SELECT CONCAT(table_schema,'.',table_name) dbtb FROM
information_schema.tables WHERE table_schema NOT IN
('information_schema','performance_schema','mysql')) A;
Run Code Online (Sandbox Code Playgroud)

这将为每个 MyISAM、InnoDB、ARCHIVE 和 CSV 表创建一个CHECK TABLE命令来检查它们的完整性。您可以将其输出到脚本并执行该脚本。CHECK TABLE 命令还可以让您将所有表作为单个命令进行检查。您可以更改查询以将表名收集为逗号分隔的列表并添加:

SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM
(SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM
information_schema.tables WHERE table_schema NOT IN
('information_schema','performance_schema','mysql')) A;
Run Code Online (Sandbox Code Playgroud)

警告:GROUP_CONCAT()函数的默认限制为 1024 个字符。如果你的表数量不多,你不会列出所有的表,最后列出的表会被截断,导致错误。您可以在命令前加上SET SESSION group_concat_max_len = 10000;以增加返回的长度。

这是我笔记本电脑上 MySQL 5.6.16 (Windows) 的示例:

mysql> SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM
    -> (SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM
    -> information_schema.tables WHERE table_schema NOT IN
    -> ('information_schema','performance_schema','mysql')) A;
+----------------------------------------------------------------------------+
| CONCAT('CHECK TABLE ',dbtblist,';')                                        |
+----------------------------------------------------------------------------+
| CHECK TABLE ayman.articles,ayman.topics,test.nuoji,test.prod,test.prodcat; |
+----------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)

然后,将该输出存储到变量并从命令行执行。请注意,我们group_concat_max_len在运行命令之前暂时增加了。

MYSQL_USER=root
MYSQL_PASS=rootpass
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SET SESSION group_concat_max_len = 1048576;"
SQL="${SQL} SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM"
SQL="${SQL} (SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM"
SQL="${SQL} information_schema.tables WHERE table_schema NOT IN"
SQL="${SQL} ('information_schema','performance_schema','mysql')) A"
mysql ${MYSQL_CONN} -ANe"${SQL}" | mysql ${MYSQL_CONN}
Run Code Online (Sandbox Code Playgroud)

试一试 !!!


aku*_*sky 4

验证备份的最佳方法是从中恢复数据库。

这样做的另一个原因是减少恢复时间。