1、查看表空间状态
mysql> SELECT CONCAT(ROUND(SUM(data_length)/(1024*1024), 2), ' MB') AS 'Total Data Size' FROM information_schema.TABLES;
mysql> SELECT CONCAT(ROUND(SUM(data_length)/(1024*1024*1024), 2), ' GB') AS 'Total Data Size' FROM information_schema.TABLES; ----单位是GB
分别查看每个数据库表空间大小:
mysql> SELECT CONCAT(ROUND(SUM(data_length)/(1024*1024), 2), ' MB') AS 'Total Data Size' FROM information_schema.TABLES WHERE table_schema LIKE 'sys'; ----查看sys数据库大小单位是MB
2、查看数据库中所有表信息:
SELECT CONCAT(table_schema,'.',table_name) AS 'Table Name',
CONCAT(ROUND(table_rows/1000000,2),'M') AS 'Number of Rows',
CONCAT(ROUND(data_length/(1024*1024*1024),2),'G') AS 'Data Size',
CONCAT(ROUND(index_length/(1024*1024*1024),2),'G') AS 'Index Size' ,
CONCAT(ROUND((data_length+index_length)/(1024*1024*1024),2),'G')
AS'Total'FROM information_schema.TABLES
WHERE table_schema LIKE 'sys';
3、共享表空间和独立表空间
共享表空间:某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下。 默认的文件名为:ibdata1(此文件,可以扩展成多个)。注意,在这种方式下,运维超级不方便。你看,所有数据都在一个文件里,要对单表维护,十分不方便。另外,你在做delete操作的时候,文件内会留下很多间隙,ibdata1文件不会自动收缩。换句话说,使用共享表空间来存储数据,会遭遇drop table之后,空间无法释放的问题。
独立表空间:每一个表都以独立方式来部署,每个表都有一个.frm表描述文件,还有一个.ibd文件。
.frm文件:保存了每个表的元数据,包括表结构的定义等,该文件与数据库引擎无关。
.ibd文件:保存了每个表的数据和索引的文件。
注意,在这种方式下,每个表都有自已独立的表空间,这样运维起来方便,可以实现单表在不同数据库之间的移动。另外,在执行drop table操作的时候,是可以自动回收表空间。在执行delete操作后,可以通过执行alter table TableName engine=innodb语句来整理碎片,回收部分表空间。
4、判断数据库表空间是共享表空间还是独立表空间:show variables like '%per_table%';
mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)mysql>
如果innodb_file_per_table的value值为OFF,代表采用的是共享表空间。
如果innodb_file_per_table的value值为ON ,代表采用的是独立表空间。
5、增减新的默认表空间文件
查看当前/etc/my.cnf配置文件中表空间:
innodb_data_file_path = ibdata1:10M:autoextend
修改该参数为:
innodb_data_file_path = ibdata1:10M:autoextend;ibdata2:10M:autoextend ---- 默认表空间文件,就是在安装数据库后,自动生成的
启动时报错:[ERROR] InnoDB: syntax error in file path or size specified is less than 1 megabyte
修改配置为:
innodb_data_file_path = ibdata1:10M;ibdata2:10M:autoextend ----- 后面的文件不管怎么加都不行,需要将第一个文件的autoextend属性去掉,否则就报错
再次启动数据库,也依然报错:[ERROR] InnoDB: The innodb_system data file './ibdata1' is of a different size 768 pages ----错误提示:ibdata1数据文件size设置大小和系统不匹配!!
查看表空间数据文件的大小:
[root@mysql57 data]# ls -lh
total 1.5G
-rw-r-----. 1 mysql mysql 56 Aug 31 13:50 auto.cnf
-rw-r-----. 1 mysql mysql 336 Aug 31 15:38 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12M Aug 31 15:38 ibdata1 -----实际大小为12M
重新修改配置文件配置参数:
innodb_data_file_path = ibdata1:12M;ibdata2:10M:autoextend
再次启动数据库,正常了
---对于已有的表空间数据文件的size,必须按照系统查看的size设置,否则报错!(亦可以将表空间建立在不同的目录下如:/data/ibdata3:10M,首先需建立/data目录)
查看数据库表空间:
mysql> show variables like '%innodb_data_file_path%';
+-----------------------+------------------------------------+
| Variable_name | Value |
+-----------------------+------------------------------------+
| innodb_data_file_path | ibdata1:12M;ibdata2:10M:autoextend |
+-----------------------+------------------------------------+
1 row in set (0.01 sec)mysql>
create tablespace tbs1 add datafile 'tbs01.ibd' engine=innodb;
create tablespace test01 add datafile 'ibdata2' engine=innodb;
6、建表语句:
A、create table classroom(id int(20) auto_increment primary key, name varchar(20) not null, cgirlnum int(16) not null, cboynum int(16) not null );
B、create table students(id int(20) auto_increment primary key, name varchar(20) not null, sex varchar(8), classroomid int(20) not null, foreign key(classroomid) references classroom(id));
7、数据插入
mysql> insert into classroom values("C++",2,10,20);
mysql> insert into classroom(name,cboynum,cgirlnum) select name,cboynum,cgirlnum from classroom;
mysql> insert into students values(12,"张三","我叫张三","女",20,"zhangs@163.com","石家庄","1597220988",3);
mysql> insert into students(name,content,sex,age,email,address,phone,classroomid) select name,content,sex,age,email,address,phone,classroomid from students;
8、创建数据库
mysql> create database xxx default charset=utf8;