6. 将单独表空间复制到另一个实例

本节介绍如何将单独表空间从一个MySQL实例复制 到另一个MySQL实例,也称为可传输表空间功能。

将InnoDB单独表空间复制到其他实例的原因有很多:

- 在不对生产服务器施加额外负载的情况下运行报告。

  • 在新的slave服务器上为表设置相同的数据 。

  • 在出现问题或错误后还原表或分区的备份版本。

  • 作为一种更快速的数据移动方式,比导入mysqldump命令的结果更快。数据立即可用,而不必重新插入并重建索引。

  • 将单独表空间移动到具有更适合系统要求的存储介质的服务器。例如,您可能希望在SSD设备上使用繁忙的表,或在高容量HDD设备上使用大表 。

限制和使用说明,请参考官方文档。

6.1 可传输表空间示例

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

  • 1)在源实例上,创建一张表
mysql> use test;
mysql> create table t(c1 int) Engine=InnoDB;
mysql> insert into t select 1;
mysql> insert into t select 2;
  • 2)在目标实例上,创建同样的表
mysql> use test;
mysql> create table t(c1 int) Engine=InnoDB;
  • 3)在目标实例上,放弃现有表空间(在导入表空间之前, InnoDB必须丢弃现有表空间。)
mysql> ALTER TABLE t DISCARD TABLESPACE;
  • 4)在源实例上,运行FLUSH TABLES TABLENAME FOR EXPORT以停顿表
mysql> flush tables t for export;
  • 5)将.ibd文件从源实例复制到目标实例,并确保属主为mysql
# cp /data/mysql/mysql3306/data/test/t.ibd /data/mysql/mysql3307/data/test/
# cd /data/mysql/mysql3307/data/test/
# ls -l
total 112
-rw-r----- 1 mysql mysql 67 Aug 10 16:53 db.opt
-rw-r----- 1 mysql mysql 8556 Aug 10 16:53 t.frm
-rw-r----- 1 root root 98304 Aug 10 17:01 t.ibd
# chown mysql:mysql t.ibd
  • 6)在源实例上,使用unlock tables释放锁
mysql> unlock tables;
  • 7)在目标实例上,导入表空间
mysql> alter table t import tablespace;
mysql> select * from t;
+------+
| c1 |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)

注意

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

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

  • 1)在源实例上,创建分区表.
mysql> create table t1 (i int) Engine=InnoDB partition by key(i) partitions 3;
mysql> insert into t1 select 1;
mysql> insert into t1 select 2;
mysql> insert into t1 select 3;

在datadir目录中,每个分区都有一个单独的*.ibd文件

# cd /data/mysql/mysql3306/data/test
# ls -l
total 536
-rw-r----- 1 mysql mysql 8622 Aug 9 17:03 account.frm
-rw-r----- 1 mysql mysql 114688 Aug 10 09:28 account.ibd
-rw-r----- 1 mysql mysql 67 Aug 7 10:15 db.opt
-rw-r----- 1 mysql mysql 8554 Aug 10 17:11 t1.frm
-rw-r----- 1 mysql mysql 98304 Aug 10 17:11 t1#P#p0.ibd
-rw-r----- 1 mysql mysql 98304 Aug 10 17:11 t1#P#p1.ibd
-rw-r----- 1 mysql mysql 98304 Aug 10 17:11 t1#P#p2.ibd
-rw-r----- 1 mysql mysql 8556 Aug 10 16:51 t.frm
-rw-r----- 1 mysql mysql 98304 Aug 10 16:51 t.ibd
  • 2)在目标实例上,创建相同的分区表
mysql> create table t1 (i int) Engine=InnoDB partition by key(i) partitions 3
  • 3)在目标实例上,丢弃分区表的表空间。
mysql> ALTER TABLE t1 DISCARD TABLESPACE;
  • 4)在源实例上,运行FLUSH TABLES ... FOR EXPORT以停顿分区表
mysql> FLUSH TABLES t1 FOR EXPORT;
  • 5)将.ibd文件复制到目标实例数据库目录中,并更改权限为mysql
# cd /data/mysql/mysql3306/data/test
# cp t1*.ibd /data/mysql/mysql3307/data/test/
# chown mysql:mysql t1*.ibd
  • 6)在源实例上,使用unlock tables释放锁
mysql> unlock tables;
  • 7)在目标实例上,导入分区表的表空间
mysql> alter table t1 import tablespace;
Query OK, 0 rows affected, 3 warnings (0.42 sec) mysql> select * from t1;
+------+
| i |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)

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

  • 1)在源实例上创建分区表,包含4个分区
mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 4;
mysql> insert into t1 select 1;
mysql> insert into t1 select 2;
mysql> insert into t1 select 3;
mysql> insert into t1 select 4;
mysql> insert into t1 select 5;
#查看分区数据分布情况
mysql> select * from t1 partition(p0);
+------+
| i |
+------+
| 1 |
| 5 |
+------+
2 rows in set (0.00 sec)
mysql> select * from t1 partition(p1);
+------+
| i |
+------+
| 4 |
+------+
1 row in set (0.00 sec)
mysql> select * from t1 partition(p2);
+------+
| i |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
mysql> select * from t1 partition(p3);
+------+
| i |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
  • 2)在目标实例上创建相同的分区
mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 4;
  • 3)在目标实例上,丢弃计划从源实例导入的表空间分区
mysql> ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;
  • 4)在源实例上,运行 FLUSH TABLES … FOR EXPORT以停顿分区表
mysql> flush tables t1 for export;
  • 5)将.ibd文件复制到目标实例数据库目录。在此示例中,仅将分区2(p2)和分区3(p3)的.ibd文件复制到data目标实例上的目录。分区0(p0)和分区1(p1)保留在源实例上。
# cp t1#P#p2.ibd  /data/mysql/mysql3307/data/test/
# cp t1#P#p3.ibd /data/mysql/mysql3307/data/test/
# chown mysql:mysql t1#P#*
  • 6)在源实例上,用于 UNLOCK TABLES释放通过FLUSH TABLES … FOR EXPORT以下方式获取的锁 :
mysql> unlock tables;
  • 7)在目标实例上,导入表空间分区(p2和p3):
mysql> ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;
mysql> select * from t1;
+------+
| i |
+------+
| 3 |
| 2 |
+------+
2 rows in set (0.00 sec)

6.2 可传输表空间内部

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

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

- 该表被锁定在X模式下

- 表空间与表分离

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

- 导出的表以共享模式锁定

- 协调器线程停止

- 脏页面写入到磁盘

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

此操作的log-error日志消息

2018-08-11T00:57:56.363847Z 2 [Note] InnoDB: Sync to disk of `test`.`t1` /* Partition `p0` */ started.
2018-08-11T00:57:56.363876Z 2 [Note] InnoDB: Stopping purge
2018-08-11T00:57:56.364901Z 2 [Note] InnoDB: Writing table metadata to './test/t1#P#p0.cfg'
2018-08-11T00:57:56.365515Z 2 [Note] InnoDB: Table `test`.`t1` /* Partition `p0` */ flushed to disk
2018-08-11T00:57:56.365539Z 2 [Note] InnoDB: Sync to disk of `test`.`t1` /* Partition `p1` */ started.
2018-08-11T00:57:56.365559Z 2 [Note] InnoDB: Writing table metadata to './test/t1#P#p1.cfg'
2018-08-11T00:57:56.366225Z 2 [Note] InnoDB: Table `test`.`t1` /* Partition `p1` */ flushed to disk
2018-08-11T00:57:56.366240Z 2 [Note] InnoDB: Sync to disk of `test`.`t1` /* Partition `p2` */ started.
2018-08-11T00:57:56.366256Z 2 [Note] InnoDB: Writing table metadata to './test/t1#P#p2.cfg'
2018-08-11T00:57:56.366429Z 2 [Note] InnoDB: Table `test`.`t1` /* Partition `p2` */ flushed to disk
2018-08-11T00:57:56.366443Z 2 [Note] InnoDB: Sync to disk of `test`.`t1` /* Partition `p3` */ started.
2018-08-11T00:57:56.366458Z 2 [Note] InnoDB: Writing table metadata to './test/t1#P#p3.cfg'
2018-08-11T00:57:56.366509Z 2 [Note] InnoDB: Table `test`.`t1` /* Partition `p3` */ flushed to disk

unlock tables在源实例上运行:

- 删除二进制.cfg文件

- 将导入表上的共享锁释放,并重启清除协调器线程

此操作的log-error日志消息

2018-08-11T01:00:20.289266Z 2 [Note] InnoDB: Deleting the meta-data file './test/t1#P#p0.cfg'
2018-08-11T01:00:20.289408Z 2 [Note] InnoDB: Deleting the meta-data file './test/t1#P#p1.cfg'
2018-08-11T01:00:20.290116Z 2 [Note] InnoDB: Deleting the meta-data file './test/t1#P#p2.cfg'
2018-08-11T01:00:20.291804Z 2 [Note] InnoDB: Deleting the meta-data file './test/t1#P#p3.cfg'
2018-08-11T01:00:20.291857Z 2 [Note] InnoDB: Resuming purge

alter table ... import tablespace在目标实例上运行时,导入算法会为要导入的每个表空间执行以下操作

  • 检查每个表空间页面是否损坏
  • 每页上的空间ID和日志序列号(LSN)都会更新
  • 验证标志并更细标题页的LSN
  • Btree页面已更新
  • 页面状态设置为脏,以便将其写入磁盘

此操作的log-error日志消息

2018-08-11T00:52:37.332663Z 2 [Note] InnoDB: Sync to disk
2018-08-11T00:52:37.339950Z 2 [Note] InnoDB: Sync to disk - done!
2018-08-11T00:52:37.340015Z 2 [Note] InnoDB: Phase I - Update all pages
2018-08-11T00:52:37.340191Z 2 [Note] InnoDB: Sync to disk
2018-08-11T00:52:37.354408Z 2 [Note] InnoDB: Sync to disk - done!
2018-08-11T00:52:37.358280Z 2 [Note] InnoDB: Phase III - Flush changes to disk
2018-08-11T00:52:37.376256Z 2 [Note] InnoDB: Phase IV - Flush complete
2018-08-11T00:52:37.376368Z 2 [Note] InnoDB: `test`.`t1` /* Partition `p2` */ autoinc value set to 0
2018-08-11T00:52:37.435594Z 2 [Note] InnoDB: Sync to disk
2018-08-11T00:52:37.441117Z 2 [Note] InnoDB: Sync to disk - done!
2018-08-11T00:52:37.441414Z 2 [Note] InnoDB: Phase I - Update all pages
2018-08-11T00:52:37.441538Z 2 [Note] InnoDB: Sync to disk
2018-08-11T00:52:37.446679Z 2 [Note] InnoDB: Sync to disk - done!
2018-08-11T00:52:37.450051Z 2 [Note] InnoDB: Phase III - Flush changes to disk
2018-08-11T00:52:37.467124Z 2 [Note] InnoDB: Phase IV - Flush complete
2018-08-11T00:52:37.467232Z 2 [Note] InnoDB: `test`.`t1` /* Partition `p3` */ autoinc value set to 0

6. 将单独表空间(File-Per-Table Tablespaces)复制到另一个实例的更多相关文章

  1. 4. InnoDB表单独表空间

    4. InnoDB表单独表空间 从历史上看,所有InnoDB表和索引都存储在系统表空间中.这种单片方法的目标是完全专用于数据库处理的机器,精心规划的数据增长,其中任何分配给MySQL的磁盘存储都不会用 ...

  2. 5. 在Datadir目录外创建单独表空间

    5. 在Datadir目录外创建单独表空间 要在MySQL dadadir之外的位置创建单独表空间,请使用该子句: DATA DIRECTORY = '/path' 在目标目录中,MySQL会创建一个 ...

  3. 表空间移动(transporting tablespaces)

    --表空间移动(transporting tablespaces) --------------------------------------2014/01/15   1. 表空间传输步骤简介.   ...

  4. 十四、oracle 数据库管理--管理表空间和数据文件

    一.概念表空间是数据库的逻辑组成部分.从物理上讲,数据库数据存放在数据文件中:从逻辑上讲,数据库数据则是存放在表空间中,表空间由一个或多个数据文件组成. 二.数据库的逻辑结构oracle中逻辑结构包括 ...

  5. oracle 数据库管理--管理表空间和数据文件

    一.概念表空间是数据库的逻辑组成部分.从物理上讲,数据库数据存放在数据文件中:从逻辑上讲,数据库数据则是存放在表空间中,表空间由一个或多个数据文件组成. 二.数据库的逻辑结构oracle中逻辑结构包括 ...

  6. Oracle创建表空间和表

    创建表空间和表ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的oracle中的表就是一张存储数据的表.表空间是逻辑上的划分.方便管理的.数据表空间 (Tablesp ...

  7. Oracle 10g bigfile表空间、smallfile 表空间

    smallfile tablespace设置不同大小的db_block_size时数据文件允许的最大大小 db_block_size=2KB,2KB*4M=8192M      8Gdb_block_ ...

  8. MySQL如何判别InnoDB表是独立表空间还是共享表空间

    InnoDB采用按表空间(tablespace)的方式进行存储数据, 默认配置情况下会有一个初始大小为10MB, 名字为ibdata1的文件, 该文件就是默认的表空间文件(tablespce file ...

  9. innodb和myisam数据库文件存储详解以及mysql表空间

    数据库常用的两种引擎有Innodb和Myisam,关于二者的区别参考:https://www.cnblogs.com/qlqwjy/p/7965460.html 1.关于数据库的存储在两种引擎的存储是 ...

随机推荐

  1. .NET CORE之API日志收集

    我们在构建WEBAPI项目时,通常需要构建一个全局的记录API 请求和返回 的功能,在WEBAPI框架下 我们通过自定义一个DelegateHandler来实现这个功能, 在.NET CORE框架下已 ...

  2. 无向图的边双连通分量(EBC)

    嗯,首先边双连通分量(双连通分量之一)是:在一个无向图中,去掉任意的一条边都不会改变此图的连通性,即不存在桥(连通两个边双连通分量的边),称作边双连通分量.一个无向图的每一个极大边双连通子图称作此无向 ...

  3. Qt样式表之一:Qt样式表和盒子模型介绍

    一.Qt样式表介绍 Qt样式表是一个可以自定义部件外观的十分强大的机制,可以用来美化部件.Qt样式表的概念.术语和语法都受到了HTML的层叠样式表(Cascading Style Sheets, CS ...

  4. Codeforces 669D Little Artem and Dance (胡搞 + 脑洞)

    题目链接: Codeforces 669D Little Artem and Dance 题目描述: 给一个从1到n的连续序列,有两种操作: 1:序列整体向后移动x个位置, 2:序列中相邻的奇偶位置互 ...

  5. Almost Acyclic Graph Codeforces - 915D

    以前做过的题都不会了.... 此题做法:优化的暴力 有一个显然的暴力:枚举每一条边试着删掉 注意到题目要求使得图无环,那么找出图上任意一个环,都应当要在其某一处断开(当然没有环是YES) 因此找出图中 ...

  6. tsconfig.json No inputs were found in config file

    Build:No inputs were found in config file '/tsconfig.json'. Specified 'include' paths were '["* ...

  7. 2019/05/11 Java内存结构

    1.  类加载子系统:负责从文件系统或者网络加载Class信息,加载的信息存放在一块称之方法区的内存空间. 2.  方法区:就是存放类的信息.常量信息.常量池信息.包括字符串字面量和数字常量等. 3. ...

  8. unity内存管理

    最近一直在研究unity的内存加载,因为它是游戏运行的重中之重,如果不深入理解和合理运用,很可能导致项目因内存太大而崩溃. 详细说一下细节概念:AssetBundle运行时加载:来自文件就用Creat ...

  9. iOS Getter 和Setter 注册xibcell

    // 初始化cell的xib的方式 [tableView registerNib:[UINib nibWithNibName:@"LXmiddleCell" bundle:nil] ...

  10. android xml中使用include标签

    在一个项目中,我们可能会在xml中局部用到相同的布局,如果每次都在xml中重写这些布局,代码显得很冗余.重复的复制黏贴也很烦恼,所以,我们把这些相同的局部布局写成一个单独的xml模块,需要用到这些布局 ...