由于个人能力有限,文中可能存在错误,欢迎批评指正。
1.解决哪些实际问题?
- 文件损坏恢复部分数据
- 快速进行数据迁移
2.前置条件
- 必须开启 innodb_file_per_table
- 表空间页大小必须与实例配置页大小( innodb_page_size)匹配
- 数据库版本必须保证一致
- ROW_FORMAT 必须保证配置一致
3.测试验证
这里测试将 test 库中的表 t2 迁移到 test1 库中。
mysql> use test
Database changed
mysql> show create table t2;
+-------+-----------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------+
| t2 | CREATE TABLE `t2` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from t2;
+------+
| id |
+------+
| 2 |
+------+
1 row in set (0.01 sec)
mysql> system ls -l /mysql/data/test/
total 116
-rw-r----- 1 mysql mysql 67 Jun 17 13:31 db.opt
-rw-r----- 1 mysql mysql 8556 Jun 20 13:46 t2.frm
-rw-r----- 1 mysql mysql 98304 Jun 20 13:46 t2.ibd
# 创建测试库 test1
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
mysql> system ls -l /mysql/data/test1/
total 4
-rw-r----- 1 mysql mysql 67 Jun 27 16:28 db.opt
# 在 test1 中创建相同表结构的 t2
mysql> CREATE TABLE `t2` ( `id` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.01 sec)
mysql> system ls -l /mysql/data/test1/
total 116
-rw-r----- 1 mysql mysql 67 Jun 27 16:28 db.opt
-rw-r----- 1 mysql mysql 8556 Jun 27 16:30 t2.frm
-rw-r----- 1 mysql mysql 98304 Jun 27 16:30 t2.ibd
# 删除表空间
mysql> ALTER TABLE t2 DISCARD TABLESPACE;
Query OK, 0 rows affected (0.07 sec)
mysql> system ls -l /mysql/data/test1/
total 16
-rw-r----- 1 mysql mysql 67 Jun 27 16:28 db.opt
-rw-r----- 1 mysql mysql 8556 Jun 27 16:30 t2.frm
# 将 test 库 t2 表的 .ibd 文件拷贝至 test1 库目录下
[mysql@host01 data]$ cp test/t2.ibd test1/
[mysql@host01 data]$ ll /mysql/data/test1/
total 116
-rw-r----- 1 mysql mysql 67 Jun 27 16:28 db.opt
-rw-r----- 1 mysql mysql 8556 Jun 27 16:30 t2.frm
-rw-r----- 1 mysql mysql 98304 Jun 27 16:32 t2.ibd
mysql> use test1;
Database changed
mysql> system ls -l /mysql/data/test1/
total 116
-rw-r----- 1 mysql mysql 67 Jun 27 16:28 db.opt
-rw-r----- 1 mysql mysql 8556 Jun 27 16:30 t2.frm
-rw-r----- 1 mysql mysql 98304 Jun 27 16:32 t2.ibd
# 导入表空间
mysql> ALTER TABLE t2 IMPORT TABLESPACE;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> select * from t2;
+------+
| id |
+------+
| 2 |
+------+
1 row in set (0.00 sec)