Innodb存储引擎-表空间介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Innodb存储引擎-表空间介绍相关的知识,希望对你有一定的参考价值。

5.5版本以后出现共享表空间概念
表空间的管理模式的出现是为了数据库的存储更容易扩展
5.6版本中默认的是独立表空间

1.共享表空间(ibdata1)

1.存储的内容

1.系统数据
2.undo			redo、undo日志,事务日志
3.临时表

2.概念

1.优点:
	可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同的文件上)。数据和文件放在一起方便管理。

2.缺点:
	所有的数据和索引存放到一个文件中,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。

3.配置共享表空间

[root@db03 data]# vim /etc/my.cnf
[mysqld]
innodb_data_file_path=ibdata1:76M;tmp/ibdata2:50M:autoextend

4.查看共享表空间

mysql> show variables like ‘%path%‘;
+----------------------------------+----------------------------------------+
| Variable_name                    | Value                                  |
+----------------------------------+----------------------------------------+
| innodb_data_file_path            | ibdata1:76M;tmp/ibdata2:50M:autoextend |

2.独立表空间

1.概念

对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理

1.优点:
	1)每个表都有自己独立的表空间
	2)数据分开存储
2.缺点:
	1)单表空间不能过大,不能大于100G

2.查看独立表空间

#物理查看
[root@db01 ~]# ll /application/mysql/data/world/
-rw-rw---- 1 mysql mysql 688128 Aug 14 16:23 city.ibd

#命令行查看是否开启独立表空间
mysql> show variables like ‘%per_table%‘;
innodb_file_per_table=ON

3.案例

1.模拟断电表损坏

#1.将db03上的数据库数据目录下的 world传到一台新数据库的数据目录下
[root@db03 data]# scp -r world 172.16.1.52:/usr/local/mysql/data/

#2.到db02上授权目录
[root@db02 data]# chown -R mysql.mysql world/

#3.登录数据库查看,数据已损坏
mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
11 rows in set (0.00 sec)

mysql> select * from city;
ERROR 1146 (42S02): Table ‘world.city‘ doesn‘t exist

2.修复数据库表

#1.找到建表语句,创建一个新表
CREATE TABLE `city_new` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT ‘‘,
  `CountryCode` char(3) NOT NULL DEFAULT ‘‘,
  `District` char(20) NOT NULL DEFAULT ‘‘,
  `Population` int(11) NOT NULL DEFAULT ‘0‘,
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  KEY `inx_name` (`Name`),
  KEY `index_popu` (`Population`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1;

#2.移除新表的表空间
mysql> alter table city_new discard tablespace;
Query OK, 0 rows affected (0.09 sec)

#3.损坏表空间的数据文件复制给新表
[root@db02 world]# cp city.ibd city_new.ibd
[root@db02 world]# chown -R mysql.mysql city_new.ibd

#4.新表读取表空间
mysql> alter table city_new import tablespace;
Query OK, 0 rows affected, 1 warning (0.22 sec)

#5.运维修改数据库名
#删除表空间
mysql> drop table city;
ERROR 1051 (42S02): Unknown table ‘world.city‘
#物理删除表数据
[root@db02 world]# rm city.ibd 
rm: remove regular file ‘city.ibd’? y
#数据库改名
mysql> alter table city_new rename city;
Query OK, 0 rows affected (0.11 sec)

以上是关于Innodb存储引擎-表空间介绍的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL存储引擎InnoDB(三十五):临时表空间

Innodb存储引擎表空间详解

《MySQL系列-InnoDB引擎25》表-InnoDB逻辑存储结构

InnoDB存储引擎的表空间文件,重做日志文件

《MySQL系列-InnoDB引擎23》文件-InnoDB存储引擎文件-重做日志文件

MySQL innodb引擎深入讲解