在對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 :)
操作系統(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會做什么?
我們看下官方的說法:
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進(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)