我正在尝试使用AutoMysqlBackup
脚本来执行应用程序的每日备份。不幸的是,在第一次尝试时,它并没有像我想象的那样为我服务。
我相信该脚本已使用该--lock-tables=true
参数,它使我的应用程序停止工作。
如果是这种情况,我怎样才能使脚本不锁定表? (这样我的应用程序就可以继续运行)?
谢谢。
答案1
好吧,不太熟悉该软件,但是:
- 它是一个 shell 脚本,因此(理论上)编辑起来很简单。当然,它是一个约 2200 行的 shell 脚本。
- 我认为 --lock-tables 来自 --opt,它是指定的(来自非常快速浏览)位于函数顶部
parse_configuration
。你可以--skip-lock-tables
在那里添加。 - 它使用 mysql 实用程序,因此您也可以
.my.cnf
以正常方式将其添加到您的中。
一般来说:
- 您没有使用 InnoDB,而是使用 MyISAM,因此没有事务。所以你不能使用
--single-transaction
. - 因此,您需要锁定以确保一致性。即使有锁定,也不能保证(只是更有可能)。但这只是在正常操作中保证的程度。认真考虑 InnoDB(但请先阅读文档,进行研究,然后进行测试,以确保它不会破坏您的应用程序)。
- 如果禁用锁定,您可能会:
- 开始备份
- 备份表A。
- 删除A中的一条记录,同时删除B中的子记录。
- 备份表B .
- 您的备份现在包含 A 中的一条记录,该记录指向 B 中不存在的记录。换句话说,它不一致。
- 还有更广泛使用的 MySQL 备份解决方案。也许你应该切换到其中之一。更容易找到更多人使用的软件的帮助(而且它也往往经过更好的测试)。
- 您可以思考您有备份,但只有在实际成功恢复(最好是从裸机(新格式化的硬盘))之前,您才会这样做。理想情况下,您可以定期执行此操作,并且最好将其自动化。这并不特定于 MySQL,它适用于全部备份。
有一个解决方案(除了切换到 InnoDB):您可以在从服务器上执行备份。如果您锁定所有表或SLAVE STOP SQL_THREAD
在备份期间锁定所有表并不重要,因为这对主表来说并不重要。这是无停机解决方案。你应该无论如何,都有这台服务器,作为热/热备用服务器,以防主服务器发生故障。
还有另一种解决方案可以最大限度地减少停机时间:将数据库放在 LVM 卷上,执行操作FLUSH TABLES WITH READ LOCK
,拍摄 LVM 快照,然后释放读锁(断开连接将执行此操作)。然后您可以从快照进行备份。这就是“我买不起另一台机器”的解决方案。
答案2
对于 Innodb,您只需在conf 文件中添加 CONFIG_mysql_dump_single_transaction='yes' 即可。
对于MyISAM引擎,您需要在automysqlbackup文件中添加--skip-add-locks。找到函数 parse_configuration 并添加数组值,如下所示。
我已经检查过它工作得很好。
改变
解析配置(){ # 用于 mysqldump 的 OPT 字符串(参见 man mysqldump ) opt=( '--引用名称' '--opt')
到
解析配置(){ # 用于 mysqldump 的 OPT 字符串(参见 man mysqldump ) opt=( '--quote-names' '--opt' '--skip-add-locks' '--skip-add-drop-table')