一、先决条件
-
准备两个 MySQL 实例
-
两个 MySQL 都要开启独立表空间( innodb_file_per_table = 1 )
-
使用 sysbench 准备 1 张表,这张表 100 万数据
-
模拟主库要备份这张表到从库,由于数据太大,备份恢复慢,使用传输表空间方式备份恢复表
端口 | 角色 |
---|---|
3308 | 模拟主库 |
3309 | 模拟从库 |
目标:减少锁表时间
二、准备数据
- 使用 sysbench 压测工具( 安装 sysbench 过程省略 )
[root@centos ~]# sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=10.186.60.54 --mysql-port=3308 --mysql-user=root --mysql-password=123456 \
--mysql-db=testdb --oltp-table-size=1000000 --oltp-tables-count=1 --threads=10 --events=0 --time=0 --report-interval=3 prepare
[root@centos ~]# /data/mysql/base/5.7.30/bin/mysql -S /data/mysql/data/3308/mysqld.sock
3308 > select count(1) from sbtest1;
+----------+
| count(1) |
+----------+
| 1000000 |
+----------+
1 row in set (0.13 sec)
三、传输表空间
- 3309 实例准备库与表结构( 通过 show create table sbtest1 语句这 3308 实例查看表结构语句 )
3309 > CREATE TABLE sbtest1 (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
k int(10) unsigned NOT NULL DEFAULT '0',
c char(120) NOT NULL DEFAULT '',
pad char(60) NOT NULL DEFAULT '',
PRIMARY KEY (id),
KEY k_1 (k)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8mb4 MAX_ROWS=1000000;
- 3309 实例剔除 sbtest1 表的 ibd 文件,只保留 frm 文件( 5.7 及以前的版本,8.0 只保留了 ibd 文件,同时包含表结构 )
3309 > alter table testdb.sbtest1 discard tablespace;
Query OK, 0 rows affected (0.02 sec)
- 3308 实例对 sbtest1 表加读锁( 防止这 cp 文件时有脏数据写入 )
3308 > flush table testdb.sbtest1 for export;
Query OK, 0 rows affected (0.02 sec)
- 拷贝 3308 实例 ibd 文件到 3309 实例对应目录下( 本次演示为一台服务器,所以使用 cp ,远程可以使用 scp 或者 rsync 等工具 )
[root@centos ~]# cp -a /data/mysql/data/3308/testdb/sbtest1.ibd /data/mysql/data/3309/testdb
[root@centos ~]# chown -R mysql.mysql /data/mysql/data/3309/testdb
- 3308 实例对 sbtest1 表解锁( ibd 文件拷贝完成后就可以解锁了 )
3308 > unlock tables;
Query OK, 0 rows affected (0.00 sec)
- 3309 实例导入 sbtest1 表 ibd 文件
3309 > alter table testdb.sbtest1 import tablespace;
Query OK, 0 rows affected, 1 warning (0.98 sec)
- 检查 3309 实例数据是否正常
3309 > select count(1) from testdb.sbtest1;
+----------+
| count(1) |
+----------+
| 1000000 |
+----------+
1 row in set (0.42 sec)
本次传输表空间操作完成!