一、背景
創(chuàng)新互聯(lián)建站是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開發(fā),軟件開發(fā),微信小程序開發(fā),十余年建站對成都柴油發(fā)電機(jī)等多個(gè)行業(yè),擁有豐富的網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn)。
近期,公司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ù)解析
對于該參數(shù)的官方文檔的解釋如下:
設(shè)置MyISAM存儲(chǔ)引擎恢復(fù)模式。選項(xiàng)值是OFF、DEFAULT、BACKUP、FORCE或QUICK的值的任意組合。如果指定多個(gè)值,請用逗號(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將嘗試對其進(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版本代碼作為對比,發(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 ):
最后我們再查看下check_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一些限制,我們在mysqld啟動(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)對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ù)。
原文鏈接:
我在
Windows
操作系統(tǒng)上,使用解壓壓縮包的方式安裝
MySQL。這是安裝的具體方法:點(diǎn)擊這里。在執(zhí)行如下命令:
mysqld
--install
MySQL
--defaults-file=[ini配置文件絕對路徑]
在執(zhí)行上面那個(gè)命令的時(shí)候,輸入了錯(cuò)誤的配置文件路徑。雖然系統(tǒng)可能會(huì)返回
success
。并且命令
mysqld
--initialize
也可以執(zhí)行并生成數(shù)據(jù)文件。但是當(dāng)我執(zhí)行
net
start
mysql
的時(shí)候,系統(tǒng)會(huì)一直提示服務(wù)正在啟動(dòng)。原因是我的配置文件路徑錯(cuò)誤,導(dǎo)致服務(wù)啟動(dòng)的時(shí)候出現(xiàn)異常情況。此時(shí)MySQL服務(wù)無法啟動(dòng),也無法通過命令行和控制面板停止。MySQL
服務(wù)也無法刪除。
解決方法:
控制面板
→
右上查看方式選擇大圖標(biāo)
→
管理工具
→
服務(wù)
→
選中MySQL。
這個(gè)時(shí)候你可以看到,根本沒有停止、重啟和暫停的選項(xiàng)。這時(shí)需要這么干:
右鍵MySQL服務(wù)
→
屬性
→
常規(guī)選項(xiàng)卡
→
“啟動(dòng)類型”選擇禁用
→
重啟電腦
→
以管理員身份打開命令行
→
cd命令進(jìn)入MySQL安裝路徑下的bin文件夾。
因?yàn)镸ySQL服務(wù)被設(shè)置禁止開機(jī)啟動(dòng),并重啟了電腦,這個(gè)時(shí)候MySQL服務(wù)是停止?fàn)顟B(tài)的。
命令行輸入命令:
mysqld
remove
MySQL
命令可以正常執(zhí)行,命令執(zhí)行完后就能把那個(gè)錯(cuò)誤配置的MySQL服務(wù)刪除了。然后把MySQL的數(shù)據(jù)文件夾下面的文件全部刪除,重新從頭開始一步一步安裝MySQL即可。
以上所述是小編給大家介紹的Windows下MySQL服務(wù)無法停止和刪除的解決辦法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
右鍵桌面”電腦“圖標(biāo),選擇”管理“,進(jìn)入”計(jì)算機(jī)管理“窗口。
注:也可以在”開始“-"運(yùn)行"里輸入services.msc命令,進(jìn)入服務(wù)窗口。
選擇計(jì)算機(jī)管理窗口中”服務(wù)和應(yīng)用程序“下面的”服務(wù)“,窗口右邊就會(huì)展示windows所有的服務(wù)。
找到你要打開或禁用的服務(wù),比如我要啟用”MySQL“服務(wù)。
找到”MySQL“服務(wù),右鍵菜單,選擇”啟用“,即可。
禁用的操作一樣,右鍵菜單選擇”停止“等相應(yīng)操作即可。
如果要修改啟動(dòng)模式,”自動(dòng)“、”手動(dòng)“、”禁用“等,右鍵菜單選擇”屬性“,進(jìn)入服務(wù)屬性設(shè)置窗口。
選擇相應(yīng)的啟動(dòng)類型后確定即可。
mysql配置文件不對,所以服務(wù)啟動(dòng)不了,應(yīng)該是你改動(dòng)過了,你查看下mysql下錯(cuò)誤日志看提示具體什么原因,針對性的修改
datadir="F:/Program Files/MySQL/MySQL Server 4.1/Data/"
basedir="F:/Program Files/MySQL/MySQL Server 4.1/"
這兩個(gè)路徑 搞正確 就差不多了
可以看看下這個(gè)資料
實(shí)在不行給我留言
在本地計(jì)算機(jī)無法啟動(dòng)MYSQL服務(wù)錯(cuò)誤1067進(jìn)程意外終止 這種情況一般是my.ini文件配置出錯(cuò)了,
你可以刪除系統(tǒng)目錄下的my.ini文件,
把下面的內(nèi)容重新寫入my.ini文件試試,
要適當(dāng)?shù)馗膶懸幌挛募窂?/p>
我的my.ini 2007年12月31日
[WinMySQLAdmin]
Server=C:/MYSQL/mysql/bin/mysqld-opt.exe
user=root
[mysqld]
basedir=C:/MYSQL/mysql
datadir=C:/MYSQL/mysql/data
#bind-address=192.168.0.2
#language=D:/MYSQL/share/chinese
===========================================
[WinMySQLAdmin]
Server=D:/MYSQL/bin/mysqld-opt.exe
user=root
[mysqld]
basedir=D:/MYSQL
datadir=D:/MYSQL/data
#bind-address=192.168.0.2
#language=D:/MYSQL/share/chinese
============================================
查找Windows目錄下的my.ini文件,編輯內(nèi)容(如果沒有該文件,則新建一個(gè)),至少包含basedir,datadir這兩個(gè)基本的配置。
[mysqld]
# set basedir to installation path, e.g., c:/mysql
# 設(shè)置為MYSQL的安裝目錄
basedir=D:/www/WebServer/MySQL
# set datadir to location of data directory,
# e.g., c:/mysql/data
# 設(shè)置為MYSQL的數(shù)據(jù)目錄
datadir=D:/www/WebServer/MySQL/data
另外,要注意:
[WinMySQLadmin]
Server=D:/www/WebServer/MySQL/bin/mysqld-nt.exe
user=root
password=xxxxxxxx
#以上是設(shè)置WinMySQLadmin的配置
[Client]
user=root
password=xxxxxxxx
將Mysql添加到Windows系統(tǒng)服務(wù)中:
1.、 安裝服務(wù)。
在Windows2000下,安裝完成后,并沒有把MySQL安裝成服務(wù),我們必須執(zhí)行下面的語句把MySQL注冊為服務(wù):installdir\mysql\bin\mysqld-nt –-install。
Windows98下沒有服務(wù)的概念,所以不用安裝服務(wù)。
2.、 啟動(dòng)服務(wù)
在Windows2000下,安裝服務(wù)后可以啟動(dòng)MySQL服務(wù):net start mysql。
在Windows98下,可以用下面的命令啟動(dòng)服務(wù):c:\mysql\bin\mysqld,服務(wù)啟動(dòng)后在后臺(tái)運(yùn)行,并沒有界面。
3.、 停止服務(wù)
在Windows2000下,可以通過下面的命令停止MySQL服務(wù):net stop mysql。
在Windows98下,可以通過下面命令停止服務(wù):C:\ C:\mysql\bin\mysqladmin -u root shutdown
網(wǎng)頁名稱:mysql服務(wù)禁用怎么辦 mysql服務(wù)無效
文章分享:http://chinadenli.net/article2/hpioic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站導(dǎo)航、靜態(tài)網(wǎng)站、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)