<del id="nnjnj"></del><track id="nnjnj"></track>

<p id="nnjnj"></p>

<address id="nnjnj"></address>

    <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

      <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>

      • 自動秒收錄
      • 軟件:1973
      • 資訊:57811|
      • 收錄網站:279872|

      IT精英團

      緊急情況下數據庫表被鎖 抓瞎?

      緊急情況下數據庫表被鎖 抓瞎?

      瀏覽次數:
      評論次數:
      編輯: 溫瑜
      信息來源: ITPUB
      更新日期: 2022-05-07 18:32:30
      摘要

      以下文章來源于公眾號-程序新視界,作者二師兄在程序員的職業生涯中,總會遇到數據庫表被鎖的情況,前些天就又撞見一次。由于業務突發需求,各個部門都在批量操作、導出數據,而數據庫又未做讀寫分離,結果就是:數

      • 正文開始
      • 相關閱讀
      • 推薦作品

      以下文章來自微信官方賬號——節目新視界,兩位師兄撰寫。

      在程序員的職業生涯中,總有數據庫表被鎖的情況,前幾天又發生了一次。由于突發業務需求,各部門都在批量操作導出數據,數據庫讀寫不分離。結果,數據庫中的一個表被鎖定!

      反饋系統部分功能無法使用,鎖定數據庫表進行緊急排查定位,然后進行緊急處理。這篇文章告訴你類似突發事件的故障排除和解決過程。建議喜歡的收藏未雨綢繆。

      故障查尋

      用戶在某個功能頁面報錯502,于是先看服務是否正常,數據庫是否正常。在控制臺中,我看到數據庫的CPU猛增,堆積了大量未提交的事務,有些事務已經被阻塞很久了?;径ㄎ皇菙祿鞂佑袉栴}。

      看了一下被屏蔽的交易列表,發現里面有鎖。我本想用控制臺直接結束被阻塞的事務,但是控制臺賬號權限有限,所以我通過客戶端登錄相應的賬號來殺死被鎖定的事務,防止了情況惡化。

      大家說說吧。如果突然面臨類似情況,應該如何緊急應對?

      解決辦法

      想象一個場景,當然是軟件工程師職業生涯中會遇到的場景:一個本來正常運行的程序,有一天突然數據庫的表被鎖了,業務無法正常運行。那么如何快速定位哪個事務鎖了表,如何結束相應的事情呢?

      首先,最簡單粗暴的方法就是:重啟MySQL。沒錯,網管解決問題的神器——“重啟”。至于后果,能不能跑,三思而后行!

      重啟可以解決表鎖定的問題,但對于在線業務顯然不可行。

      讓我們來看看不跑步的解決方案:

      第一步:查看表使用

      當遇到數據庫阻塞的問題時,應該首先檢查表是否在使用中。

      showopentableswherein _ use

      如果查詢結果為空,說明表沒有被使用,說明不是鎖表的問題。

      mysqlshowopentableswherein _ use0

      清空設置(0.00秒)

      例如,如果查詢結果不為空,將出現以下結果:

      mysqlshowopentableswherein _ use

      - - - -

      |數據庫|表|使用中|名稱鎖定|

      - - - -

      |測試|t|1|0|

      - - - -

      1流動插圖(0.00秒)

      那么測試臺正在使用中,此時需要進一步調查。

      第二步:查看進程

      檢查數據庫的當前進程,查看是否有緩慢的SQL或阻塞的線程。

      執行命令:

      showprocesslist

      這個命令只顯示當前用戶正在運行的線程。當然,如果是root的話,可以全部看到。

      在上面的實踐中,阿里云控制臺之所以可以查看所有線程,是因為應該是root,但是我去殺的時候,因為登錄的用戶不是root的數據庫賬號,不能操作另一個用戶的線程,所以殺不了。

      第三步:查看當前運行的所有事務

      在緊急情況下,可以跳過這一步,主要用于檢查:

      SELECT*FROMinformation_schema。INNODB

      第四步:查看當前出現的鎖

      在緊急情況下,可以跳過這一步,主要用于檢查:

      SELECT*FROMinformation_schema

      .INNODB_LOCKs;

      第五步:查詢鎖等待的對應關系

      SELECT * FROM information_schema.INNODB_LOCK_waits;

      看事務表INNODB_TRX中是否有正在鎖定的事務線程,看看ID是否在show processlist的sleep線程中。如果在,說明這個sleep的線程事務一直沒有commit或者rollback,而是卡住了,需要手動kill掉。

      搜索的結果中,如果在事務表發現了很多任務,最好都kill掉。

      第六步:kill掉事務

      執行kill命令:

      kill 1011;

      對應的線程都執行完kill命令之后,后續事務便可正常處理。

      針對緊急情況,通常也會直接操作第一、第二、第六步。

      MySQL的鎖

      這里再補充一些MySQL鎖相關的知識點:數據庫鎖設計的初衷是處理并發問題,作為多用戶共享的資源,當出現并發訪問的時候,數據庫需要合理地控制資源的訪問規則,而鎖就是用來實現這些訪問規則的重要數據結構。

      根據加鎖的范圍,MySQL里面的鎖大致可以分成全局鎖、表級鎖和行鎖三類。MySQL中表級別的鎖有兩種:一種是表鎖,一種是元數據鎖(metadata lock,MDL)。

      表鎖是在Server層實現的,ALTER TABLE之類的語句會使用表鎖,忽略存儲引擎的鎖機制。表鎖通過lock tables... read/write來實現,而對于InnoDB來說,一般會采用行級鎖。畢竟鎖住整張表影響范圍太大了。

      另外一個表級鎖是MDL(metadata lock),用于并發情況下維護數據的一致性,保證讀寫的正確性,不需要顯式的使用,在訪問一張表時會被自動加上。

      MySQL鎖表場景

      常見的一種鎖表場景就是有事務操作處于:Waiting for table metadata lock狀態。

      Waiting for table metadata lock

      MySQL在進行alter table等DDL操作時,有時會出現Waiting for table metadata lock的等待場景。

      一旦alter table TableA的操作停滯在Waiting for table metadata lock狀態,后續對該表的任何操作(包括讀)都無法進行,因為它們也會在Opening tables的階段進入到Waiting for table metadata lock的鎖等待隊列。如果核心表出現了鎖等待隊列,就會造成災難性的后果。

      場景一:長事務運行,阻塞DDL,繼而阻塞所有同表的后續操作。

      通過show processlist可以看到表上有正在進行的操作(包括讀),此時alter table語句無法獲取到metadata 獨占鎖,會進行等待。

      場景二:為提交事務,阻塞DDL,繼而阻塞所有同表的后續操作。

      通過show processlist看不到表上有任何操作,但實際上存在有未提交的事務,可以在information_schema.innodb_trx中查看到。在事務沒有完成之前,表上的鎖不會釋放,alter table同樣獲取不到metadata的獨占鎖。

      處理方法:通過 select * from information_schema.innodb_trx\G, 找到未提交事物的sid,然后kill掉,讓其回滾。

      場景三:顯式事務失敗操作獲得鎖,未釋放

      通過show processlist看不到表上有任何操作,在information_schema.innodb_trx中也沒有任何進行中的事務。很可能是因為在一個顯式的事務中,對表進行了一個失敗的操作(比如查詢了一個不存在的字段),這時事務沒有開始,但是失敗語句獲取到的鎖依然有效,沒有釋放。從performance_schema.events_statements_current表中可以查到失敗的語句。

      處理方法:通過performance_schema.events_statements_current找到其sid,kill 掉該session,也可以kill掉DDL所在的session。

      總之,alter table的語句是很危險的(核心是未提交事務或者長事務導致的),在操作之前要確認對要操作的表沒有任何進行中的操作、沒有未提交事務、也沒有顯式事務中的報錯語句。

      如果有alter table的維護任務,在無人監管的時候運行,最好通過lock_wait_timeout設置好超時時間,避免長時間的metedata鎖等待。

      小結

      關于MySQL的鎖表其實還有很多其他場景,我們在實踐的過程中盡量避免鎖表情況的發生,當然這需要一定經驗的支撐。但更重要的是,如果發現鎖表我們要能夠快速的響應,快速的解決問題,避免影響正常業務,避免情況進一步惡化。所以,本文中的解決思路大家一定要收藏或記憶一下,做到有備無患,避免突然狀況下抓瞎。

      基礎鞏固——至少需要多少行代碼才能實現深度復制?
      ? 上一篇 2022-05-07
      服務器端高并發分布式架構的演進之路
      下一篇 ? 2022-05-07
      • 如何在Ubuntu中保留文件系統并備份當前開發板鏡像
        0閱讀 0條評論 個贊
        在Ubuntu保留文件系統或者說備份當前開發板鏡像的需求在不斷增加。比如Ubuntu文件系統需要安裝庫文件的話直接使用apt-get工具就可以下載,但由于需要下載的核心板較多,比較費時間,這時需要將安……
      • 國產核心板全志T507助力消防系統升級
        0閱讀 0條評論 個贊
        9月16日下午,位于湖南長沙市區內的中國電信大樓發生火災,建筑高度218米,現場濃煙滾滾,數十層樓體燃燒劇烈。消防救援人員趕到現場后很快將火勢控制住,目前大樓火勢已被撲滅,所幸未發現人員傷亡。湖南電信……
      • 教大家如何處理Spring Boot易流中的用戶和群體!
        0閱讀 0條評論 個贊
        1.準備工作2.用戶操作2.1添加用戶2.2修改用戶2.3刪除用戶2.4查詢用戶3.組操作3.1添加組3.2修改組3.3刪除組3.4查詢組4.查看表詳情雖然說我們在實際開發中,……
      • 從PG15開始WAL壓縮優化
        0閱讀 0條評論 個贊
        PG15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG15BETA已經發出幾個月了,似乎PG15里令人激動人心的功能不多,不過從長長的新功能列表里,……
      • 深入了解美團葉子發射器開源方案
        0閱讀 0條評論 個贊
        大家好,我是樹哥。之前我們有聊過「如何設計一個分布式ID發號器」,其中有講過4種解決方案,分別是:UUID類雪花算法數據庫自增主鍵Redis原子自增美團以第2、3種解決方案為基礎,開發出……
      發表評論 共有條評論
      用戶名: 密碼:
      驗證碼: 匿名發表
      • 國產超級大腦———rk 3568核心板!
        13閱讀 0條評論 個贊
        從1956年麥卡錫首次提出“人工智能(AI)”的概念至今,人工智能已有66年的歷史,而人工智能真正的崛起卻是在最近的10年。隨著消費電子行業的快速發展和激烈競爭,人工智能再度流行起來,盡管許多企業對A……
      • 轉:Java老了 科特林會取而代之嗎?
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • 面試官:為什么系統不推薦雙寫?
        0閱讀 0條評論 個贊
        某日,阿雄跑去面試!于是有如下情形面試官:"阿雄是吧,做做自我介紹!"阿雄:"我叫阿雄,來自某a國際電商公司!"面試官:"我看你項目里用了elasticsearch,你是怎么同步數據的呢?"阿……
      • 開發者如何在應用后臺直接控制用戶的運動狀態?
        18閱讀 0條評論 個贊
        酷暑終于過去,很多人伴著涼爽的秋風開啟了新一輪的健身計劃。當用戶進行戶外運動或使用跑步機、橢圓機等器械時,他們會希望在運動健康類App里點擊即可開啟運動并記錄運動數據。而對于開發者自己開發的應用來說,……
      • 記錄在線超時的分析和故障排除過程
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • 長文解讀春季交易!隔離?傳播性?網被消滅了!
        9閱讀 0條評論 個贊
        1.什么是事務2.Spring中的事務2.1兩種用法2.2三大基礎設施3.編程式事務4.聲明式事務4.1XML配置4.2Java配置4.3混合配置5.事務屬性5.1隔離性5……
      • Java核心知識系統4: AOP原理和部分應用
        0閱讀 0條評論 個贊
        1概述我們所說的Aop(即面向切面編程),即面向接口,也面向方法,在基于IOC的基礎上實現。Aop最大的特點是對指定的方法進行攔截并增強,這種增強的方式不需要業務代碼進行調整,無需侵入到業務代碼中,……
      • 基于 網絡6的輕量級Webapi框架緊固點
        0閱讀 0條評論 個贊
        大家好,我是等天黑。FastEndpoints是一個基于.NET6開發的開源webapi框架,它可以很好地替代.NETMinimalAPIs和MVC,專門為開發效率而生,帶來了全……
      • 【MySQL】DDL因正在等待表元數據鎖定卡住
        0閱讀 0條評論 個贊
        在數據庫空閑時間,對表做碎片整理:1altertablemy_abcengine=innodb;發現會話被阻塞,顯示狀態是:1Waitingfortablemetadatalock手動斷開alte……
      • 滲透攻擊和防御網絡-簡單的SQL注入
        0閱讀 0條評論 個贊
        1背景京東SRC(SecurityResponseCenter)收錄大量外部白帽子提交的sql注入漏洞,漏洞發生的原因多為sql語句拼接和Mybatis使用不當導致。2手工檢測2.1前置知識……
      • 談ASP.NET核心認證與授權
        0閱讀 0條評論 個贊
        使用asp.netcore開發應用系統過程中,基本上都會涉及到用戶身份的認證,及授權訪問控制,因此了解認證和授權流程也相當重要,下面通過分析asp.netcore框架中的認證和授權的源碼來分析……
      • 一個沒有寫代碼的案例 讓我們看看Flowable為我們提供了哪些功能
        3閱讀 0條評論 個贊
        其實松哥之前已經寫過文章和大家介紹了flowable-ui的玩法了,這是官方提供的一個工具,這個工具不僅可以用來繪制流程圖,還可以用來部署一個流程應用,通過這個流程應用我們可以體驗一把flowa……
      • python入門系列(十)學習Python文件處理
        0閱讀 0條評論 個贊
        文件處理在Python中處理文件的關鍵函數是open()函數。有四種不同的方法(模式)來打開一個文件"r"-讀取-默認值。打開一個文件進行讀取,如果文件不存在則出錯。"a"-Append……
      • SQL Server:觸發器的詳細說明
        0閱讀 0條評論 個贊
        1.概述2.觸發器的分類3.Inserted和Deleted表4.觸發器的執行過程5.創建觸發器6.修改觸發器:7.刪除觸發器:8.查看數據庫中已有觸發器:9.“Insteadof……
      • 卡夫卡數據丟失問題優化總結及重復消費原因分析(二)
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • python的環境,你再也不用愁康達
        1閱讀 0條評論 個贊
        CondaGuideConda簡介conda是一個包,依賴和環境管理工具,適用于多種語言,如:Python,R,Scala,Java,Javascript,C/C++,FORTRAN……
      • 面試官:談談你對mysql事務的認識?
        0閱讀 0條評論 個贊
        引言今天回頭繼續講講數據庫系列的文章。這篇文章屬于mysql數據庫系列,我們來談談事務方面的常見面試題。那么,具體題目有下面這些:1、講講為什么用事務?事務的四大特性?事務的隔離級別知道吧,你們生產……
      • 《2022 分布式數據庫發展趨勢研究報告》的解釋
        9閱讀 0條評論 個贊
        分布式數據庫近年來廣受關注,目前,對分布式數據庫的討論,已經從什么是分布式數據庫,為什么要用分布式數據庫,轉變為怎樣規劃應用分布式數據庫。但分布式數據庫有3條不同的技術路線,這無疑增加了選型難度,到底……
      • SQL SERVER存儲過程學習筆記
        6閱讀 0條評論 個贊
        將常用的或很復雜的工作,預先用SQL語句寫好并用一個指定的名稱存儲起來,那么以后要叫數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。存儲過程的優點1.存儲……
      • SQL Server備份和還原攻略
        0閱讀 0條評論 個贊
        一、知識點完全備份:備份全部選中的文件夾,并不依賴文件的存檔屬性來確定備份那些文件。(在備份過程中,任何現有的標記都被清除,每個文件都被標記為已備份,換言之,清除存檔屬性)。完全備份也叫完整備份。差異……
      最近發布資訊
      更多
      警花高潮嗷嗷叫
      <del id="nnjnj"></del><track id="nnjnj"></track>

      <p id="nnjnj"></p>

      <address id="nnjnj"></address>

        <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

          <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>