一文搞懂Mysql數(shù)據(jù)庫中的各種日志
1.binlog(二進(jìn)制日志)
MySQL中的binlog,全稱為Binary Log(二進(jìn)制日志),是MySQL數(shù)據(jù)庫的一種日志文件,主要記錄了數(shù)據(jù)庫中所有修改了數(shù)據(jù)的SQL語句或者二進(jìn)制的事件,用來保證數(shù)據(jù)的一致性與恢復(fù)。具體來說,binlog記錄了所有的DDL(Data Definition Language,數(shù)據(jù)定義語言)和DML(Data Manipulation Language,數(shù)據(jù)操作語言)語句,但不包括純查詢語句(如SELECT)和一些無需修改數(shù)據(jù)的操作(如SHOW等)。binlog是MySQL復(fù)制和數(shù)據(jù)恢復(fù)的基礎(chǔ),具有以下幾個(gè)主要作用。
(1)數(shù)據(jù)復(fù)制:binlog是MySQL實(shí)現(xiàn)主從復(fù)制的基礎(chǔ)。在主從復(fù)制架構(gòu)中,主服務(wù)器會(huì)記錄所有修改數(shù)據(jù)的操作到binlog中,而從服務(wù)器通過讀取這些binlog記錄并在自己的數(shù)據(jù)庫上重新執(zhí)行這些操作,從而實(shí)現(xiàn)與主服務(wù)器數(shù)據(jù)的同步。
(2)數(shù)據(jù)恢復(fù):在數(shù)據(jù)庫發(fā)生故障時(shí),可以使用binlog來進(jìn)行點(diǎn)的恢復(fù)。例如,如果數(shù)據(jù)庫在某個(gè)時(shí)間點(diǎn)之后的數(shù)據(jù)因?yàn)椴僮麇e(cuò)誤或者其他原因被破壞,可以通過恢復(fù)到最近的備份,然后使用binlog中記錄的日志,重新執(zhí)行從備份時(shí)間點(diǎn)到故障時(shí)間點(diǎn)之間的所有操作,從而實(shí)現(xiàn)數(shù)據(jù)的恢復(fù)。
(3)審計(jì):通過分析binlog的內(nèi)容,可以查看在某個(gè)時(shí)間段內(nèi)數(shù)據(jù)庫中發(fā)生了哪些數(shù)據(jù)修改操作,這對(duì)于跟蹤數(shù)據(jù)變更歷史、進(jìn)行安全審計(jì)等都非常有用。
(4)增量備份:利用binlog可以實(shí)現(xiàn)增量備份,即備份自上次備份以來發(fā)生的所有數(shù)據(jù)變更。這種備份方式比完整備份更高效,尤其是在數(shù)據(jù)量大的情況下。
上圖表示了binlog 的四種讀寫作用場景,即數(shù)據(jù)恢復(fù)、數(shù)據(jù)復(fù)制(數(shù)據(jù)備份)、數(shù)據(jù)庫分布式讀寫、數(shù)據(jù)庫主從讀寫分離。
為了有效地使用binlog,需要在MySQL的配置文件(如my.cnf
或my.ini
)中開啟binlog,并配置相關(guān)參數(shù),比如:
log_bin
:啟用binlog,并設(shè)置binlog文件的名稱。max_binlog_size
:設(shè)置binlog文件的最大大小。binlog_format
:設(shè)置binlog的格式,可以是STATEMENT
(基于SQL語句)、ROW
(基于行的變化)或MIXED
(混合模式)。expire_logs_days:
管理binlog還需要注意其大小,因?yàn)殡S著時(shí)間的推移,binlog可能會(huì)占用大量磁盤空間。因此,需要定期清理或歸檔舊的binlog文件,以釋放空間并保持系統(tǒng)性能??梢酝ㄟ^設(shè)置expire_logs_days
參數(shù)來自動(dòng)刪除過期的binlog文件。
Statement每一條會(huì)修改數(shù)據(jù)的sql都會(huì)記錄在binlog中。
優(yōu)點(diǎn):不需要記錄每一行的變化,減少了binlog日志量,節(jié)約了IO,提高性能。
Row5.1.5版本的MySQL才開始支持row level 的復(fù)制,它不記錄sql語句上下文相關(guān)信息,僅保存哪條記錄被修改。
優(yōu)點(diǎn):row level 的日志內(nèi)容會(huì)非常清楚的記錄下每一行數(shù)據(jù)修改的細(xì)節(jié)。而且不會(huì)出現(xiàn)某些特定情況下的存儲(chǔ)過程,或function,以及trigger的調(diào)用和觸發(fā)無法被正確復(fù)制的問題。
Mixed從5.1.8版本開始,MySQL提供了Mixed格式,實(shí)際上就是Statement與Row的結(jié)合。
2.錯(cuò)誤日志
MySQL的錯(cuò)誤日志是MySQL數(shù)據(jù)庫中用于記錄數(shù)據(jù)庫啟動(dòng)、運(yùn)行或停止時(shí)出現(xiàn)的問題的日志文件。這些記錄包括MySQL服務(wù)器的各種錯(cuò)誤、警告和重要的系統(tǒng)信息,對(duì)數(shù)據(jù)庫管理員進(jìn)行故障排查和性能調(diào)優(yōu)非常有用。錯(cuò)誤日志具有以下幾個(gè)重要作用。
(1)故障診斷
- 錯(cuò)誤日志提供了關(guān)于MySQL服務(wù)器運(yùn)行中發(fā)生的錯(cuò)誤的詳細(xì)信息,如啟動(dòng)失敗、連接錯(cuò)誤、語法錯(cuò)誤等。
- 管理員可以通過查看錯(cuò)誤日志中的錯(cuò)誤信息,快速定位問題的原因,進(jìn)而采取相應(yīng)的解決措施。
(2)系統(tǒng)檢控
- 通過定期檢查錯(cuò)誤日志,可以及時(shí)發(fā)現(xiàn)并處理潛在的問題,如配置錯(cuò)誤、性能瓶頸或安全風(fēng)險(xiǎn)。
- 錯(cuò)誤日志中的信息可以幫助管理員了解系統(tǒng)的運(yùn)行狀態(tài),從而進(jìn)行優(yōu)化和調(diào)整。
(3)恢復(fù)參考
- 在發(fā)生系統(tǒng)崩潰或意外中斷的情況下,錯(cuò)誤日志可以提供崩潰前的最后活動(dòng)記錄,這對(duì)于數(shù)據(jù)恢復(fù)和系統(tǒng)重啟有重要參考價(jià)值。
啟用錯(cuò)誤日志
在MySQL的配置文件(通常是my.cnf
或my.ini
)中,可以設(shè)置錯(cuò)誤日志的文件路徑:
[mysqld] log_error = /path/to/your/log-file.err
如果沒有明確設(shè)置log_error
選項(xiàng),MySQL通常會(huì)在數(shù)據(jù)目錄中自動(dòng)創(chuàng)建一個(gè)錯(cuò)誤日志文件。錯(cuò)誤日志的查看可以直接通過訪問其文件路徑來進(jìn)行,或者通過相關(guān)的管理工具來查看。隨著運(yùn)行時(shí)間的增長,錯(cuò)誤日志的大小可能會(huì)增長很快,特別是在出現(xiàn)很多錯(cuò)誤或警告的情況下。定期輪換和備份日志文件是一個(gè)好習(xí)慣,可以使用如logrotate
這樣的工具來幫助管理日志文件。
3.事務(wù)日志
mysql的事務(wù)有 4 種特性:原子性、一致性、隔離性和持久性。那么事務(wù)的四種特性到底是基于什么機(jī)制實(shí)現(xiàn)呢?
事務(wù)的隔離性由鎖機(jī)制實(shí)現(xiàn)。
而事務(wù)的原子性、一致性和持久性由事務(wù)的 redo 日志和 undo 日志來保證。
- Redo Log:又稱為重做日志,提供再寫入操作,恢復(fù)提交事務(wù)修改的頁操作,用來保證事務(wù)的持久性。記錄的是物理級(jí)別上的頁修改操作,比如頁號(hào)xxx、偏移量 yyy 寫入了 ‘zzz’ 數(shù)據(jù)。主要為了保證數(shù)據(jù)的可靠性;
- Undo Log:又稱為回滾日志,回滾行記錄到某個(gè)特定版本,用來保證事務(wù)的原子性、一致性。記錄的是邏輯操作日志,比如對(duì)某一行數(shù)據(jù)進(jìn)行了 INSERT 語句操作,那么 undo log 就記錄一條與之相反的 DELETE 操作。主要用于事務(wù)的回滾(undo log 記錄的是每個(gè)修改操作的逆操作)和一致性非鎖定讀(undo log 回滾行記錄到某種特定的版本—MVCC,即多版本并發(fā)控制)
3.1Redo日志
InnoDB 存儲(chǔ)引擎是以頁為單位來管理存儲(chǔ)空間的。在真正訪問頁面之前,需要把在磁盤上的頁緩存到內(nèi)存中的 Buffer Pool 之后才可以訪問。所有的變更都必須先更新緩沖池中的數(shù)據(jù),然后緩沖池中的臟頁會(huì)以一定的頻率被刷入磁盤(checkPoint 機(jī)制),通過緩沖池來優(yōu)化 CPU 和磁盤之間的鴻溝,這樣就可以保證整體的性能不會(huì)下降太快。
InnoDB 引擎的事務(wù)采用了 WAL 技術(shù) (Write-Ahead Logging ),這種技術(shù)的思想就是先寫日志,再寫磁盤,只有日志寫入成功,才算事務(wù)提交成功,這里的日志就是 redo log。當(dāng)發(fā)生宕機(jī)且數(shù)據(jù)未刷到磁盤的時(shí)候,可以通過 redo log 來恢復(fù),保證 ACID 中的 D,這就是 redo log 的作用。
redo日志的組成
Redo log 可以簡單分為以下兩個(gè)部分:
(1)重做日志緩沖 (redo log buffer),保存在內(nèi)存中,是易失的。在服務(wù)器啟動(dòng)時(shí)就向操作系統(tǒng)申請(qǐng)了一大片稱之為 redo log buffer 的連續(xù)內(nèi)存空間,翻譯成中文就是 redo 日志緩沖區(qū)。這片內(nèi)存空間被劃分成若干個(gè)連續(xù)的 redo log block。一個(gè) redo log block 占用 512 字節(jié)大小。
(2)重做日志文件 (redo log file),保存在硬盤中,是持久的。
redo的整體流程如下圖
第 1 步:先將原始數(shù)據(jù)從磁盤中讀入內(nèi)存中來,修改數(shù)據(jù)的內(nèi)存拷貝;
第 2 步:生成一條重做日志并寫入 redo log buffer,記錄的是數(shù)據(jù)被修改后的值;
第 3 步:當(dāng)事務(wù) commit 時(shí),將 redo log buffer 中的內(nèi)容刷新到 redo log file,對(duì) redo log file采用追加寫的方式;
第 4 步:定期將內(nèi)存中修改的數(shù)據(jù)刷新到磁盤中;
3.2Undo日志
undo log 是事務(wù)原子性的保證。在事務(wù)中更新數(shù)據(jù)的前置操作其實(shí)是要先寫入一個(gè) undo log。
(1)事務(wù)需要保證原子性,也就是事務(wù)中的操作要么全部完成,要么什么也不做。但有時(shí)候事務(wù)執(zhí)行到一半會(huì)出現(xiàn)一些情況,比如:
情況一:事務(wù)執(zhí)行過程中可能遇到各種錯(cuò)誤,比如服務(wù)器本身的錯(cuò)誤, 操作系統(tǒng)錯(cuò)誤 ,甚至是突然斷電導(dǎo)致的錯(cuò)誤。
情況二:程序員可以在事務(wù)執(zhí)行過程中手動(dòng)輸入 ROLLBACK 語句結(jié)束當(dāng)前事務(wù)的執(zhí)行。
(2)以上情況出現(xiàn),我們需要把數(shù)據(jù)改回原先的樣子,這個(gè)過程稱之為回滾,這樣就可以造成一個(gè)假象:這個(gè)事務(wù)看起來什么都沒做,所以符合原子性要求。
(3)每當(dāng)我們要對(duì)一條記錄做改動(dòng)時(shí)(這里的改動(dòng)可以指 INSERT、DELETE、UPDATE,不包括 SELECT),都需要"留一手"——即把回滾時(shí)所需的東西記下來。比如:
你插入一條記錄時(shí),至少要把這條記錄的主鍵值記下來,之后回滾的時(shí)候只需要把這個(gè)主鍵值對(duì)應(yīng)的記錄融掉就好了。(對(duì)于每個(gè)INSERT,InnoDB 存儲(chǔ)引擎會(huì)完成一個(gè)DELETE)
你刪除了一·條記錄,至少要把這條記錄中的內(nèi)容都記下來,這樣之后回滾時(shí)再把由這些內(nèi)容組成的記錄插入到表中就好了。(對(duì)于每個(gè)DELETE,InnoDB 存儲(chǔ)引擎會(huì)執(zhí)行一個(gè) INSERT)你修改了一個(gè)記錄,至少要把修改這條記錄前的舊值都記錄下來,這樣之后回滾時(shí)再把這條記錄更新為舊值就好了。(對(duì)于每個(gè)UPDATE,InnoDB 存儲(chǔ)引擎會(huì)執(zhí)行一個(gè)相反的 UPDATE,將修改前的行放回去)
(4)MySQL 把這些為了回滾而記錄的這些內(nèi)容稱之為撤銷日志或者回滾日志(即 undo log)。注意,由于查詢操作 (SELECT) 并不會(huì)修改任何用戶記錄,所以在查詢操作執(zhí)行時(shí),并不需要記錄相應(yīng)的 undo 日志。此外,undo log 會(huì)產(chǎn)生 redo log,也就是 undo log 的產(chǎn)生會(huì)伴隨著 redo log 的產(chǎn)生,這是因?yàn)?undo log 也需要持久性的保護(hù)。
undo+redo日志生成過程(簡要)
(1)假設(shè)有 2 個(gè)數(shù)值,分別為 A = 1 和 B = 2,然后將 A 修改為3 ,B 修改為 4。
1. start transaction; 2. 記錄 A = 1 到 undo log; 3. update A = 3; 4. 記錄 A = 3 到 redo log; 5. 記錄 B = 2 到 undo log; 6. update B =4; 7. 記錄 B = 4 到 redo log; 8. 將 redo log 刷新到磁盤; 9. commit;
在 1 ~ 8 步驟的任意一步系統(tǒng)宕機(jī),事務(wù)未提交,該事務(wù)就不會(huì)對(duì)磁盤上的數(shù)據(jù)做任何影響。
如果在 8 ~ 9 之間宕機(jī),恢復(fù)之后可以選擇回滾,也可以選擇繼續(xù)完成事務(wù)提交
因?yàn)榇藭r(shí) redo log 已經(jīng)持久化。若在 9 之后系統(tǒng)宕機(jī),內(nèi)存映射中變更的數(shù)據(jù)還來不及刷回磁盤,那么系統(tǒng)恢復(fù)之后,可以根據(jù) redo log 把數(shù)據(jù)刷回磁盤。
4.慢查詢?nèi)罩?/h2>
MySQL的慢查詢?nèi)罩臼荕ySQL提供的一種日志類型,用于記錄執(zhí)行時(shí)間超過特定閾值的SQL查詢。這個(gè)功能主要用來識(shí)別數(shù)據(jù)庫操作中的性能瓶頸,從而幫助數(shù)據(jù)庫管理員優(yōu)化查詢語句和改進(jìn)數(shù)據(jù)庫性能,其主要作用如下:
(1)性能分析
- 慢查詢?nèi)罩咎峁┝艘粋€(gè)記錄所有執(zhí)行時(shí)間超過預(yù)設(shè)閾值的SQL語句的機(jī)制。這使得開發(fā)者和數(shù)據(jù)庫管理員能夠識(shí)別和優(yōu)化那些對(duì)性能影響最大的查詢。
(2)優(yōu)化數(shù)據(jù)庫
- 通過分析慢查詢?nèi)罩局械男畔?,可以確定需要添加索引的地方、需要改寫的查詢、可能存在的表設(shè)計(jì)問題等。這有助于減少數(shù)據(jù)庫的響應(yīng)時(shí)間和提升應(yīng)用的整體性能。
(3)監(jiān)控與警報(bào)
- 在一些高級(jí)的監(jiān)控系統(tǒng)中,慢查詢?nèi)罩究梢员挥米魃尚阅芫瘓?bào)的依據(jù),及時(shí)通知管理員采取行動(dòng)。
如何啟用慢查詢?nèi)罩炯捌湎嚓P(guān)參數(shù)
(1)啟用慢查詢?nèi)罩?/strong>
在MySQL的配置文件(通常是my.cnf
或my.ini
)中設(shè)置以下參數(shù)以啟用慢查詢?nèi)罩荆?/p>
[mysqld] slow_query_log = 1 slow_query_log_file = /path/to/your/log-file long_query_time = 2
其中,slow_query_log
用于啟用慢查詢?nèi)罩荆?code>slow_query_log_file指定日志文件的存儲(chǔ)位置,long_query_time
設(shè)置查詢執(zhí)行的時(shí)間閾值(單位是秒),超過這個(gè)時(shí)間的查詢會(huì)被記錄。
總結(jié)
到此這篇關(guān)于Mysql數(shù)據(jù)庫中各種日志的文章就介紹到這了,更多相關(guān)Mysql各種日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySql使用skip-name-resolve解決外網(wǎng)鏈接客戶端過慢問題
在騰訊云上面搭建的mysql使用開發(fā)的電腦上navicat進(jìn)行訪問時(shí)總是特別的慢,原來是Mysql會(huì)對(duì)請(qǐng)求的地址進(jìn)行域名解析,開發(fā)的電腦并沒有域名,所以會(huì)導(dǎo)致特別的慢,下面通過本文給大家分享MySql使用skip-name-resolve解決外網(wǎng)鏈接客戶端過慢問題2017-07-07MySQL數(shù)據(jù)庫存儲(chǔ)過程和事務(wù)的區(qū)別講解
今天小編就為大家分享一篇關(guān)于MySQL數(shù)據(jù)庫存儲(chǔ)過程和事務(wù)的區(qū)別講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03MySQL?聚合函數(shù)、分組查詢、時(shí)間函數(shù)詳解
這篇文章主要介紹了MySQL?聚合函數(shù)、分組查詢、時(shí)間函數(shù)?,主要考驗(yàn)聚合函數(shù)count()求和以及分組查詢,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08