1. 程式人生 > >mysql表空間管理

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;