表空间是一种逻辑结构,它位于表和数据文件之间
1. System Tablespace
SYSTEM表空间包含的内容: InnoDB数据字典,Change Buffer,DoublewriteBuffer, Undo Log,如果用户在该表空间中创建表和索引,那么数据也位于表空间中,表空间对应一个或多个数据文件,位于datadir中,默认情况下,其中一个文件为ibdata1
参数选项一: innodb_data_home_dir
指定表空间存放位置,默认值为空,默认建立在数据库初始化目录。 自定义表空间可以在[mysqld]下设置:innodb_data_home_dir = /your_path (=号两边需要有空格) 也可以指定绝对路径innodb_data_file_path innodb_data_file_path=/path/ibdata1:12M;ibdata2:/path/ibdata2:50M:autoextend[:max:maxfilesize] 自动扩展autoextend默认每次自动扩展64M, 想指定其扩展大小参数为innodb_autoextend_increment=128;
参数选项二:innodb_data_file_path
控制表空间大小及文件个数。其默认值为 ibdata1:12M:autoextend 根据innodb_page_size按最大值指定的,为了确保其空间可以容纳doublewrite buffer pages, innodb_page_size为16K时(默认值) innodb_data_file_path最小值为3M innodb_page_size为32K时 innodb_data_file_path最小值为6M innodb_page_size为64K时 innodb_data_file_path最小值为12M* 当表空间文件空间满了之后,可以自动拓展或者指定新文件空间
方法一:最后一个数据文件(仅当最后一个)可以自动扩展,即innodb_data_file_path 设置 /ibdata/ibdata1:12M;/disk2/ibdata2:50M:autoextend:max:500M,动态变量innodb_autoextend_increment用于指定表空间扩展的基本单位,默认为64MB。
方法二:新建文件空间创建表空间
停止mysql客户端,vim打开并修改my.cnf的innodb_data_file_path参数,在:autoextend[:max:maxfilesize]前面添加新的文件系统的绝对路径,注意路径的读写权限,同时统计文件大小,旧数据文件50M修改为实际大小,大小为1M的整数倍,如统计大小不足100M,就写100M即可,写上新的文件系统的绝对路径,后面添加:autoextend[:max:maxfilesize],注意新建路径及相应权限
[mysqld] innodb_data_home_dir = innodb_data_file_path=/path of your old file/ibdata1:100M;/path of your new data file/ibdata2:50M:autoextend[:max:maxfilesize],最后重启mysql
2. File-Per-Table Tablespace
默认为MySQL初始化路径下对应数据库名称文件夹下,在这种表空间中,表、表空间、数据文件之间存在意义对应关系,每个表空间对应一个.ibd文件,位于datadir目录下,与数据库名称相同的子目录中。如果不能使用这种表空间,表将位于SYSTEM表空间中。每个表对应一个表空间,每个表空间对应一个.ibd文件,表及索引中的数据存在这个.ibd文件中,当删除表或者truncate时,表所占用的空间将释放,可以把特定的放在特定的设备上,便于I/O优化,空间管理,备份等,方便的移动单个表,表可以方便地在不同服务器之间迁移。
参数选项一:
innodb_file_per_table 是否开启单表表空间,可动动态修改,默认为ON,如果设置为OFF,在没有显式指定表空间情况下,数据及索引默认存放到系统表空间ibdata下
表空间的使用:
动态变量innodb_file_per_table用于enable/disable这种表空间。例如: mysql>SET GLOBAL innodb_file_per_table=1; mysq> create table … 如果这种表空间被disable,用户创建的表默认位于SYSTEM表空间
将表从SYSTEM表空间移动到File-Per-Table表空间: mysql>SET GLOBAL innodb_file_per_table=1; mysql>ALTER TABLE table_nameENGINE=InnoDB
把表从File-Per-Table表空间移动到SYSTEM表空间: mysql>alter table t1 tablespace innodb_system;
在datadir之外创建File-Per-Table表空间: mysql> create table t2(id int)engine=innodb data directory='/mysql'; 或 mysql> create table t3(id int) tablespace=innodb_file_per_table data directory='/mysql';
以上确保操作系统用户mysql对目录具有读写权限
3.General Tablespace
存放用户创建的表数据及索引的共享表空间,即多表数据存放在同一表空间内是一种共享的表空间,不同数据库中的各个表,都可以位于这种表空间中,数据文件可以位于datadir之外,位于手工创建路径下。
表空间的创建:
create tablespace ts12 add datafile 'ts12.ibd' file_block_size=16K engine=innodb; 文件的扩展名必须是.ibd。文件默认位于datadir目录,需要指定engine=innodb,否则需要设置变量; mysql> set global default_storage_engine=innodb;
4. redo log文件
存放Innodb存储引擎的事务日志,在数据库进行数据恢复时保证数据完整性,默认2个,各48MB,位于datadir目录下
参数选项,编辑my.cnf文件:
innodb_log_group_home_dir 指定文件所在路径,相对或绝对。如果不指定,则为datadir路径
innodb_log_files_in_group 指定文件的数量,默认为2
innodb_log_file_size 指定每个文件的大小
如果希望修改redolog文件的存储路径、数量或者大小,修改上述变量的值,重新启动mysqld,文件便会在指定的目录下产生
5. undo log Tablespace
用来存放Innodb存储引擎的事务日志,与系统表空间存放于同一文件中数据库默认路径下ibdata1中。与事务有关的UNDO段位于SYSTEM空间中,可以单独创建一个UNDO表空间,将UNDO段放在UNDO表空间中,对于已经存在的数据库服务器来说,UNDO的管理方式不可改变。
参数选项,在对数据库服务器进行初始化时,指定以下变量:
–innodb_undo_directory:指定undo表空间的存储路径,该参数只能在mysql初始化时指定
–innodb_undo_log_truncate:支持动态修改,默认值OFF,使用innodb_undo_log_truncate时,至少需要保证 innodb_undo_tablespaces参数为2,保证truncate其中之一时,另一个可以继续工作。
–innodb_undo_tablespaces:指定UNDO表空间的数量,全局参数不支持动态修改,最大值95,默认值0
–innodb_max_undo_log_size:支持动态修改,默认值1G,配合innodb_undo_log_truncate参数使用,在undolog文件达到该限值时,会标记为截断,不会分配给其他事务,允许当前事务完成其操作后,回滚段不再被使用时,mysql将执行truncate,将文件大小恢复到初始化的大小(10MiB)
6. Temporary Tablespace
•由临时表组成,用于存储临时数据,对应文件ibtmp1,位于datadir目录中,当数据服务器正常关闭时,该表空间被删除,下次重新产生
相关参数
•变量innodb_data_home_dir用于指定数据文件所在路径,如果为空,则表示datadir目录
•变量innodb_temp_data_file_path表示数据文件的名称,大小,是否自动扩展。相对路径或绝对历经。如:
innodb_temp_data_file_path=ibtmp1:12M:autoextend
# 使用示例
ile-per-table表空间的创建:
1、设置变量innodb_file_per_table=1 或者on
create table t10(...);
2、 create table t2(id integer) tablespace innodb_file_per_table;
3、创建表,并且指定数据文件的存储路径:
create table t3(id integer) tablespace innodb_file_per_table data directory='/var/lib/mysql-files';
把表移动到system表空间中:
alter table t2 tablespace innodb_system;
把表从SYSTEM表空间移出,转变为file_per_table:
alter table t2 tablespace innodb_file_per_table;
general表空间的用法:
创建: create tablespace ts1 add datafile 'ts1.ibd' engine=innodb;
在表空间上创建表:
create table t4(id integer) tablespace ts1;