在复制过程中,不管源上的原始表和副本上的复制表使用什么存储引擎类型都无关紧要。事实上,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
,即使您之前在副本上将表类型更改为其他引擎。如果您想在源和副本上保留引擎差异,应该小心使用 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
语句将在副本上使用副本的默认引擎执行。