mysql怎么處理磁盤滿,磁盤己滿如何清理

技術(shù)分享 | MySQL中MGR中SECONDARY節(jié)點(diǎn)磁盤滿,導(dǎo)致mysqld進(jìn)程被OOM Killed

在對MySQL 8.0.26 vs GreatSQL 8.0.25的對比測試過程中,有一個環(huán)節(jié)是人為制造磁盤滿的場景,看看MGR是否還能正常響應(yīng)請求。

在浦江等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作定制設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,營銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè)公司,浦江網(wǎng)站建設(shè)費(fèi)用合理。

在實(shí)測過程中,最后發(fā)現(xiàn)磁盤滿的那個節(jié)點(diǎn),持續(xù)時間足夠久后,會因?yàn)閮?nèi)存消耗過大而最終被OS給OOM Kill。

這個問題我已報告BUG(#104979),下面是該過程的詳細(xì)記錄。

首先,直接利用dd復(fù)制空文件填滿磁盤。

disk full報告過程及何時被oom killed

來看下MySQL 8.0.26遇到disk full時日志都輸出哪些內(nèi)容:

從disk full時刻開始,大約過了2.5小時,mysqld進(jìn)程內(nèi)存消耗持續(xù)上升,最終引發(fā)oom kill

在這期間某個時刻抓到的待認(rèn)證事務(wù)堆積,在被oom kill前實(shí)際不止這么多:

關(guān)注mysqld進(jìn)程內(nèi)存消耗變化

下面是mysqld進(jìn)程內(nèi)存消耗變化情況

OS層oom-killer相關(guān)日志:

GreatSQL 8.0.25測試過程

作為對比,我用GreatSQL 8.0.25也做了同樣的測試。

從日志詳情中可以看到,當(dāng)磁盤空間滿了之后,GreatSQL會將那個節(jié)點(diǎn)主動退出集群,對整個集群的影響非常小。

此外,從集群退出后,也不會再接收認(rèn)證事務(wù)了,所以也沒發(fā)生內(nèi)存持續(xù)暴漲最終被oom killed的情況,實(shí)際觀察過程中發(fā)現(xiàn)內(nèi)存反倒還下降了

這樣對比來看,GreatSQL的可靠性還真是可以的,官方的MySQL MGR的可靠性還有待進(jìn)一步加強(qiáng)呀。

Enjoy GreatSQL :)

mysql 盤滿了怎么辦

操作系統(tǒng):CentOS 6.2

現(xiàn)象:MySQL無法啟動

查找問題發(fā)現(xiàn):存放mysql數(shù)據(jù)分區(qū)100%

[root@jinniu-test3 mysql]# df -h

文件系統(tǒng) 容量 已用 可用 已用%% 掛載點(diǎn)

/dev/sda2 49G 49G 20K 100% /

tmpfs 933M 0 933M 0% /dev/shm

/dev/sda1 194M 31M 153M 17% /boot

/dev/sda5 219G 701M 207G 1% /opt

檢查/etc/my.cnf,數(shù)據(jù)文件默認(rèn)存放于/var/lib/mysql下

確認(rèn)此文件夾確實(shí)過大

解決方案:轉(zhuǎn)移存放目錄,修改my.cnf或者軟連接回來

[root@-_- ~]# cp -Rp /var/lib/mysql /opt/ --帶權(quán)限拷貝整個目錄

修改/etc/my.cnf配置datadir=/opt/mysql指向新位置

重啟mysql發(fā)現(xiàn)無法啟動

[root@-_- ~]# service mysqld start

MySQL Daemon failed to start.

正在啟動 mysqld: [失敗]

檢查/var/log/mysqld.log文件最后

[root@-_- ~]# tail -20 /var/log/mysqld.log

...

130301 11:52:05 [Warning] Can't create test file /opt/mysql/-_-.lower-test

130301 11:52:05 [Warning] Can't create test file /opt/mysql/-_-.lower-test

...

網(wǎng)絡(luò)搜索問題得知是這臺機(jī)器啟用SElinux 安全策略引起的

使用命令可以解決

[root@-_- ~]# chcon -R -t mysqld_db_t /opt/mysql

實(shí)在不行,禁用SElinux

執(zhí)行:setenforce 0

磁盤空間滿了之后MySQL會怎樣

一、磁盤滿了之后MySQL會做什么?

我們看下官方的說法:

When a disk-full condition occurs, MySQL does the following:

* It checks once every minute to see whether there is enough space to write the current row. If there is enough space,it continues as if nothing had happened.

* Every 10 minutes it writes an entry to the log file, warning about the disk-full condition.

其實(shí)MySQL本身并不會做任何操作,如官方文檔說說,只會每分鐘check一次是否有空閑空間,并且10分鐘寫一次錯誤日志。

但是再次期間由于磁盤滿了,意味著binlog無法更新,redo log也無法更新,所有buffer

pool中的數(shù)據(jù)無法被flush上,如果不幸的服務(wù)器重啟,或者實(shí)例被kill了,那必然會造成數(shù)據(jù)丟失,這幾乎是一定的。所以,處理磁盤滿的問題最好是先釋放出來一定空間讓dirty數(shù)據(jù)刷新下來。

二、磁盤滿了為什么會導(dǎo)致操作hang???

1、select

首先經(jīng)過經(jīng)驗(yàn)和實(shí)際測試,select操作不會由于磁盤滿導(dǎo)致問題,也就是所有select操作都會正常運(yùn)行。

2、insert

經(jīng)過不通的測試發(fā)現(xiàn),當(dāng)磁盤滿了之后,并不是第一個insert就卡住,而是會在n個之后出現(xiàn)卡住的情況。

通過查看error日志,發(fā)現(xiàn)卡住現(xiàn)象和刷磁盤的操作有關(guān)系。

[ERROR] /usr/local/mysql-5.1.42/libexec/mysqld: Disk is full writing './test/cj_webex.MYD'

[ERROR] /usr/local/mysql-5.1.42/libexec/mysqld: Disk is full writing './mysql-bin.000017'

為了驗(yàn)證推論是否正確,我們將sync_binlog設(shè)置為1,在這種情況下,insert第一條就卡住了,并且error

log中直接報錯提示寫binlog失敗??磥砜ㄗ〈_實(shí)和刷磁盤有關(guān)系。

目前已知和刷磁盤有關(guān)系的參數(shù)有3個,分別是sync_binlog,innodb_flush_log_tr_commit和duoblewrite。

3、show slave status

在從庫經(jīng)過測試,操作會被卡住,這主要是由于執(zhí)行show slave

status需要獲得LOCK_active_mi鎖,然后鎖上mi-data_lock,但是由于磁盤滿了無法將io_thread中的數(shù)據(jù)寫入到relay

log中,導(dǎo)致io_thread持有mi-data_lock鎖,這就導(dǎo)致了死鎖。

所以,這就導(dǎo)致在磁盤滿的情況下,執(zhí)行show slave status操作會卡住。

4、show status

測試可以正常操作,但是如果先執(zhí)行了show slave status操作的情況下,show

status也會被卡住。這是因?yàn)閳?zhí)行show status需要鎖上LOCK_status,而由于status狀態(tài)中包含slave

status,所以還需要鎖上LOCK_active_mi。如果限制性了show slave

status,這時候由于mi-data_lock死鎖問題,導(dǎo)致io_thread不會釋放LOCK_active_mi鎖。這時候就導(dǎo)致show

status和show slave status爭搶同一把LOCK_active_mi鎖,也形成了死鎖。

所以,在磁盤滿的情況下,如果先執(zhí)行show slave status,后執(zhí)行show status,連個操作都會卡住。

mysql硬盤滿怎么辦

可以通過查看mysql進(jìn)程來實(shí)現(xiàn)。 進(jìn)入mysql命令行客戶端,選擇數(shù)據(jù)庫后,執(zhí)行show processlist命令: 多刷新幾次,可以看到最后執(zhí)行的SQL語句,以此判斷什么查詢在占用資源。

分享名稱:mysql怎么處理磁盤滿,磁盤己滿如何清理
分享鏈接:http://muchs.cn/article44/hcieee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、小程序開發(fā)網(wǎng)站設(shè)計、網(wǎng)站改版、網(wǎng)頁設(shè)計公司、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司