#### 15.6.1.4 移动或复制 InnoDB 表

[](<>)

本节介绍移动或复制部分或全部的技术`InnoDB`表到不同的服务器或实例。例如，您可以将整个 MySQL 实例移动到更大、更快的服务器；您可以将整个 MySQL 实例克隆到新的副本服务器；您可以将单个表复制到另一个实例以开发和测试应用程序，或者复制到数据仓库服务器以生成报告。

在 Windows 上，`InnoDB`始终在内部以小写形式存储数据库和表名。要将二进制格式的数据库从 Unix 移动到 Windows 或从 Windows 移动到 Unix，请使用小写名称创建所有数据库和表。实现此目的的一种简便方法是将以下行添加到`[mysqld]`你的部分`我的.cnf`要么`我的.ini`创建任何数据库或表之前的文件：

```
[mysqld]
lower_case_table_names=1
```

笔记

禁止使用 a 启动服务器[`lower_case_table_names`](server-system-variables.html#sysvar_lower_case_table_names)与初始化服务器时使用的设置不同的设置。

移动或复制技术`InnoDB`表格包括：

-   [导入表](innodb-migration.html#copy-tables-import)

-   [MySQL 企业备份](innodb-migration.html#copy-tables-meb)

-   [复制数据文件（冷备份方法）](innodb-migration.html#copy-tables-cold-backup)

-   [从逻辑备份恢复](innodb-migration.html#copy-tables-logical-backup)

##### 导入表

驻留在 file-per-table 表空间中的表可以从另一个 MySQL 服务器实例或使用*可传输表空间*特征。看[第 15.6.1.3 节，“导入 InnoDB 表”](innodb-table-import.html).

##### MySQL 企业备份

MySQL Enterprise Backup 产品可让您备份正在运行的 MySQL 数据库，同时尽可能减少对操作的干扰，同时生成一致的数据库快照。当 MySQL Enterprise Backup 正在复制表时，可以继续读取和写入。此外，MySQL Enterprise Backup 可以创建压缩备份文件，并备份表的子集。结合 MySQL 二进制日志，您可以执行时间点恢复。MySQL Enterprise Backup 包含在 MySQL Enterprise 订阅中。

有关 MySQL 企业备份的更多详细信息，请参阅[第 30.2 节，“MySQL 企业备份概述”](mysql-enterprise-backup.html).

##### 复制数据文件（冷备份方法）

你可以移动一个`InnoDB`只需复制数据库中“冷备份”下列出的所有相关文件[第 15.18.1 节，“InnoDB 备份”](innodb-backup.html).

`InnoDB`数据和日志文件在具有相同浮点数格式的所有平台上都是二进制兼容的。如果浮点格式不同但您没有使用[`漂浮`](floating-point-types.html)要么[`双倍的`](floating-point-types.html)表中的数据类型，那么过程是相同的：只需复制相关文件。

当您移动或复制每个表的文件时`.ibd`文件，数据库目录名称在源系统和目标系统上必须相同。表定义存储在`InnoDB`共享表空间包括数据库名称。存储在表空间文件中的事务 ID 和日志序列号也因数据库而异。

移动一个`.ibd`文件和关联的表从一个数据库到另一个，使用[`重命名表`](rename-table.html)陈述：

```
RENAME TABLE db1.tbl_name TO db2.tbl_name;
```

[](<>)[](<>)

如果你有一个“干净”的备份`.ibd`文件，您可以将其还原到它起源的 MySQL 安装，如下所示：

1.  自从您复制了`.ibd`文件，因为这样做会更改存储在表空间中的表 ID。

2.  发出这个[`更改表`](alter-table.html)删除当前语句`.ibd`文件：

    ```
    ALTER TABLE tbl_name DISCARD TABLESPACE;
    ```

3.  复制备份`.ibd`文件到正确的数据库目录。

4.  发出这个[`更改表`](alter-table.html)声明告诉`InnoDB`使用新的`.ibd`表格文件：

    ```
    ALTER TABLE tbl_name IMPORT TABLESPACE;
    ```

    笔记

    这[`ALTER TABLE ... 导入表空间`](alter-table.html)功能不对导入的数据强制执行外键约束。

    在这种情况下，“干净”`.ibd`文件备份是满足以下要求的一种：

-   事务中没有未提交的修改`.ibd`文件。

-   没有未合并的插入缓冲区条目`.ibd`文件。

-   Purge 已从`.ibd`文件。

-   [**mysqld**](mysqld.html)已刷新所有已修改的页面`.ibd`文件从缓冲池到文件。

    您可以进行干净的备份`.ibd`文件使用以下方法：

1.  停止所有活动[**mysqld**](mysqld.html)服务器并提交所有事务。

2.  等到[`显示引擎 INNODB 状态`](show-engine.html)显示数据库中没有活动事务，主线程状态为`InnoDB`是`等待服务器活动`.然后你可以复制一份`.ibd`文件。

    另一种制作干净副本的方法`.ibd`文件是使用 MySQL Enterprise Backup 产品：

3.  使用 MySQL Enterprise Backup 备份`InnoDB`安装。

4.  开始一秒钟[**mysqld**](mysqld.html)服务器上的备份，让它清理`.ibd`备份中的文件。

##### 从逻辑备份恢复

您可以使用实用程序，例如[**mysql转储**](mysqldump.html)执行逻辑备份，生成一组 SQL 语句，可以执行这些语句来重现原始数据库对象定义和表数据，以便传输到另一个 SQL 服务器。使用此方法，格式是否不同或您的表是否包含浮点数据都无关紧要。

要提高此方法的性能，请禁用[`自动提交`](server-system-variables.html#sysvar_autocommit)导入数据时。仅在导入整个表或表的段后执行提交。
