10-MySql 日誌-binlog

MySql日誌-binlog

  • MySQL中有六種日誌文件,分別是:事物日誌、(包括redo log和undo log)、二進制日誌(binlog)、錯誤日誌(errorlog)、慢查詢日誌(slow query log)、一般查詢日誌(general log),中繼日誌(relay log),本文關於二進制日誌(binlog)。

一、作用和場景

  • Binary Log簡稱binlog 即二進制日誌文件,日誌記錄了MySql所有DDL和DML操作。通過 binlog 可以做數據恢復,主主和主從複製等。簡言之BinLlog兩個重要的用途:複製和恢復,MySQL的很多特性比如可靠性、備份,數據重放等機制都依賴於binlog。
binlog會保存所有的DDL語句和非select的DML操作,用於對數據進行恢復和備份。

應用場景

  • 主從複製:master 會開啓binlog並將其傳遞給slave來達到master和slave數據一致的目的。
  • 數據恢復:mysqlbinlog等工具通過binlog來恢復數據。

二、配置

2.1 查看binlog是否開啓

show variables like 'log_bin%'; 
log_bin_basename: binlog文件的保存路徑

在這裏插入圖片描述

2.2 查看binlog位置

  • 查看binlog的保存位置(binlog的位置和數據路徑一致)
show variables like '%datadir%';

2.3 查看binlog模式

show variables like 'binlog_format';

set global bin_log format = statement;//修改binlog模式

show variables like 'binlog%'; 

在這裏插入圖片描述

關於binlog模式:binlog記錄日誌有多種模式,通過配置 binlog-format 指定

  • Statement:每一條修改數據的sql都會記錄到 master 的 binlog 中。slave在複製的時候sql進程會解析成和原來的master端執行的相同的sql來再次執行。

  • Row:日誌中會記錄成每一行數據被修改的形式,然後在slave端再對相同的數據進行修改。

  • Mixed:實際上就是前兩種模式的結合,MySQL根據執行的每一條具體的sql語句來區分對待記錄的日誌形式,在Statement和Row之間選擇一種。

  • 表格對比

配置值 優點 缺點
Statement 不需要記錄每一行數據的變化,減少 binlog 日誌量,節約IO,提高性能。需要記錄每條語句在執行的上下文信息
Row 可以不記錄執行的sql語句的上下文信息,可能會產生大量的日誌內容,尤其是當執行alter table之類的語句的時候,產生的日誌量是驚人的。
Mixed 二者兼顧 二者兼顧
  • 在性能允許的時候,建議使用 ROW 模式,statement 可以在有些時候會導致複製數據不一致

2.4 binlog配置文件

  • binlog 相關配置
[mysqld]
log_bin = "D:/mysql/mysql-5.7.27-winx64/data/bin_log/"
expire_logs_days=5
server-id = 1
binlog-format = Row (設置爲 MIXED 才能記錄到insert語句)
  • 配置說明
配置 說明 示例值
log_bin binlog保存路徑,注意配置的是文件夾,文件名系統自己生成 “D:/mysql/mysql-5.7.27-winx64/data/bin_log/”
log_bin_index 指定二進制索引文件的路徑與名稱
expire_logs_days 配置日誌定期清理 7
server-id 主從模式下該id必須唯一 100
binlog-format binlog模式 Statement(默認) /Row /Mixed(推薦)/
max_binlog_size binlog每個日誌文件大小 100m
binlog_cache_size binlog緩存大小 4m
max_binlog_cache_size 最大binlog緩存大小 512m
  • 配置expire_logs_days決定binlog文件的過期,對於非活動的binlog文件,如果生成時間大於該配置的天數會被自動刪除。(只會有一個活動的binlog文件)
show variables like '%expire_logs_days%'
PS:關於 binlog-format 配置,參考1.3小節binlog的模式。

2.5 binlog刷盤配置

  • binlog 日誌刷盤策略由配置項 sys_binlog 控制,sync_binlog=[N]:,N 表示每多少個事務寫入緩衝刷一次盤,默認值爲0表示由操作系統決定何時刷盤,數據安全性要求較高時建議配置爲1;
sys_binlog配置值 含義
0 默認,表示由操作系統決定何時刷盤,此時寫入binlog文件但是存在文件系統緩存,不會調用 fsync 刷盤,系統奔潰可能會丟失binlog日誌
N 表示每多少個事務寫入緩衝刷一次盤,比如配置1,那麼每一次事物都會調用 fsync 寫磁盤

2.6 binlog文件和命令

  • binlog的文件名稱由配置項:log-bin 決定,產生的文件類似於下面所示,後綴000001 … 遞增,並且還會有一個 index 後綴的索引文件
log-bin=mysql-bin

-rw-r----- 1 mysql mysql 2.5K Dec 23 11:29 mysql-bin.000001
-rw-r----- 1 mysql mysql  779 Dec 23 11:43 mysql-bin.000002
-rw-r----- 1 mysql mysql  490 Dec 23 11:47 mysql-bin.000003
-rw-r----- 1 mysql mysql  469 Dec 23 11:48 mysql-bin.000004
-rw-r----- 1 mysql mysql   76 Dec 23 11:47 mysql-bin.index
  • 注意,bin-log有很多種情況會生成一個新的文件,比如flush logs、MySql重啓、還有文件大小達到閾值,都會重新創建一個文件,可以通過index文件查詢binlog日誌文件;

2.7 binlog其他配置

  • 其他更多配置
binlog_do_db:只記錄指定數據庫的二進制日誌
binlog_ignore_db:不記錄指定的數據庫的二進制日誌

binlog_cache_use:使用二進制日誌緩存的事務數量
max_binlog_cache_size:binlog使用的內存最大值
binlog_cache_size:binlog使用的內存大小,可以通過狀態變量binlog_cache_use和binlog_cache_disk_use來幫助測試。
binlog_cache_disk_use:使用二進制日誌緩存但超過binlog_cache_size值並使用臨時文件來保存事務中的語句的事務數量

max_binlog_size:Binlog最大值,最大和默認值是1GB,該設置並不能嚴格控制Binlog的大小,尤其是Binlog比較靠近最大值而又遇到一個
比較大事務時,爲了保證事務的完整性,不可能做切換日誌的動作,只能將該事務的所有SQL都記錄進當前日誌,直到事務結束

三、binlog操作

3.1 查看所有binlog日誌

show master logs
//或者
show binary logs;

在這裏插入圖片描述

3.2 查看最新binlog日誌

  • 查看最新binlog日誌編號及最後一個操作事件的結束點(Position)值;
show master status;

在這裏插入圖片描述

3.3 刷新binlog

  • flush刷新log日誌;flush後會產生一個新編號的binlog日誌文件;
flush logs;

3.4 清空binlog

  • 清空binlog;執行之後會刪除之前的binlog,生成新的binlog和index文件。
reset master;

3.5 查看binlog日誌

  • 查看binlog內容;使用mysqlbinlog自帶查看命令法
mysqlbinlog mysql-bin.00001
mysqlbinlog --start-position=1 --stop-position=100  -d dbName   .000001
  • 更精確查詢;可以從指定的pos起點位置開始查詢,還可指定偏移和查詢條數。
show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

show binlog events in '.000001';
show binlog events in  'mysql-bin.000004' ;

3.6 查看bin-log日誌

  • binlog 日誌文件的後綴名稱是遞增的,查看之前刷新一下,然後操作一下數據庫就可以看到新的日誌文件了
mysql> flush logs;
Query OK, 0 rows affected (0.03 sec)
mysql> 
mysql> show binlog events in  'mysql-bin.000003' ;
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000003 |   4 | Format_desc    |       100 |         123 | Server ver: 5.7.28-log, Binlog ver: 4 |
| mysql-bin.000003 | 123 | Previous_gtids |       100 |         154 |                                       |
| mysql-bin.000003 | 154 | Anonymous_Gtid |       100 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000003 | 219 | Query          |       100 |         295 | BEGIN                                 |
| mysql-bin.000003 | 295 | Table_map      |       100 |         352 | table_id: 109 (mzptest2.user)         |
| mysql-bin.000003 | 352 | Write_rows     |       100 |         412 | table_id: 109 flags: STMT_END_F       |
| mysql-bin.000003 | 412 | Xid            |       100 |         443 | COMMIT /* xid=327 */                  |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
7 rows in set (0.00 sec)

四、binlog恢復數據

4.1 創建數據庫,新增數據

  • 首先創建數據庫,新增數據,導出的sql如下:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for t_name
-- ----------------------------
DROP TABLE IF EXISTS `t_name`;
CREATE TABLE `t_name` (
  `name` varchar(30) DEFAULT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_name
-- ----------------------------
INSERT INTO `t_name` VALUES ('name1', '1');
INSERT INTO `t_name` VALUES ('name2', '2');
INSERT INTO `t_name` VALUES ('name3', '3');
INSERT INTO `t_name` VALUES ('name4', '4');
INSERT INTO `t_name` VALUES ('name5', '5');
INSERT INTO `t_name` VALUES ('name6', '6');
INSERT INTO `t_name` VALUES ('name7', '7');
INSERT INTO `t_name` VALUES ('name8', '8');
INSERT INTO `t_name` VALUES ('name9', '9');

4.2 整庫備份

  • 正常情況,會一定週期的整庫備份,現在備份一把,備份文件和備份sql如下,假設此時數據庫的狀態爲狀態1
mysqldump -h 192.168.31.147 --port 3308  -u root -p123456 -t testbinlog  --tables  t_name > t_name_bak.sql
  • 備份的dump文件
-- MySQL dump 10.13  Distrib 5.7.27, for Win64 (x86_64)
--
-- Host: 192.168.31.147    Database: testbinlog
-- ------------------------------------------------------
-- Server version	5.7.27-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping data for table `t_name`
--

LOCK TABLES `t_name` WRITE;
/*!40000 ALTER TABLE `t_name` DISABLE KEYS */;
INSERT INTO `t_name` VALUES ('name1',1),('name2',2),('name3',3),('name4',4),('name5',5),('name6',6),('name7',7),('name8',8),('name9',9);
/*!40000 ALTER TABLE `t_name` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2019-12-24 11:30:37

4.3 模擬誤操作

  • 爲了便於模擬,此時我們執行 flush logs ,讓mysql開始一個新的binlog文件;
  • 定時備份後,繼續業務操作,假設業務操作sql 如下,假設操作之後記爲狀態2,此時所有的 name字段 都被加上了 “_state1” 這樣一個後綴;
UPDATE t_name set name = CONCAT(name,'_state1'); --- 狀態2
  • 然後不小心發生了誤操作,假設誤操作sql如下,不小心刪除了id大於5的記錄,此時數據庫狀態記爲狀態3
DELETE FROM t_name where id >5; -- 狀態3
  • 到此數據已經有問題,現在我們的需求是恢復到狀態2,不能僅僅靠之前的定時備份來恢復到狀態1,那樣我們的業務修改就沒有了(注意中間的業務操作可能有很多,這裏只是用一個sql來模擬),此時我們先通過定時備份恢復到狀態1,先把數據庫記錄刪除,然後用定時備份恢復到狀態1;後面再通過binlog從狀態1恢復到狀態2

4.4 binlog恢復數據

  • 首先要用整庫備份的數據,恢復到備份時候的數據,也就是狀態1;後面的數據就要用binlog恢復了,但是不能完全執行binlog,因爲裏面有誤操作的日誌,我們要去掉誤操作的,否則就直接到狀態2了;
  • 現在假設我們已經用整庫恢復了原始的數據,現在我們要回到狀態1,先看看binlog
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#191224  5:58:45 server id 100  end_log_pos 123 CRC32 0xef099625 	Start: binlog v 4, server v 5.7.28-log created 191224  5:58:45
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
FakBXg9kAAAAdwAAAHsAAAABAAQANS43LjI4LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
ASWWCe8=
'/*!*/;
# at 123
#191224  5:58:45 server id 100  end_log_pos 154 CRC32 0xd9b4eed2 	Previous-GTIDs
# [empty]
# at 154
#191224  5:59:35 server id 100  end_log_pos 219 CRC32 0xc45bcb07 	Anonymous_GTID	last_committed=0	sequence_number=1	rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#191224  5:59:35 server id 100  end_log_pos 294 CRC32 0xa425d252 	Query	thread_id=15	exec_time=0	error_code=0
SET TIMESTAMP=1577167175/*!*/;
SET @@session.pseudo_thread_id=15/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 294
#191224  5:59:35 server id 100  end_log_pos 349 CRC32 0xce4849bb 	Table_map: `db_test`.`t_name` mapped to number 108
# at 349
#191224  5:59:35 server id 100  end_log_pos 646 CRC32 0xa78a1ca1 	Update_rows: table id 108 flags: STMT_END_F

BINLOG '
R6kBXhNkAAAANwAAAF0BAAAAAGwAAAAAAAEAB2RiX3Rlc3QABnRfbmFtZQACDwMCWgABu0lIzg==
R6kBXh9kAAAAKQEAAIYCAAAAAGwAAAAAAAEAAgAC///8BW5hbWUxAQAAAPwMbmFtZTFfc3RhdGUx
AQAAAPwFbmFtZTICAAAA/AxuYW1lMl9zdGF0ZTECAAAA/AVuYW1lMwMAAAD8DG5hbWUzX3N0YXRl
MQMAAAD8BW5hbWU0BAAAAPwMbmFtZTRfc3RhdGUxBAAAAPwFbmFtZTUFAAAA/AxuYW1lNV9zdGF0
ZTEFAAAA/AVuYW1lNgYAAAD8DG5hbWU2X3N0YXRlMQYAAAD8BW5hbWU3BwAAAPwMbmFtZTdfc3Rh
dGUxBwAAAPwFbmFtZTgIAAAA/AxuYW1lOF9zdGF0ZTEIAAAA/AVuYW1lOQkAAAD8DG5hbWU5X3N0
YXRlMQkAAAChHIqn
'/*!*/;
# at 646
#191224  5:59:35 server id 100  end_log_pos 677 CRC32 0xf301eae3 	Xid = 184
COMMIT/*!*/;
# at 677
#191224  5:59:58 server id 100  end_log_pos 742 CRC32 0xe996d5c5 	Anonymous_GTID	last_committed=1	sequence_number=2	rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 742
#191224  5:59:58 server id 100  end_log_pos 817 CRC32 0xbeb75473 	Query	thread_id=15	exec_time=0	error_code=0
SET TIMESTAMP=1577167198/*!*/;
BEGIN
/*!*/;
# at 817
#191224  5:59:58 server id 100  end_log_pos 872 CRC32 0xffcf032e 	Table_map: `db_test`.`t_name` mapped to number 108
# at 872
#191224  5:59:58 server id 100  end_log_pos 979 CRC32 0x28bb1396 	Delete_rows: table id 108 flags: STMT_END_F

BINLOG '
XqkBXhNkAAAANwAAAGgDAAAAAGwAAAAAAAEAB2RiX3Rlc3QABnRfbmFtZQACDwMCWgABLgPP/w==
XqkBXiBkAAAAawAAANMDAAAAAGwAAAAAAAEAAgAC//wMbmFtZTZfc3RhdGUxBgAAAPwMbmFtZTdf
c3RhdGUxBwAAAPwMbmFtZThfc3RhdGUxCAAAAPwMbmFtZTlfc3RhdGUxCQAAAJYTuyg=
'/*!*/;
# at 979
#191224  5:59:58 server id 100  end_log_pos 1010 CRC32 0x2d34be1e 	Xid = 193
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

  • 能夠看到裏面有兩個 BEGIN ,第一個是 BEGIN 裏面是 Update_rows,對應第一次的業務更新操作,第二次是 Delete_rows ,對應後面一次的誤刪除操作,可以看到第一個事物完成後的position是742,因此我們可以將這個 binlog 文件的開始部分到742部分導出成爲sql:
mysqlbinlog --stop-position="742" /var/lib/mysql/mysql-bin.000002 > back_1.sql
  • 首先通過定時備份恢復到狀態1,恢復後就回到了第一次全量本分的時候:

在這裏插入圖片描述

  • 然後運行sql之前得到的sql,下面是我整個操作的命令截圖:
//整個過程如下:
 
mysql> select * from t_name;  --- 這是通過定時備份恢復到狀態1
+-------+----+
| name  | id |
+-------+----+
| name1 |  1 |
| name2 |  2 |
| name3 |  3 |
| name4 |  4 |
| name5 |  5 |
| name6 |  6 |
| name7 |  7 |
| name8 |  8 |
| name9 |  9 |
+-------+----+
9 rows in set (0.00 sec)

mysql> source /var/lib/mysql/back_1.sql   --- 導入binlog中的日誌來恢復業務操作
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Charset changed
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.02 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_name;   --- 得到了狀態2,數據都在,沒有丟失
+--------------+----+
| name         | id |
+--------------+----+
| name1_state1 |  1 |
| name2_state1 |  2 |
| name3_state1 |  3 |
| name4_state1 |  4 |
| name5_state1 |  5 |
| name6_state1 |  6 |
| name7_state1 |  7 |
| name8_state1 |  8 |
| name9_state1 |  9 |
+--------------+----+
9 rows in set (0.00 sec)
mysql> 
  • 最後就回到了包含 9 條數據的誤操作之前的狀態,被刪除的數據恢復了
  • 這裏我使用的binlog模式是ROW模式,另外需要注意的是真正遇到需要通過binlog回覆數據的時候,數據量以及發生的業務修改是非常多的,可能binlog文件也很多,只要binlog文件保存着,最關鍵的是找到自己需要恢復的數據對應在 binlog 中的時間點,就像起那麼找到position 742 一樣,通過 mysqlbinlog 命令可以查看,但是非常多的時候,未必有這麼好查看,mysqlbinlog 命令可以通過position和其實時間來控制導出,最後附了一些可供參考的命令

五、mysqlbinlog命令參考

假設 binlog-format=ROW 模式下:

  • 提取指定數據庫的指定binlong文件日誌
mysqlbinlog -d db_name --base64-output=decode-rows -v binlog.00000x > ./bak.sql
  • 提取指定數據庫的數據表的指定binlong文件日誌
mysqlbinlog -d db_name --base64-output=decode-rows -v binlog.00000x |grep table_name > /bak.sql
  • 提取insert/update操作的binlog日誌
mysqlbinlog -d db_name --base64-output=decode-rows -v binlog.00000x | grep insert/update  > /bak.sql
  • 提取指定時間段日誌
mysqlbinlog --base64-output=decode-rows -v --start-datetime='2019-12-24 00:00:00' --stop-datetime='2019-12-24 23:59:59' binlog.00000x > /bak.sql
  • 提取指定position日誌
mysqlbinlog --base64-output=decode-rows -v --start-position='123' --stop-position='456' binlog.00000x > /bak.sql
  • 提取並壓縮
mysqlbinlog --start-position="123" --stop-position="456" binlog.00000x | gzip  > /bak.gz
  • 提取後直接導入數據庫
mysqlbinlog --start-position="123" --stop-position="456" binlog.00000x | mysql -uroot -p 
  • 批量binlog文件提取
mysqlbinlog --start-position="123" --stop-position="456" binlog.00000x binlog.00000y  > /bak.sql
mysqlbinlog  /var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.000002 > ./bak.sql
  • 遠程提取數據庫的binlog
mysqlbinlog  -h10.168.10.11 -P3306 -uroot -p --stop-datetime="2020-01-01 00:00:00" --read-from-remote-server  mysql-bin.0000x  > /bak.sql

六、參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章