### 13.2.5 IMPORT TABLE 语句

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

```
IMPORT TABLE FROM sdi_file [, sdi_file] ...
```

这[`导入表`](import-table.html)声明导入`MyISAM`基于包含的信息的表格`.sdi`（序列化字典信息）元数据文件。[`导入表`](import-table.html)需要[`文件`](privileges-provided.html#priv_file)阅读的特权`.sdi`和表格内容文件，以及[`创建`](privileges-provided.html#priv_create)要创建的表的权限。

可以使用从一台服务器导出表[**mysql转储**](mysqldump.html)编写一个 SQL 语句文件并使用[**mysql**](mysql.html)处理转储文件。[`导入表`](import-table.html)使用“原始”表文件提供了一种更快的替代方案。

在导入之前，提供表内容的文件必须放在导入服务器的适当模式目录中，并且`.sdi`文件必须位于服务器可访问的目录中。例如，`.sdi`文件可以放在由[`secure_file_priv`](server-system-variables.html#sysvar_secure_file_priv)系统变量，或（如果[`secure_file_priv`](server-system-variables.html#sysvar_secure_file_priv)为空）在服务器数据目录下的目录中。

以下示例描述了如何导出`MyISAM`表名为`雇员`和`经理`来自`小时`一台服务器的架构并将它们导入`小时`另一台服务器的架构。该示例使用这些假设（要在您自己的系统上执行类似的操作，请根据需要修改路径名）：

-   对于导出服务器，*`export_basedir`*表示它的基目录，它的数据目录是`*`export_basedir`*/数据`.

-   对于导入服务器，*`import_basedir`*表示它的基目录，它的数据目录是`*`import_basedir`*/数据`.

-   表文件从导出服务器导出到`/tmp/出口`目录，并且此目录是安全的（其他用户无法访问）。

-   导入服务器使用`/tmp/mysql 文件`作为由其命名的目录[`secure_file_priv`](server-system-variables.html#sysvar_secure_file_priv)系统变量。

    要从导出服务器导出表，请使用以下过程：

1.  通过执行此语句锁定表以确保在导出期间无法修改它们，从而确保快照一致：

    ```
    mysql> FLUSH TABLES hr.employees, hr.managers WITH READ LOCK;
    ```

    当锁生效时，这些表仍然可以使用，但只能用于读取访问。

2.  在文件系统级别，复制`.sdi`和表格内容文件`小时`架构目录到安全导出目录：

    -   这`.sdi`文件位于`小时`schema 目录，但可能与表名没有完全相同的基本名称。例如，`.sdi`文件为`雇员`和`经理`表可能被命名`雇员_125.sdi`和`manager_238.sdi`.

    -   为一个`MyISAM`表，内容文件是它的`.MYD`数据文件和`。我的我`索引文件。

        给定这些文件名，复制命令如下所示：

    ```
    $> cd export_basedir/data/hr
    $> cp employees_125.sdi /tmp/export
    $> cp managers_238.sdi /tmp/export
    $> cp employees.{MYD,MYI} /tmp/export
    $> cp managers.{MYD,MYI} /tmp/export
    ```

3.  解锁表：

    ```
    mysql> UNLOCK TABLES;
    ```

    要将表导入导入服务器，请使用以下过程：

4.  导入模式必须存在。如有必要，请执行以下语句来创建它：

    ```
    mysql> CREATE SCHEMA hr;
    ```

5.  在文件系统级别，复制`.sdi`文件到导入服务器[`secure_file_priv`](server-system-variables.html#sysvar_secure_file_priv)目录，`/tmp/mysql 文件`.另外，将表格内容文件复制到`小时`架构目录：

    ```
    $> cd /tmp/export
    $> cp employees_125.sdi /tmp/mysql-files
    $> cp managers_238.sdi /tmp/mysql-files
    $> cp employees.{MYD,MYI} import_basedir/data/hr
    $> cp managers.{MYD,MYI} import_basedir/data/hr
    ```

6.  通过执行导入表[`导入表`](import-table.html)声明`.sdi`文件：

    ```
    mysql> IMPORT TABLE FROM
           '/tmp/mysql-files/employees.sdi',
           '/tmp/mysql-files/managers.sdi';
    ```

    这`.sdi`文件不需要放在由[`secure_file_priv`](server-system-variables.html#sysvar_secure_file_priv)系统变量（如果该变量为空）；它可以位于服务器可访问的任何目录中，包括导入表的模式目录。如果`.sdi`文件被放置在该目录中，但是，它可以被重写；导入操作创建一个新的`.sdi`表的文件，它会覆盖旧的`.sdi`如果操作对新文件使用相同的文件名，则为文件。

    每个*`sdi_file`*value 必须是一个字符串字面量，用于命名`.sdi`表的文件或者是匹配的模式`.sdi`文件。如果字符串是模式，则任何前导目录路径和`.sdi`文件名后缀必须按字面意思给出。模式字符仅允许在文件名的基本名称部分中使用：

-   `?`匹配任何单个字符

-   `*`匹配任何字符序列，包括无字符

    使用模式，前一个[`导入表`](import-table.html)声明可以这样写（假设`/tmp/mysql 文件`目录不包含其他`.sdi`匹配模式的文件）：


```
IMPORT TABLE FROM '/tmp/mysql-files/*.sdi';
```

解释位置`.sdi`文件路径名，服务器使用相同的规则[`导入表`](import-table.html)作为服务器端规则[`加载数据`](load-data.html)（也就是说，非`当地的`规则）。看[第 13.2.7 节，“加载数据语句”](load-data.html)，特别注意用于解释相对路径名的规则。

[`导入表`](import-table.html)如果失败`.sdi`或找不到表文件。导入表后，服务器会尝试打开它并将检测到的任何问题报告为警告。要尝试修复以纠正任何报告的问题，请使用[`维修台`](repair-table.html).

[`导入表`](import-table.html)不写入二进制日志。

#### 限制和限制

[`导入表`](import-table.html)仅适用于非`暂时的` `MyISAM`表。它不适用于使用事务存储引擎创建的表、使用[`创建临时表`](create-table.html)，或意见。

一个`.sdi`导入操作中使用的文件必须在与导入服务器具有相同数据字典版本和 sdi 版本的服务器上生成。生成服务器的版本信息在`.sdi`文件：

```
{
   "mysqld_version_id":80019,
   "dd_version":80017,
   "sdi_version":80016,
   ...
}
```

要确定导入服务器的数据字典和 sdi 版本，可以检查`.sdi`导入服务器上最近创建的表的文件。

在导入操作之前，表数据和索引文件必须放在导入服务器的模式目录中，除非导出服务器上定义的表使用`数据目录`要么`索引目录`表选项。在这种情况下，请在执行之前使用这些替代方法之一修改导入过程[`导入表`](import-table.html)陈述：

-   将数据和索引文件放在导入服务器主机上与导出服务器主机上相同的目录中，并在导入服务器模式目录中创建指向这些文件的符号链接。

-   将数据和索引文件放入与导出服务器主机不同的导入服务器主机目录中，并在导入服务器模式目录中创建指向这些文件的符号链接。此外，修改`.sdi`文件以反映不同的文件位置。

-   将数据和索引文件放到导入服务器主机的schema目录下，修改`.sdi`文件删除数据和索引目录表选项。

    存储在`.sdi`文件必须引用导出和导入服务器上的相同排序规则。

    表的触发器信息没有序列化到表中`.sdi`文件，因此导入操作不会恢复触发器。

    一些编辑`.sdi`文件在执行之前是允许的[`导入表`](import-table.html)声明，而其他有问题甚至可能导致导入操作失败：

-   如果导出服务器和导入服务器之间数据和索引文件的位置不同，则需要更改数据目录和索引目录表选项。

-   需要更改模式名称才能将表导入到导入服务器上与导出服务器上不同的模式中。

-   可能需要更改架构和表名称以适应导出和导入服务器上文件系统区分大小写语义之间的差异或[`lower_case_table_names`](server-system-variables.html#sysvar_lower_case_table_names)设置。更改表中的表名`.sdi`文件可能还需要重命名表文件。

-   在某些情况下，允许更改列定义。更改数据类型可能会导致问题。
