当主服务器关闭并重新启动时,其 MEMORY表将变为空。为了将此效果复制到从属服务器,主服务器MEMORY在启动后第一次使用给定表时,它会记录一个事件,该事件通过将该表的DELETE语句写入二进制日志来通知从属服务器必须清空 该表。
当从属服务器关闭并重新启动时,其 MEMORY表将变为空。这会导致从站与主站不同步,并可能导致其他故障或导致从站停止:
从母版收到的行格式更新和删除可能会失败。 Can’t find record in ‘memory_table’
诸如之类的语句 可能会在主服务器和从服务器上插入不同的行集。 INSERT INTO … SELECT FROM memory_table
重新启动正在复制MEMORY表的从属服务器的安全方法 是,首先从MEMORY 主服务器上的表中删除或删除所有行,然后等待这些更改复制到从属服务器上。这样就可以安全地重新启动从站。
在某些情况下,可以使用其他重新启动方法。如果 binlog_format=ROW,可以防止从从停止,如果你设置 slave_exec_mode=IDEMPOTENT 你再次启动从服务器之前。这允许从服务器继续复制,但是其 MEMORY表仍将与主服务器上的表不同。如果应用程序逻辑MEMORY可以安全地丢失表的内容 (例如,如果MEMORY表用于缓存),则可以这样做。 slave_exec_mode=IDEMPOTENT 全局应用于所有表,因此它可能会在非MEMORY表中隐藏其他复制错误。
(刚刚描述的方法不适用于slave_exec_mode始终为 IDEMPOTENT且不能更改的NDB群集。)
MEMORY表 的大小受max_heap_table_size系统变量的值限制,该值 不能被复制(请参见 第17.4.1.35节“复制和变量”)。在改变 max_heap_table_size发生的影响 MEMORY创建或更新使用表ALTER TABLE … ENGINE = MEMORY或TRUNCATE TABLE以下的变化,或所有 MEMORY表以下重新启动服务器。如果您在主服务器上增加此变量的值而不在从属服务器上增加此变量的值,则主服务器上的表可能变得大于从属服务器上的对应表,从而导致插入在主服务器上成功但在从属服务器上失败与表已满错误。这是一个已知的问题(错误#48666)。在这种情况下,必须max_heap_table_size在从服务器和主服务器上设置全局值 ,然后重新启动复制。还建议您重新启动主MySQL服务器和从MySQL服务器,以确保新值对它们中的每一个都具有完全的(全局)作用。
有关表的更多信息, 请参见第15.3节“ MEMORY存储引擎”MEMORY。




