場景:需要對現(xiàn)在數(shù)據(jù)庫的數(shù)據(jù)進行批量的進行is_del=1的操作黑忱,但是遇到一個問題,在執(zhí)行sql的時候發(fā)現(xiàn)sql不能在查詢特定表的時候再嵌套查詢來做update的操作,經(jīng)過討論,后續(xù)我們想到用臨時表的方案來解決這個問題榆浓。
開始進行數(shù)據(jù)測試,進行單用戶的update操作撕攒,一切都比較順利沒有任何問題陡鹃,操作的也是我們想操作的數(shù)據(jù),接下來進行批量的數(shù)據(jù)操作抖坪,sql語句運行一會出現(xiàn)如下錯誤:
ERROR 1114 (HY000): The table 'adv_date_tmp' is full
報錯為臨時表已滿萍鲸,原因是沒有調(diào)整mysql的默認(rèn)臨時表大小導(dǎo)致的報錯。
tmp_table_size
如果內(nèi)存內(nèi)的臨時表超過該值擦俐,MySQL自動將它轉(zhuǎn)換為硬盤上的MyISAM表脊阴。如果你執(zhí)行許多高級GROUP BY查詢并且有大量內(nèi)存,則可以增加tmp_table_size的值捌肴。
max_heap_table_size
該變量設(shè)置MEMORY (HEAP)表可以增長到的最大空間大小蹬叭。該變量用來計算MEMORY表的MAX_ROWS值。在已有的MEMORY表上設(shè)置該變量沒有效果状知,除非用CREATE TABLE或TRUNCATE TABLE等語句重新創(chuàng)建表。
默認(rèn)情況下的臨時表大小不能滿足特定場景的需求孽查,這個時候就需要將臨時表的大小進行動態(tài)的調(diào)整饥悴,一般我們推薦進行set session動態(tài)進行會話調(diào)整(可以不重啟服務(wù)器進行調(diào)整),不過也可以通過調(diào)整my.cnf的配置來進行永久的調(diào)整(需要重啟服務(wù)盲再,不推薦這種操作)西设。
查詢mysql的默認(rèn)配置臨時表的大小
mysql> show variables like'%tmp_table%';
+----------------+----------+
| Variable_name? | Value? ? |
+----------------+----------+
| max_tmp_tables | 32? ? ? |
| tmp_table_size | 16777216 |
+----------------+----------+
2 rows in set (0.31 sec)
mysql> show variables like '%max_heap%';
+---------------------+----------+
| Variable_name? ? ? | Value? ? |
+---------------------+----------+
| max_heap_table_size | 16777216 |
+---------------------+----------+
1 row in set (0.08 sec)
在線調(diào)整臨時表大小?
mysql> set session tmp_table_size=1024*1024*1024;
Query OK, 0 rows affected (0.16 sec)
mysql> set session max_heap_table_size=1024*1024*1024;
Query OK, 0 rows affected (0.29 sec)
mysql> set session max_tmp_tables=1024*1024*1024;
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> show variables like '%tmp_table%';
+----------------+------------+
| Variable_name? | Value? ? ? |
+----------------+------------+
| max_tmp_tables | 1073741824 |
| tmp_table_size | 1073741824 |
+----------------+------------+
2 rows in set (0.06 sec)
mysql> show variables like '%max_heap%';
+---------------------+------------+
| Variable_name? ? ? | Value? ? ? |
+---------------------+------------+
| max_heap_table_size | 1073741824 |
+---------------------+------------+
1 row in set (0.21 sec)