mysql 記憶體表The table 'pvlogs' is full問題處理

賀子_DBA時代發表於2016-11-09
   今天收到報錯:[ERROR] mysqld: The table 'pvlogs' is full,資料無法寫入,影響業務,看到這個錯,我首先想到是不是空間滿了,檢視之後發現是正常的,透過查詢和詢問同事才知道,原來這個記憶體引擎的表。
首先理解下記憶體引擎的概念:
MEMORY儲存引擎:
(1)memory儲存引擎相比前面的一些儲存引擎,有點不一樣,其使用儲存在記憶體中的資料來建立表,而且所有的資料也都儲存在記憶體中。
(2)每個基於memory儲存引擎的表實際對應一個磁碟檔案,該檔案的檔名和表名是相同的,型別為.frm。該檔案只儲存表的結構,而其資料檔案,都是儲存在記憶體中,這樣有利於對資料的快速處理,提高整個表的處理能力
(3)memory儲存引擎預設使用雜湊(HASH)索引,其速度比使用B-+Tree型要快,如果讀者希望使用B樹型,則在建立的時候可以引用。
(4)memory儲存引擎檔案資料都儲存在記憶體中,如果mysqld程式發生異常,重啟或關閉機器這些資料都會消失。所以memory儲存引擎中的表的生命週期很短,一般只使用一次。
解決辦法:
方法一:
檢視記憶體表大小相關引數
MariaDB [log]> show VARIABLES like '%max_heap_table_size%';
+---------------------+-----------+
| Variable_name       | Value     |
+---------------------+-----------+
| max_heap_table_size | 671088640 |
+---------------------+-----------+
1 row in set (0.00 sec)
檢視臨時表大小控制引數
MariaDB [log]> show VARIABLES like '%tmp_table_size%';
+----------------+----------+
| Variable_name  | Value    |
+----------------+----------+
| tmp_table_size | 67108864 |
+----------------+----------+
1 row in set (0.01 sec)
1). 設定新的引數,這樣設定的引數重啟就失效了,
mysql> set global max_heap_table_size=1048576000
mysql> set global tmp_table_size=1048576000
2)之後在mysql配置檔案my.cnf裡面新增下面兩行,使得永久生效。
tmp_table_size = 671088640
max_heap_table_size = 671088640
3)然後客戶端重新連線資料庫就可以了,如果再不可以的話,那就重新建立相關的記憶體表。

關於max_heap_table_size和tmp_table_size的解釋:
tmp_table_size :它規定了內部記憶體臨時表的最大值,每個執行緒都要分配。(實際起限制作用的是tmp_table_size和max_heap_table_size的最小值。)如果記憶體臨時表超出了限制,MySQL就會自動地把它轉化為基於磁碟的MyISAM表,儲存在指定的tmpdir目錄下,預設:
mysql> show variables like "tmpdir";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir        | /tmp/ |
+---------------+-------+
max_heap_table_size:這個變數定義了使用者可以建立的記憶體表(memory table)的大小.這個值用來計算記憶體表的最大行數值。這個變數支援動態改變,即set global max_heap_table_size=#
,但是對於已經存在的記憶體表就沒有什麼用了,除非這個表被重新建立(create table)或者修改(alter table)或者truncate table。服務重啟也會設定已經存在的記憶體表為全域性max_heap_table_size的值
這個變數和tmp_table_size一起限制了內部記憶體表的大小。
方法二:
執行ALTER TABLE tbl_name MAX_ROWS=1000000000;

總結:關於mysql的memory儲存引擎的表報錯:The table 'pvlogs' is full的問題解決,直接ALTER TABLE tbl_name MAX_ROWS=1000000000立馬生效,然後你再修改max_heap_table_size和tmp_table_size這兩個引數,並把這個引數寫進配置檔案,這樣重啟mysql之後依舊生效,一定注意設定這兩個引數之後,對已經存在的記憶體表是不生效的,需要重新建立(create table)或者修改(alter table)或者truncate table

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2128189/,如需轉載,請註明出處,否則將追究法律責任。

相關文章