对于复制过程而言,源上的原始表和副本上的复制表是否使用不同的存储引擎类型无关紧要。实际上,default_storage_engine
系统变量不会复制。
这在复制过程中提供了一些好处,您可以利用不同的引擎类型来应对不同的复制场景。例如,在典型的扩展场景(参见 第 19.4.5 节,“使用复制进行扩展”)中,您希望在源上使用 InnoDB
表来利用事务功能,但在副本上使用 MyISAM
,因为数据只读,所以不需要事务支持。在使用复制进行数据日志记录的环境中,您可能希望在副本上使用 Archive
存储引擎。
在源和副本上配置不同的引擎取决于您如何设置初始复制过程
如果您使用 mysqldump 在源上创建数据库快照,您可以编辑转储文件文本以更改每个表上使用的引擎类型。
对于 mysqldump 的另一种选择是在使用转储在副本上构建数据之前,禁用您不想在副本上使用的引擎类型。例如,您可以在副本上添加
--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
语句将在副本上使用副本的默认引擎执行。