mysql清除表空间导入_mysql5.6之 传输表空间迁移表或恢复误删除的表

本文介绍了如何在MySQL 5.6中使用表空间迁移技术,包括迁移表的限制条件、优点,以及在误删除表后的恢复方法。详细步骤包括表的卸载、导出、元数据处理、文件复制和导入,强调了在不同阶段的注意事项和锁机制。
摘要由CSDN通过智能技术生成

一,简单说明:

1),传输表空间的限制:

1,mysql 版本 5.6.6 及其以上,并且版本建议源和目标版本建议都是GA版并且大版本一样

2,表引擎为innodb并且开启独立表空间  innodb_file_per_table

3,处于导出状态的表只允许读也即是”read_only“状态

4,DISCARD TABLESPACE不支持分区表[5.6.17才支持] 并且当表上具有外键关系的时候需要将 foreign_key_check设置为0

5,源和目标实例的page size 必须大小一致

6,ALTER TABLE ... IMPORT TABLESPACE  不强制进行外键约束检查,所以需要将主表和子表都导出,然后在目标实例导入,

另外该操作不需要.cfg 元数据文件,当然如果没有改文件在导入的时候是不做元数据检查的

7,在windows上,innodb引擎内部都是以小写格式存储数据库,表名和表空间名,故为了避免导入因为大小写出现文件建议在大小写敏感, 如linux、unix的操作系统上都以小写的格式创建数据库和表同时在[mysqld]项下 添加

[mysqld]

lower_case_table_names=1

2),传输表空间的优点:

1,不需要消耗太多的资源

2,很方便的将表 从一个实例迁移到另一个实例

3,相对于mysqldump来说你无须导出然后导入同时还的维护索引

二,正常的表空间迁移

1, 源数据库:

use test;

create table lidan(id int) engine=innodb;

insert into lidan values(10);

2,目标数据库:

use test;

create table lidan(id int) engine=innodb;

insert into lidan values(10);

3,目标数据库卸载表空间:

ALTER TABLE lidan DISCARD TABLESPACE;

卸载表空间后lidan.ibd 文件和表空间分离并且会对表加一个排他锁,此时如果执行dml则会直接报错如图:

6c613a26ae2408366941ef3e6ce0ce0e.png

4,源数据执行表空间导出:

use test;

FLUSH TABLES lidan FOR EXPORT;

flush操作会触发表lidan的dirty page刷新到磁盘,并且stop purge 线程,同时将元数据信息写入lidan.cfg 如图:

a926b6136ab764d706e0d759343ba5a4.png

元数据文件存储的信息如下:

8bd67e56cd509f97b2a375ee6c473f5e.png

主要就是一些数据库和表名、row_id 、回滚指针、事物id等

该会话会一直持有表lidan的metadata锁,故此时其他会话只能进行SELECT二更新和插入操作会被阻塞 。

如图:

a74fc3ad1e3f3d7ccf38452cafa3fe3f.png

5,将导出的表(源数据库)所在数据文件目录下对应的lidan.ibd file和lidan.cfg 拷贝到目标数据库对应的文件夹下

cp -p  lidan.cfg lidan.ibd /data/percona-data-3307/test/

注意:文件的拷贝必须在下一步释放metadata lock 之前

6,释放源数据库的metadata lock

use test;

unlock table;

unlock 这一步会删除之前生成的lidan.cfg文件,同时释放metadata lock 并且重新启动purge 线程

7,目标数据库将表导入到表空间

alter table lidan import tablespace;

然后查看导入成功如图:

d1c26dfe5e8812b63947174a9122d79c.png

导入的过程mysql内部会做如下事情:

a,检查表空间每个page的一致性

b,更新每个page的space id和lsn的信息

c,启用头部页标记和更新LSN到头部页

d,page 状态信息设置为dirty ,这样page将很快会被刷新到磁盘

具体如图

d12cc738b4f388eefab82a3ad9b6785d.png    

三,误删除情况下的恢复

这里只讨论备库误删除的恢复,如果是主库误删表那只能通过备份来恢复了

1,首先备库上执行drop操作,模拟误删除

(user:root  time: 16:37 port: 3307)[db: test]drop table lidan;

2,备库恢复必须要有.frm文件,故这里需要从源库查看表结构然后在目标库创建

create table lidan(id int) engine=innodb;

接下来的步骤就按照(二)当中从3开始做即可,具体请自行测试。

参考:

http://dev.mysql.com/doc/refman/5.6/en/flush.html

http://dev.mysql.com/doc/refman/5.6/en/tablespace-copying.html

转:http://blog.csdn.net/lidan3959/article/details/25152623

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值