亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL案例-初步恢復: alter引起的從庫無限Crash

發布時間:2020-08-15 20:13:13 來源:ITPUB博客 閱讀:573 作者:wangwenan6 欄目:MySQL數據庫
-------------------------------------------------------------------------------------------------正文---------------------------------------------------------------------------------------------------------------

場景 : 
Crash發生時的數據庫版本: MySQL-5.7.17, 從庫在同步到某一個alter語句的時候發生了Crash, 并且在重啟進行Crash Recovery的時候不斷觸發同一個錯誤導致Crash;

結論 :
只讀業務臨時切換到另外一個只讀實例, 且重新做一個從庫給業務用;

重點! : 
解決問題的辦法肯定不是把庫恢復起來,
而是重新做一個, 所以本文記錄的操作主要目的做實踐和嘗試, 生產環境上請謹慎操作;


場景:
生產環境的場景, 屏蔽一些敏感信息;

首先截取Error log中比較的重要信息:

點擊(此處)折疊或打開

  1. 2017-05-25 14:10:23 0x7f9b5b927700 InnoDB: Assertion failure in thread 140305232983808 in file fsp0fsp.cc line 2108
  2. InnoDB: Failing assertion: frag_n_used > 0
  3. ......
  4. /usr/sbin/mysqld(_Z14fseg_free_stepPhbP5mtr_t+0x36e)[0x11d073e]
  5. ......
  6. /usr/sbin/mysqld(_Z23trx_undo_insert_cleanupP14trx_undo_ptr_tb+0x16c)[0x1100b9c]
  7. ......
  8. /usr/sbin/mysqld(_Z19innobase_commit_lowP5trx_t+0x17)[0xf6a0e7]
  9. /usr/sbin/mysqld(_ZN15Query_log_event14do_apply_eventEPK14Relay_log_infoPKcm+0x68d)[0xdf4c1d]
  10. /usr/sbin/mysqld(_Z27slave_worker_exec_job_groupP12Slave_workerP14Relay_log_info+0x293)[0xe52353]
  11. ......
  12. /usr/sbin/mysqld(handle_slave_worker+0x363)[0xe34f73]
  13. ......
  14. Trying to get some variables.
  15. Some pointers may be invalid and cause the dump to abort.
  16. Query (xxxxxxxxx): alter table tb1 add primary key(`col1`,`col2`,`col3`)
  17. Connection ID (thread ID): 129443
  18. Status: NOT_KILLED
  19. ......
  20. 2017-05-25T14:10:24.858719+08:00 0 [Note] InnoDB: Ignoring data file './dbname/tb0.ibd' with space ID 375, since the redo log references ./dbname/tb0.ibd with space ID 280.
  21. 2017-05-25T14:10:24.860628+08:00 0 [Note] InnoDB: Ignoring data file './dbname/tb1.ibd' with space ID 374, since the redo log references ./dbname/tb1.ibd with space ID 279.
  22. ......
  23. 2017-05-25T14:10:44.635655+08:00 0 [Note] InnoDB: Ignoring data file './dbname/#sql-7b4e1_9f3a1.ibd' with space ID 375. Another data file called ./dbname/tb0.ibd exists with the same space ID.
  24. ......
  25. 2017-05-25T14:10:39.845947+08:00 0 [Note] InnoDB: Ignoring data file './dbname/#sql-7b4e1_9f3a1.ibd' with space ID 374. Another data file called ./report_gamein/t30741_hs_g47_day.ibd exists with the same space ID.
  26. ......
  27. 2017-05-25T14:11:02.972181+08:00 0 [Note] Starting crash recovery...
  28. 2017-05-25T14:11:02.972227+08:00 0 [Note] Crash recovery finished.
  29. 2017-05-25T14:11:40.547210+08:00 0 [Note] InnoDB: Rollback of trx with id 3377056858 completed
  30. 2017-05-25T14:11:40.554385+08:00 0 [Note] InnoDB: Rollback of non-prepared transactions completed

  31. ......
  32. 2017-05-25T14:11:03.752024+08:00 0 [Warning] Recovery from master pos 43851595 and file binlog.006933 for channel 'amaster'. Previous relay log pos and relay log file had been set to 43851818, /home/mysql/log/relaylog/relaylog-amaster_3537.020527 respectively.
  33. ......
  34. 2017-05-25T14:11:03.817050+08:00 0 [Warning] Recovery from master pos 789680988 and file binlog.027468 for channel 'bmaster'. Previous relay log pos and relay log file had been set to 789681243, /home/mysql/log/relaylog/relaylog-bmaster_3637.020768 respectively.
  35. ......
  36. 2017-05-25T14:11:04.353863+08:00 0 [Note] /usr/sbin/mysqld: ready for connections.
  37. Version: '5.7.17-log'  socket: '/home/mysql/data/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
  38. 2017-05-25 14:11:04 0x7f10762de700  InnoDB: Assertion failure in thread 139708678924032 in file fsp0fsp.cc line 2108
    InnoDB: Failing assertion: frag_n_used > 0
  39. ......

截取出來的是第一次遇到問題, mysql重啟進行Crash Recovery的日志;

可以從紅色標記的地方看到, 其實第一次重啟的時候, crash recovery就已經完成了, 而且mysqld進程也已經ready for connections,
但是馬上就觸發了同樣的問題, 導致mysql又發生了Crash, 而且mysqld_safe也跟著"消失"了;

在之后的重啟嘗試中, 每次在Crash之前, 都有這么一行信息:

點擊(此處)折疊或打開

  1. 2017-05-25T15:25:33.025244+08:00 0 [Note] InnoDB: Cleaning up trx with id 3377057419

結合堆棧信息中顯示出來的fsp0fsp.cc line 2108, 在源代碼中找到這一行(紅色標注),


點擊(此處)折疊或打開

  1. fsp_free_page(
            const page_id_t&        page_id,
            const page_size_t&      page_size,
            mtr_t*                  mtr)

  2. ......
  3. if (state == XDES_FULL_FRAG) {
  4.                 /* The fragment was full: move it to another list */
  5.                 flst_remove(header + FSP_FULL_FRAG, descr + XDES_FLST_NODE,
  6.                             mtr);
  7.                 xdes_set_state(descr, XDES_FREE_FRAG, mtr);
  8.                 flst_add_last(header + FSP_FREE_FRAG, descr + XDES_FLST_NODE,
  9.                               mtr);
  10.                 mlog_write_ulint(header + FSP_FRAG_N_USED,
  11.                                  frag_n_used + FSP_EXTENT_SIZE - 1,
  12.                                  MLOG_4BYTES, mtr);
  13.         } else {
  14.                 ut_a(frag_n_used > 0);
  15.                 mlog_write_ulint(header + FSP_FRAG_N_USED, frag_n_used - 1,
  16.                                  MLOG_4BYTES, mtr);
  17.         }

結合日志中的cleanup階段的log和阿里的mysql內核月報中對innodb的分析可以知道, alter語句在drop 索引的時候會調用到這個方法的, 用來回收數據頁/返還表空間;

所以問題基本確定就是alter語句引起了這次mysql的Crash, 且每次重啟的時候都在同樣一個位置報錯說明這個alter ... drop index的數據頁并沒有完成cleanup, 每次重啟的時候都在嘗試, 然后觸發Crash;

由于觸發Crash的階段始終都處于Crash Recovery之后,  所以推斷mysql可能是在處于rollback階段, 所以設置了
innodb_force_recovery = 3,
發現跳過rollback以后數據庫正常的起來了~\(≧▽≦)/~

那么事情就好辦了, innodb_force_recovery = 3的時候是可以對表進行操作的, 比如說.....drop.....

在第一次Crash的
日志里面, 可以看到tb0和tb1的alter可能都有問題, 因為alter產生的中間結果表還在data目錄下;
所以為了不再讓rollback觸發alter語句cleanup的問題, 最簡單的辦法就是......drop掉這兩個表~\(≧▽≦)/~

_(:з」∠)_ 當然不能直接drop...先dump出來.....
不過實際操作之前, 先確認一下當前數據庫的狀態:

從庫復現主庫的事務, 停留在這個階段: 8fc6463a-f9b1-11e6-b218-ce0e1b052154:1-2241902370:2241902372-2241902383;
通過查看relaylog, 找到遺漏的2241902371事務, 正好是alter語句
MySQL案例-初步恢復: alter引起的從庫無限Crash
MySQL案例-初步恢復: alter引起的從庫無限Crash

這里面有幾個比較重要的信息, 除了GTID和SQL以外, 還有一個: last_committed=91691

再看看2241902383之后的事務是什么
MySQL案例-初步恢復: alter引起的從庫無限Crash

那么就基本確認了, 當前的狀態是91692的事務組中, 除了2241902371以外全部提交成功, 而下一個事務組91693還沒有開始;

再查一下有問題的tb0和tb1, 確認2241902371事務對應的表結構確實是沒有主鍵, 那么說明這個語句確實沒有執行, 所以目前的庫應該是處于一致的狀態的(Crash Recovery成功了是大前提)
我們開始著手讓mysql啟動起來~


_(:з」∠)_ 先把tb0和tb1都dump出來.....
~\(≧▽≦)/~ 然后drop掉~(如果之后需要重建同步的話, 記得關掉sql_log_bin, 不要把drop語句寫到binlog)
(⊙﹏⊙)再去掉配置文件的
innodb_force_recovery, 重啟mysql.....

done, 數據庫正常起來了~

之后就簡單了, 重新把這兩張表導入到數據庫, 再開啟同步, 看看同步的狀態:
MySQL案例-初步恢復: alter引起的從庫無限Crash

可以看到缺少的2241902371事務已經重新拉取下來了, 而且2241902384和之后的事務也正常的拉取和執行了~

等到同步同步跟上的時候, 就可以驗證一下數據是不是真的一致了~

PS: 由于在重啟的過程中, MTR和Crash Recovery都成功了, 而且同步狀態正常, GTID的事務號也保持了連續, 從個人角度來看, 更加傾向于數據是一致的~
PPS: 這個庫能交付給用戶繼續使用么? 雖然不推薦就這么交付回去, 不過用戶說能用, 那就能用~
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

包头市| 黎城县| 河北省| 沁阳市| 东丽区| 岚皋县| 施甸县| 黄冈市| 衢州市| 页游| 日喀则市| 米林县| 东乌珠穆沁旗| 德清县| 和田县| 金溪县| 江达县| 五河县| 钟山县| 贡山| 宁德市| 措美县| 安达市| 鄂托克前旗| 本溪| 沧源| 连山| 马边| 博客| 西昌市| 灵宝市| 乐至县| 高陵县| 柏乡县| 左权县| 龙山县| 永嘉县| 霍州市| 社会| 桐城市| 临沂市|