MySQL DB 备份:无锁、按表恢复、MyISAM/InnoDB

MySQL DB 备份:无锁、按表恢复、MyISAM/InnoDB

问题

我想在专用服务器上实施 MySQL 备份策略。

它有多个数据库,总计约 150GB。其中大部分都集中在其中一个数据库中。

数据库是混合引擎 MyISAM 和 InnoDB(长期计划进行全面改革,但短期内不可能)。

寻找可以使用的策略/软件的建议。

 主要目标

理想的MySQL备份过程将实现以下目标。

  1. 一致的 MySQL 备份。
  2. 无锁备份(或接近无锁备份,以便数据库仍然可以满足请求)。
  3. 按表恢复。

目前的建议

我不是专业的系统/数据库管理员,因此我非常感谢社区的博学建议。到目前为止,我有一些建议...

mysqllvm 荷兰备份

Holland Backup 拥有mysqllvm选项。

它通过对 MySQL 数据目录进行完整快照来工作。在拍摄快照时,它会锁定一小段时间,并且保持一致。

它实现了目标 1 和 2。

目标 3,不太多……只能恢复整个数据目录。无法对每个数据库进行恢复,更不用说每个表了。

mysqldumplvm 荷兰备份

Holland Backup 拥有mysqldumplvm选项。

这实现了目标 1 和 2。

目标 3,不是很多...它仅允许从 .sql 转储中恢复每个数据库,由于数据库的大小,需要花费数小时/天才能恢复到虚拟数据库,仅提取一个表。磁盘空间可能开始成为问题。

答案1

有一种方法可以实现所有三个目标,但我不知道是否有产品可以做到这一点,所以我将按以下方式编写脚本:

  • 使用 LVM 快照获取数据库的一致状态(不要忘记 FLUSH TABLE WITH READ LOCK)
  • 将快照挂载到特定位置:/opt/mysql 读写
  • 使用 --data-dir=/opt/mysql 启动 mysqld 作为第二个实例(以及像 --skip-network 这样的选项以避免冲突,并将套接字文件分离到 /var/lib/mysql/mysql.sock 以外的其他地方) - 帮助:在 Unix 服务器上运行多个 Mysql 实例

然后,你可以使用任何脚本,通过连接到你的第二个 mysql 实例,为每个表生成一个转储表,并保证一致性

最后,如果快照性能或磁盘大小是一个问题,您只需将快照移动到第二台服务器上,然后在第二个位置执行转储。

答案2

我认为您知道目标 3 与目标 1 相矛盾。

显而易见的解决方案是在镜像文件系统上实现数据存储。当您想要进行备份时,请停止 DBMS,刷新写入缓冲区,中断镜像并重新启动 DBMS,然后将镜像文件系统挂载到其他地方,并使用副本启动 DBMS 的第二个实例并将其用于备份。

(虽然您可以在不关闭 DBMS 的情况下破坏镜像,但您必须修复数据并且不会有一致的快照)。

或者,设置第二台机器的复制集群并从另一个节点执行备份。

(使用文件系统快照可能是另一种方法 - 但 LVM 或 BTRFS 的性能开销很大)。

答案3

您还可以考虑 Percona XtraBackup (http://www.percona.com/software/percona-xtrabackup)虽然据我所知它与 MyISAM 不兼容

编辑:实际上它与 MyISAM 兼容

答案4

mysqldumplvm 荷兰备份

进一步了解其工作原理:

-> 发出 FLUSH WITH READ LOCK -> 获取 MySQL 数据目录的 LVM 快照 -> 根据此快照启动单独的 MySQL 实例 -> 对每个数据库执行 mysqldump 到 database.sql -> 压缩这些文件 -> 终止单独的 MySQL 实例并删除快照

我认为可以修改 mysqldump 步骤,使其循环遍历每个表,然后将 mysqldump 到 database/table.sql。这样可以实现每个表的恢复。

相关内容