MySQL传输表空间备份恢复

一、先决条件

  • 准备两个 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)

本次传输表空间操作完成!

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
MySQL
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论