InnoDB的特点
- Fully ACID (InnoDB默认的Repeat Read隔离级别就支持)
- Row-level Locking(支持行锁)
- Multi-version concurrency control(MVCC)(支持多版本并发控制)
- Foreign key support(支持外键)
- Automatic deadlock detection(死锁自动检测)
- High performance、High scalability、High availability(高性能,高扩展,高可用)
InnoDB存储引擎的文件
概述
InnoDB的文件主要分为两个部分,一个是表空间文件,一个是重做日志文件。
- 表空间文件
- 独立表空间文件
- 全局表空间文件
- undo表空间文件(from MySQL 5.6)
- 重做日志文件
- 物理逻辑日志
- 没有Oracle的归档重做日志
InnoDB表空间
- 表空间的概念
- 表空间是一个逻辑存储的概念
- 表空间可以由多个文件组成
- 支持裸设备(可以直接使用O_DIRECT方式绕过缓存,直接写入磁盘)
- 支持裸设备指的是不需要在硬盘上分区安装文件系统。
表空间的分类
- 系统表空间 (最早只有系统表空间)
- 存储元数据信息
- 存储Change Buffer信息
- 存储Undo信息
- 甚至一开始 所有的表和索引的信息都是存储在系统表空间中
- 随后InnoDB对其做了改进,可以使用独立的表空间
- 独立表空间
- innodb_file_per_table=1 (开启支持每个表一个独立的表空间)
- 每张用户表对应一个独立的 ibd文件
- 分区表可以对应多个ibd文件
- Undo表空间
- MySQL5.6版本支持独立的Undo表空间
- innodb_undo_tablespaces,控制生成的UNDO表空间的数量,默认2个,在8.0对该参数做了废弃,但并未提供其他参数控制UNDO数量,当前依旧可以使用该参数做UNDO表空间数量配置,通常建议配置为3(手工收缩UNDO时需要至少3个UNDO表空间)
-- 创建一个新的UNDO表空间 CREATE UNDO TABLESPACE undo_003 ADD DATAFILE 'undo_003.ibu'; -- 可以将已有的UNDO表示为inactive(也可理解为UNDO表空间收缩) -- PS:设置为INACTIVE的表空间的STATE为empty,表示这个表空间不包含任何事务回滚数据,且表空间也收缩为默认大小 ALTER UNDO TABLESPACE undo_003 SET INACTIVE; -- 可以将inactive的UNDO转为active ALTER UNDO TABLESPACE innodb_undo_001 SET ACTIVE; -- 可以将inactive的UNDO表空间进行删除 -- PS:默认以innodb_开头初始化的undo表空间不可被删除 DROP UNDO TABLESPACE innodb_undo_001; ERROR: 3119 (42000): InnoDB: Tablespace names starting with `innodb_` are reserved. -- 非系统默认的UNDO在inactive后可被删除 ALTER UNDO TABLESPACE undo_003 SET ACTIVE; Query OK, 0 rows affected (0.0030 sec)
- 临时表空间
- MySQL5.7增加了临时表空间(ibtmp1)
- innodb_temp_data_file_path
-rw-r----- 1 mysql mysql 79691776 Mar 26 14:25 ibdata1 # 系统表空间,默认所有信息存在这里 -rw-r----- 1 mysql mysql 12582912 Mar 26 13:46 ibtmp1 # 临时表空间 -rw-r----- 1 mysql mysql 16777216 Mar 26 14:25 undo_001 # undo表空间 -rw-r----- 1 mysql mysql 16777216 Mar 26 14:27 undo_002 -rw-r----- 1 mysql mysql 16777216 Mar 26 14:23 undo_003.ibu # 手动创建的undo表空间 -rw-r----- 1 mysql mysql 16777216 Mar 26 14:25 undo_004.ibu root@ubuntu:/data/mysql/dbt3_s1# ll total 2906492 drwxr-x--- 2 mysql mysql 4096 Mar 12 13:46 ./ drwxr-xr-x 10 mysql mysql 4096 Mar 26 14:25 ../ -rw-r----- 1 mysql mysql 41943040 Mar 12 13:42 customer.ibd #ibd中包含了索引和数据,从8.0开始,表结构定义文件存储在数据字典中 -rw-r----- 1 mysql mysql 2403336192 Mar 12 13:46 lineitem.ibd
系统表空间(ibdata1)存储数据和独立表空间存储就性能上而言没有区别,当需要删除表(drop table)时,独立的表空间存储可以直接删除文件,而ibdata1存储也只是把该部分表空间标记为可用,所以从速度上看很难说哪个更快;但是删除文件后ibdata1占用的空间不会释放;
分区表会产生独立的ibd文件;
独立的表空间,一个表对应一个ibd文件,给人的感觉更加直观;
单个ibd文件直接拷贝到新的数据库中无法直接恢复:
- 原因一:元数据信息还是在ibdata1中
- 原因二:部分索引文件存在于Change Buffer中,目前还是存放于ibdata1文件中
select * from information_schema.innodb_tablespaces\G -- 查看表空间的元数据信息
General表空间
新建一张表,并让该表的存储路径不是默认的/data/mysql,而是指定的存储位置/data1
前提条件
- 创建/data1目录
- 修改/data1目录的属主和属组为mysql
- 添加参数到my.cnf后重启MySQL
root@ubuntu:/data/mysql# mkdir /data1 root@ubuntu:/data/mysql# chown -R mysql.mysql /data1/ [mysqld] innodb_directories = '/data1' --添加到my.cnf配置中后重启
方法1
root@mysqldb 15:04: [gavin]> create table test_ger1 (a int) data directory='/data1';
Query OK, 0 rows affected (0.00 sec)
root@ubuntu:/data/mysql# ll /data1/gavin/ -- 因为我是在gavin数据库里面创建的test_ger1表,所以在/data1目录下自动生成gavin目录
total 120
drwxr-x--- 2 mysql mysql 4096 Mar 26 15:04 ./
drwxr-xr-x 3 mysql mysql 4096 Mar 26 14:58 ../
-rw-r----- 1 mysql mysql 114688 Mar 26 15:04 test_ger1.ibd -- 生成的表空间文件
标签:Mar,16,--,undo,InnoDB,UNDO,mysql,空间 From: https://www.cnblogs.com/gavin-zheng/p/18095640