mysql如何收縮表空間

2022-05-07 09:12:15 字數 1479 閱讀 4979

引數 innodb_file_per_table   

mysql5.6.6版本以後,預設設定為on,表示innodb表資料儲存在乙個以.ibd為字尾的檔案中  

不建議設定為off,原因是  設定為off後,會將表資料儲存在系統共享表空間中,即使drop掉表,空間也不會被**【磁碟空間不會減少,只會無腦增加】

資料刪除、修改:

innodb資料都是用b+樹結構

當r4的資料刪除以後,mysql會在r4這個位置記錄乙個標記為刪除,當插入300~600之間的資料值,r4這個位置會被復用

當page a 整個資料頁被刪除後,整個頁就會被標記為可復用 

但是資料頁的復用和記錄的復用是不一樣的:

記錄的復用只限於: 只限於符合範圍條件的資料

資料頁的復用:當乙個資料頁寫滿後,需要使用新的資料頁,就可以被復用;如果相鄰的兩個資料頁利用率都很小,系統就會把這兩個頁上的資料合到其中乙個頁上,另外乙個資料頁就被標記為可復用。

delete 命令其實只是把記錄的位置,或者資料頁標記為了「可復用」,但磁碟檔案的大小是不會變的。所以,單靠delete 命令是不能**表空間的

update可以理解為:刪除乙個舊的值,再插入乙個新值

總結:經過大量的增刪改,資料頁上都是可能會存在空洞。

收縮表空間的方法:

重建表   建議使用命令:alter table a engine=innodb

mysql5.6版本之後引入了online ddl,重建表流程如下:

1.建立乙個臨時檔案,掃瞄表 a 主鍵的所有資料頁;

2.用資料頁中表 a 的記錄生成 b+ 樹,儲存到臨時檔案中;

3.生成臨時檔案的過程中,將所有對 a 的操作記錄在乙個日誌檔案(row log)中        #mysql5.6之前還沒有引入onine ddl機制,不會生成row log日誌

4.臨時檔案生成後,將日誌檔案中的操作應用到臨時檔案,得到乙個邏輯資料上與表 a 相同的資料檔案

5.用臨時檔案替換表 a 的資料檔案。

重建方法都會掃瞄原表資料和構建臨時檔案。對於很大的表來說,這個操作是很消耗 io 和 cpu 資源的。推薦使用 github 開源的 gh-ost 。

optimize table、analyze table 和 alter table 這三種方式重建表的區別

從 mysql 5.6 版本開始,alter table t engine = innodb(也就是 recreate,上邊的流程)

analyze table t 其實不是重建表,只是對錶的索引資訊做重新統計,沒有修改資料,這個過程中加了 mdl 讀鎖;

optimize table t 等於 recreate+analyze。

mysql收縮空間 Oracle表空間收縮方案

對於表空間收縮,oracle只提供擴大的功能,而不提供收縮。所以,要實現這樣的要求,就只能先建立乙個中間表空間,然後將待收縮表 應用背景 某些情況下,由於前期設計上沒有考慮全面,導致表空間預建太大,遠遠超出實際使用大小。於是,就出現了收縮表空間這樣的需求,即將這個表空間的占用空間進行收縮。處理方案 ...

mysql 表空間收縮 mysql壓縮表空間

repair table table name 修復表 optimize table table name 優化表 optimize local no write to binlog table tbl name tbl name 如果您已經刪除了表的一大部分,或者如果您已經對含有可變長度行的表 含...

收縮表空間大小

使用者所關聯的表都刪除了,但是表空間不能自己釋放。找到了下面一條sql語句,它的作用是查詢 拼接 出縮小表空間檔案 datafile 的語句,預設是計算所有的表空間檔案,給出可以釋放的大小。根據它給出的結果,執行類似 alter database datafile e oracle nnc data...