19.4.4 使用不同源和副本存储引擎
在复制过程中,不管原始表在源端和副本端使用的存储引擎类型是否不同。实际上,default_storage_engine
系统变量不被复制。
这提供了多种好处,使您可以根据不同的复制场景使用不同的引擎类型。例如,在典型的扩展场景(见第19.4.5节,“使用复制进行扩展”),您想要在源端使用InnoDB
表,以利用事务功能,但在副本端使用MyISAM
,因为数据只读不需要事务支持。在数据日志环境中,您可能想要在副本端使用Archive
存储引擎。
在源端和副本端配置不同的引擎类型取决于您如何设置初始复制过程:
-
如果使用mysqldump创建数据库快照,您可以编辑dump文件文本来更改每个表的引擎类型。
另一个mysqldump的替代方法是,在副本端禁用您不想使用的引擎类型之前使用dump文件来构建副本数据。例如,您可以在副本端添加
--skip-federated
选项来禁用FEDERATED
引擎。如果某个引擎不存在于表中,MySQL将使用默认引擎类型,通常是InnoDB
。(需要在没有启用NO_ENGINE_SUBSTITUTION
SQL 模式的情况下。)如果您想禁用更多引擎,可以考虑构建一个支持您想要使用的引擎的特殊二进制文件。 -
如果您使用原始数据文件(二进制备份)来设置副本,无法更改初始表格式。相反,使用
ALTER TABLE
来更改表类型后启动副本。 -
对于新的源/副本复制设置,如果源端当前没有表,您避免指定创建新表的引擎类型。
如果您已经运行复制解决方案并想将现有表转换到另一个引擎类型,遵循以下步骤:
-
停止副本从运行复制更新:
mysql> STOP REPLICA;
这使得可以更改引擎类型而无需中断。
-
执行
ALTER TABLE ... ENGINE='
对每个表进行更改。engine_type
' -
重新启动复制过程:
mysql> START REPLICA;
虽然default_storage_engine
变量不被复制,请注意CREATE TABLE
和ALTER TABLE
语句,包括引擎指定,正确地复制到副本。如果在CSV
表中,您执行以下语句:
mysql> ALTER TABLE csvtable ENGINE='MyISAM';
这个语句将被复制;副本中表的引擎类型将被转换为InnoDB
,即使您在副本中之前已经将表类型更改为除CSV
之外的引擎。如果您想在源和副本中保留引擎差异,应该在创建新表时在源中使用default_storage_engine
变量。例如,而不是:
mysql> CREATE TABLE tablea (columna int) Engine=MyISAM;
使用以下格式:
mysql> SET default_storage_engine=MyISAM;
mysql> CREATE TABLE tablea (columna int);
在复制时,default_storage_engine
变量将被忽略,CREATE TABLE
语句将在副本中使用副本的默认引擎执行。