传输表空间

转自https://dev.mysql.com/doc/refman/5.6/en/tablespace-copying.html

示例:将InnoDB表复制到另一个实例

此过程演示如何将存储在每个表文件表空间中的表从正在运行的MySQL服务器实例复制到另一个正在运行的实例。可以使用具有微小调整的相同过程在同一实例上执行完整表还原。

  1. 在源实例上,创建一个表(如果尚不存在):

    <span style="color:#555555"><span style="color:black"><code class="language-sql"><span style="color:#a67f59">mysql></span> <span style="color:#0077aa">use</span> test<span style="color:#999999">;</span>
    <span style="color:#a67f59">mysql></span> <span style="color:#0077aa">CREATE</span> <span style="color:#0077aa">TABLE</span> t<span style="color:#999999">(</span>c1 <span style="color:#834689">INT</span><span style="color:#999999">)</span> <span style="color:#0077aa">engine</span><span style="color:#a67f59">=</span>InnoDB<span style="color:#999999">;</span></code></span></span>
  2. 在目标实例上,创建一个表(如果不存在):

    <span style="color:#555555"><span style="color:black"><code class="language-sql"><span style="color:#a67f59">mysql></span> <span style="color:#0077aa">use</span> test<span style="color:#999999">;</span>
    <span style="color:#a67f59">mysql></span> <span style="color:#0077aa">CREATE</span> <span style="color:#0077aa">TABLE</span> t<span style="color:#999999">(</span>c1 <span style="color:#834689">INT</span><span style="color:#999999">)</span> <span style="color:#0077aa">engine</span><span style="color:#a67f59">=</span>InnoDB<span style="color:#999999">;</span></code></span></span>
  3. 在目标实例上,放弃现有表空间。(在导入表空间之前, InnoDB必须丢弃附加到接收表的表空间。)

    <span style="color:#555555"><span style="color:black"><code class="language-sql"><span style="color:#a67f59">mysql></span> <span style="color:#0077aa">ALTER</span> <span style="color:#0077aa">TABLE</span> t <span style="color:#0077aa">DISCARD</span> <span style="color:#0077aa">TABLESPACE</span><span style="color:#999999">;</span></code></span></span>
  4. 在源实例上,运行 FLUSH TABLES ... FOR EXPORT以停顿表并创建.cfg元数据文件:

    <span style="color:#555555"><span style="color:black"><code class="language-sql"><span style="color:#a67f59">mysql></span> <span style="color:#0077aa">use</span> test<span style="color:#999999">;</span>
    <span style="color:#a67f59">mysql></span> <span style="color:#0077aa">FLUSH</span> <span style="color:#0077aa">TABLES</span> t <span style="color:#0077aa">FOR</span> <span style="color:#0077aa">EXPORT</span><span style="color:#999999">;</span></code></span></span>

    metadata(.cfg)文件在InnoDB数据目录中创建。

    注意

    FLUSH TABLES ... FOR EXPORT从MySQL 5.6.6开始提供。该语句确保已将命名表的更改刷新到磁盘,以便在服务器运行时可以创建二进制表副本。当FLUSH TABLES ... FOR EXPORT运行时, InnoDB产生了 .cfg在同一个数据库的目录表文件。该.cfg文件包含导入表空间文件时用于模式验证的元数据。

  5. .ibd文件和 .cfg元数据文件从源实例复制到目标实例。例如:

    <span style="color:#555555"><span style="color:black"><code class="language-terminal"><span style="color:#a67f59">shell></span><span style="color:#0077aa"> scp</span> <em>/path/to/datadir</em>/test/t<span style="color:#999999">.</span><span style="color:#999999">{</span>ibd<span style="color:#999999">,</span>cfg<span style="color:#999999">}</span> destination-server<span style="color:#999999">:</span><em>/path/to/datadir</em>/test</code></span></span>

    注意

    .ibd文件和 .cfg文件必须释放共享锁之前如在下一步中所述被复制。

  6. 在源实例上,用于 UNLOCK TABLES释放通过FLUSH TABLES ... FOR EXPORT以下方式获取的锁 :

    <span style="color:#555555"><span style="color:black"><code class="language-sql"><span style="color:#a67f59">mysql></span> <span style="color:#0077aa">use</span> test<span style="color:#999999">;</span>
    <span style="color:#a67f59">mysql></span> <span style="color:#0077aa">UNLOCK</span> <span style="color:#0077aa">TABLES</span><span style="color:#999999">;</span></code></span></span>
  7. 在目标实例上,导入表空间:

    <span style="color:#555555"><span style="color:black"><code class="language-sql"><span style="color:#a67f59">mysql></span> <span style="color:#0077aa">use</span> test<span style="color:#999999">;</span>
    <span style="color:#a67f59">mysql></span> <span style="color:#0077aa">ALTER</span> <span style="color:#0077aa">TABLE</span> t <span style="color:#0077aa">IMPORT</span> <span style="color:#0077aa">TABLESPACE</span><span style="color:#999999">;</span></code></span></span>

    注意

    ALTER TABLE ... IMPORT TABLESPACE功能不会对导入的数据强制执行外键约束。如果表之间存在外键约束,则应在相同(逻辑)时间点导出所有表。在这种情况下,您将停止更新表,提交所有事务,获取表上的共享锁,然后执行导出操作。

可移动的表空间内部

以下信息描述了可传输表空间复制过程的内部和错误日志消息传递。

何时ALTER TABLE ... DISCARD TABLESPACE在目标实例上运行:

  • 该表被锁定在X模式下。

  • 表空间与表分离。

何时 FLUSH TABLES ... FOR EXPORT在源实例上运行:

  • 刷新导出的表在共享模式下被锁定。

  • 清除协调器线程已停止。

  • 脏页面与磁盘同步。

  • 表元数据被写入二进制 .cfg文件。

此操作的预期错误日志消息:

<span style="color:#555555"><span style="color:black"><code class="language-none">2013-07-18 14:47:31 34471 [Note] InnoDB: Sync to disk of '"test"."t"' started.
2013-07-18 14:47:31 34471 [Note] InnoDB: Stopping purge
2013-07-18 14:47:31 34471 [Note] InnoDB: Writing table metadata to './test/t.cfg'
2013-07-18 14:47:31 34471 [Note] InnoDB: Table '"test"."t"' flushed to disk</code></span></span>

何时UNLOCK TABLES在源实例上运行:

  • 二进制.cfg文件已删除。

  • 将导入要导入的表上的共享锁,并重新启动清除协调程序线程。

此操作的预期错误日志消息:

<span style="color:#555555"><span style="color:black"><code class="language-none">2013-07-18 15:01:40 34471 [Note] InnoDB: Deleting the meta-data file './test/t.cfg'
2013-07-18 15:01:40 34471 [Note] InnoDB: Resuming purge</code></span></span>

ALTER TABLE ... IMPORT TABLESPACE目标实例上运行时,导入算法会为要导入的每个表空间执行以下操作:

  • 检查每个表空间页面是否损坏。

  • 每页上的空间ID和日志序列号(LSN)都会更新

  • 验证标志并更新标题页的LSN。

  • Btree页面已更新。

  • 页面状态设置为脏,以便将其写入磁盘。

此操作的预期错误日志消息:

<span style="color:#555555"><span style="color:black"><code class="language-none">2013-07-18 15:15:01 34960 [Note] InnoDB: Importing tablespace for table 'test/t' that was exported from host 'ubuntu'
2013-07-18 15:15:01 34960 [Note] InnoDB: Phase I - Update all pages
2013-07-18 15:15:01 34960 [Note] InnoDB: Sync to disk
2013-07-18 15:15:01 34960 [Note] InnoDB: Sync to disk - done!
2013-07-18 15:15:01 34960 [Note] InnoDB: Phase III - Flush changes to disk
2013-07-18 15:15:01 34960 [Note] InnoDB: Phase IV - Flush complete</code></span></span>

注意

您可能还会收到一个警告,表示已丢弃表空间(如果您丢弃了目标表的表空间),并且收到一条消息,指出由于缺少.ibd文件而无法计算统计信息:

<span style="color:#555555"><span style="color:black"><code class="language-none">2013-07-18 15:14:38 34960 [Warning] InnoDB: Table "test"."t" tablespace is set as discarded.
2013-07-18 15:14:38 7f34d9a37700 InnoDB: cannot calculate statistics for table "test"."t" because the .ibd file is missing. For help, please refer to
http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html</code></span></span>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值