mysql表空間管理
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設定大小和系統不匹配!!
查看錶空間資料檔案的大小:
[[email protected] 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,"[email protected]","石家莊","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;