AutoMysqlBackup --lock-tables=false

AutoMysqlBackup --lock-tables=false

我正在尝试使用AutoMysqlBackup脚本来执行应用程序的每日备份。不幸的是,在第一次尝试时,它并没有像我想象的那样为我服务。

我相信该脚本已使用该--lock-tables=true参数,它使我的应用程序停止工作。

如果是这种情况,我怎样才能使脚本不锁定表? (这样我的应用程序就可以继续运行)?

谢谢。

答案1

好吧,不太熟悉该软件,但是:

  • 它是一个 shell 脚本,因此(理论上)编辑起来很简单。当然,它是一个约 2200 行的 shell 脚本。
  • 我认为 --lock-tables 来自 --opt,它是指定的(来自非常快速浏览)位于函数顶部parse_configuration。你可以--skip-lock-tables在那里添加。
  • 它使用 mysql 实用程序,因此您也可以.my.cnf以正常方式将其添加到您的中。

一般来说:

  • 您没有使用 InnoDB,而是使用 MyISAM,因此没有事务。所以你不能使用--single-transaction.
  • 因此,您需要锁定以确保一致性。即使有锁定,也不能保证(只是更有可能)。但这只是在正常操作中保证的程度。认真考虑 InnoDB(但请先阅读文档,进行研究,然后进行测试,以确保它不会破坏您的应用程序)。
  • 如果禁用锁定,您可能会:
    1. 开始备份
    2. 备份表A。
    3. 删除A中的一条记录,同时删除B中的子记录。
    4. 备份表B .
    5. 您的备份现在包含 A 中的一条记录,该记录指向 B 中不存在的记录。换句话说,它不一致。
  • 还有更广泛使用的 MySQL 备份解决方案。也许你应该切换到其中之一。更容易找到更多人使用的软件的帮助(而且它也往往经过更好的测试)。
  • 您可以思考您有备份,但只有在实际成功恢复(最好是从裸机(新格式化的硬盘))之前,您才会这样做。理想情况下,您可以定期执行此操作,并且最好将其自动化。这并不特定于 MySQL,它适用于全部备份。

有一个解决方案(除了切换到 InnoDB):您可以在从服务器上执行备份。如果您锁定所有表或SLAVE STOP SQL_THREAD在备份期间锁定所有表并不重要,因为这对主表来说并不重要。这是无停机解决方案。你应该无论如何,都有这台服务器,作为热/热备用服务器,以防主服务器发生故障。

还有另一种解决方案可以最大限度地减少停机时间:将数据库放在 LVM 卷上,执行操作FLUSH TABLES WITH READ LOCK,拍摄 LVM 快照,然后释放读锁(断开连接将执行此操作)。然后您可以从快照进行备份。这就是“我买不起另一台机器”的解决方案。

答案2

  1. 对于 Innodb,您只需在conf 文件中添加 CONFIG_mysql_dump_single_transaction='yes' 即可。

  2. 对于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')

相关内容