我们其中一个数据库上使用 mysqldump 进行的计划备份导致Too many connections
。该数据库包含 InnoDB 和 MyISAM 表,大小约为 500Mb。Too many connections
出现这种情况大约持续 2-3 分钟
我们知道 mysqldump 会锁定表并导致所有其他查询和连接堆积并堵塞 mysql 服务器。
我们需要频繁备份,我们不能承受服务器停机或网站处于维护模式。我们的网站是全球性的,流量一直很高,因此很难找到备份的时间。
我们如何避免备份期间停机?
有没有办法使用 mysqldump 使其不会同时锁定所有表?
有没有使用 mysqldump 备份的替代方法?
答案1
首先,尝试逐表或逐数据库进行备份 - 不要锁定所有内容。
增加 max_connections,否则尝试使用连接限制: http://dev.mysql.com/doc/refman/5.5/en/user-resources.html
我不确定增加 max_connections 是否会占用太多内存。
如果您使用 MyISAM - 没有其他方法可以备份。使用 InnoDB 或 XTraDB - 没有问题。 http://www.innodb.com/doc/hot_backup/manual.html
答案2
1)设置第二台服务器,将您的数据库复制到该服务器,从那里备份
如果您的主服务器上有很多更改,这可能不是一个好的解决方案,因为从属服务器上的复制是单线程的。
2)使用http://www.percona.com/doc/percona-xtrabackup/
或者像往常一样,查阅官方文档,其中概述了其他替代方案:
http://dev.mysql.com/doc/refman/5.1/en/backup-methods.html
答案3
有没有使用 mysqldump 备份的替代方法?
您打算如何使用它们?如果您想要快速且便宜的增量备份,我只会使用rsync
(或rsnapshot
用于rsync
保留多个并发副本而不占用太多额外磁盘空间)来备份/var/lib/mysql
(或数据文件可能所在的任何地方)。
我是假设您实际上不会使用它们来复制/解析或以其他方式解释,但万一您的服务器发生故障,您需要(本质上)执行全盘恢复。这也使得这种恢复非常快(但很严格,您实际上要么恢复所有内容,要么什么都不恢复),因为它是一个标准的复制操作。在最好的情况下,您可以根据需要经常使用它,并使用另一种备份机制(例如mysqldump
在非高峰时间)来确保您永远不会没有更新的可解析转储。
答案4
myisam 和 innodb-tables 的混合使用使事情变得有些复杂。如果您可以将 myisam-tables 转换为 innodb-tables,则可以在事务内运行 mysqldump。这样,您将获得一致的备份,而无需表/数据库锁定。
问题可能在于:
- 性能:对于您的应用程序来说,Innodb 可能比 myisam 慢
- 功能:如果您使用只有 myisam 才具备的功能