sql數(shù)據(jù)庫(kù)磁盤滿了怎么辦 MYSQL所在機(jī)器磁盤滿了以后,寫入數(shù)據(jù)庫(kù)會(huì)阻塞嗎?
MYSQL所在機(jī)器磁盤滿了以后,寫入數(shù)據(jù)庫(kù)會(huì)阻塞嗎?當(dāng)磁盤空間滿了,MySQL就不能再寫任何數(shù)據(jù)了,包括寫表數(shù)據(jù)、binlog、binlog索引等文件。當(dāng)然,由于InnoDB可以先將臟數(shù)據(jù)放入內(nèi)存,因
MYSQL所在機(jī)器磁盤滿了以后,寫入數(shù)據(jù)庫(kù)會(huì)阻塞嗎?
當(dāng)磁盤空間滿了,MySQL就不能再寫任何數(shù)據(jù)了,包括寫表數(shù)據(jù)、binlog、binlog索引等文件。
當(dāng)然,由于InnoDB可以先將臟數(shù)據(jù)放入內(nèi)存,因此不會(huì)立即顯示無(wú)法寫入。除非binlog被打開,否則寫請(qǐng)求將被阻止。
當(dāng)MySQL檢測(cè)到磁盤已滿時(shí),它將:
每分鐘:檢查空間是否可用于寫入新數(shù)據(jù)。當(dāng)我們發(fā)現(xiàn)還有空間的時(shí)候,我們會(huì)繼續(xù)寫數(shù)據(jù),一切照舊。
每十分鐘:如果沒有剩余空間,將在日志中寫入一條記錄以報(bào)告磁盤空間已滿(此時(shí)只有幾個(gè)字節(jié)足夠)。
我們?cè)撛趺崔k
然后,當(dāng)我們發(fā)現(xiàn)磁盤空間已滿時(shí),我們?cè)撛趺崔k?建議:
提高監(jiān)控系統(tǒng)的檢測(cè)頻率,防止再次發(fā)生;
及時(shí)刪除未使用的文件,釋放空間;
如果某個(gè)線程因?yàn)榇疟P滿的問(wèn)題被阻塞,可以先將其殺死,下一分鐘再次被檢測(cè)到時(shí),該線程可能會(huì)再次正常工作;
該線程可能會(huì)正常工作,因?yàn)榇疟P已滿,某些線程被阻止,而其他線程被阻止。您可以終止被阻止的線程,其他被阻止的線程可以繼續(xù)工作。
異常
存在異常:
執(zhí)行修復(fù)表或優(yōu)化表操作時(shí),或執(zhí)行加載數(shù)據(jù)填充或更改表后批量更新索引時(shí),這些操作將創(chuàng)建臨時(shí)文件。當(dāng)mysqld在這些操作中發(fā)現(xiàn)磁盤空間已滿時(shí),它會(huì)將涉及的表標(biāo)記為崩潰并刪除臨時(shí)文件(除了Alter table操作外,MySQL會(huì)放棄正在執(zhí)行的操作,刪除臨時(shí)文件并釋放磁盤空間)。
注意:當(dāng)mysqld進(jìn)程在執(zhí)行這些命令的過(guò)程中意外終止時(shí),生成的臨時(shí)文件不會(huì)自動(dòng)刪除,只能通過(guò)手動(dòng)刪除來(lái)釋放磁盤空間。
mysql表數(shù)據(jù)量太大,達(dá)到了1億多條數(shù)據(jù),除了分庫(kù)分表之外,還有沒有其他的解決方式?
在正常配置下,MySQL只能承載2000萬(wàn)數(shù)據(jù)(同時(shí)讀寫,表中有大文本字段,單服務(wù)器)?,F(xiàn)在已經(jīng)超過(guò)1億,而且還在增加,建議按以下方式處理:
1子表。它可以按時(shí)間或一定的規(guī)則進(jìn)行拆分,以便盡可能地查詢子表中的數(shù)據(jù)庫(kù)。這是最有效的方法。特別是寫,放入一個(gè)新表,并定期同步。如果記錄不斷更新,最好將寫入的數(shù)據(jù)放在redis中,并定期同步表3的大文本字段,將它們分隔成一個(gè)新的獨(dú)立表。對(duì)于較大的文本字段,可以使用NoSQL數(shù)據(jù)庫(kù)
4優(yōu)化體系結(jié)構(gòu),或者優(yōu)化SQL查詢,避免聯(lián)合表查詢,盡量不要使用count(*)、in、recursion等性能消耗語(yǔ)句
5使用內(nèi)存緩存,或者在前端讀取時(shí)增加緩存數(shù)據(jù)庫(kù)。重復(fù)讀取時(shí),直接從緩存中讀取。
以上是一種低成本的管理方法,基本上幾個(gè)服務(wù)器就可以做到,但是管理起來(lái)有點(diǎn)麻煩。
當(dāng)然,如果總的數(shù)據(jù)量特別大,并且您不關(guān)心成本,您可以使用cluster或tidb來(lái)清除日志并壓縮日志和數(shù)據(jù)庫(kù)文件的大小