我不想使用AWS CLI / UI 创build只读副本,而是使用“足够靠近”的模式创build数据库实例,并将其设置为副本。
我需要做一个模式更改(整理更改),不能在MySQL中生活。 我想通过创build一个带有模式更改的读取“副本”来进行此更改,然后提升只读“副本”。
问题在于AWS RDS MySQL只读副本机制要求两个模式精确。
我知道这可以在MySQL中进行(尽pipe我不知道具体情况)。 我想完全在AWS RDS框架内完成此操作。
问题在于AWS RDS MySQL只读副本机制要求两个模式精确。
一般来说,复制需要这个。
但是,如果您对“足够接近”的定义确实足够接近,那么您可以使用RDS for MySQL,就像您一直这样做。
创build一个数据库实例…并将其设置为副本。
那么,这不会是你做这件事的方式。
这不是你如何在RDS之外做的。 您始终必须从一个相同的副本开始,然后再进行更改,因为根据定义进行的复制依赖于数据集和模式相同的已知特定时间点,然后在MySQL的实际考虑范围内进行更改他们“够接近”。
“足够接近”的例子可能包括具有更多索引或更less索引的副本…但是显然不是像主副本上的数据违反约束的副本上的新的唯一键或外键约束…和sorting规则更改可能会导致现有约束被违反,而不会实际更改数据。 (或者不,如果你从大小写不敏感切换到二进制)。
将表添加到副本是好的,删除表不是,甚至可以从表中添加列或删除列,当且仅当从第一列开始序号位置的剩余列是相同的。 也就是说,您可以添加列或从表格的右边删除列; 您不能更改列顺序,但是如果可以强制更改数据types,例如增加VARCHAR的长度,则可以更改数据types。 只要主BINLOG_FORMAT上的BINLOG_FORMAT设置为ROW ,您可以重命名列,在尝试进行此类更改时这通常是更好的select。 在RDS的情况下,唯一的select是MIXED 。 他们明智地防止严格的基于STATEMENT的复制。 请注意, BINLOG_FORMAT上的BINLOG_FORMAT与从属转换无关。
MySQL通常会在复制期间隐式地进行types转换。 对于这个一般的MySQL透视图,另请参见主和从上不同的表定义的复制 。
你真的可以逃避你的计划。 如果没有,你应该很快find答案。
但是,至less在RDS中,如果你打破了这个标准,就很容易再试一次…而且,主人的完整性和性能不会受到复制品损坏的影响。
这是你的修复:
只读副本旨在支持读取查询,但您可能需要偶尔更新,例如添加索引以加快访问副本的特定types的查询。 您可以通过在只读副本的数据库参数组中将
read_only参数设置为0来启用更新。http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ReadRepl.html#USER_ReadRepl.MySQL
除非这是您唯一的副本,否则请务必将参数组复制到新副本,将其应用于副本,然后更改新组的设置。 留下其他复制品作为副作用是可以解决的麻烦。
一旦完成并生效,副本是可写的。 如果您提出的更改确实“足够接近”,那么在您直接login到副本之后,使用与主服务器相同的凭据并进行更改,将会继续进行复制。
或者,如果不是,复制将会中断。
在对副本进行模式更改时,不需要暂停复制,因为当包含下一个复制对象的副本上的DDL操作正在进行时,MySQL会使用正常的locking机制(如表元数据锁)自动暂停执行复制事件事件需要访问。
SHOW SLAVE STATUS语句与RDS中的标准MySQL相同。 如果Slave_IO_Running和Slave_SQL_Running都显示为Yes且Seconds_Behind_Master不为NULL则副本不会被破坏; 如果Seconds_Behind_Master = 0,那么副本与主控实时同步(> 0意味着它滞后,试图赶上)。
问题:一个loooonngggg会发生什么变化(重新调整列的时间大概是一个小时)会对主人造成问题吗? 我正在考虑大量备份复制日志,并在只读副本中lockingstream量小时。
这对RDS来说不成问题,原因有两个。
最重要的原因是MySQL复制使用两个线程 – 一个接收来自主机(I / O线程)的日志,一个执行它们(SQL线程) – 这些线程的“运行”状态I上文提到的。 当副本阻止执行事件时,由于本地更改,它将继续接收它们。 只要副本未耗尽存储空间,一切都会按照预期发布。
此外,尽pipe在这种情况下不是非常有意义的,但由于I / O线程将保持运行,RDS不会使用标准的expire_logs_days系统variables来清除master中的旧expire_logs_days 。 相反,只要没有一个副本需要它们,而不是之前有用,它就会自行清除它们,因为它们会对存储分配进行计数。 ( 如果需要,您也可以configurationRDS使其更长时间 )。 我已经完全停止RDS复制超过24小时,并开始备份没有问题。