日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

怎么把mysql表里的时间往后推移_Mysql实战45讲笔记:2、更新语句的执行以及日志...

發布時間:2023/12/19 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎么把mysql表里的时间往后推移_Mysql实战45讲笔记:2、更新语句的执行以及日志... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

mysql> update T set c=c+1 where ID=2;

執行語句前要先連接數據庫,這是連接器的工作。

前面我們說過,在一個表上有更新的時候,跟這個表有關的查詢緩存會失效,所以這條語句就會把表T上所有緩存結果都清空。這也就是我們一般不建議使用查詢緩存的原因。

接下來,分析器會通過詞法和語法解析知道這是一條更新語句。優化器決定要使用ID這個索引。然后,執行器負責具體執行,找到這一行,然后更新。

與查詢流程不一樣的是,更新流程還涉及兩個重要的日志模塊,它們正是我們今天要討論的主角:redo log(重做日志)和 binlog(歸檔日志)。

重要的日志模塊:redo log

當有一條記錄需要更新的時候,InnoDB引擎就會先把記錄寫到redo log(粉板)里面,并更新內存,這個時候更新就算完成了。同時,InnoDB引擎會在適當的時候,將這個操作記錄更新到磁盤里面,而這個更新往往是在系統比較空閑的時候做。 InnoDB的redo log是固定大小的,比如可以配置為一組4個文件,每個文件的大小是1GB,那么總共就可以記錄4GB的操作。從頭開始寫,寫到末尾就又回到開頭循環寫,如下面這個圖所示。

write pos是當前記錄的位置,一邊寫一邊后移,寫到第3號文件末尾后就回到0號文件開頭。checkpoint是當前要擦除的位置,也是往后推移并且循環的,擦除記錄前要把記錄更新到數據文件。

write pos和checkpoint之間的是還空著的部分,可以用來記錄新的操作。如果write pos追上checkpoint,表示滿了,這時候不能再執行新的更新,得停下來先擦掉一些記錄,把checkpoint推進一下。

有了redo log,InnoDB就可以保證即使數據庫發生異常重啟,之前提交的記錄都不會丟失,這個能力稱為crash-safe。

重要的日志模塊:binlog

MySQL整體來看,其實就有兩塊:一塊是Server層,它主要做的是MySQL功能層面的事情;還有一塊是引擎層,負責存儲相關的具體事宜。上面我們聊到的redo log是InnoDB引擎特有的日志,而Server層也有自己的日志,稱為binlog(歸檔日志)。

最開始MySQL里并沒有InnoDB引擎。MySQL自帶的引擎是MyISAM,但是MyISAM沒有crash-safe的能力,binlog日志只能用于歸檔。而InnoDB是另一個公司以插件形式引入MySQL的,既然只依靠binlog是沒有crash-safe能力的,所以InnoDB使用另外一套日志系統——也就是redo log來實現crash-safe能力。

這兩種日志有以下三點不同:

  • redo log是InnoDB引擎特有的;binlog是MySQL的Server層實現的,所有引擎都可以使用。
  • redo log是物理日志,記錄的是“在某個數據頁上做了什么修改”;binlog是邏輯日志,記錄的是這個語句的原始邏輯,比如“給ID=2這一行的c字段加1 ”。
  • redo log是循環寫的,空間固定會用完;binlog是可以追加寫入的。“追加寫”是指binlog文件寫到一定大小后會切換到下一個,并不會覆蓋以前的日志。
  • 有了對這兩個日志的概念性理解,我們再來看執行器和InnoDB引擎在執行這個簡單的update語句時的內部流程:

  • 執行器先找引擎取ID=2這一行。ID是主鍵,引擎直接用樹搜索找到這一行。如果ID=2這一行所在的數據頁本來就在內存中,就直接返回給執行器;否則,需要先從磁盤讀入內存,然后再返回。
  • 執行器拿到引擎給的行數據,把這個值加上1,比如原來是N,現在就是N+1,得到新的一行數據,再調用引擎接口寫入這行新數據。
  • 引擎將這行新數據更新到內存中,同時將這個更新操作記錄到redo log里面,此時redo log處于prepare狀態。然后告知執行器執行完成了,隨時可以提交事務。
  • 執行器生成這個操作的binlog,并把binlog寫入磁盤。
  • 執行器調用引擎的提交事務接口,引擎把剛剛寫入的redo log改成提交(commit)狀態,更新完成。
  • 圖中淺色框表示是在InnoDB內部執行的,深色框表示是在執行器中執行的。

    最后三步看上去有點“繞”,將redo log的寫入拆成了兩個步驟:prepare和commit,這就是"兩階段提交"

    tip

    • redo log用于保證crash-safe能力。innodb_flush_log_at_trx_commit這個參數設置成1的時候,表示每次事務的redo log都直接持久化到磁盤。這個參數建議設置成1,這樣可以保證MySQL異常重啟之后數據不丟失。
    • sync_binlog這個參數設置成1的時候,表示每次事務的binlog都持久化到磁盤。這個參數建議設置成1,這樣可以保證MySQL異常重啟之后binlog不丟失。
    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的怎么把mysql表里的时间往后推移_Mysql实战45讲笔记:2、更新语句的执行以及日志...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。