共计 2482 个字符,预计需要花费 7 分钟才能阅读完成。
本篇内容主要讲解“如何通过物理方式使 MySQL 恢复单表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“如何通过物理方式使 MySQL 恢复单表”吧!
1、首先创建一个测试表 test1,并插入几条数据:
mysql create table test1 (id int auto_increment primary key,name varchar(20));
Query OK, 0 rows affected (0.05 sec)
mysql insert into test1 (name) values (张三),(李四),(王二
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql select * from test1;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王二 |
+----+--------+
3 rows in set (0.00 sec)
2、创建目标表 test2:
mysql create table test2 like test1;
Query OK, 0 rows affected (0.10 sec)
查看数据目录里面的 ibd 文件(test2.ibd、test1.ibd):
-rw-r-----. 1 * * 114688 Nov 2 16:20 test1.ibd
-rw-r-----. 1 * * 114688 Nov 2 16:23 test2.ibd
3、通过 alter table discard 的方法丢弃表 test2 的 idb 文件(为下一步复制 test1 的数据过来做准备):
mysql alter table test2 discard tablespace;
Query OK, 0 rows affected (0.02 sec)
查看 ibd 文件情况,发现 test2 的 ibd 文件已经被删除
-rw-r----- 1 * * 114688 Nov 2 16:20 test1.ibd
4、执行下面的命令,生成一个 test1 的 cfg 文件,如下:
mysql flush table test1 for export;
Query OK, 0 rows affected (0.00 sec)
生成了一个 test1.cfg 的 cfg 文件
-rw-r----- 1 * * 655 Nov 2 16:25 test1.cfg
-rw-r----- 1 * * 114688 Nov 2 16:20 test1.ibd
5、拷贝源表 test1 的 cfg 文件和 ibd 文件到目标表 test2,并修改文件权限:
cp test1.cfg test2.cfg
cp test1.ibd test2.ibd
chown -R mysql.mysql test2.*
6、复制完成之后,执行 select 命令发现出现以下报错:
mysql select * from test2;
ERROR 1100 (HY000): Table test2 was not locked with LOCK TABLES
7、执行 unlock tables,释放源表的 test1.cfg 文件,然后导入 ibd 文件:
mysql unlock tables;
Query OK, 0 rows affected (0.00 sec)
并用 alter table 的方法为目标表 test2 导入这个 ibd 文件:
mysql alter table test2 import tablespace;
Query OK, 0 rows affected (0.03 sec)
1 row in set (0.00 sec)
8、再次执行 select,发现数据已经导入:
mysql select * from test2;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王二 |
+----+--------+
3 rows in set (0.00 sec)
物理复制方法介绍
上述单表物理复制的方法,核心在于 cp 命令,因为是通过物理拷贝,所以如果复制的表非常大,那么通过物理拷贝,就会比逻辑上的 SQL 写入快很多,比如 insert into select 语句。
简单总结一下上述物理复制过程:
1、create table like 语法创建一个相同表结构的空的目标表
2、目标表执行 alter table discard,丢弃 ibd 文件
3、源表执行 alter table for export 语法,生成.cfg 文件,并锁表
4、使用 cp 命令复制源表 cfg 文件和 ibd 文件为目标表
5、unlock tables 释放源表的 cfg 文件和锁
6、alter table import 命令导入目标表的 ibd 数据文件。
alter table for export 语法介绍:
1、这个命令是为了将内存中关于这个表的数据刷新到磁盘上,确保数据都能被 binlog 所记录;
2、这个操作需要 flush table 或者 reload 权限;
3、这个操作会持有当前表的共享 MDL 锁,阻止其他会话修改表结构,在 FOR EXPORT 操作完成时不会释放先前获取的 MDL 锁,需要手工释放
4、InnoDB 会在与该表相同的数据库目录中生成一个名为 table_name.cfg 的文件
5、处理完表复制后,需要使用 UNLOCK tables 释放源表的 MDL 锁或者断开连接。
注意:
因为 alter table for export 锁表,所以这种方法更适合在从库上停掉复制关系,然后执行这个表复制的操作。如果有业务操作当前的源表,需要谨慎考虑。
到此,相信大家对“如何通过物理方式使 MySQL 恢复单表”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!