类型二:独立表空间
在数据库服务5.6版本中,针对用户数据,可以进行单独的存储管理,存储表的数据行和索引等相关信息;
独立表空间在各个版本之间的作用区别:
-
在数据库服务8.0版本前
用户表包含三个部分组成(表.ibd 表.frm ibdata1-全局数据字典信息存储);
所以在8.0之前,如果想修改表数据结构信息(元数据修改),都会修改frm和ibdata文件信息,每次更新都会锁表(元数据锁);
因为要保证数据一致性,并且两个表均更新完,才能释放解锁,因此在8.0前修改元数据信息,要避开业务繁忙时间段;
-
在数据库服务8.0版本后
用户表数据进行统一存储(表.ibd); 如果想修改表数据结构信息(元数据修改),只会修改ibd文件信息;
此时不需要对两个表文件均更新,只要更新一个文件即可,因此对文件锁的代价降低了,降低了对业务的影响;
独立表空间管理:
-
表空间配置参数信息查看
mysql > select @@innodb_file_per_table;
+---------------------------------+
| @@innodb_file_per_table |
+---------------------------------+
| 1 |
+---------------------------------+
1 row in set (0.00 sec)
-- 表示每个表就是一个独立文件,进行数据信息的独立存储,不建议进行修改,如果改为0就是所有数据统一存储在共享表空间
[root@xiaoQ-01 ~]# ibd2sdi city.ibd
-- 可以看到文件中存储的元数据信息(数据字典信息),并且数据库8.0之后不再有表对应的frm文件信息了
-- 在数据库5.7环境中,每个表数据信息会存储生成两个表 frm ibd
-- frm文件中存储数据表的数据字典信息(元数据信息)
-- ibd文件中存储数据行信息和索引信息
表空间配置参数信息修改
mysql > set global innodb_file_per_table=0
-- 设置为0表示利用共享表空间存储用户数据 1表示利用独立表空间存储用户数据
表空间企业应用案例:
案例01:利用独立表空间进行快速数据迁移(源端 3306/test/t100w --> 目标端 3307/test/t100w)
说明:可以在需要某个表中的数据信息时,可以将数据表的独立表空间数据信息做迁移,在另一个数据库中进行恢复即可
操作步骤一:锁定源端t100w表
mysql > lock tables baimei.t100w write;
-- 给t100w表加写数据锁
mysql > show create table baimei.t100w;
CREATE TABLE `t100w` (
`id` int DEFAULT NULL,
`num` int DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY `idx` (`k1`,`k2`,`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
-- 获取创建表结构数据信息
操作步骤二:目标端创建baimei库和t100w空表
mysql> create database baimei;
-- 创建新的数据库
mysql > CREATE TABLE `t100w` (
`id` int DEFAULT NULL,
`num` int DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY `idx` (`k1`,`k2`,`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
-- 创建新的数据表
操作步骤三:单独删除空的表空间文件
mysql> alter table baimei.t100w discard tablespace;
-- 删除t100w表的ibd数据文件信息,但是保留t100w的frm,ibdata1中关于t100w的系统数据
操作步骤四:拷贝源端ibd文件到目标端目录,并设置权限
[root@xiaoQ-01 ~]# cp /data/3306/data/baimei/t100w.ibd /data/3307/data/baimei/
[root@xiaoQ-01 ~]# chown -R mysql.mysql /data/*
操作步骤五:导入表空间
mysql> alter table baimei.t100w import tablespace;
-- 在目标端加载识别迁移过来的数据文件信息
mysql> select count(*) from t100w;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (0.04 sec)
-- 查看数据表中是否有迁移古来的数据信息
操作步骤六:解锁源端数据表
mysql> unlock tables;
欢迎来撩 : 汇总all