阿里云數(shù)據(jù)庫MySQL臨時文件導(dǎo)致實例空間滿的解決辦法
MySQL實例可能會由于查詢語句的排序、分組、關(guān)聯(lián)表產(chǎn)生的臨時表文件,或者大事務(wù)未提交前產(chǎn)生的binlog cache文件,導(dǎo)致實例空間滿,為避免數(shù)據(jù)丟失,RDS會對實例進(jìn)行自動鎖定,磁盤鎖定之后,將無法進(jìn)行寫入操作。
背景信息
當(dāng)實例由于實例空間滿自動鎖定時,控制臺可以在 基本信息 > 運行狀態(tài)看到如下信息:
前提條件
?對于MySQL 5.6版本的實例,升級實例存儲空間后即可解鎖實例,關(guān)于如何升級實例配置,請參見變更配置,若實例存儲空間已到最大值,請?zhí)峤还温?lián)系客服臨時解鎖實例,再進(jìn)行后續(xù)操作。
?對于MySQL 5.5/5.7版本的實例,請?zhí)峤还温?lián)系客服臨時解鎖實例,再進(jìn)行后續(xù)操作。
實施步驟
注意事項
清理臨時文件有延遲,請耐心等待實例已使用空間的下降。
操作步驟
1.通過 DMS登錄數(shù)據(jù)庫。
2.選擇SQL操作 > SQL窗口,執(zhí)行如下命令查看數(shù)據(jù)庫的會話。
show processlist
3.單擊顯示結(jié)果中的State進(jìn)行狀態(tài)排序,在狀態(tài)欄查看是否有大量 Copy to tmp table 、Sending data等信息,再根據(jù)Info列的語句確定是哪個SQL語句在建立臨時表,記下該語句的Id。
4.可以通過命令行或者混合云數(shù)據(jù)庫管理平臺HDM(Hybrid Cloud Database Management)來終止會話。
?命令行:
a.在SQL窗口執(zhí)行如下命令終止會話。
kill <會話Id>
?混合云數(shù)據(jù)庫管理平臺:
a.選擇性能 > 空間,跳轉(zhuǎn)到混合云數(shù)據(jù)庫管理平臺(Hybrid Cloud Database Management,HDM)。
說明 對于第一次進(jìn)入的用戶需要對HDM進(jìn)行授權(quán),若已授權(quán),請?zhí)降?步。
b.在授權(quán)HDM訪問您的云資源信息頁面單擊確定,并在彈出的云資源訪問授權(quán)頁面單擊同意授權(quán)。
c.在實例會話中找到之前記下的Id,單擊該行任意位置選中該行,在右上角單擊kill選中會話。
后續(xù)維護(hù)
?針對查詢產(chǎn)生的臨時文件,應(yīng)該優(yōu)化SQL語句,避免頻繁使用 order by、group by 操作,可以適當(dāng)調(diào)大tmp_table_size和max_heap_table_size,但是為了減少磁盤使用而調(diào)高 tmp_table_size 和 max_heap_table_size 并不明智,因為內(nèi)存資源遠(yuǎn)比磁盤資源寶貴;可以通過explain+SQL語句查看是否使用內(nèi)部臨時表,在 Extra 字段中有 Using temporary 字樣的代表會使用內(nèi)部臨時表。示例如下:
explain select * from alarm group by created_on order by default;
?針對binlog cache,應(yīng)該少執(zhí)行大事務(wù),尤其應(yīng)該減少在多個連接同時執(zhí)行大事務(wù),如果大事務(wù)比較多,可以適當(dāng)調(diào)大binlog_cache_size,但是同樣不應(yīng)該為了節(jié)省磁盤調(diào)整這個參數(shù),使用短連接執(zhí)行大事務(wù)可以有效降低臨時空間開銷。