共计 3730 个字符,预计需要花费 10 分钟才能阅读完成。
本篇内容介绍了“mysql 表空间传输过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
在 MySQL 5.6 版本中引入了一个可移动表空间的新特性(复制的表空间到另一个服务器),即 mysql 表空间传输。这使得我们传输表或者单个库的数据变得十分方便。
但是,传输表空间必须满足以下的条件
1. 必须使用独立表空间
2. 两个 mysql 数据库的 page 大小必须一样
3. 两个表的表结构必须一样
下面我们对 lala 库下面的 score 表进行传输
首先,先从主库导出 score
我们可以在导出之前对错误日志 - f 命令进行输出,跟踪它做了什么
[root@potato data]# tail -f error.log
root@localhost:mysql.sock 01:31:46 [lala] flush tables score for export;
root@localhost:mysql.sock 02:08:21 [lala] select * from score; +——+———-+——-+
| id | name | score |
+——+———-+——-+
| 3 | xiaohong | 99 |
| 2 | xiaoming | 65 |
| 1 | xiaojun | 55 |
+——+———-+——-+
3 rows in set (0.00 sec)
以下是错误日志的输出
2016-12-19 01:32:44 25547 [Note] InnoDB: Sync to disk of lala . score started.
2016-12-19 01:32:44 25547 [Note] InnoDB: Stopping purge
2016-12-19 01:32:44 25547 [Note] InnoDB: Writing table metadata to ./lala/score.cfg
2016-12-19 01:32:44 25547 [Note] InnoDB: Table lala . score flushed to disk
可见,它首先对表停止操作,再把 score 的数据和元数据写到磁盘。
此时可以访问这张表,但是不能对数据进行 DML 操作,如
发起查询语句,成功
root@localhost:mysql.sock 01:33:11 [(none)] select * from lala.score; +——+———-+——-+
| id | name | score |
+——+———-+——-+
| 3 | xiaohong | 99 |
| 2 | xiaoming | 65 |
| 1 | xiaojun | 55 |
+——+———-+——-+
3 rows in set (0.00 sec)
发起插入语句,一直在等待
root@localhost:mysql.sock 01:31:23 [(none)] insert into lala.score values(4, xiaolin ,74);
在库文件夹下面多了 cfg 文件
[root@potato lala]# ls -l score*
-rw-r—–. 1 mysql mysql 470 Dec 19 02:07 score.cfg
-rw-rw—-. 1 mysql mysql 8618 Dec 19 02:03 score.frm
-rw-r—–. 1 mysql mysql 98304 Dec 19 02:07 score.ibd
我们把 cfg 和 ibd 文件先复制到 /tmp 目录下
[root@potato lala]#cp score.cfg /tmp
[root@potato lala]#cp score.ibd /tmp
然后解锁表,让外部可以尽快访问表
root@localhost:mysql.sock 01:35:02 [lala] unlock tables;
Query OK, 0 rows affected (0.00 sec)
备库此时没有该表
root@localhost:mysql.sock 01:35:28 [lala] show tables;
+—————-+
| Tables_in_lala |
+—————-+
| haha |
| test |
| test1 |
+—————-+
3 rows in set (0.00 sec)
查看主库的 score 建表语句
root@localhost:mysql.sock 01:37:19 [lala] show create table score\G
*************************** 1. row ***************************
Table: score
Create Table: CREATE TABLE `score` (
`id` int(11) DEFAULT NULL,
`name` varchar(15) DEFAULT NULL,
`score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
在从库上执行
root@localhost:mysql.sock 02:03:44 [lala] CREATE TABLE `score` (
– `id` int(11) DEFAULT NULL,
– `name` varchar(15) DEFAULT NULL,
– `score` int(11) DEFAULT NULL
– ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)
现在 score 表是没有数据的
root@localhost:mysql.sock 02:04:11 [lala] select * from score;
Empty set (0.00 sec)
卸载 score 表空间
root@localhost:mysql.sock 02:05:12 [lala] alter table score discard tablespace;
Query OK, 0 rows affected (0.02 sec)
[root@potato lala]# ls -l score*
-rw-rw—-. 1 mysql mysql 8618 Dec 19 02:03 score.frm
在主库上把两个文件传到备库上
[root@potato lala]# scp /tmp/score* 192.168.161.55:/data/mysql/mytest_3306/data/lala
root@192.168.161.55 s password:
score.cfg 100% 470 0.5KB/s 00:00
score.ibd 100% 96KB 96.0KB/s 00:00
修改传输过去的文件属主
[root@potato lala]# ls -l score*
-rw-r—–. 1 root root 8618 Dec 19 01:37 score.cfg
-rw-rw—-. 1 mysql mysql 8618 Dec 19 02:03 score.frm
-rw-r—–. 1 root root 98304 Dec 19 01:37 score.ibd
[root@potato lala]# chown mysql:mysql score*
[root@potato lala]# ls -l score*
-rw-r—–. 1 mysql mysql 470 Dec 19 02:07 score.cfg
-rw-rw—-. 1 mysql mysql 8618 Dec 19 02:03 score.frm
-rw-r—–. 1 mysql mysql 98304 Dec 19 02:07 score.ibd
导入 score 表空间
root@localhost:mysql.sock 02:05:29 [lala] alter table score import tablespace; Query OK, 0 rows affected (0.36 sec)
root@localhost:mysql.sock 02:08:21 [lala] select * from score; +——+———-+——-+
| id | name | score |
+——+———-+——-+
| 3 | xiaohong | 99 |
| 2 | xiaoming | 65 |
| 1 | xiaojun | 55 |
+——+———-+——-+
3 rows in set (0.00 sec)
至此,表空间传输成功
“mysql 表空间传输过程”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!