我想在专用服务器上实施MySQL备份策略。
它有多个数据库,合计总数约150GB。 其中大部分是针对其中一个数据库的。
数据库是混合引擎MyISAM和InnoDB(计划overhall正在发生长期但短期内不可能)。
寻找可以使用的策略/软件的build议。
理想的MySQL备份程序将实现以下目标。
我不是一个专业的系统/数据库pipe理员,所以我会感谢社区的学习build议。 我到目前为止的一些build议…
Holland Backup有一个mysqllvm选项。
它通过获取MySQL数据目录的完整快照而工作。 它locking一个非常短的时间,而快照是一致的。
它达到了目标1和目标2。
目标3,不是那么多…只能恢复整个数据目录。 每个数据库恢复是不可能的,没关系每桌。
Holland Backup有一个mysqldumplvm选项。
这实现了目标1和2。
目标3,不是那么多…它只允许从.sql转储中恢复数据库的每个数据库,由于数据库的大小,每天需要花费数小时才能恢复到一个虚拟数据库,以便提取一个表。 磁盘空间可能开始成为一个问题在这里。
有一种方法可以实现所有这三个目标,但我不知道是否有产品,所以我会这样编写脚本:
然后,您可以使用任何脚本,每个表将生成一个转储表,通过连接到您的第二个mysql实例来保证一致
最后,如果快照性能或磁盘大小有问题,则可以在第二个服务器上移动快照,然后在第二个位置执行转储。
我认为你知道目标3与目标1相矛盾。
明显的解决scheme是在镜像文件系统上实现数据存储。 当您想要进行备份时,停止DBMS,刷新写入缓冲区,中断镜像并重新启动DBMS,然后在其他地方挂载镜像文件系统,并使用副本启动第二个DBMS实例,并将其用于备份。
(虽然你可以在不closures数据库pipe理系统的情况下打破镜像,那么你将不得不修复数据,并且不会有一致的快照)。
或者,将复制群集设置为第二台机器,并从另一个节点执行备份。
(使用文件系统快照可能是另一种方法 – 但LVM或BTRFS会有很大的性能开销)。
你也可以考虑Percona XtraBackup( http://www.percona.com/software/percona-xtrabackup ),虽然AFAIK它与MyISAM不兼容
编辑:其实它是与MyISAM兼容
如果使用Xtrabackup和InnoDB,你可以实现1,2和3。 对于MyISAM来说,不可能获得全部三个。
mysqldumplvm荷兰备份
扩展这个工作原理:
– >发出FLUSH WITH READ LOCK – >取得MySQL数据的LVM快照dir – >根据这个快照创build一个单独的MySQL实例 – >在每个数据库上执行一个mysqldump到database.sql – >压缩这些文件 – > Kills单独的MySQL实例并删除快照
我想mysqldump步骤可以修改,以循环通过每个表和mysqldump到数据库/ table.sql来代替。 这将使每个表恢复。
使用MySQL的复制function创build第二个副本数据库。 然后在副本上进行备份。 locking/减慢副本数据库不会影响主数据库的性能,并将提供一致的备份。
分别备份每个表需要在mysqldump周围编写一个包装脚本来分离备份文件,或者(甚至更快,但只能在MyISAM表上运行),您可以closures副本数据库并复制整个数据目录。 每个表都有它自己的数据文件。 重新启动副本服务器,它会从二进制日志中恢复。