AWS RDS-使用MyISAM表自动备份与快照

Lui*_*uis 1 mysql rds amazon-web-services

我有一个带有MyISAM表的AWS RDS MySQL 5.7数据库,我想将其迁移到自定义VPC中的另一个RDS,并且一旦迁移,请将那些MyISAM表转换为InnoDB。如果我理解正确,那么创建正确的自动备份的唯一方法是使用此处说明的以下过程:“使用不受支持的MySQL存储引擎进行自动备份” https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups .html#Overview.BackupDeviceRestrictions

  1. 停止对MyISAM表的所有活动(即关闭所有会话)。您可以通过对SHOW FULL PROCESSLIST命令返回的每个进程调用mysql.rds_kill命令来关闭所有会话。
  2. 锁定并刷新每个MyISAM表
  3. 创建数据库实例的快照。快照完成后,释放锁并恢复MyISAM表上的活动

有人做过这个程序吗?即使快照包含MyISAM表,每天晚上如何从当前RDS数据库实例成功创建快照?

谢谢!

Mic*_*bot 5

问题不在于快照创建。当您实际尝试使用其中一个快照时,这可能会出错。

RDS快照通过捕获RDS实例的基础EBS卷(您看不到该卷,但它在那里-RDS在EC2上运行,带有“隐藏”的实例和卷)来捕获快照而工作。

EBS快照完全捕获快照过程开始时恰好存在的硬盘内容。

快照最终产生的结果与执行MySQL服务器时基本上相同sudo killall -9 mysqld-好像服务器立即停止了所有操作,而没有执行通常要做的任何清理操作正常关机。有了RDS,事情并没有那么剧烈,因为RDS确实采取了一些预防措施,但是从根本上讲,这就是正在发生的事情的本质。

当您从快照创建RDS实例时,实例启动时发生的第一件事就是您的假设服务器在重新启动终止的MySQL Server守护程序时会执行的操作:InnoDB Crash Recovery。

InnoDB崩溃恢复

要从MySQL服务器崩溃中恢复,唯一的要求是重新启动MySQL服务器。InnoDB自动检查日志并执行数据库到当前的前滚。InnoDB自动回退崩溃时存在的未提交的事务。

https://dev.mysql.com/doc/refman/5.7/zh-CN/innodb-recovery.html#innodb-crash-recovery

崩溃恢复是InnoDB的一种机制,用于使内部数据结构中的所有内容恢复和谐,并确保所有数据完整无缺,就像您的应用程序保留的那样。这可能是因为InnoDB是事务存储引擎。这意味着很多不同的事情,但是在这种情况下,这特别意味着,当您更改表时,InnoDB不仅会更改表数据。它经历了一个可以简化的过程,如下所示:

  • 将建议的更改存储到磁盘¹
  • 实际进行更改
  • 将更改标记为完成

这意味着在更改完成之前,InnoDB可以被中断,并且随后可以在中断的地方进行恢复,而不会破坏或丢失数据。

MyISAM没有这种机制。 它只是直接写入数据文件。即使未积极使用MyISAM表,在服务器启动时仍可能需要对其进行修复以清理其结构。在某些情况下,修复表是不可能的,并且表中的全部或部分数据将丢失。

如果在发生快照时刷新并锁定了MyISAM表,则它们处于磁盘上的静态状态,就好像服务器实际上在发生快照之前已经正常关闭了,因此它们在快照上将是稳定的。

但是快照过程总是看起来会成功,因为快照只是复制磁盘上的所有内容,就像快照开始时出现的那样。

问题在于捕获的快照可能不可用,并且您无法知道快照是否将完全可行。


¹请注意,第一步“将建议的更改存储到磁盘”与系统变量有关,该变量innodb_flush_log_at_trx_commit会使系统变慢(如果将其设置为,1但也是最安全的设置),因为在完成第一步之后,您的查询实际上不会成功。设置2仍然是相当安全的,因为它仍然可以写入更改,但是在查询返回成功之前,不需要操作系统确认更改实际上已经被写入硬盘驱动器即可继续进行...但是在崩溃时,应用程序将进行事务处理认为犯下的罪行可能会或可能不会幸存。