mysql 表空間管理


https://www.runoob.com/mysql/mysql-administration.html

表空間:

MySQL沒有真正意義上的表空間管理。

MySQL的Innodb包含兩種表空間文件模式,默認的共享表空間和每個表分離的獨立表空間。

一般來說,當數據量很小的時候建議使用共享表空間的管理方式。數據量很大的時候建議使用獨立表空間的管理方式。

查看表空間模式:

mysql> show variables like '%innodb_file_per_table%' ;

| innodb_file_per_table | ON    |

表示當前是獨立表空間。

若為OFF,則表示為共享表空間。

同樣:1表示ON、0表示OFF

 

查看表空間信息:

select *

  from information_schema.global_variables

 where variable_name in ("datadir",

             "innodb_data_file_path",

             "innodb_data_home_dir",

             "innodb_file_per_table",

             "innodb_open_files");

datadir表示數據文件的基本路徑。

innodb_data_file_path表示共享文件的名稱。

innodb_file_per_table表示表空間的類型。

innodb_open_files最多可打開的文件個數。

 

innodb_data_file_path文件格式:

file_name:file_size:auto_extend:max_size

file_name表示數據文件名稱、file_size表示數據文件大小、auto_extend表示自動擴展、max_size表示最大大小。

innodb_data_file_path=ibdata1:10M:autoextend:max:500M

ibdata1初始大小為10M、自動擴展且最大為500M。

多個標示符之間使用分號隔開,另外,只有最后一個文件能夠使用autoextend屬性。

 

 

 

共享表空間: 

Innodb的所有數據保存在一個單獨的表空間里面,而這個表空間可以由很多個文件組成,一個表可以跨多個文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中可以看到,其表空間的最大限制為64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,當然這個大小是包括這個表的所有索引等其他相關數據。

 

共享表空間的優點:

表空間可以分成多個文件存放到各個磁盤,所以表也就可以分成多個文件存放在磁盤上,表的大小不受磁盤大小的限制。

數據和文件放在一起方便管理。

 

共享表空間的缺點:

1、所有的數據和索引存放到一個文件,雖然可以把一個大文件分成多個小文件,但是多個表及索引在表空間中混合存儲,當數據量非常大的時候,表做了大量刪除操作后表空間中將會有大量的空隙,特別是對於統計分析,對於經常刪除操作的這類應用最不適合用共享表空間。

2、共享表空間分配后不能回縮:當出現臨時建索引或是創建一個臨時表的操作表空間擴大后,就是刪除相關的表也沒辦法回縮那部分空間了,進行數據庫的冷備很慢;

 

設置數據文件:

有兩種方式設置數據文件,一種是所有的數據文件均在一個目錄下,稱為同目錄數據文件。另一種是所有的數據文件在不同的目錄下,稱為異目錄數據文件。

同目錄數據文件、異目錄數據文件。

共享表空間數據存儲規則:

表結構定義文件:$datadir/$dbname/$tabname.frm

數據文件:共享表空間。

設置同目錄數據文件:

[mysqld] 

innodb_file_per_table=0

innodb_data_home_dir=/msdata/datas

innodb_data_file_path=ibdata1:50M;ibdata2:20M;ibdata3:50M:autoextend

通過innodb_data_home_dir設置一個共同的數據文件目錄。

 

設置異目錄數據文件:

[mysqld] 

innodb_file_per_table=0

innodb_data_home_dir=

innodb_data_file_path=/msdata/datas/ibdata1:76M;/msdata/datas/ibdata2:10M;/msdata/datas/ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

注意,“innodb_data_home_dir=”參數必須存在。同時,autoextend屬性只能用於最后一個文件。

也可以使用相對目錄,如:

[mysqld] 

innodb_file_per_table=0

innodb_data_home_dir=

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

好此,innodb_data_home_dir為空值,則默認取值為:datadir參數的目錄。

 

 

獨立表空間:

獨立表空間是每個表都有獨立的多個數據文件,而且做到了索引和數據的分離

 

獨立表空間的優點:

每個表都有自已獨立的表空間,每個表的數據和索引都會存在自已的表空間中,可以實現單表在不同的數據庫中移動。

空間可以回收(除drop table操作處,表空不能自已回收),Drop table操作自動回收表空間,如果對於統計分析或是日值表,刪除大量數據后可以通過:alter table TableName engine=innodb;回縮不用的空間。

對於使用獨立表空間的表,不管怎么刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。

 

獨立表空間的缺點:

1、當數據庫中的表數量達到一定級別時,每次操作所涉及的文件過多,如果按照默認Centos的ulimit -n = 1024的話,僅僅只能保證同時打開256個表以內,這在習慣上“拆庫拆表”的MySQL數據結構上很難達到要求。

2、另外這種數據文件的利用率不算很高,當大量“不高”的文件集中起來,浪費的空間也很驚人,更何況最后可能出現的狀況不是“一堆K級別的小文件”而是“一堆G級別的大文件”,有點適得其反的意思。

 

獨立表空間數據存儲規則:

表結構定義文件:$datadir/$dbname/$tabname.frm

數據文件:$datadir/$dbname/$tabname.ibd

獨立表空間空間爆滿的問題:

當獨立表空間的所處空間爆滿的時候,只能采用數據遷移的方式,將表空間移走。

具體辦法是,將獨立表空間更改為共享表空間。

舊配置為:

[mysqld]

innodb_file_per_table=1

新配置為:

[mysqld]

innodb_file_per_table=0

innodb_data_home_dir=

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

重啟數據庫以后:

對於已經存在的表,數據仍然會存儲在原來的獨立表空間相關文件中。

對於新增加的表,數據則會存在於新增加共享表空間中。

舊表數據可以通過遷移的方式插入到新表中去。

獨立表空間轉共享表空間:

舊配置為:

[mysqld]

innodb_file_per_table=1

新配置為:

[mysqld]

innodb_file_per_table=0

innodb_data_home_dir=

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

轉換后,重啟數據庫。

對於已經存在的表,數據仍然會存儲在原來的獨立表空間相關文件中。

對於新增加的表,數據則會存在於新增加共享表空間中。

共享表空間轉獨立表空間:

舊配置:

innodb_file_per_table=0

innodb_data_home_dir=

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

新配置:

innodb_file_per_table=1

innodb_data_home_dir=

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M;/msdata/datas01/ibdata4:10M:autoextend

轉換后,重啟數據庫。

對於已經存在的表,數據仍然會存儲在原來的共享表空間相關文件中。

對於新增加的表,數據則會存在於獨立表空間中。

轉換已存在共享表為獨立表:

如果tshare1表之前為共享表,在更改數據模式為獨立表之間,可使用命令將該表轉換為獨立表,具體的命令為:

mysql> alter table tshare1 engine=innodb;

但對於獨立轉共享模式,上式方法將失效。

 


 

同目錄下添加數據文件:

[mysql@jmdev2 datas]$ ls -ltr

drwxrwxr-x 2 mysql root     4096 2015-10-31 performance_schema

 

 

...

-rwxrwxr-x 1 mysql root 79691776 07-26 14:05 ibdata1

-rw-r----- 1 mysql root    26533 07-26 14:09 jmdev2.err

能夠看到,當前ibdata1文件已經有76M,此時重新設置my.cnf參數文件

[mysqld]

innodb_data_home_dir=/msdata/datas

innodb_data_file_path=ibdata1:50M;ibdata2:20M;ibdata3:50M:autoextend

啟動數據庫,會報錯:

 

2016-07-26 14:09:28 1079 [ERROR] InnoDB: Data file /msdata/datas/ibdata1 is of a different size 4864 pages (rounded down to MB) than specified in the .cnf file 3200 pages!

2016-07-26 14:09:28 1079 [ERROR] InnoDB: Could not open or create the system tablespace. If you tried to add new data files to the system tablespace, and it failed here, you should now edit innodb_data_file_path in my.cnf back to what it was, and remove the new ibdata files InnoDB created in this failed attempt. InnoDB only wrote those files full of zeros, but did not yet use them in any way. But be careful: do not remove old data files which contain your precious data!

由於默認每個page大小為16K,它表示創建該表空間時失敗,理由是新建的3200頁比已經存在的4864頁要小。

[mysqld]

innodb_data_home_dir=/msdata/datas

innodb_data_file_path=ibdata1:76M;ibdata2:10M;ibdata3:10M:autoextend

啟動數據庫,數據庫已經自動在/msdata/datas目錄下創建ibdata2、ibdata3兩個文件。

 

 


 

釋放表空間:

MySQL的表空間在刪除數據以后,並不會自動收縮表空間,需要進行相關的操作。

刪除共享空間表:

刪除前大小:

-rw-rw---- 1 mysql root  9437184 07-26 17:32 tshare1.ibd

刪除表數據:

mysql> truncate table tshare1;

刪除后大小:

-rw-rw---- 1 mysql root    98304 07-26 17:47 tshare1.ibd

可以看到,空間已經釋放很多。

剩余空間,如果想刪除,則只能使用重建(recreate + analyze)的方式進行。

刪除獨立空間表:

刪除前大小:

-rw-rw---- 1 mysql root 41943040 07-26 17:10 t1.ibd

刪除表數據:

mysql> truncate table t1;

刪除后大小:

-rw-rw---- 1 mysql root    98304 07-26 17:53 t1.ibd

可以看到,空間已經釋放很多。

剩余空間,如果想刪除,則只能使用重建(recreate + analyze)的方式進行。

關於optimize操作:

該操作可以使表空間得到充分釋放,但該表在操作過程中需要對表添加鎖,因為需要在業務壓力不大的時候操作。

[mysqld]

skip-new

然后重啟數據庫。

mysql> optimize table t1;

如果沒有“skip-new”選項,就會報錯:Table does not support optimize, doing recreate + analyze instead


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM