我有一个 MySQL 5.5 数据库,其中有数千个表和繁重的写入工作量。
我需要使用 xtrabackup 进行在线备份(从生产服务器创建一个停机时间最短的从属服务器),但问题是备份的最后阶段(当它发出 FLUSH TABLES WITH READ LOCK 时)需要很长时间才能完成。我怀疑这是因为它复制了数千个 frm 表定义文件。我可以通过任何方式加快这个过程吗?例如,如果我确信表结构没有改变?
我还看到 innobackupex 有一个名为 --rsync 的选项,据说应该有帮助,但 innobackupex 现在已经弃用了,而且 xtrabackup 由于某种原因缺少这个选项。
任何有助于减少 FLUSH TABLES WITH READ LOCK 有效时间的帮助都将受到赞赏。
答案1
有一个--no-lock
选项但是,只有在没有可写的非 InnoDB 表的情况下才能使用它和如果你不关心 binlog 位置。
如果您不能使用,--no-lock
我建议设置一个副本并从中进行备份。
顺便说一句,--rsync
无论如何都帮不上忙。
答案2
为后人解答。Innobackupex--rsync
成功了。它将锁定时间缩短至几秒钟。
答案3
使用 --rsync 参数。
令人惊讶的是,它可用在 xtrabackup 上,尽管它没有出现在任何地方在撰写本文时,Percona XtraBackup 2.4 文档。该文档是错误的。=/
如果您将参数传递给 xtrabackup 命令,它的工作方式与 innobackupex 一样。这样做是有道理的,因为 innobackupex 现在只是一个“调用者”符号链接。
我看到你自问自答后又“退回”使用 innobackupex。我不建议这么做,因为根据文档:
从 Percona XtraBackup 2.3 版开始,innobackupex 已用 C 语言重写,并设置为 xtrabackup 的符号链接。innobackupex 支持 2.2 版的所有功能和语法,但现在已弃用,并将在下一个主要版本中删除。新功能的语法不会添加到 innobackupex,只会添加到 xtrabackup。
它是已经过时的并且缺少 xtrabackup 中提供的新功能。
例如“--databases-exclude”
在我的场景中,备份通常在 LOCK TABLES 中浪费 6 分钟:
180824 14:52:53 正在执行 FLUSH NO_WRITE_TO_BINLOG TABLES...
180824 14:52:53 正在执行 FLUSH TABLES WITH READ LOCK...
(...)
180824 14:58:55 正在执行 UNLOCK TABLES
180824 14:58:55 所有表均已解锁
使用--rsync后,时间就变得少于一秒了。
180824 13:07:28 正在执行 FLUSH NO_WRITE_TO_BINLOG TABLES...
180824 13:07:28 正在执行 FLUSH TABLES WITH READ LOCK...
180824 13:07:28 开始备份非 InnoDB 表和文件
180824 13:07:28 以下列方式启动 rsync:rsync -t . --files-
(...)
180824 13:07:28 正在执行 UNLOCK TABLES
180824 13:07:28 所有表均已解锁
我遇到了和你完全相同的问题,并且找到了你的问题和答案,再加上缺乏一致的文档,让我相信它不可用,最终我浪费了一天时间寻找替代解决方案,因为 innobackupex 已经过时并且没有我需要的一些功能,比如前面提到的--databases-exclude。
发布这个答案,以便如果其他人发现自己遇到完全相同的问题,他们就会知道他们可以使用该参数,即使它不在文档中。