AWS RDS - 自动备份与使用 MyISAM 表的快照
AWS RDS - automatic backup vs snapshot with MyISAM tables
我有一个带有 MyISAM 表的 AWS RDS MySQL 5.7 数据库,我想将其迁移到自定义 VPC 中的另一个 RDS,迁移后,将这些 MyISAM 表转换为 InnoDB。
如果我理解正确,创建正确自动备份的唯一方法是使用此处说明的以下过程:"Automated Backups with Unsupported MySQL Storage Engines"
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html#Overview.BackupDeviceRestrictions
- 停止所有 activity 到您的 MyISAM 表(即关闭所有会话)。
您可以通过为从 SHOW FULL PROCESSLIST 命令返回的每个进程调用 mysql.rds_kill 命令来关闭所有会话。
- 锁定并刷新您的每个 MyISAM 表
- 创建数据库实例的快照。快照完成后,释放锁并在 MyISAM 表
上恢复 activity
有人做过这个程序吗?
快照是如何每晚从当前 RDS DBInstance 成功创建的,即使它包含 MyISAM 表?
谢谢!
问题不在于快照创建。当您实际尝试使用其中一个快照时可能会出错。
如果您的 RDS 实例的底层 EBS 卷(您看不到该卷,但它就在那里——RDS 在 EC2 上运行,具有 "hidden" 个实例和卷),RDS 快照会通过捕获快照来工作。 =15=]
EBS 快照捕获硬盘驱动器的全部内容,与快照进程开始时碰巧存在的内容完全一样。
如果执行 sudo killall -9 mysqld
,快照上的结果与 MySQL 服务器上的结果基本相同——就好像服务器立即停止了一切,没有做任何通常为正常关机而清理的事情。对于 RDS,事情并没有那么戏剧化,因为 RDS 确实采取了一些预防措施,但从根本上说,这就是正在发生的事情的本质。
当您从快照创建 RDS 实例时,实例启动时发生的第一件事与您假设的服务器在您重新启动被杀死的 MySQL 服务器守护程序时所做的第一件事相同:InnoDB 崩溃恢复.
InnoDB Crash Recovery
To recover from a MySQL server crash, the only requirement is to restart the MySQL server. InnoDB automatically checks the logs and performs a roll-forward of the database to the present. InnoDB automatically rolls back uncommitted transactions that were present at the time of the crash.
https://dev.mysql.com/doc/refman/5.7/en/innodb-recovery.html#innodb-crash-recovery
崩溃恢复是 InnoDB 的机制,用于使内部数据结构中的一切恢复和谐,并确保所有数据完好无损,与您的应用程序离开时完全一样。这是可能的,因为 InnoDB 是一个事务存储引擎。这意味着很多不同的事情,但在这种情况下它具体意味着当您更改 table 时 InnoDB 不只是更改 table 数据。它经历了一个可以像这样简化的过程:
- 将建议的更改存储到磁盘¹
- 实际进行更改
- 将更改标记为完成
这意味着在更改完成之前,InnoDB 可以被中断,随后可以从中断的地方继续,而不会损坏或丢失数据。
MyISAM 没有这样的机制。它只是直接写入数据文件。即使 MyISAM table 没有被积极使用,它可能仍然需要在服务器启动时进行修复,以清理其结构。在某些情况下,修复table可能是不可能的,table中的全部或部分数据将丢失。
如果您的 MyISAM tables 在快照发生时被刷新和锁定,它们在磁盘上处于静止状态,就好像服务器实际上在快照发生之前已经正常关闭一样,所以他们将是快照上的 stable。
但是快照过程似乎总是成功的,因为快照只是复制磁盘上的任何内容,因为它出现在快照开始的时刻。
问题是捕获的快照可能无法使用,您无法知道快照是否完全可用。
¹ 请注意,第一步 "store the proposed changes to disk" 与系统变量 innodb_flush_log_at_trx_commit
有关,如果设置为 1
会使系统变慢,但也是最安全的设置,因为您的在第一步完成之前,查询实际上并没有成功。 2
的设置仍然相当安全,因为它仍然会写入更改,但无需操作系统确认它们实际上已写入硬盘驱动器即可继续,然后您的查询 returns 成功...但在崩溃中,您的应用程序认为已提交的事务可能会或可能不会幸存。
我有一个带有 MyISAM 表的 AWS RDS MySQL 5.7 数据库,我想将其迁移到自定义 VPC 中的另一个 RDS,迁移后,将这些 MyISAM 表转换为 InnoDB。 如果我理解正确,创建正确自动备份的唯一方法是使用此处说明的以下过程:"Automated Backups with Unsupported MySQL Storage Engines" https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html#Overview.BackupDeviceRestrictions
- 停止所有 activity 到您的 MyISAM 表(即关闭所有会话)。 您可以通过为从 SHOW FULL PROCESSLIST 命令返回的每个进程调用 mysql.rds_kill 命令来关闭所有会话。
- 锁定并刷新您的每个 MyISAM 表
- 创建数据库实例的快照。快照完成后,释放锁并在 MyISAM 表 上恢复 activity
有人做过这个程序吗? 快照是如何每晚从当前 RDS DBInstance 成功创建的,即使它包含 MyISAM 表?
谢谢!
问题不在于快照创建。当您实际尝试使用其中一个快照时可能会出错。
如果您的 RDS 实例的底层 EBS 卷(您看不到该卷,但它就在那里——RDS 在 EC2 上运行,具有 "hidden" 个实例和卷),RDS 快照会通过捕获快照来工作。 =15=]
EBS 快照捕获硬盘驱动器的全部内容,与快照进程开始时碰巧存在的内容完全一样。
如果执行 sudo killall -9 mysqld
,快照上的结果与 MySQL 服务器上的结果基本相同——就好像服务器立即停止了一切,没有做任何通常为正常关机而清理的事情。对于 RDS,事情并没有那么戏剧化,因为 RDS 确实采取了一些预防措施,但从根本上说,这就是正在发生的事情的本质。
当您从快照创建 RDS 实例时,实例启动时发生的第一件事与您假设的服务器在您重新启动被杀死的 MySQL 服务器守护程序时所做的第一件事相同:InnoDB 崩溃恢复.
InnoDB Crash Recovery
To recover from a MySQL server crash, the only requirement is to restart the MySQL server. InnoDB automatically checks the logs and performs a roll-forward of the database to the present. InnoDB automatically rolls back uncommitted transactions that were present at the time of the crash.
https://dev.mysql.com/doc/refman/5.7/en/innodb-recovery.html#innodb-crash-recovery
崩溃恢复是 InnoDB 的机制,用于使内部数据结构中的一切恢复和谐,并确保所有数据完好无损,与您的应用程序离开时完全一样。这是可能的,因为 InnoDB 是一个事务存储引擎。这意味着很多不同的事情,但在这种情况下它具体意味着当您更改 table 时 InnoDB 不只是更改 table 数据。它经历了一个可以像这样简化的过程:
- 将建议的更改存储到磁盘¹
- 实际进行更改
- 将更改标记为完成
这意味着在更改完成之前,InnoDB 可以被中断,随后可以从中断的地方继续,而不会损坏或丢失数据。
MyISAM 没有这样的机制。它只是直接写入数据文件。即使 MyISAM table 没有被积极使用,它可能仍然需要在服务器启动时进行修复,以清理其结构。在某些情况下,修复table可能是不可能的,table中的全部或部分数据将丢失。
如果您的 MyISAM tables 在快照发生时被刷新和锁定,它们在磁盘上处于静止状态,就好像服务器实际上在快照发生之前已经正常关闭一样,所以他们将是快照上的 stable。
但是快照过程似乎总是成功的,因为快照只是复制磁盘上的任何内容,因为它出现在快照开始的时刻。
问题是捕获的快照可能无法使用,您无法知道快照是否完全可用。
¹ 请注意,第一步 "store the proposed changes to disk" 与系统变量 innodb_flush_log_at_trx_commit
有关,如果设置为 1
会使系统变慢,但也是最安全的设置,因为您的在第一步完成之前,查询实际上并没有成功。 2
的设置仍然相当安全,因为它仍然会写入更改,但无需操作系统确认它们实际上已写入硬盘驱动器即可继续,然后您的查询 returns 成功...但在崩溃中,您的应用程序认为已提交的事务可能会或可能不会幸存。