对于复制过程来说,源上的原始表和副本上的复制表是否使用不同的存储引擎类型无关紧要。事实上,
default_storage_engine
系统变量并没有被复制。
这在复制过程中提供了许多好处,因为您可以针对不同的复制场景利用不同的引擎类型。例如,在典型的横向扩展场景中(请参阅
第 17.4.5 节,“使用复制进行横向扩展”),您希望使用
InnoDB
源上的表来利用事务功能,但
MyISAM
在事务所在的副本上使用不需要支持,因为仅读取数据。在数据记录环境中使用复制时,您可能希望
Archive
在副本上使用存储引擎。
在源和副本上配置不同的引擎取决于您如何设置初始复制过程:
如果您使用mysqldump在源上创建数据库快照,则可以编辑转储文件文本以更改每个表上使用的引擎类型。
mysqldump的 另一种替代方法是在使用转储在副本上构建数据之前禁用不想在副本上使用的引擎类型。例如,您可以
--skip-federated
在副本上添加选项以禁用FEDERATED
引擎。如果要创建的表不存在特定引擎,则 MySQL 使用默认引擎类型,通常是InnoDB
. (这要求NO_ENGINE_SUBSTITUTION
未启用 SQL 模式。)如果您想以这种方式禁用其他引擎,您可能需要考虑构建一个特殊的二进制文件以用于仅支持所需引擎的副本。如果您使用原始数据文件(二进制备份)来设置副本,则无法更改初始表格式。相反,用于
ALTER TABLE
在副本启动后更改表类型。对于当前在源上没有表的新源/副本复制设置,避免在创建新表时指定引擎类型。
如果您已经在运行复制解决方案并希望将现有表转换为另一种引擎类型,请执行以下步骤:
停止副本运行复制更新:
mysql> STOP SLAVE; Or from MySQL 8.0.22: mysql> STOP REPLICA;
这使得可以不间断地更改引擎类型。
为每个要更改的表 执行一个。
ALTER TABLE ... ENGINE='
engine_type
'再次开始复制过程:
mysql> START SLAVE;
或者,从 MySQL 8.0.22 开始:
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
语句将使用副本的默认引擎在副本上执行。