系统表空间的文件存储在 数据文件 data_dir 参数的目录下。
其中包含的内容有 4个: the doublewrite buffer,the change buffer, and undo logs. 还有其最原始的功能InnoDB data dictionary (innodb的字典数据)
如果MySQL不启动 file_per_table 参数的话,其中还会存储用户的表和索引。
系统表空间可以拥有1个或者多个数据文件,默认是1个。名字为 ibdata1.
系统表空间的大小和数量是由参数 innodb_data_file_path 参数决定的,并且这个参数只能在初始化的时候决定,初始化完了之后,不可修改。【更多信息可以看 14.8.1章节】
附加信息:
1 收缩系统表空间 (原文resize)
2 使用裸设备存放系统表空间
增大表空间:
最容易的方式就是 通过设置 参数 innodb_data_file_path 加上autoextend 属性。比如:
innodb_data_file_path=ibdata1:10M:autoextend
然后重启MySQL即可。
其中 10M 表时将ibdata1一开始就是10M, 并且自动扩展,每次扩展的大小默认为8MB, 其中 innodb_autoextend_increment 参数可以控制每次增长的数据大小
还可以通过加文件的方式扩大表空间:
1 停库
2 如果参数 innodb_data_file_path 最后加了 autoextend ,去掉, 并且参数和设置的数据大不能比现在的 ibdata1的大小要小,单位是MB, 换算是1024X1024.
比如 msyql 使用了一段时间,现在是 488M的大小, 则该设置参数为 innodb_data_file_path= ibdata1:488M; ibdata2:50M: autoextend ,这样就加了1个文件,新文件默认10m大,
还可以改变存放路径 ,比如这样设置 innodb_data_file_path= ibdata1:490M; /newdata/ibdata2:10M: autoextend
注意添加文件的时候,文件名不要重复了。
缩小表空间:
不通直接通过删除文件的方式缩小表空间。
1 备份所有的表数据,包括 mysql 系统库内的 innodb存储引擎的表数据。可以通过如下句子查询:
SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mysql' and ENGINE='InnoDB';
2 停库
3 删除所有文件。
删除所有数据库文件*.ibd ,包括ibdata 和 ib_log。 不要忘了 mysql 系统库的 *.ibd 文件也要删除
4 删除所有 .frm 文件
5 配置好参数 innodb_autoextend_increment ,比如使用默认的。innodb_data_file_path=ibdata1:10M:autoextend
6 启动MySQL
7 恢复刚才备份的数据
【为什么只删除ibd呢, 因为 innodb 存储引擎使用 undo , undo 是innodb引擎独有的, 而 undo存放在 ibdata中,且往往是ibdata暴涨的元凶。
myisam之类的表 是用不到undo的,索引也不太可能会使ibdata暴涨。
】
避免使ibdata 暴涨, 最好使用开启参数 file-per-table ,因为不仅可以将这些表的数据从 ibdata 独立出来,而且不同于ibdata,这些表是可以将空间还给操作体统的,
比如 表 truncate 和 drop 掉的时候。
用裸设备存放系统表空间
先声明,使用裸设备并不一定表示性能会比使用文件系统来得好,这个得自己去测试。
使用之前,先必须保证mysql用户对裸设备有读写的权限。
当创建一个新文件,使用裸设备的时候,参数的最后都必须跟着关键词newraw。 【MySQL参数的1mb指的是 1024X1024 bytes , 而裸设备的1M 指的是 1,000,000 bytes】
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw
MySQL初始化之后呢,关闭MySQL修改配置 ,将关键词 newraw 换成 raw,不然重启的时候会报错。
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw
在windows 下, 裸设备的表示方式与 linux不同,比如加了个罗分区,为D盘,但是没格式化(这时候就是裸设备),那配置如下:
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=//./D::10Gnewraw
初始化之后,记得将newraw的关键字换掉
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=//./D::10Graw