对于复制过程来说,源上的原始表和副本上的复制表是否使用不同的存储引擎类型并不重要。事实上,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
语句将在副本上使用副本的默认引擎执行。