使用xtrabackup --copy-back恢复单一数据库的关键命令是:xtrabackup --prepare --target-dir=/backup/full --databases="db1" && xtrabackup --copy-back --target-dir=/backup/full --databases="db1",这能精准恢复指定数据库而不影响其他数据。
步骤一:全库备份
首先执行全量备份:xtrabackup --backup --target-dir=/backup/full --user=root --password=xxx。备份完成后,你会看到在/backup/full目录下生成了很多文件,包括ibdata1、ib_logfile*和各个数据库的目录。
准备备份并指定数据库恢复
进入备份目录,执行xtrabackup --prepare --target-dir=/backup/full。这一步会回放redo log,使数据文件一致。然后,使用--databases="testdb"参数指定要恢复的数据库:xtrabackup --prepare --target-dir=/backup/full --databases="testdb"。这会只准备testdb的相关文件。
复制回数据目录
停止MySQL服务,备份数据目录mv /var/lib/mysql /var/lib/mysql.bak。然后执行xtrabackup --copy-back --target-dir=/backup/full --databases="testdb" --datadir=/var/lib/mysql。只复制testdb文件回去。设置权限chown -R mysql:mysql /var/lib/mysql,重启MySQL即可。
验证恢复结果
恢复后,登录MySQL检查:use testdb; show tables;。确保数据完整无误,其他数据库不受影响。如果有ibdata1问题,需要用--export参数处理,但单一库恢复通常无需。
常见错误处理
如果遇到xtrabackup: Error: some tables are not .ibd files,说明有分区表或共享表空间,用--export导出并import。另一个问题是权限,确保备份时用有PROCESS和RELOAD权限的用户。
FAQ:
Q: 恢复单一数据库会覆盖全库吗?A: 不会,使用--databases参数只复制指定库的文件,其他库保持原样。
Q: 需要全量备份还是增量?A: 全量备份即可,单一库恢复基于全备份,使用--databases过滤。
Q: 恢复后MySQL启动失败怎么处理?A: 检查ibdata1是否完整,或用innodb_force_recovery=1临时启动修复。