gpt4 book ai didi

mysql - 备份 MySQL 亚马逊 RDS

转载 作者:IT老高 更新时间:2023-10-28 23:56:08 28 4
gpt4 key购买 nike

我正在尝试在 AWS 之外设置副本,而 master 正在 AWS RDS 上运行。而且我不希望我的主人有任何停机时间。所以我设置了我的从节点,现在我想备份我在 AWS 上的当前数据库。
mysqldump -h RDS ENDPOINT -u root -p --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 --all-databases > /root/dump.sql
我在我的虚拟机上测试了它并且它工作正常但是当它与 RDS 绑定(bind)时它给了我错误
mysqldump: Couldn't execute 'FLUSH TABLES WITH READ LOCK': Access denied for user 'root'@'%' (using password: YES) (1045)
是因为我没有 super 用户权限还是如何解决这个问题?请有人建议我。

最佳答案

RDS 甚至不允许主用户 SUPER特权,这是执行 FLUSH TABLES WITH READ LOCK 所必需的. (这是 RDS 的一个不幸限制)。

失败的语句是由 --master-data 生成的选项,当然,如果您希望能够了解备份开始的精确二进制日志坐标,这是必要的。 FLUSH TABLES WITH READ LOCK获取所有表的全局读锁,允许mysqldump到START TRANSACTION WITH CONSISTENT SNAPSHOT (就像 --single-transaction 一样)然后是 SHOW MASTER STATUS获取二进制日志坐标,之后它释放全局读锁,因为它有一个事务,将使可见数据处于与该日志位置一致的状态。

RDS 通过拒绝 SUPER 打破了这一机制。特权并没有提供明显的解决方法。

有一些 hacky 选项可用于正确解决此问题,但没有一个可能特别有吸引力:

  • 在低流量期间做备份。如果 binlog 坐标在您开始备份和备份开始将数据写入输出文件或目标服务器之后没有改变(假设您使用了 --single-transaction ),那么这将起作用,因为您知道坐标没有改变在进程运行时。
  • 在开始备份之前观察 master 上的 binlog 位置,并将这些坐标与 CHANGE MASTER TO 一起使用。 .如果你的主人binlog_format设置为 ROW那么这应该可以工作,尽管您可能必须跳过一些初始错误,但随后不应出现任何错误。这是有效的,因为基于行的复制是非常确定的,如果它试图插入已经存在的东西或删除已经消失的东西,它就会停止。一旦通过错误,您将处于一致快照实际开始的真实二进制日志坐标处。
  • 和上一项一样,但是,在恢复备份后,尝试使用 mysqlbinlog --base64-output=decode-rows --verbose 确定正确的位置。在您获得的坐标处读取主站的二进制日志,检查您的新从站以查看在快照实际开始之前必须已经执行了哪些事件,并使用以这种方式确定的坐标到 CHANGE MASTER TO .
  • 使用外部进程获取服务器上每个表的读锁,这将停止所有写入;观察来自 SHOW MASTER STATUS 的 binlog 位置已停止递增,开始备份,并释放这些锁。

  • 如果您使用这些方法中的任何一种,也许不是最后一种,那么进行表比较以确保您的从站与主站运行时相同,这一点尤为重要。如果您遇到后续的复制错误……那么它不是。

    可能最安全的选择——但也可能是最烦人的,因为它似乎没有必要——首先创建 RDS 主节点的 RDS 只读副本。一旦它启动并同步到主服务器,您可以通过执行 RDS 提供的存储过程来停止 RDS 只读副本上的复制, CALL mysql.rds_stop_replication which was introduced in RDS 5.6.13 and 5.5.33不需要 SUPER特权。

    随着 RDS 副本从站停止,带上您的 mysqldump来自 RDS 只读副本,该副本现在将拥有一组不变的数据集,作为一组特定的主坐标。将此备份恢复到您的异地从站,然后使用来自 SHOW SLAVE STATUS 的 RDS 只读副本的主坐标。 Exec_Master_Log_PosRelay_Master_Log_File作为您的 CHANGE MASTER TO坐标。
    Exec_Master_Log_Pos中显示的值从站上是 the start of the next transaction or event to be processed ,这正是你的新奴隶需要开始在主人上阅读的地方。

    然后,一旦您的外部从站启动并运行,您就可以停用 RDS 只读副本。

    关于mysql - 备份 MySQL 亚马逊 RDS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638012/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com