Skip to main content

4.使用具有不同源和副本存储引擎的复制

使用具有不同源和副本存储引擎的复制

对于复制过程来说,源上的原始表和副本上的复制表是否使用不同的存储引擎类型并不重要。 事实上,default_storage_engine 系统变量没有被复制。

这在复制过程中提供了许多好处,因为可以针对不同的复制场景利用不同的引擎类型。 例如,在典型的横向扩展场景中,在源上使用 InnoDB 表来利用事务功能,但在副本上使用 MyISAM 其中不需要事务支持,因为仅读取数据。 在数据记录环境中使用复制时,可以在副本上使用存档存储引擎。

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

  • 如果使用 mysqldump 在源上创建数据库快照,则可以编辑转储文件文本以更改每个表上使用的引擎类型。
  • mysqldump 的另一个替代方法是在使用转储在副本上构建数据之前禁用不想在副本上使用的引擎类型。 例如,可以在副本上添加 --skip-federated 选项以禁用 FEDERATED 引擎。 如果创建的表不存在特定的引擎,MySQL会使用默认的引擎类型,通常是InnoDB。 (这要求未启用 NO_ENGINE_SUBSTITUTION SQL 模式。)如果想以这种方式禁用其他引擎,可能需要考虑构建一个特殊的二进制文件,以便在仅支持想要的引擎的副本上使用。
  • 如果使用原始数据文件(二进制备份)来设置副本,则无法更改初始表格式。 相反,在启动副本后使用 ALTER TABLE 更改表类型。
  • 对于当前源上没有表的新源/副本复制设置,请避免在创建新表时指定引擎类型。

如果已经在运行复制解决方案并希望将现有表转换为其他引擎类型,请按照以下步骤操作:

  1. 停止副本运行复制更新:

    mysql> STOP REPLICA;

    可以不间断地改变引擎类型。

  2. 对每个要更改的表执行 ALTER TABLE ... ENGINE='engine_type'。

  3. 再次启动复制过程:

    mysql> START REPLICA;

尽管未复制 default_storage_engine 变量,但请注意,包含引擎规范的 CREATE TABLE 和 ALTER TABLE 语句已正确复制到副本。 如果对于 CSV 表,执行以下语句:

mysql> ALTER TABLE csvtable ENGINE='MyISAM';

此声明被复制; 即使之前已将副本上的表类型更改为 CSV 以外的引擎,副本上表的引擎类型也会转换为 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 语句。