欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql-binlog的查看實踐

 更新時間:2023年12月20日 10:14:32   作者:云閑不收  
MySQL的二進制日志可以說是MySQL最重要的日志了,它記錄了所有的DDL和DML語句,本文主要介紹了Mysql-binlog的查看實踐,具有一定的參考價值,感興趣的可以了解一下

簡介

MySQL的二進制日志可以說是MySQL最重要的日志了,它記錄了所有的DDL和DML(除了數(shù)據(jù)查詢語句)語句,以事件形式記錄,還包含語句所執(zhí)行的消耗的時間,MySQL的二進制日志是事務安全型的。一般來說開啟二進制日志大概會有1%的性能損耗(參見MySQL官方中文手冊 5.1.24版)。二進制有兩個最重要的使用場景:
其一:MySQL Replication在Master端開啟binlog,Mster把它的二進制日志傳遞給slaves來達到master-slave數(shù)據(jù)一致的目的。
其二:自然就是數(shù)據(jù)恢復了,通過使用mysqlbinlog工具來使恢復數(shù)據(jù)。

binlog日志概念

binlog全稱為:binary,翻譯就是二進制文件,主要記錄了MySQL在進行DML(數(shù)據(jù)操作語言)過程中的操作日志。在執(zhí)行SQL語句的過程中,作為使用者,無需關注程序執(zhí)行的過程,但是當數(shù)據(jù)庫數(shù)據(jù)丟失,或者需要搭建數(shù)據(jù)庫主從復制時,則此時的binlog日志文件的重要性就展現(xiàn)出來了。

二進制日志包括兩類文件:二進制日志索引文件(文件名后綴為.index)用于記錄所有的二進制文件,二進制日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫所有的DDL和DML(除了數(shù)據(jù)查詢語句)語句事件。

binlog本身是一類二進制文件。二進制文件更省空間,寫入速度更快,是無法直接打開來查看的。
因此mysql提供了命令mysqlbinlog進行查看。

一般的statement格式的二進制文件,用下面命令就可以(后面會講到什么是statement格式)

mysqlbinlog mysql-bin.000001

如果是row格式,加上-v或者-vv參數(shù)就行,如

mysqlbinlog -vv mysql-bin.000001 

使用場景

以事件形式記錄,還包含語句所執(zhí)行的消耗的時間,MySQL的二進制日志是事務安全型的。binlog 的主要目的是復制和恢復。

  • MySQL主從復制:MySQL Replication在Master端開啟binlog,Master把它的二進制日志傳遞給slaves來達到master-slave數(shù)據(jù)一致的目的
  • 數(shù)據(jù)恢復:通過使用 mysqlbinlog工具來使恢復數(shù)據(jù)
  • 查看數(shù)據(jù)更改記錄

數(shù)據(jù)庫操作類型:

在對數(shù)據(jù)庫的日常操作中,MySQL的操作語法,經(jīng)常使用的幾種MySQL指令類型如下

DQL:數(shù)據(jù)查詢語言,例如 where 、group by 、 orderby
DML:數(shù)據(jù)操作語言,例如 insert、delete、update等
DPL:事務處理語言,例如begin transaction、commit、rollback
DCL:數(shù)據(jù)控制語言,例如grant 、revoke控制用戶訪問權限等
DDL:數(shù)據(jù)定義語言,例如create、drop刪除表、索引添加類等

binlog三種模式

format定義優(yōu)點缺點
statem ent記錄的是修改SQL語句日志文件小,節(jié)約I0,提高性能準確性差,對一些系統(tǒng)函數(shù)不能準確復制或不能復制,如now0.uuid0等
row記錄的是每行實際數(shù)據(jù)的變更準確性強,能準確復制數(shù)據(jù)的變更日志文件大,較大的網(wǎng)絡10和磁盤lO
mixedstatement和row模式的混合準確性強,文件大小適中有可能發(fā)生主從不一致問題

業(yè)內目前推薦使用的是row模式,準確性高,雖然說文件大,但是現(xiàn)在有SSD和萬兆光纖網(wǎng)絡,這些磁盤IO和網(wǎng)絡IO都是可以接受的。

那么,大家一定想問,為什么不推薦使用mixed模式,理由如下
假設master有兩條記錄,而slave只有一條記錄。
master的數(shù)據(jù)為

+----+------------------------------------------------------+
| id | n |
+----+------------------------------------------------------+
| 1 | d24c2c7e-430b-11e7-bf1b-00155d016710 |
| 2 | ddd |
+----+------------------------------------------------------+

slave的數(shù)據(jù)為

+----+-------------------------------------------------------+
| id | n |
+----+-------------------------------------------------------+
| 1 | d24c2c7e-430b-11e7-bf1b-00155d016710 |
+----+-------------------------------------------------------+

當在master上更新一條從庫不存在的記錄時,也就是id=2的記錄,你會發(fā)現(xiàn)master是可以執(zhí)行成功的。而slave拿到這個SQL后,也會照常執(zhí)行,不報任何異常,只是更新操作不影響行數(shù)而已。并且你執(zhí)行命令show slave status,查看輸出,你會發(fā)現(xiàn)沒有異常。但是,如果你是row模式,由于這行根本不存在,是會報1062錯誤的。

在 MySQL 5.7.7 之前,默認的格式是 STATEMENT,在 MySQL 5.7.7 及更高版本中,默認值是 ROW。

開啟binlog

一般來說開啟binlog日志大概會有1%的性能損耗。

需要先輸入mysql 進入mysql命令行模式

mysql> show variables like 'log_%'; #注意有分號
+----------------------------------------+---------------------------------------+
| Variable_name                          | Value                                 |
+----------------------------------------+---------------------------------------+
| log_bin                                | ON                                    | ------> ON表示已經(jīng)開啟binlog日志
| log_bin_basename                       | /usr/local/mysql/data/mysql-bin       |
| log_bin_index                          | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators        | OFF                                   |
| log_bin_use_v1_row_events              | OFF                                   |
| log_error                              | /usr/local/mysql/data/martin.err      |
| log_output                             | FILE                                  |
| log_queries_not_using_indexes          | OFF                                   |
| log_slave_updates                      | OFF                                   |
| log_slow_admin_statements              | OFF                                   |
| log_slow_slave_statements              | OFF                                   |
| log_throttle_queries_not_using_indexes | 0                                     |
| log_warnings                           | 1                                     |
+----------------------------------------+---------------------------------------+

如果沒有開啟

啟用binlog,通過配置 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf 或mysql\bin\my.ini 配置文件的 log-bin 選項:

在配置文件中加入 log-bin 配置,表示啟用binlog,如果沒有給定值,寫成 log-bin=,則默認名稱為主機名。(注:名稱若帶有小數(shù)點,則只取第一個小數(shù)點前的部分作為名稱)

[mysqld]
log-bin=my-binlog-name

log-bin后面是binlog的文件名,譬如 log-bin=mysql-bin, 則生成的文件名為:

在這里插入圖片描述

然后需要重啟mysql

也可以通過 SET SQL_LOG_BIN=1 命令來啟用 binlog,通過 SET SQL_LOG_BIN=0 命令停用 binlog。啟用 binlog 之后須重啟MySQL才能生效。

binlog文件介紹

binlog日志包括兩類文件:

二進制日志索引文件(文件名后綴為.index)用于記錄所有有效的的二進制文件

二進制日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫所有的DDL和DML語句事件

binlog是一個二進制文件集合,每個binlog文件以一個4字節(jié)的魔數(shù)開頭,接著是一組Events:

魔數(shù):0xfe62696e對應的是0xfebin;

Event:每個Event包含header和data兩個部分;header提供了Event的創(chuàng)建時間,哪個服務器等信息,data部分提供的是針對該Event的具體信息,如具體數(shù)據(jù)的修改;

第一個Event用于描述binlog文件的格式版本,這個格式就是event寫入binlog文件的格式;

其余的Event按照第一個Event的格式版本寫入;

最后一個Event用于說明下一個binlog文件;

binlog的索引文件是一個文本文件,其中內容為當前的binlog文件列表

當遇到以下3種情況時,MySQL會重新生成一個新的日志文件,文件序號遞增:

  • MySQL服務器停止或重啟時

  • 使用 flush logs 命令;

  • 當 binlog 文件大小超過 max_binlog_size 變量的值時;

max_binlog_size 的最小值是4096字節(jié),最大值和默認值是 1GB (1073741824字節(jié))。事務被寫入到binlog的一個塊中,所以它不會在幾個二進制日志之間被拆分。
因此,如果你有很大的事務,為了保證事務的完整性,不可能做切換日志的動作,只能將該事務的日志都記錄到當前日志文件中,直到事務結束,你可能會看到binlog文件大于 max_binlog_size 的情況。

binlog日志內容查看

binlog日志有二種查看方式,具體如下:

1、mysql查看binlog

這種方法相當于執(zhí)行sql語句 在圖形化工具中也可直接執(zhí)行

mysql> show binlog events; #只查看第一個binlog文件的內容(全部的 怎么只看部分呢)
mysql> show binlog events ``in 'mysql-bin.000002'``;#查看指定binlog文件的內容 
mysql> show binary logs; #獲取binlog文件列表 
mysql> show master status; #查看當前正在寫入的binlog文件
mysql> show binary logs; #獲取binlog文件列表 
參數(shù)名含義
log bin = (onoff base name)
sql log bin =( onoff )
expire logs days指定自動刪除二進制日志的時間,即日志過期時間
log bin index指定mysql-bin.index文件的路徑
binlog format = [ mixed | row | statement ]指定二進制日志基于什么模式記錄
max binlog size指定二進制日志文件最大值
binlog cache size指定事務日志緩存區(qū)大小
max binlog cache size指定二進制日志緩存最大大小
sync binlog = { 0 | n }指定寫緩沖多少次,刷一次盤
SHOW BINLOG EVENTS
   [IN 'log_name']
   [FROM pos]
   [LIMIT [offset,] row_count]
在二進制日志中顯示事件。如果未指定,則顯示第一個二進制日志。需要特權。'log_name'SHOW BINLOG EVENTSREPLICATION SLAVE

該LIMIT子句與該語句具有相同的語法SELECT。請參見“ SELECT語句”。


mysql> show binlog events limit 10;
+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+
| Log_name         | Pos   | Event_type     | Server_id | End_log_pos | Info                                                |
+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+
| mysql-bin.000001 |     4 | Format_desc    |         1 |         123 | Server ver: 5.7.27-log, Binlog ver: 4               |
| mysql-bin.000001 |   123 | Previous_gtids |         1 |         154 |                                                     |
| mysql-bin.000001 |   154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                |
| mysql-bin.000001 |   219 | Query          |         1 |         300 | BEGIN                                               |
| mysql-bin.000001 |   300 | Table_map      |         1 |         412 | table_id: 392 (cactus_000510.360exthost_examinemgr) |
| mysql-bin.000001 |   412 | Delete_rows    |         1 |        8617 | table_id: 392                                       |
| mysql-bin.000001 |  8617 | Delete_rows    |         1 |       12732 | table_id: 392 flags: STMT_END_F                     |
| mysql-bin.000001 | 12732 | Xid            |         1 |       12763 | COMMIT /* xid=530 */                                |
| mysql-bin.000001 | 12763 | Anonymous_Gtid |         1 |       12828 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                |
| mysql-bin.000001 | 12828 | Query          |         1 |       12917 | BEGIN                                               |
+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+
10 rows in set (0.13 sec)

Binlog Event 簡要分析
從一個最簡單的實例來分析Event,包括創(chuàng)建表,插入數(shù)據(jù),更新數(shù)據(jù),刪除數(shù)據(jù);

CREATE TABLE `test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `age` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into test values(1,22,"小旋鋒");
update test set name='whirly' where id=1;
delete from test where id=1;

日志格式為STATEMENT,查看所有的Event

在這里插入圖片描述

日志格式為ROW時是下面這樣,可以發(fā)現(xiàn)又有一些不同

在這里插入圖片描述

2、使用mysqlbinlog工具

以下為普通bash命令 非mysql模式下的了

發(fā)出SHOW BINLOG EVENTS with no LIMIT子句可能會啟動一個非常耗時和資源消耗的過程,因為服務器將二進制日志的完整內容(包括服務器修改數(shù)據(jù)的所有語句)返回給客戶端。作為替代SHOW BINLOG EVENTS,使用mysqlbinlog實用程序將二進制日志保存到文本文件中,以供以后檢查和分析。
而且 show event命令查看了binlog的簡單信息,如何查看執(zhí)行時間、執(zhí)行花費的時間等詳細信息需要使用工具包中的mysqlbinlog命令。

mysqlbinlog是一個查看mysql二進制日志的工具,可以把mysql上面的所有操作記錄從日志里導出,這個工具默認的安裝路徑為:/usr/local/mysql/bin/mysqlbinlog

可以通過find / -name "mysqlbinlog"或者which mysqlbinlog命令查找mysqlbinlog的工具路徑。

至于日志文件,參照前面的開啟binlog章

基于開始/結束時間:

/usr/local/mysql/bin/mysqlbinlog --start-datetime=``"2013-03-01 00:00:00" --stop-datetime=``"2014-03-21 23:59:59" /usr/local/mysql/``var``/mysql-bin.000007 -r test2.sql
# mysqlbinlog 的執(zhí)行格式
mysqlbinlog [options] log_file ...

# 查看bin-log二進制文件(shell方式)
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003

# 查看bin-log二進制文件(帶查詢條件)
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003 \
    --start-datetime="2019-03-01 00:00:00"  \
    --stop-datetime="2019-03-10 00:00:00"   \
    --start-position="5000"    \
    --stop-position="20000"

截取結果其中的一段進行分析:

# at 21019
#190308 10:10:09 server id 1  end_log_pos 21094 CRC32 0x7a405abc     Query   thread_id=113   exec_time=0 error_code=0
SET TIMESTAMP=1552011009/*!*/;
BEGIN
/*!*/;

上面輸出包括信息:

position: 位于文件中的位置,即第一行的(# at 21019),說明該事件記錄從文件第21019個字節(jié)開始
timestamp: 事件發(fā)生的時間戳,即第二行的(#190308 10:10:09)
server id: 服務器標識(1)
end_log_pos 表示下一個事件開始的位置(即當前事件的結束位置+1)
thread_id: 執(zhí)行該事件的線程id (thread_id=113)
exec_time: 事件執(zhí)行的花費時間
error_code: 錯誤碼,0意味著沒有發(fā)生錯誤
type:事件類型Query

在這里插入圖片描述

發(fā)現(xiàn)BINLOG 處的內容我們看不明白。。。_

增加 --base64-output=decode-rows –v 選項解析

(base64-output,可以控制輸出語句輸出base64編碼的BINLOG語句;decode-rows:選項將把基于行的事件解碼成一個SQL語句)

/mysql/app/mariadb/bin/mysqlbinlog --no-defaults --database=db --base64-output=decode-rows -v --start-datetime='2019-04-11 00:00:00' --stop-datetime='2019-04-11 15:00:00' mysql-bin.000007 | more

在這里插入圖片描述

變成人類可以讀懂的SQL語句了;

PS: 可以把binlog解析后的內容放到一個文件后,在分析,利用如下腳本

/mysql/app/mariadb/bin/mysqlbinlog --no-defaults --database=db --base64-output=decode-rows -v --start-datetime='2019-04-11 00:00:00' --stop-datetime='2019-04-11 15:00:00' mysql-bin.000007 >/tmp/binlog007.sql
mysqlbinlog --no-defaults --base64-output=decode-rows -v   mysql-bin.000002 

怎么刪binlog

刪binlog的方法很多,有三種是常見的
(1) 使用reset master,該命令將會刪除所有日志,并讓日志文件重新從000001開始。
(2) 使用命令

PURGE { BINARY | MASTER } LOGS { TO ‘log_name' | BEFORE datetime_expr }

例如

purge master logs to “binlog_name.00000X”

將會清空00000X之前的所有日志文件.
(3) 使用–expire_logs_days=N選項指定過了多少天日志自動過期清空。

到此這篇關于Mysql-binlog的查看實踐的文章就介紹到這了,更多相關Mysql binlog查看內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL 聲明變量及存儲過程分析

    MySQL 聲明變量及存儲過程分析

    這篇文章主要介紹了MySQL 聲明變量及存儲過程的相關內容,小編覺得挺不錯的,這里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • Mysql中使用Union—多表合并之行合并

    Mysql中使用Union—多表合并之行合并

    這篇文章主要介紹了Mysql中使用Union—多表合并之行合并,如果我們需要將兩個select語句的結果作為一個整體顯示出來,我們就需要用到union或者union all關鍵字,union(或稱為聯(lián)合)的作用是將多個結果合并在一起顯示出來,需要的朋友可以參考下
    2023-07-07
  • MySQL中的binary類型使用操作

    MySQL中的binary類型使用操作

    這篇文章主要介紹了MySQL中的binary類型使用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • MySQL校對規(guī)則(COLLATION)的具體使用

    MySQL校對規(guī)則(COLLATION)的具體使用

    本文主要介紹了MySQL校對規(guī)則(COLLATION)的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 解析MySQL隱式轉換問題

    解析MySQL隱式轉換問題

    本文通過實例代碼給大家介紹了MySQL隱式轉換問題,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Windows平臺下MySQL安裝與配置方法與注意事項

    Windows平臺下MySQL安裝與配置方法與注意事項

    這篇文章主要介紹了Windows平臺下MySQL安裝與配置方法與注意事項,需要的朋友可以參考下
    2017-04-04
  • 如何用Navicat操作MySQL

    如何用Navicat操作MySQL

    這篇文章主要介紹了如何用Navicat操作MySQL,幫助大家使用可視化工具來連接 MySQL,感興趣的朋友可以了解下
    2021-05-05
  • 安裝Mysql時出現(xiàn)錯誤及解決辦法

    安裝Mysql時出現(xiàn)錯誤及解決辦法

    因為一時手癢癢更新了一下驅動,結果導致無線網(wǎng)卡出了問題,本文給大家分享安裝mysql時出現(xiàn)錯誤及解決辦法,對安裝mysql時出現(xiàn)錯誤相關知識感興趣的朋友一起學習吧
    2015-12-12
  • (MariaDB)MySQL數(shù)據(jù)類型和存儲機制全面講解

    (MariaDB)MySQL數(shù)據(jù)類型和存儲機制全面講解

    下面小編就為大家分享一篇(MariaDB)MySQL數(shù)據(jù)類型和存儲機制全面講解,具有很的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • MySQL 查詢某個字段含有字母數(shù)字的值示例詳解

    MySQL 查詢某個字段含有字母數(shù)字的值示例詳解

    在本文中,我們詳細介紹了如何在 MySQL 中查詢某個字段含有字母和數(shù)字的值,我們首先介紹了正則表達式的基礎知識,然后通過五個具體示例展示了如何應用這些知識,通過這些示例,我們可以看到正則表達式在處理復雜字符串模式匹配時的強大功能,感興趣的朋友跟隨小編一起看看吧
    2024-05-05

最新評論