16.3.3 将复制与不同的源和副本存储引擎一起使用

对于复制过程而言,源上的源 table 和副本上的复制 table 是否使用不同的引擎类型无关紧要。实际上,不会复制default_storage_enginestorage_engine系统变量。

这在复制过程中提供了许多好处,因为您可以将不同的引擎类型用于不同的复制方案。例如,在典型的横向扩展方案中(请参见第 16.3.4 节“使用复制进行横向扩展”),您想在源上使用InnoDBtable 来利用事务功能,但在不需要事务支持的副本上使用MyISAM,因为仅读取数据。在数据记录环境中使用复制时,您可能需要在副本上使用Archive存储引擎。

在源和副本上配置不同的引擎取决于您如何设置初始复制过程:

  • 如果使用mysqldump在源上创建数据库快照,则可以编辑转储文件文本以更改每个 table 上使用的引擎类型。

mysqldump的另一种选择是在使用转储在副本上构建数据之前,禁用不想在副本上使用的引擎类型。例如,您可以在副本上添加--skip-federated选项以禁用FEDERATED引擎。如果要创建的 table 不存在特定的引擎,则 MySQL 将使用默认的引擎类型,通常为MyISAM。 (这要求不启用NO_ENGINE_SUBSTITUTION SQL 模式。)如果要以这种方式禁用其他引擎,则可能需要考虑构建一个特殊的二进制文件以用于仅支持所需引擎的副本。

  • 如果您使用原始数据文件(二进制备份)来设置副本,则将无法更改初始 table 格式。而是,在复制副本启动后,使用ALTER TABLE更改 table 类型。

  • 对于当前在源上没有 table 的新源/副本复制设置,请避免在创建新 table 时指定引擎类型。

如果您已经在运行复制解决方案,并且想要将现有 table 转换为另一种引擎类型,请按照下列步骤操作:

  • 停止副本运行复制更新:
mysql> STOP SLAVE;

这将使您无需中断即可更改发动机类型。

  • 对要更改的每个 table 执行ALTER TABLE ... ENGINE='engine_type'

  • 再次启动复制过程:

mysql> START SLAVE;

尽管未复制default_storage_engine变量,但是请注意,包含引擎规范的CREATE TABLEALTER TABLE语句将正确复制到副本。例如,如果您有一个 CSVtable 并执行:

mysql> ALTER TABLE csvtable Engine='MyISAM';

上面的语句将被复制到副本,并且副本上的引擎类型将转换为MyISAM,即使您之前已将副本上的 table 类型更改为 CSV 以外的引擎。如果要在源和副本上保留引擎差异,则在创建新 table 时应小心在源上使用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语句将使用副本的默认引擎在副本上执行。