談談tmpdir與innodb_tmpdir的區別和用處

背景html

  innodb_tmpdir是在innodb online ddl中提到的一個參數;大體的意思是innodb在作online-ddl的時候會向臨時目錄寫入「臨時排序文件」mysql

  而這些文件的大小基本上就要與表的數據+索引的大小差很少。linux

 

  這裏的臨時目錄默認就是由「tmpdir」這個參數的值,在個人主機上用了/tmp/這個目錄sql

show global variables like 'tmpdir';                                                                          
+----------------+----------+
| Variable_name  | Value    |
+----------------+----------+
| tmpdir         | /tmp     |
+----------------+----------+

  一般來講linux上的tmp目錄不可能會特別大,常見的也就幾個G吧,可是innodb單個表中的「數據」+「索引」幾十個G的多了去了;若是是對數據庫

  這樣的表作online ddl 那麼臨時目錄是保存不下這麼大的數據量的,最終的結果就是online ddl失敗。spa

 

innodb_tmpdir設計

  若是有設置innodb_tmpdir的值、那麼在online ddl時innodb會以innodb_tmpdir的值爲準、也就是說事實上造成了一種innodb_tmpdir覆蓋code

  tmpdir的效果htm

  回過頭來、若是MySQL實例沒有設置innodb_tmpdir的值天然就是以tmpdir的值爲準啦。blog

 

設置innodb_tmpdir的注意事項

  一、設置innodb_tmpdir要求用戶有file權限

  二、innodb自己要求innodb_tmpdir的值不能與datadir的值相同

-- 把innodb_tmpdir設置爲datadir是行不通的
mysql> set @@global.innodb_tmpdir='/database/mysql/data/3306/';                                                    
ERROR 1231 (42000): Variable 'innodb_tmpdir' can't be set to the value of '/database/mysql/data/3306/'

 

innodb_tmpdir的最佳實踐

  一、設計時應該儘量的想到用數據分片來處理表、不要讓表太大(超過tmpdir目錄的大小)、雖然這條寫在最前面我本身並不怎麼care!

  二、推薦把數據(datadir)與數據庫備份文件保存在不一樣的物理磁盤上,一來能夠在備份的時候儘量的減少對oltp的影響,二來這種狀況

  下把tmpdir配置成備份盤的一個目錄是很是好的一個選擇。(咱們的數據庫主機上沒有第二塊盤呀!「窮」自己就是一個問題)

  三、實在沒有辦法就在執行online ddl前給innodb_tmpdir分配一個大點的目錄吧,好歹也能保證執行成功呀!

 

innodb online ddl的官方文檔

  官方文檔 : https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html

----

相關文章
相關標籤/搜索