如何解決SQL SERVER Always on 生產(chǎn)故障問題,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)是一家專業(yè)提供迭部企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站建設(shè)、H5建站、小程序制作等業(yè)務(wù)。10年已為迭部眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
最近忙的要死,手底下各種優(yōu)化,數(shù)據(jù)庫系統(tǒng),各種問題,恨不得長(zhǎng)上8只手干這些活,而偏偏屋漏偏逢連夜雨,SQL SERVER ALWAYS ON 又出了問題,SQL SERVER 目前公司使用的是 WINDOWS 2016 ENTERPRISE + SQL SERVER 2016 ENTERPRISE ALWAYS ON 的集群,來支撐公司部分業(yè)務(wù)。
SQL SERVER ALWAYS ON 作為成熟的SQL SERVER 集群解決方案已經(jīng)在很多企業(yè)中應(yīng)用,但任何系統(tǒng)都不是完美的,故障也是有的,這兩天運(yùn)維的同事和我說,SQL SERVER ALWAYS ON 的日志不在截取,瘋狂的增長(zhǎng)。 其實(shí)我聽到這個(gè)消息后,并不緊張,因?yàn)橐郧拔夜┞毜哪臣夜?,使用的SQL SERVER 2012 也有這樣的問題,最后雖然沒有找到根本原因,但問題是解決了。
OK ,我們先看看SQL SERVER 的日志,SQL SERVER 的日志文件是LDF,對(duì)于外行來說,它就是一個(gè)文件,但實(shí)際上,對(duì)DBA來說他是一個(gè)可循環(huán)的 capped collection (此概念為MongoDB的一個(gè)概念,這里引用一下雖然不完全相同,但意思是這個(gè)意思)。
下面就是 一個(gè)LDF 的文件結(jié)構(gòu),每個(gè)文件里面有 多個(gè) VLF 塊,而這些塊時(shí)可以復(fù)用的,也就是當(dāng) CHECK POINT 將 dirty data FLUSH 到數(shù)據(jù)文件后,其實(shí)這些LOG 在某些層面上已經(jīng)對(duì)數(shù)據(jù)庫沒有太大意義,是可以被DUMP掉的。
但為什么有時(shí)候,日志不能被截?cái)?,并且日志不能被reuse
1 VLF 塊中有沒有被 CHECK POINT 的日志 ,也就是活動(dòng)日志,例如一個(gè)大事務(wù),一直沒有做完,那么這個(gè)VLF的文件塊時(shí)不會(huì)被覆蓋的,直到數(shù)據(jù)刷到數(shù)據(jù)文件后,才可以被CHECK POINT ,這個(gè)VLF 才可以被重用
2 VLF 的尾部必須是 FREE VLF ,如果碰巧你的 有 4個(gè) VLF 而恰巧 TAIL 和 HEAD 在一個(gè) VLF 中,那這樣的日志也是不能被收縮的,除非數(shù)據(jù)寫到VLF1 ,舉個(gè)例子,如果有一個(gè)壁虎,如果讓他釋放自己的空間,你說他是愿意從頭砍下去,還是從尾部砍下去。所以下面的情況也是不能收縮日志。
另外我們還要明白,收縮日志有沒有必要,在我看來,還好,因?yàn)槿罩救绻麧q到800G (不是因?yàn)殄e(cuò)誤,或者各種爛 DML)造成的,那就可以不釋放,因?yàn)樗麜?huì)REUSE 空間的,你SHRINK他后,早晚還是要占用空間,而且和系統(tǒng)交換空間也有損耗,干嘛呢。
如果你想看你的日志文件到底什么狀態(tài),鍵入 dbcc loginfo 就可以知道了,狀態(tài)為 2的 是激活的,不可以SHRINK的文件
我們回到為什么日志不能被截取,其實(shí)這個(gè)說法不準(zhǔn)確,應(yīng)該是問日志為什么一直在激活的狀態(tài),而不能背釋放,在我們這次故障中,明顯就是 ALWAYS ON 的日志沒有在從庫上被應(yīng)用完畢。造成的問題
查詢數(shù)據(jù)庫一直是在 AVALIABILITY_REPLCA 的狀態(tài),一般這樣狀態(tài)都是因?yàn)閺膸煊袉栴}造成,例如從庫宕機(jī),從庫由于查詢(一般從庫查詢,都是大查詢,OLAP的需求),造成日志無法應(yīng)用,或者一些稀奇古怪的問題。
這里的經(jīng)驗(yàn)我們要重新啟動(dòng)從庫即可,另外在從庫的錯(cuò)誤日志中我發(fā)現(xiàn)了
下面的錯(cuò)誤日志:
Error: 19432, Severity: 16, State: 0. Always On Availability Groups transport has detected a missing log block for availability database "database_name". LSN of last applied log block is (xxxx:xxxxxxx:x). Log scan will be restarted to fix the issue. This is an informational message only. No user action is required.
按照微軟官方的 FIX (微軟官方對(duì)錯(cuò)誤的解釋和解決)
我們需要打上 SQL SERVER 2016 SP1 SP2的補(bǔ)丁來解決問題。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。