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

源上的原始表和副本上的复制表是否使用不同的存储引擎类型对于复制过程无关紧要。事实上，[`default_storage_engine`](server-system-variables.html#sysvar_default_storage_engine)系统变量不被复制。

这在复制过程中提供了许多好处，因为您可以针对不同的复制方案利用不同的引擎类型。例如，在典型的横向扩展场景中（请参阅[第 17.4.5 节，“使用复制进行横向扩展”](replication-solutions-scaleout.html))，你想使用`InnoDB`源上的表以利用事务功能，但使用`MyISAM`在不需要事务支持的副本上，因为仅读取数据。在数据记录环境中使用复制时，您可能希望使用`档案`副本上的存储引擎。

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

-   如果你用过[**mysql转储**](mysqldump.html)要在源上创建数据库快照，您可以编辑转储文件文本以更改每个表上使用的引擎类型。

    另一种选择[**mysql转储**](mysqldump.html)是在使用转储在副本上构建数据之前禁用您不想在副本上使用的引擎类型。例如，您可以添加[`--skip-federated`](innodb-parameters.html#option_mysqld_innodb)副本上的选项以禁用`联邦`引擎。如果要创建的表不存在特定引擎，则 MySQL 使用默认引擎类型，通常`InnoDB`.（这要求[`NO_ENGINE_SUBSTITUTION`](sql-mode.html#sqlmode_no_engine_substitution)SQL 模式未启用。）如果您想以这种方式禁用其他引擎，您可能需要考虑构建一个特殊的二进制文件，以便在仅支持所需引擎的副本上使用。

-   如果您使用原始数据文件（二进制备份）来设置副本，则无法更改初始表格式。相反，使用[`更改表`](alter-table.html)在副本启动后更改表类型。

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

    如果您已经在运行复制解决方案并希望将现有表转换为另一种引擎类型，请执行以下步骤：

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

    ```
    mysql> STOP SLAVE;
    Or from MySQL 8.0.22:
    mysql> STOP REPLICA;
    ```

    这使得可以在不中断的情况下更改发动机类型。

2.  执行一个`改变表...引擎='*`引擎类型`*'`对于要更改的每个表。

3.  再次启动复制过程：

    ```
    mysql> START SLAVE;
    ```

    或者，从 MySQL 8.0.22 开始：

    ```
    mysql> START REPLICA;
    ```

    虽然[`default_storage_engine`](server-system-variables.html#sysvar_default_storage_engine)变量不会被复制，请注意[`创建表`](create-table.html)和[`更改表`](alter-table.html)包含引擎规范的语句被正确复制到副本。如果，在一个[`CSV`](csv-storage-engine.html)表，你执行这个语句：


```
mysql> ALTER TABLE csvtable ENGINE='MyISAM';
```

该声明被复制；副本上表的引擎类型转换为`InnoDB`，即使您之前已将副本上的表类型更改为引擎以外的其他引擎`CSV`.如果要保留源和副本上的引擎差异，则应小心使用[`default_storage_engine`](server-system-variables.html#sysvar_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`](server-system-variables.html#sysvar_default_storage_engine)变量被忽略，并且[`创建表`](create-table.html)语句使用副本的默认引擎在副本上执行。
