真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql怎么修復(fù)配置,mysql 優(yōu)化配置

面試官:MySQL權(quán)限表損壞導(dǎo)致無法啟動(dòng)怎么辦?

一、背景

成都創(chuàng)新互聯(lián)公司致力于網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇成都創(chuàng)新互聯(lián)公司,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!

近期,公司RDS云產(chǎn)品的MySQL Server版本進(jìn)行升級(jí),由目前使用的5.7.26版本升級(jí)到最新版本5.7.31;升級(jí)后測試同學(xué)發(fā)現(xiàn):在MySQL創(chuàng)建用戶后,5.7.31版本重新啟動(dòng)集群會(huì)出現(xiàn)啟動(dòng)失敗的現(xiàn)象;而5.7.26版本在相同測試場景下是正常啟動(dòng)的。這到底是為什么呢?

二、問題復(fù)現(xiàn)

2.1 實(shí)驗(yàn)環(huán)境

2.2 操作步驟

按照測試同學(xué)的測試步驟,首先創(chuàng)建一個(gè)用戶:

然后關(guān)閉mysqld;這里需要介紹一下,我們集群的關(guān)閉方式是如下方式:

這種方式的內(nèi)部實(shí)現(xiàn)類似于kill -9模式。所以我在線下環(huán)境使用kill -9的方式來復(fù)現(xiàn),操作如下:

然后重啟mysqld,操作如下:

此時(shí)問題復(fù)現(xiàn)了,mysqld啟動(dòng)失敗,我們查看了下error日志,信息如下:

根據(jù)報(bào)錯(cuò)信息可以看出:MySQL的權(quán)限系統(tǒng)表發(fā)生了損壞,導(dǎo)致了mysqld啟動(dòng)失??;由于在MySQL 5.7及其之前版本該表是MyISAM引擎,且該引擎不支持事務(wù),所以在mysqld異常崩潰會(huì)導(dǎo)致該類型引擎表的損壞;但在mysqld啟動(dòng)時(shí)是有參數(shù)控制MyISAM引擎的恢復(fù)模式,且該參數(shù)在我們產(chǎn)品中也配置到了my.cnf中,如下所示:

2.3 參數(shù)解析

對(duì)于該參數(shù)的官方文檔的解釋如下:

設(shè)置MyISAM存儲(chǔ)引擎恢復(fù)模式。選項(xiàng)值是OFF、DEFAULT、BACKUP、FORCE或QUICK的值的任意組合。如果指定多個(gè)值,請(qǐng)用逗號(hào)分隔。指定不帶參數(shù)的選項(xiàng)與指定DEFAULT相同,指定顯式值" "將禁用恢復(fù)(與OFF值相同)。如果啟用了恢復(fù),則mysqld每次打開MyISAM表時(shí),都會(huì)檢查該表是否標(biāo)記為已崩潰或未正確關(guān)閉。(只有在禁用外部鎖定的情況下運(yùn)行,最后一個(gè)選項(xiàng)才起作用。)在這種情況下,mysqld在表上運(yùn)行檢查。如果表已損壞,mysqld將嘗試對(duì)其進(jìn)行修復(fù)。

服務(wù)器自動(dòng)修復(fù)表之前,它將有關(guān)修復(fù)的注釋寫到錯(cuò)誤日志中。如果您希望能夠在無需用戶干預(yù)的情況下從大多數(shù)問題中恢復(fù),則應(yīng)使用選項(xiàng)BACKUP,F(xiàn)ORCE。即使某些行將被刪除,這也會(huì)強(qiáng)制修復(fù)表,但是它將舊的數(shù)據(jù)文件保留為備份,以便您以后可以檢查發(fā)生了什么。

全局變量,只讀變量,默認(rèn)為OFF。

三、問題修復(fù)

這類MySQL用戶表損耗的問題解決方式也是有多種,我這里列舉其中一種:

(1)my.cnf中的[mysqld]標(biāo)簽下添加skip_grant_tables,啟動(dòng)時(shí)跳過加載系統(tǒng)字典。

(2)重啟mysqld,然后修復(fù)mysql schema下的所有表。

(3)在[mysqld]標(biāo)簽下注釋或刪除掉skip_grant_tables,然后重啟mysqld。

此時(shí)mysqld是可以正常啟動(dòng)的,無異常。

四、深入排查

在產(chǎn)品化中,以上修復(fù)方式很不優(yōu)雅,只是作為臨時(shí)的解決方案;并且也存在一些令人疑惑的點(diǎn):

帶著這些疑問,我們繼續(xù)排查出現(xiàn)該現(xiàn)象的原因;此時(shí)Google也沒有找到一些有效的信息,那么只能通過MySQL源代碼來尋找一些答案。

首先需要下載mysql 5.7.31版本的源代碼,并搭建mysql debug環(huán)境;具體步驟可以自動(dòng)Google搜索一下,本文就不再贅述了。

在源代碼中搜索一下關(guān)鍵詞,用于打斷點(diǎn)的位置,然后進(jìn)行調(diào)試:

定位到相關(guān)代碼,大概是sql/mysqld.cc的4958行,且存在if條件判斷,此時(shí)我們開始調(diào)試:

通過以上調(diào)試信息,可以判斷出acl_init函數(shù)返回的值為真;此時(shí)我們查看該函數(shù)的代碼 (sql/auth/sql_auth_cache.cc:1365):

根據(jù)該函數(shù)的注釋發(fā)現(xiàn):該函數(shù)是初始化負(fù)責(zé)用戶/數(shù)據(jù)庫級(jí)特權(quán)檢查的結(jié)構(gòu),并從mysql schema中的表中為其加載特權(quán)信息;且return值為1代表的是初始化權(quán)限失敗。

此后開始逐步調(diào)試,觀察return相關(guān)信息,當(dāng)調(diào)試到lock_table_names函數(shù)時(shí),我們發(fā)現(xiàn)在Phase 3時(shí)return值為true,且根據(jù)代碼注釋發(fā)現(xiàn)true代表是Failure;具體代碼如下(sql/sql_base.cc:5549):

調(diào)試信息如下:

可以看到flags的值為0,而MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK為宏定義值0x1000,與flags的值 做按位與操作,結(jié)果自然也是0,當(dāng)然MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY也是如此;need_global_read_lock_protection是bool類型值,代表是否需要全局讀鎖的保護(hù),這個(gè)值是在table- mdl_request.type不為MDL_SHARED_READ_ONLY發(fā)生改變;check_readonly函數(shù)相關(guān)信息 下面概述。

此時(shí)也查看了下MySQL 5.7.26版本代碼作為對(duì)比,發(fā)現(xiàn)lock_table_names函數(shù)下的Phase 3后的部分代 碼是在5.7.29版本后新增的。如果是git clone的MySQL代碼可以用git blame命令查詢文件變化的信息:

上述展示的信息中,最左側(cè)的列值為commit id為05824063和0405ebee,有興趣的同學(xué)可以詳細(xì)看下。

此功能解決的問題是 BUG#28438114: SET READ_ONLY=1 SOMETIMES DOESN'T BLOCK CONCURRENT DDL.;當(dāng)然這個(gè)代碼的變更功能也在5.7 Release Notes中有所體現(xiàn),如下所示( m/doc/relnotes/mysql/5.7/en/news-5-7-29.html ):

最后我們?cè)俨榭聪耤heck_readonly函數(shù),該函數(shù)是基于read_only和super_read_only狀態(tài)執(zhí)行標(biāo)準(zhǔn)化檢查,是禁止(TRUE)還是允許(FALSE)操作。代碼如下(sql/auth/sql_authorization.cc:489):

此時(shí)第一反應(yīng)就是去檢查my.cnf中是否包含read_only相關(guān)參數(shù),檢查之后發(fā)現(xiàn)確實(shí)是使用了該參數(shù), 如下:

此時(shí)注釋掉該參數(shù),然后再次啟動(dòng)mysqld,發(fā)現(xiàn)MyISAM表可以自動(dòng)修復(fù),且正常啟動(dòng);error log信息如下:

由于docker一些限制,我們?cè)趍ysqld啟動(dòng)會(huì)涉及兩次;所以解決該問題的方式為:第一次mysqld的啟動(dòng)時(shí)先關(guān)閉read_only參數(shù),第二次啟動(dòng)時(shí)開啟read_only參數(shù)。之所以選擇默認(rèn)開啟read_only參數(shù), 是為了避免在mysqld啟動(dòng)后,選主邏輯未完成時(shí)的保護(hù)措施;當(dāng)然選主完成后,會(huì)自動(dòng)對(duì)master執(zhí)行 set global read_only=0 操作。

五、總結(jié)

六、附錄

調(diào)試的棧幀信息如下,有興趣的小伙伴可以研究下:

熟悉MySQL體系結(jié)構(gòu)和innodb存儲(chǔ)引擎工作原理;以及MySQL備份恢復(fù)、復(fù)制、數(shù)據(jù)遷移等技術(shù);專注于MySQL、MariaDB開源數(shù)據(jù)庫,喜好開源技術(shù)。

原文鏈接:

MySQL崩潰-修復(fù)損壞的innodb:innodb_force_recovery

Windows上安裝了XMAPP-controller之后間歇性出現(xiàn)MySQL無法啟動(dòng),查看日之后發(fā)現(xiàn)是innodb的報(bào)錯(cuò),報(bào)錯(cuò)信息如下:

度娘上各種答案無法解決,后來直接看官方文檔,直接上解決方案:

踩坑指南 - - 操作配置前需要做這些操作:

1、配置my.cnf 配置innodb_force_recovery = 1 到 6 試到正確為止,重啟MySQL

2、導(dǎo)出數(shù)據(jù)腳本 mysqldump -uroot -p123456 test test.sql 導(dǎo)出SQL腳本。或者用Navicat將所有數(shù)據(jù)庫/表導(dǎo)入到其他服務(wù)器的數(shù)據(jù)庫中。 注意:這里的數(shù)據(jù)一定要備份成功。然后刪除原數(shù)據(jù)庫中的數(shù)據(jù)。

3、刪除ib_logfile0、ib_logfile1、ibdata1 備份MySQL數(shù)據(jù)目錄下的ib_logfile0、ib_logfile1、ibdata1三個(gè)文件,然后將這三個(gè)文件刪除

4、配置my.cnf 將my.cnf中innodb_force_recovery 這行配置刪除或者配置為innodb_force_recovery = 0,重啟MySQL服務(wù)

5、將數(shù)據(jù)導(dǎo)入MySQL數(shù)據(jù)庫 mysql -uroot -p123456 test test.sql;

或者用Navicat將備份的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫中。 如果在導(dǎo)入數(shù)據(jù)過程中發(fā)生tablespace不存在的問題,請(qǐng)刪除data目錄相應(yīng)database下的文件。

mysql下載老顯示重新配置

一、 下載MySQL 二、 安裝MySQL 三、 配置環(huán)境變量 解決MYSQL中安裝失敗之一 安裝失敗之starting the sever 第一種解決方法 :完全卸載mysql重新安裝 第二種解決方法:修改系統(tǒng)設(shè)置 一、 下載MySQL Mysql官網(wǎng)下載地址: MySQL :: Download MySQL Installer (Archived Versions) 二、 安裝MySQL 打開剛剛下載好的安裝包,開始安裝MySQL。 選擇I accept 然后點(diǎn)擊next進(jìn)入下一步。 這里選擇是自定義安裝,所以直接選擇“Custom”,點(diǎn)擊“Next” “Developer Default”是開發(fā)者默認(rèn) “Server only”僅作為服務(wù)器安裝 “Clientonly”僅作為客戶端安裝 “Full”是完整安裝 “Custom”是自定義安裝 先選中“MySQL Server” 之后點(diǎn)擊下方的藍(lán)色“Advanced Options” 自定義安裝路徑和數(shù)據(jù)存放路徑,更改完成之后點(diǎn)擊“OK”注:雖說安裝在C盤也沒毛病,但是個(gè)人建議不要安裝到C盤,我安裝到了D盤 直接點(diǎn)擊“OK”注:這里因?yàn)檫x擇了我自己創(chuàng)建的路徑,故程序提示路徑已存在,是否要繼續(xù) 更改完成之后點(diǎn)擊“Next” 確認(rèn)一下安裝路徑和數(shù)據(jù)存放路徑對(duì)不對(duì),沒有問題的話就直接點(diǎn)擊Next 直接點(diǎn)擊“Yes” 先選中“MySQL Server5.7.31”,若電腦中沒有這個(gè)環(huán)境,會(huì)提示安裝“Microsoft Visual C++ 2013”環(huán)境,點(diǎn)擊“Execute” 勾選中之后點(diǎn)擊“Install” 安裝完成,點(diǎn)擊“Close” 看到這個(gè)對(duì)勾就說明這個(gè)環(huán)境安裝上了,直接點(diǎn)擊“Next” 直接點(diǎn)擊“Execute” 出現(xiàn)這個(gè)圖標(biāo)就說明安裝成功了,直接點(diǎn)擊“Next” 直接點(diǎn)擊“Next” 直接點(diǎn)擊“Next” 選擇安裝類型個(gè)人學(xué)習(xí)研究的話選擇“Development Computer”則可以,我這里選擇是“Development Computer” Development Computer 適合個(gè)人開發(fā)學(xué)習(xí)使用的 Server Computer 是像主要用于像FTP,email,web服務(wù)器等等 Dedicated Computer 只用作MySQL服務(wù)器


網(wǎng)站題目:mysql怎么修復(fù)配置,mysql 優(yōu)化配置
分享路徑:http://weahome.cn/article/heddsp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部