1 案例分析1
案例: 将3306实例上dbt3库下的orders迁移到3307实例下的db库
。 在3306,flush table orders for export; #加锁阻止写操作
2 测试脚本MDL锁
09:39: [ytt]>
select b.name,a.path from
information_schema.innodb_tables b,
information_schema.innodb_datafiles a /* innodb_tablespaces*/
where a.space=b.space;
+----------------+----------------------+
| name | PATH |
+----------------+----------------------+
| mysql/id | .\mysql\id.ibd |
| mysql/t | .\mysql\t.ibd |
| mysql/test2 | .\mysql\test2.ibd |
| mysql/test3 | .\mysql\test3.ibd |
| sys/sys_config | .\sys\sys_config.ibd |
| test/t2 | .\test\t2.ibd |
| ytt/t4 | 23.ibd |
| ytt/t3 | 23.ibd |
| ytt/t2 | 23.ibd |
+----------------+----------------------+
9 rows in set (0.05 sec)
09:40: [ytt]>
会话A
09:40: [ytt]> flush table t2 for export;
Query OK, 0 rows affected, 1 warning (0.00 sec)
会话B
09:46: [ytt]> update t2 set id =3 ; 卡主
09:47: [ytt]> delete from t2; --卡主
09:47: [ytt]> insert into t2 select * from t2; --卡主
09:48: [ytt]> select count(1) from t2;
+----------+
| count(1) |
+----------+
| 0 |
+----------+
1 row in set (0.01 sec)
09:48: [ytt]>
在会话A查看锁信息
09:46: [ytt]> show processlist;
+----+-----------------+-----------------+------+---------+------+---------------------------------+--
-------------------------------+
| Id | User | Host | db | Command | Time | State | I
nfo |
+----+-----------------+-----------------+------+---------+------+---------------------------------+--
-------------------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 1057 | Waiting on empty queue | N
ULL |
| 8 | root | localhost:49201 | ytt | Query | 0 | init | s
how processlist |
| 9 | root | localhost:56583 | ytt | Query | 8 | Waiting for table metadata lock | i
nsert into t2 select * from t2 |
+----+-----------------+-----------------+------+---------+------+---------------------------------+--
-------------------------------+
3 rows in set (0.00 sec)
09:48: [ytt]>
可以发现 使用flush table T2 for export 是在表级别加上了X级别的mdl锁。
3 实施步骤
在3306,flush table orders for export; #加锁阻止写操作
在3306,进入数据区;cp orders.* /root
在3306,unlock tables; 释放锁
在3307,执行order建表
show create table orders;
CREATE TABLE `orders` ( `o_orderkey` int(11) NOT NULL, `o_custkey` int(11) DEFAULT NULL, `o_orderstatus` char(1) DEFAULT NULL, `o_totalprice` double DEFAULT NULL, `o_orderDATE` date DEFAULT NULL, `o_orderpriority` char(15) DEFAULT NULL, `o_clerk` char(15) DEFAULT NULL, `o_shippriority` int(11) DEFAULT NULL, `o_comment` varchar(79) DEFAULT NULL, PRIMARY KEY (`o_orderkey`), KEY `i_o_custkey` (`o_custkey`), KEY `i_key_date` (`o_orderkey`,`o_orderDATE`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;
在3307,执行alter table orders discard tablespace; 删除独立表空间文件
在3307:拷贝ibd和cfg文件到3307
scp root@192.168.58.51:/root/orders.ibd ./
scp root@192.168.58.51:/root/orders.cfg ./
更改用户
chown mysql:mysql orders.*
在3307,alter table orders import tablespace; 导入表空间的数据
4 迁移总结
MySQL使用表空间文件来存储和管理数据。
在MySQL中,表空间是指用于存储表和索引数据的文件集合。每个MySQL数据库可以包含一个或多个表空间,每个表空间可以包含一个或多个数据文件。
数据文件的类型可以是InnoDB的独立表空间文件(.ibd),
或者MyISAM的表文件(.MYD和.MYI)。
在InnoDB存储引擎中,每个InnoDB表都有一个独立的表空间文件。这种表空间文件包含了表的数据和索引信息。
而MyISAM存储引擎将表的数据和索引分别存储在两个不同的文件中,.MYD文件存储数据,.MYI文件存储索引。
需要注意的是,MySQL的表空间文件是底层数据存储的一部分,对于常规操作来说,不需要直接操作表空间文件。大多数情况下,使用SQL语句和MySQL的管理工具来进行数据库和表的操作即可。
转载于DB哥MySQL高级教程-81.表空间文件迁移 本文仅供自己学习参考。