婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL刪除表時I/O錯誤的原因分析與解決

MySQL刪除表時I/O錯誤的原因分析與解決

熱門標簽:承德電腦地圖標注 遵義地圖標注app 商家地圖標注哪個好 地圖標注賺錢真假 陜西400電話如何申請 德惠市地圖標注 合肥營銷外呼系統收費 外呼系統從哪買 深圳

問題現象

最近使用sysbench測試MySQL,由于測試時間較長,寫了一個腳本按prepare->run->cleanup的順序在后臺跑著。跑完后察看日志發現一個問題,MySQL服務的錯誤日志中出現多條類似以下信息的報錯:

[ERROR] InnoDB: Trying to do I/O to a tablespace which does not exist. I/O type: read, page: [page id: space=32, page number=57890], I/O length: 16384 bytes。

看起來是I/O出現了錯誤,但MySQL進程并未崩潰,sysbench客戶端也沒有報錯。

發現問題過程

根據報錯的時間記錄以及腳本輸出的各個階段的時間點對比,確定了當時腳本正在執行的命令為:

sysbench --tables=100 --table-size=4000000 --threads=50 --mysql-db=sbtest --time=300 oltp_delete cleanup

重新手動執行一遍這個用例,卻沒有再出現同樣的情況。但是用腳本執行卻依然能夠發現這個錯誤信息。初步懷疑是run和cleanup之間不能間隔太久才會觸發這個問題。由于執行一遍100G數據量的時間較長,重現代價較大,先嘗試縮減用例數據量。將—table-size=4000000修改為2000000,此時執行腳本,又不會觸發這個問題了,最后將—table-size=3000000可以穩定觸發又能減少部分重現時間。為了確認是否間隔太長會導致不能復現,修改腳本在run和cleanup兩個階段之間sleep 10秒,果然不會觸發這個錯誤信息。修改為sleep 5秒則還能觸發,不過報錯條數已有所減少。

問題調查

察看對應版本mysql5.7.22的代碼,發現這個報錯只有一個位置:fil0fil.cc文件的第5578行fil_io()函數內。 直接使用gdb調試,在這個位置加上斷點,并執行可復現的腳本,得到以下堆棧:

(gdb) bt
#0 fil_io (type=..., sync=sync@entry=false, page_id=..., page_size=..., byte_offset=byte_offset@entry=0, len=16384, buf=0x7f9ead544000, message=message@entry=0x7f9ea8ce9c78) at mysql-5.7.22/storage/innobase/fil/fil0fil.cc:5580
#1 0x00000000010f99fa in buf_read_page_low (err=0x7f9ddaffc72c, sync=optimized out>, type=0, mode=optimized out>, page_id=..., page_size=..., unzip=true) at mysql-5.7.22/storage/innobase/buf/buf0rea.cc:195
#2 0x00000000010fc5fa in buf_read_ibuf_merge_pages (sync=sync@entry=false, space_ids=space_ids@entry=0x7f9ddaffc7e0, page_nos=page_nos@entry=0x7f9ddaffc7a0, n_stored=2) at mysql-5.7.22/storage/innobase/buf/buf0rea.cc:834
#3 0x0000000000f3a86c in ibuf_merge_pages (n_pages=n_pages@entry=0x7f9ddaffce30, sync=sync@entry=false) at mysql-5.7.22/storage/innobase/ibuf/ibuf0ibuf.cc:2552
#4 0x0000000000f3a94a in ibuf_merge (sync=false, sync=false, n_pages=0x7f9ddaffce30) at mysql-5.7.22/storage/innobase/ibuf/ibuf0ibuf.cc:2656
#5 ibuf_merge_in_background (full=full@entry=false) at mysql-5.7.22/storage/innobase/ibuf/ibuf0ibuf.cc:2721
#6 0x000000000102bcf4 in srv_master_do_active_tasks () at mysql-5.7.22/storage/innobase/srv/srv0srv.cc:2132
#7 srv_master_thread (arg=optimized out>) at mysql-5.7.22/storage/innobase/srv/srv0srv.cc:2383
#8 0x00007fa003eeddc5 in start_thread () from /lib64/libpthread.so.0
#9 0x00007fa002aab74d in clone () from /lib64/libc.so.6

很明顯這是后臺線程在做insert buffer merge操作。此時發現space->stop_new_ops為true,也就是要處理的頁面所屬的space正在被刪除。為什么會去操作正在被刪除的space呢?這需要調查下insert buffer功能、insert buffer merge的流程以及刪除表的流程。

insert buffer背景知識

insert buffer是一種特殊的數據結構(B+ tree),當輔助索引頁面不在緩沖池中時,它會將更改緩存起來,稍后在頁面被其他讀取操作加載到緩沖池中時合并。MySQL最初引進這個功能的時候只能緩存insert操作,所以叫做insert buffer,現在這些操作可以是 INSERT, UPDATE, or DELETE(DML),所以改叫做change buffer了(本文依然以insert buffer描述),但源碼中依然以ibuf作為標識。這個功能把若干對同一頁面的更新緩存起來,合并為一次性更新操作,減少了IO,并轉化隨機IO為順序IO,這樣可以避免隨機IO帶來性能損耗,提高數據庫的寫性能。

相關insert buffer merge邏輯

當buffer page讀入buffer pool時,就會進行insert buffer merge。主要有幾個場景會出現merge過程:

  • 當頁面被讀入緩沖池時,讀取完成后先進行ibuf的merge,然后頁面才可用;
  • merge操作作為后臺任務執行。 innodb_io_capacity參數可設置InnoDB后臺任務每次merge過程的頁面數上限;
  • 在崩潰恢復期間,當索引頁被讀入緩沖池時,將執行對應頁的insert buffer merge;
  • insert buffer具有持久性,系統崩潰不會導致它失效。重啟后,insert buffer merge操作將恢復正常;
  • 服務器關閉時可使用—innodb-fast-shutdown = 0強制進行ibuf的完全合并。

我們這次的問題很明顯屬于第二種情況。innodb主線程(svr_master_thread)會每隔一秒主動進行一次insert buffer的merge操作。先判斷過去1s之內服務器是否發生過活動(插入元組到頁面、undo表上的行操作等),如果發生過,則merge的最大頁面數為innodb_io_capacity設定的5%。如果沒有則merge的最大頁面數為innodb_io_capacity設定的值。

innodb主線程(svr_master_thread)merge的主流程如下:

  • 主線程從ibuf樹的葉子節點讀取頁號和space號,并記錄到一個二元數組中(未加鎖);
  • 主線程對二元組中space進行檢測是否在表空間緩存中,如不在,說明已經被刪除了,刪除對應ibuf的記錄;
  • 主線程判斷是否對一個正在刪除的space進行異步讀取操作,如果是,報錯,并刪除對應ibuf的記錄,轉到過程2繼續下一個數組元素的判斷;
  • 如果一切判斷正常,主線程發出async io請求,async讀取需要被merge的索引頁面;
  • I/O handler 線程,在接受到完成的async I/O之后,進行merge操作;
  • 進行merge的時候調用fil_space_acquire對space->n_pending_ops進行自增。避免刪除操作并發;
  • 執行完畢后調用fil_space_release對space->n_pending_ops進行自減。

相關刪除表的邏輯

  • 對fil_system->mutex加鎖,設置sp->stop_new_ops = true,標記space正在刪除,不允許對它進行新操作,然后對fil_system->mutex解鎖;
  • 對fil_system->mutex加鎖,檢測space->n_pending_ops,對fil_system->mutex解鎖。如果檢測到大于0,意味著還有依賴的操作未完成,睡眠20ms后重試;
  • 對fil_system->mutex加鎖,檢測space->n_pending_flushes和(*node)->n_pending ,對fil_system->mutex解鎖。如果檢測到大于0,意味著還有依賴的I/O未完成,睡眠20ms后重試;
  • 此時認為已經沒有沖突的操作了,刷出所有臟頁面或刪除所有給定的表空間的頁面;
  • 從表空間緩存刪除指定space的記錄;
  • 刪除對應數據文件。

問題結論

情況很明確了,主線程獲取ibuf的(space,page)的過程與刪除操作執行的過程并沒有鎖保證互斥,只有async I/O完成之后的merge操作與刪除操作才有互斥。如果后臺線程開始ibuf merge并已經執行過了第2步的檢測,但還沒有執行到第3步檢測,此時用戶線程開始做刪除表的操作,并設置好stop_new_ops標記但還沒有執行到第5步刪除表空間緩存,就會出現這個錯誤信息。兩線程的交互如下圖所示:

不出意外的話,在打中斷點時必然有線程在執行對應表的刪除操作。果然我們可以發現如下堆棧:

Thread 118 (Thread 0x7f9de0111700 (LWP 5234)):
#0 0x00007fa003ef1e8e in pthread_cond_broadcast@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x0000000000f82f41 in broadcast (this=0xd452ef8) at mysql-5.7.22/storage/innobase/os/os0event.cc:184
#2 set (this=0xd452ef8) at mysql-5.7.22/storage/innobase/os/os0event.cc:75
#3 os_event_set (event=0xd452ef8) at mysql-5.7.22/storage/innobase/os/os0event.cc:483
#4 0x00000000010ec8a4 in signal (this=optimized out>) at mysql-5.7.22/storage/innobase/include/ut0mutex.ic:105
#5 exit (this=optimized out>) at mysql-5.7.22/storage/innobase/include/ib0mutex.h:690
#6 exit (this=optimized out>) at mysql-5.7.22/storage/innobase/include/ib0mutex.h:961
#7 buf_flush_yield (bpage=optimized out>, buf_pool=optimized out>) at mysql-5.7.22/storage/innobase/buf/buf0lru.cc:405
#8 buf_flush_try_yield (processed=optimized out>, bpage=optimized out>, buf_pool=optimized out>) at mysql-5.7.22/storage/innobase/buf/buf0lru.cc:449
#9 buf_flush_or_remove_pages (trx=optimized out>, flush=optimized out>, observer=optimized out>, id=optimized out>, buf_pool=optimized out>) at mysql-5.7.22/storage/innobase/buf/buf0lru.cc:632
#10 buf_flush_dirty_pages (buf_pool=optimized out>, id=optimized out>, observer=optimized out>, flush=optimized out>, trx=optimized out>) at mysql-5.7.22/storage/innobase/buf/buf0lru.cc:693
#11 0x00000000010f6de7 in buf_LRU_remove_pages (trx=0x0, buf_remove=BUF_REMOVE_FLUSH_NO_WRITE, id=55, buf_pool=0x31e55e8) at mysql-5.7.22/storage/innobase/buf/buf0lru.cc:893
#12 buf_LRU_flush_or_remove_pages (id=id@entry=55, buf_remove=buf_remove@entry=BUF_REMOVE_FLUSH_NO_WRITE, trx=trx@entry=0x0) at mysql-5.7.22/storage/innobase/buf/buf0lru.cc:951
#13 0x000000000114e488 in fil_delete_tablespace (id=id@entry=55, buf_remove=buf_remove@entry=BUF_REMOVE_FLUSH_NO_WRITE) at mysql-5.7.22/storage/innobase/fil/fil0fil.cc:2800
#14 0x0000000000fe77bd in row_drop_single_table_tablespace (trx=0x0, is_encrypted=false, is_temp=false, filepath=0x7f9d7c209f38 "./sbtest/sbtest25.ibd", tablename=0x7f9d7c209dc8 "sbtest/sbtest25", space_id=55) at mysql-5.7.22/storage/innobase/row/row0mysql.cc:4189
#15 row_drop_table_for_mysql (name=name@entry=0x7f9de010e020 "sbtest/sbtest25", trx=trx@entry=0x7f9ff9515750, drop_db=optimized out>, nonatomic=optimized out>, nonatomic@entry=true, handler=handler@entry=0x0) at mysql-5.7.22/storage/innobase/row/row0mysql.cc:4741
#16 0x0000000000f092f3 in ha_innobase::delete_table (this=optimized out>, name=0x7f9de010f5e0 "./sbtest/sbtest25") at mysql-5.7.22/storage/innobase/handler/ha_innodb.cc:12539
#17 0x0000000000801a30 in ha_delete_table (thd=thd@entry=0x7f9d7c1f6910, table_type=table_type@entry=0x2ebd100, path=path@entry=0x7f9de010f5e0 "./sbtest/sbtest25", db=db@entry=0x7f9d7c00e560 "sbtest", alias=0x7f9d7c00df98 "sbtest25", generate_warning=generate_warning@entry=true) at mysql-5.7.22/sql/handler.cc:2586
#18 0x0000000000d0a6af in mysql_rm_table_no_locks (thd=thd@entry=0x7f9d7c1f6910, tables=tables@entry=0x7f9d7c00dfe0, if_exists=true, drop_temporary=false, drop_view=drop_view@entry=false, dont_log_query=dont_log_query@entry=false) at mysql-5.7.22/sql/sql_table.cc:2546
#19 0x0000000000d0ba58 in mysql_rm_table (thd=thd@entry=0x7f9d7c1f6910, tables=tables@entry=0x7f9d7c00dfe0, if_exists=optimized out>, drop_temporary=optimized out>) at mysql-5.7.22/sql/sql_table.cc:2196
#20 0x0000000000c9d90b in mysql_execute_command (thd=thd@entry=0x7f9d7c1f6910, first_level=first_level@entry=true) at mysql-5.7.22/sql/sql_parse.cc:3589
#21 0x0000000000ca1edd in mysql_parse (thd=thd@entry=0x7f9d7c1f6910, parser_state=parser_state@entry=0x7f9de01107a0) at mysql-5.7.22/sql/sql_parse.cc:5582
#22 0x0000000000ca2a20 in dispatch_command (thd=thd@entry=0x7f9d7c1f6910, com_data=com_data@entry=0x7f9de0110e00, command=COM_QUERY) at mysql-5.7.22/sql/sql_parse.cc:1458
#23 0x0000000000ca4377 in do_command (thd=thd@entry=0x7f9d7c1f6910) at mysql-5.7.22/sql/sql_parse.cc:999
#24 0x0000000000d5ed00 in handle_connection (arg=arg@entry=0x10b8e910) at mysql-5.7.22/sql/conn_handler/connection_handler_per_thread.cc:300
#25 0x0000000001223d74 in pfs_spawn_thread (arg=0x10c48f40) at mysql-5.7.22/storage/perfschema/pfs.cc:2190
#26 0x00007fa003eeddc5 in start_thread () from /lib64/libpthread.so.0
#27 0x00007fa002aab74d in clone () from /lib64/libc.so.6

解決辦法

為buf_read_ibuf_merge_pages、buf_read_page_low、fil_io新增一個參數ignore_missing_space。表示忽略正在刪除的space,默認為false,當ibuf_merge_pages調用的時候置為true。在fil_io報錯處額外判斷該參數是否為true,是則不報錯,繼續其他流程。

或者直接在buf_read_ibuf_merge_pages調用buf_read_page_low時傳入IORequest::IGNORE_MISSING參數。

具體代碼參考MariaDB commit:8edbb1117a9e1fd81fbd08b8f1d06c72efe38f44

影響版本

察看相關信息,這個問題是修改Bug#19710564時刪除表空間版本引入的。

  • MySQL Community Server 5.7.6引入,版本5.7.22尚未修復,版本8.0.0已修復。
  • MariaDB Server 10.2受影響。MariaDB Server 10.2.9, 10.3.2已修復

優化建議

可優化一下性能:在buf_read_ibuf_merge_pages中記錄下出錯的space id,循環的時候判斷下一個page的space id,如果space id是相同的,直接刪除對應ibuf的記錄(當前分配的最大space id記錄在系統表空間,space id占4個字節,低于0xFFFFFFF0UL,分配時讀取系統表空間保存的值,然后加一,具有唯一性)。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • MySQL刪除表操作實現(delete、truncate、drop的區別)
  • mysql查找刪除表中重復數據方法總結
  • MySql刪除表中一行的實操方法
  • mysql創建刪除表的實例詳解
  • MySQL刪除表的時候忽略外鍵約束的簡單實現
  • 刪除mysql數據表如何操作

標簽:新余 贛州 巴中 揚州 三門峽 南陽 商丘 貴州

巨人網絡通訊聲明:本文標題《MySQL刪除表時I/O錯誤的原因分析與解決》,本文關鍵詞  MySQL,刪除,表時,錯誤,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL刪除表時I/O錯誤的原因分析與解決》相關的同類信息!
  • 本頁收集關于MySQL刪除表時I/O錯誤的原因分析與解決的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲伦理在线免费看| 成人免费va视频| 中文字幕不卡在线| 日韩三级伦理片妻子的秘密按摩| 丁香啪啪综合成人亚洲小说| 五月天国产精品| 亚洲国产一区二区a毛片| 国产精品无圣光一区二区| 久久免费精品国产久精品久久久久| 欧美区视频在线观看| 欧美日韩视频不卡| 欧美日韩一级黄| 日韩欧美国产电影| 欧美不卡在线视频| 亚洲女女做受ⅹxx高潮| 青青草91视频| 一区二区三区不卡视频在线观看| 26uuu色噜噜精品一区| 久久久精品欧美丰满| 精品美女一区二区三区| 欧美一二三区在线| 国产精品全国免费观看高清| 国产精品麻豆久久久| 亚洲一区二区三区三| 久久99精品久久只有精品| 91麻豆.com| 日韩一区二区电影网| 国产精品色哟哟| 老司机精品视频一区二区三区| 成人午夜电影久久影院| 色噜噜狠狠成人网p站| 欧美va亚洲va香蕉在线| 亚洲自拍偷拍综合| kk眼镜猥琐国模调教系列一区二区| 欧美日韩一区二区三区四区五区 | 亚洲精品国产精华液| 一区二区三区波多野结衣在线观看| 国产精品萝li| 成人aa视频在线观看| www国产成人免费观看视频 深夜成人网| 亚洲欧美在线视频观看| 精品一区二区三区免费| 色偷偷久久人人79超碰人人澡| 日韩网站在线看片你懂的| 精品一区二区三区在线观看 | 久久精品一区二区三区不卡牛牛| 亚洲尤物视频在线| 成人av资源站| 国产精品家庭影院| 成人的网站免费观看| 成人av电影在线| 亚洲日本免费电影| 欧美视频一区在线| 亚洲午夜激情av| 欧美一级理论片| 麻豆成人免费电影| 精品国产在天天线2019| 激情综合亚洲精品| 欧美一区二区三区性视频| 日本欧洲一区二区| 91女厕偷拍女厕偷拍高清| 中文字幕一区视频| 在线观看欧美精品| 偷拍一区二区三区| 日韩你懂的在线观看| 一区二区三区毛片| 久久久亚洲精品石原莉奈| 国产精品一区2区| 中文字幕一区二区三区在线观看| 欧美日韩久久久| 国内不卡的二区三区中文字幕 | 国产精品日产欧美久久久久| 欧美精品一卡两卡| 色噜噜夜夜夜综合网| 亚洲第一搞黄网站| www.欧美日韩国产在线| 久久综合一区二区| 国产麻豆日韩欧美久久| 麻豆国产欧美日韩综合精品二区| 亚洲精品福利视频网站| 久久久青草青青国产亚洲免观| 91在线一区二区三区| 国产成人啪午夜精品网站男同| 免费观看在线综合色| 蜜臀精品久久久久久蜜臀 | 成人性生交大片免费看中文网站| 亚洲国产精品自拍| 亚洲成人黄色影院| 亚洲五月六月丁香激情| 亚洲欧美日韩国产另类专区| 国产亚洲一区字幕| 国产成人综合亚洲网站| 国产91精品在线观看| 日韩精品三区四区| 亚洲欧美中日韩| 亚洲伦在线观看| 男男成人高潮片免费网站| 亚洲成人你懂的| 日本在线播放一区二区三区| 亚洲一区二区三区四区在线免费观看| 国产女主播在线一区二区| 2021国产精品久久精品| 欧美r级在线观看| 久久亚洲精精品中文字幕早川悠里| 欧美日韩国产高清一区二区| 91免费观看视频| 欧美视频在线播放| 国产精品伦理在线| 亚洲黄色尤物视频| 蜜桃传媒麻豆第一区在线观看| 日韩综合在线视频| 成人手机在线视频| 欧美一二三区在线| 中文字幕一区二区三区四区| 亚洲欧美另类小说| 免费看精品久久片| 91论坛在线播放| 精品国产91久久久久久久妲己| 国产视频一区在线观看| 亚洲精选视频在线| 精品夜夜嗨av一区二区三区| 亚洲图片欧美综合| 成人一区二区三区视频| 欧美在线观看视频一区二区三区| 欧美情侣在线播放| 国产无一区二区| 成人ar影院免费观看视频| 91精品国产91综合久久蜜臀| 亚洲人一二三区| 国产一区二区三区在线观看免费视频| 国产mv日韩mv欧美| 亚洲三级在线观看| 成人v精品蜜桃久久一区| 欧美白人最猛性xxxxx69交| 一区av在线播放| 一本到高清视频免费精品| 亚洲国产精品自拍| 欧洲国内综合视频| 一区二区三区免费看视频| 不卡一区二区中文字幕| 99麻豆久久久国产精品免费 | 欧美综合一区二区| 一区二区三区在线视频播放| 国产.精品.日韩.另类.中文.在线.播放| 日韩一区和二区| 激情久久五月天| 9191精品国产综合久久久久久| 日韩激情视频网站| 亚洲国产成人tv| 国产成人精品影视| 久久久久久免费毛片精品| 国产精品99久久不卡二区| 91精品国产美女浴室洗澡无遮挡| 水蜜桃久久夜色精品一区的特点| 欧美区在线观看| 国产一区二区主播在线| 国产精品久久久久久久裸模| 9色porny自拍视频一区二区| 亚洲欧美日韩在线播放| 欧美人成免费网站| 国产精品一区二区视频| 一区二区在线观看视频| 欧美mv日韩mv国产网站app| 亚洲国产cao| 亚洲一区二区黄色| 国产精品对白交换视频 | 欧美日韩一区二区三区高清| 国产又黄又大久久| 国产高清久久久久| 免费观看30秒视频久久| 一区二区三区在线高清| 欧美一区二区视频网站| 欧美性淫爽ww久久久久无| 欧美亚洲高清一区二区三区不卡| 国产在线不卡一卡二卡三卡四卡| 亚洲激情欧美激情| 亚洲人精品午夜| 精品国产乱码久久久久久久| 国产午夜一区二区三区| 欧美大片在线观看一区| 欧美日韩不卡视频| 欧美一级夜夜爽| 欧美成人伊人久久综合网| 日韩视频一区二区| 91精品国产欧美一区二区| 国产精品区一区二区三区 | 亚洲国产裸拍裸体视频在线观看乱了| 一区二区三区四区国产精品| 一区二区三区四区高清精品免费观看| 国产欧美日韩在线| 国产精品国产三级国产三级人妇| 欧美大片拔萝卜| 一区二区三区精品视频| 日日骚欧美日韩| 国产精品456露脸| 色吊一区二区三区| 中文在线免费一区三区高中清不卡| 亚洲国产精品黑人久久久| 亚洲人成精品久久久久久| 日韩精品91亚洲二区在线观看 |