Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Moving or Copying InnoDB Tables

17.6.1.4 InnoDB 表的移动或复制

本节描述了将某些或所有InnoDB表移到不同的服务器或实例的技术。例如,您可能会将整个 MySQL 实例移到一个更大的、更快的服务器上;您可能会克隆整个 MySQL 实例到一个新的副本服务器上;您可能会将单个表复制到另一个实例,以便在应用程序中开发和测试,或者将其复制到数据仓库服务器以生成报告。

在 Windows 上,InnoDB总是将数据库和表名内部存储为小写字母。要从 Unix 到 Windows 或从 Windows 到 Unix 将数据库在二进制格式中移动,请使用小写名称创建所有数据库和表。一个方便的方法是,在创建任何数据库或表之前,添加以下行到您的[mysqld]部分中的my.cnfmy.ini文件中:

[mysqld]
lower_case_table_names=1
Note

禁止在服务器启动时使用与初始化服务器时不同的lower_case_table_names设置。

移动或复制InnoDB表的技术包括:

Importing 表

可以使用Transportable Tablespace特性将一个文件表空间中的表从另一个MySQL服务器实例或备份中导入。见第17.6.1.3节,“Importing InnoDB Tables”

MySQL Enterprise Backup产品可以在最小地中断操作的情况下对运行中的MySQL数据库进行备份,生成一个一致的数据库快照。当MySQL Enterprise Backup正在复制表时,可以继续读取和写入。在此外,MySQL Enterprise Backup还可以创建压缩后的备份文件,并备份表的子集。结合MySQL二进制日志,您可以执行点-in-time恢复。MySQL Enterprise Backup是MySQL Enterprise订阅的一部分。

关于MySQL Enterprise Backup的更多信息,请见第32.1节,“MySQL Enterprise Backup Overview”

可以简单地将InnoDB数据库移动到另一个位置,只需复制“Cold Backups”部分中列出的所有相关文件,见第17.18.1节,“InnoDB Backup”

InnoDB 数据和日志文件在所有具有相同浮点数格式的平台上是二进制兼容的。如果浮点格式不同,但您尚未使用FLOATDOUBLE数据类型在表中,那么程序相同:简单地复制相关文件。

当您移动或复制文件-per-table .ibd 文件时,数据库目录名称必须在源和目标系统上相同。InnoDB共享表空间中的表定义包括数据库名称。事务ID和日志序列号也存储在表空间文件中,并且在不同的数据库之间不同。

要将 .ibd 文件和关联表从一个数据库移到另一个数据库,使用RENAME TABLE 语句:

RENAME TABLE db1.tbl_name TO db2.tbl_name;

如果您有一个““clean””备份的 .ibd 文件,可以将其恢复到原始 MySQL 安装中如下所示:

  1. 表不能已经被删除或截断,因为这样会更改表ID存储在表空间中的内容。

  2. 使用ALTER TABLE 语句删除当前 .ibd 文件:

    ALTER TABLE tbl_name DISCARD TABLESPACE;
  3. 将备份文件.ibd复制到适当的数据库目录中。

  4. 使用以下ALTER TABLE语句通知InnoDB使用新的.ibd文件来更新表:

    ALTER TABLE tbl_name IMPORT TABLESPACE;
    Note

    导入数据时,ALTER TABLE ... IMPORT TABLESPACE功能不强制执行外键约束。

在这个上下文中,一个““clean”.ibd文件备份是指满足以下要求的备份:

  • 没有未提交的事务对.ibd文件进行修改。

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

  • Purge已经从.ibd文件中删除了所有删除标记的索引记录。

  • mysqld已经将.ibd文件中的所有修改页面从缓冲池中刷新到文件中。

您可以使用以下方法创建一个“clean”备份.ibd文件:

  1. 停止mysqld服务器的所有活动,并提交所有事务。

  2. 等待SHOW ENGINE INNODB STATUS显示数据库中没有活动事务,并且InnoDB的主要线程状态为Waiting for server activity。然后,您可以将.ibd文件复制。

另一种方法是使用 MySQL Enterprise Backup 产品来创建一个干净的.ibd文件副本:

  1. 使用 MySQL Enterprise Backup 将InnoDB安装备份。

  2. 在备份中启动第二个mysqld服务器,让它清理备份中的.ibd文件。

您可以使用工具,如mysqldump,执行逻辑备份,这将生成一组 SQL 语句,可以执行以重现原始数据库对象定义和表数据,以便在另一个 SQL 服务器上转移。使用这种方法,不管格式是否不同,如果您的表包含浮点数数据也无关紧要。

为了提高该方法的性能,在导入数据时禁用autocommit。在导入整个表或表段后,执行 commit 操作。