暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

mysql表空间传输

原创 七七 2021-12-03
434


MySQL5.6版本以后引入的表空间传输,可以把一张表从一个数据库移到另一个库或另一个机器上。

 

要想使用表空间传输的几个限制条件:

1.必须是5.6以上的版本

2.使用独立表空间方式,把innodb_file_per_table参数开启

3.源库和目录库的page size必须一致。innodb_page_size

4.源库和目录库的表结构必须一致

5.当表做导出操作时,该表只能进行只读操作

 

 

 

步骤描述:

1.目标库:创建和源库相同表结构的表

2.目标库执行alter table tb_name discard tablespace ;   这个命令会删除ibd文件

3.源库:flush table tb_name for export ;此时这个表只能读不能写

数据目录下会生成一个tb_name.cfg的文件

4.cp tb_name.ibd、 tb_name.cfg文件到目标库的数据目录下

5.源库:unlock tables ;  释放表锁

6.目标库数据目录授权:chown -R mysql:mysql *

7.目标库导入表空间:alter table tb_name import tablespace;

主库执行恢复的时候,从库会报错找不到原来的表空间,造成复制中断

 

 

实验过程:

描述:把dhr库下的t1表的数据传输到tdhr库下的t1表中,dhr库下的t1表中的数据如下:

mysql> select * from t1;

+----+----+----+----+

| c1 | c2 | c3 | c4 |

+----+----+----+----+

|  0 |  0 |  0 |  0 |

|  1 |  1 |  1 |  0 |

|  3 |  3 |  3 |  0 |

|  4 |  2 |  2 |  0 |

|  6 |  2 |  5 |  0 |

|  8 |  6 |  6 |  0 |

| 10 |  4 |  4 |  0 |

+----+----+----+----+

7 rows in set (0.03 sec)

 

先在tdhr库下创建一个和dhr库下t1表结构相同的表t1

mysql> use tdhr;

Database changed

mysql> CREATE TABLE `t1` (

    ->   `c1` int(10) unsigned NOT NULL DEFAULT '0',

    ->   `c2` int(10) unsigned NOT NULL DEFAULT '0',

    ->   `c3` int(10) unsigned NOT NULL DEFAULT '0',

    ->   `c4` int(10) unsigned NOT NULL DEFAULT '0',

    ->   PRIMARY KEY (`c1`),

    ->   UNIQUE KEY `index_c3` (`c3`),

    ->   KEY `c2` (`c2`)

    -> ) ENGINE=InnoDB;

Query OK, 0 rows affected (0.15 sec)

 

查看数据目录下形成了t1表的数据信息

[root@dhr data]# cd tdhr

[root@dhr tdhr]# ls -l

total 144

-rw-r----- 1 mysql mysql     61 Aug 24 14:32 db.opt

-rw-r----- 1 mysql mysql   8634 Aug 24 14:35 t1.frm

-rw-r----- 1 mysql mysql 131072 Aug 24 14:35 t1.ibd

 

目标库:卸载tdhr库下t1表的表空间

mysql> alter table t1 discard tablespace;

Query OK, 0 rows affected (0.10 sec)

 

发现tdhr数据目录下,t1.ibd文件被删除了

[root@dhr tdhr]# ls -l

total 16

-rw-r----- 1 mysql mysql   61 Aug 24 14:32 db.opt

-rw-r----- 1 mysql mysql 8634 Aug 24 14:35 t1.frm

 

源库:然后在dhr库下执行表空间导出操作

mysql> use dhr;

Database changed

mysql> flush table t1 for export;

Query OK, 0 rows affected (0.00 sec)

 

会发现dhr的数据目录下,多了一个t1.cfg的文件

[root@dhr tdhr]# cd ../dhr

[root@dhr dhr]# ls

db.opt  t1.cfg  t1.frm  t1.ibd  t2.frm  t2.ibd  t3.frm  t3.ibd

 

然后dhr数据目录下的t1.cfg和t1.ibd文件拷贝到tdhr数据目录下

[root@dhr dhr]# cp t1.cfg ../tdhr/

[root@dhr dhr]# cp t1.ibd  ../tdhr/

[root@dhr dhr]# cd ../tdhr/

[root@dhr tdhr]# ls -la

total 156

drwxr-x--- 2 mysql mysql   4096 Aug 24 14:38 .

drwxr-xr-x 7 mysql mysql   4096 Aug 24 14:32 ..

-rw-r----- 1 mysql mysql     61 Aug 24 14:32 db.opt

-rw-r----- 1 root  root     633 Aug 24 14:38 t1.cfg

-rw-r----- 1 mysql mysql   8634 Aug 24 14:35 t1.frm

-rw-r----- 1 root  root  131072 Aug 24 14:38 t1.ibd

更改文件 权限

[root@dhr tdhr]# chown mysql:mysql *

[root@dhr tdhr]# ls -la

total 156

drwxr-x--- 2 mysql mysql   4096 Aug 24 14:38 .

drwxr-xr-x 7 mysql mysql   4096 Aug 24 14:32 ..

-rw-r----- 1 mysql mysql     61 Aug 24 14:32 db.opt

-rw-r----- 1 mysql mysql    633 Aug 24 14:38 t1.cfg

-rw-r----- 1 mysql mysql   8634 Aug 24 14:35 t1.frm

-rw-r----- 1 mysql mysql 131072 Aug 24 14:38 t1.ibd

 

源库:授权完后,因为目前dhr库下的t1表处于只读操作,所以需要执行解锁操作

mysql> unlock tables;

Query OK, 0 rows affected (0.01 sec)

 

目标库:然后在 tdhr库上执行表空间导入命令

mysql> alter table t1 import tablespace;

Query OK, 0 rows affected (0.03 sec)

 

确认tdhr库下的t1表中是否有数据了

mysql> select * from t1;

+----+----+----+----+

| c1 | c2 | c3 | c4 |

+----+----+----+----+

|  0 |  0 |  0 |  0 |

|  1 |  1 |  1 |  0 |

|  3 |  3 |  3 |  0 |

|  4 |  2 |  2 |  0 |

|  6 |  2 |  5 |  0 |

|  8 |  6 |  6 |  0 |

| 10 |  4 |  4 |  0 |

+----+----+----+----+

7 rows in set (0.00 sec)

 

 

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论