易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 37|回复: 4
收起左侧

通过binlog日志恢复数据

[复制链接]
发表于 2024-8-12 10:12:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
1、执行4.1前置准备中的操作,生成一个新的binlog文件,假设我这里生成新的文件叫做mysql_bin.000004,后续数据的操作日志都会记录在这个日志文件中。
; E1 d1 [- c1 r/ ]
9 d' P/ y( h! c- k' k2 w2、准备数据,直接执行本文第三点制作测试数据中的SQL即可。
4 h4 V' N! _' h/ p! [3 l9 A; {* b
5 n8 B; i- {/ y9 G' C3、将mysql_bin.000004这个binlog日志归档,因为我们需要通过mysql_bin.000004这个日志恢复全部数据,所以要在删除数据库之前归档,如果删除数据库语句也被记录在mysql_bin.000004中,那么执行完mysql_bin.000004库又会被删除了。
! t5 R5 Q- E2 c# z% P: z" W1 c6 J3 |6 K4 C

! y9 B9 l7 Y) e+ d- Z7 F$ H. a9 Q1 ~$ F0 u
一:登录数据库时执行刷新log日志,自此开始产生一个新编号的binlog日志文件
$ q5 b1 \: S; U0 b$ k, ]) C, l7 b) _- U# \% O
mysql > flush logs;2 G* V# B) |3 T- {' Z$ o' d
& e( O# j9 _* ^, \. S% Q0 S
cd  /var/lib/mysql/
1 O. |  L  o% }' j$ X3 I" \, Y; L1 e& P1 D7 H/ T% I
ls -l mysql.bin.*4 C5 u* D! b1 z; [$ [

: N8 H. y8 |; @" n二:通过mysqlbinlog执行恢复全部数据  I' w! W: C8 y2 g: E
mysqlbinlog是mysql自带的一个工具,一般在安装MySQL时mysqlbinlog也会放入可执行目录下,可以直接执行
4 P0 h: E  Q' U) Z$ ^4 D 如果不能直接执行mysqlbinlog命令,可以通过  find / -name "mysqlbinlog"查找下这个工具在什么位置
2 B3 C, Q  N+ @+ [1 u然后指定全路径执行即可: 如  /usr/bin/mysqlbinlog  --no-defaults  ...
$ F% w' e6 l$ E, h! }5 v& C0 J" U1 W* M3 }0 p6 k, s0 @
mysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.00005  |mysql -h127.0.0.1 -P3306 -root -p: P9 n+ e' V) `! G
2 K( F, x* Y. I$ I
三:即可检查数据库恢复情况! J5 w5 R% E( p4 e0 f
0 E, x+ D3 L+ ~* U* e( V7 A& F
  h1 x1 T# i6 j& H4 D: s. ?$ Q

1 O9 R5 w  Q( D8 K# Y/ M通过mysqlbinlog将binlog转为sql,以方便查询具体位置+ Z0 u; o) _) k
mysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql_bin.0000x > binlog_00000x.sql
4 ?0 M) e5 |5 z# w7 h7 \, q查看生成的binlog_000006.sql,确定需要恢复的起始位置结束位置还有起始时间和结束时间
2 d/ v: h2 f3 ~4 G" ?- J- }. j# `. Q6 ^; w' N. J; e
! _2 y/ _2 `8 S2 ~5 }: l& R) D4 U

1 v  h  T$ v* `/ r4 d7 ?

* \' {9 p' e7 N1 v4 |, o& b& y' {; |" }# x. m, k) F. U; t
# u5 w( u* P9 J0 P6 {. E$ w

; k% r9 W$ o8 c9 T' x# _: D/ f
 楼主| 发表于 2024-8-12 10:50:10 | 显示全部楼层
通过mysqlbinlog执行恢复操作
1 A* X" [+ Q9 I8 [通过位置区间恢复3 ]: l  k! z: |4 a$ z7 c
mysqlbinlog  --no-defaults  /var/lib/mysql/mysql_bin.00000x --start-position=231 --stop-position=2210 |mysql -h127.0.0.1 -P3306 -uroot -p
 楼主| 发表于 2024-8-12 10:50:23 | 显示全部楼层
/var/lib/mysql/mysql_bin.000006 : 要操作binlog文件/ m7 r! x) N8 g( L; J$ d
–start-position=232 :数据恢复的起始位置
/ c5 i5 n; ^' R* i- M+ H–stop-position=2220 :数据恢复的结束位置% i& i% g( q6 K3 q8 S
mysql -h127.0.0.1 -P3306 -uroot -p123456 : 数据恢复需要登录数据库
 楼主| 发表于 2024-8-12 10:53:17 | 显示全部楼层
要通过binlog日志来查看数据库变更信息,你需要确保MySQL服务器已经开启了binlog日志记录功能。以下是如何查看和解析binlog日志的基本步骤:/ ]: x" V7 X3 Z) K" n* g$ p
5 J1 V& z  `$ `. A+ U* L
查看当前的binlog日志列表:
2 Y/ u; Q: J) q- ]' H' u+ i0 B  P& J4 u. v7 m& k
SHOW BINARY LOGS;
  K* Y$ l9 Q  b6 y( C' W8 y: f* _查看特定binlog文件的内容:4 N+ V; o4 W2 e" h
2 u" r/ L$ s/ Q( F
SHOW BINLOG EVENTS IN 'binlog_file_name';
4 f" |6 x  R$ F如果需要解析binlog内容,可以使用MySQL提供的工具 mysqlbinlog。在命令行中使用该工具可以查看详细的日志内容:
/ {% i* j- H  H
; M8 O. \) a' Pmysqlbinlog binlog_file_name: Q, s6 q) B. o, y- n' V( ~- S
如果你想要编写自己的解析程序,可以使用MySQL提供的BINLOG API进行解析。以下是一个简单的Python示例,使用mysql-replication库来解析binlog:
( U; w6 I& e7 V0 @, j- E* d1 o; Y* m  Q5 ]! e, H+ k; s0 n4 _+ H
首先,安装mysql-replication库:3 m! j; H) A. ~3 Q- I
& [  @+ m% W9 L3 T0 d) Q
pip install mysql-replication
/ j6 {) S% o/ F
6 g4 _( p% ~- L1 |- L2 p然后,使用以下Python脚本解析binlog:
% ~. C+ w0 a2 S9 j
1 u6 R2 T9 K( x7 S; F5 gfrom mysql_replication import BinLogStreamReader7 Q) W' Y- b. ~9 }+ ~5 \9 S0 I5 f
9 W6 b7 x: t& [0 Y+ l- A3 U' m
# 配置binlog服务器和认证信息' o4 u$ V/ g* y7 X
config = {
0 f! D( x* k. }: d0 V( E    'host': 'localhost',9 z6 b7 m7 ]) {! N: N( J
    'port': 3306,
3 I1 s0 K- z9 V- l" N    'user': 'your_username',6 H* A' g) Y7 d2 i6 J
    'password': 'your_password'/ H- `6 i( C% X5 ]/ |+ o
}% O# X8 x' R7 }5 ?

# B2 s8 T9 o, }  @$ b# 获取binlog文件列表9 c, ?! ^' o1 [: |1 a; d8 I% d
show_binlogs_result_set = client.query('SHOW BINARY LOGS;'), n* e2 \7 z: z, h" ?( ^4 }  G# J
binlog_files = [row[0] for row in show_binlogs_result_set]
/ Y6 F  Q* W! q5 Y- L& t
, F0 P/ {' y" F& o# 对于每个binlog文件,解析其内容
: G, N* y( I; v$ Z5 N+ Ifor binlog_file in binlog_files:
: e/ ~$ J0 E5 b& q0 m0 S    stream = BinLogStreamReader(connection_settings=config, log_file=binlog_file)
3 r1 C$ B( o0 G! ?" T) D    for binlog_event in stream:
9 a) l  K& M5 M/ s- h        # 处理每个事件,例如:0 }+ n1 p. t) ]3 z' @
        print(binlog_event.row)  # 这将打印出事件中的数据行
+ a! c" P! D5 h/ |1 O! L$ E; h    stream.close()( O" S4 v: m& Q/ i0 w! }
请注意,这只是一个简单的示例,实际使用时你可能需要根据自己的需求处理更多复杂的情况,比如错误处理、事务管理等。
 楼主| 发表于 2024-8-12 10:56:21 | 显示全部楼层
使用mysqlbinlog工具解析和恢复日志( v) C' N! Q* x9 O) m" G( _/ w
默认情况下binlog日志是二进制格式,无法直接查看,除了使用上述命令查看二进制日志中的事务,还可以通过mysqlbinlog工具。  N- I8 g8 r6 w3 h, \9 j
mysqlbinlog是mysql官方提供的一个binlog查看工具,也可使用 –read-from-remote-server 从远程服务器读取二进制日志,还可使用 –start-position –stop-position、–start-time –stop-time等选项精确解析binlog日志。4 [4 H  t- _" m

9 f7 g3 ?$ x, o' b% {( s选项:: G! L: Q* ?) c/ X
-h, --host=:连接MySQL服务器的主机名。* n: Y' `+ G0 n+ t

& y2 I2 q& R. j) G+ k# W-P, --port=<port_num>:连接MySQL服务器的端口号。
" p8 n# `0 Y8 M4 v9 E; e0 Y0 h- h  C" q0 t; @
-u, --user=:连接MySQL服务器的用户名。" {9 g  f8 g; u% q; m3 Z
  Y5 a1 t: c3 g2 A) K" r( O
-p, --password=:连接MySQL服务器的密码。
* O4 {+ C$ V/ ]3 D8 Z# J+ o. `0 r& L; s9 F0 w
–ssl-ca=<ca_file>:使用指定的CA证书文件进行SSL连接。2 J+ Y+ R) g. ~' \0 h

( h7 H' z8 E' N/ C, O; z–ssl-cert=<cert_file>:使用指定的SSL证书文件进行SSL连接。. K, O* ]$ A" x! x5 e

' o7 y! C. _! _& Z0 t- A9 i–ssl-key=<key_file>:使用指定的SSL密钥文件进行SSL连接。& T+ L- f6 g# T

+ x" z% i* z& E0 P% v+ B; R( @-R, --read-from-remote-server:从远程MySQL服务器读取二进制日志。
6 z% U# J7 `1 p; e+ R
& A1 }% p) l1 R- n- z& Z& F-r, --result-file=<file_name>:将解析后的日志输出到指定的文件。
1 }9 ~" J2 _$ g: P  @. E  ^+ Z$ h! O2 Z" Z1 B' t
–base64-output[=value]:将blob字段以Base64编码的形式输出。: {1 b  c- J" a* G) j
( U/ W: c  ^% f/ u9 u# x
-v, --verbose:详细输出解析后的日志内容。/ w* G9 C. Z# P7 S/ C

: \2 s  b: N8 G( ~/ e/ e% D) M2 u* A-d, --database=<database_name>:仅输出指定数据库的日志内容。
) [; k- R+ X5 A  Y" n$ x: K6 Z+ Q
! e1 o3 C( u2 |. ~& p-t, --to-last-log:从当前日志文件开始读取,直到最新的日志文件结束。
- ?$ J8 X) ]8 o1 i
! F0 m/ y* A/ j+ W1 B-s, --start-datetime=:从指定的日期和时间开始读取日志。. Z# X: y3 w/ s. m

4 H; x' A/ }" a7 F: O1 U3 j-e, --stop-datetime=:在指定的日期和时间停止读取日志。
9 E1 Z  D  Q% P/ Z8 |, [) X4 o& f" H8 b% h1 _; s+ d* c7 B  K
–start-position=:从指定的位置开始读取日志。
, s% d9 w* H/ E9 _' v( r
4 y, n0 S& D( ~  a. Q' i–stop-position=:在指定的位置停止读取日志。
1 W& X- X8 g0 ?* F, A7 {1 b' G- H
0 J9 i4 j+ w# Q: ~1 {, o- u! Z  H. y–skip-gtids[=value]:跳过指定的GTID(全局事务标识符)。  e1 O9 t! L0 P' a- G& Y9 V

; Z+ }' I) \9 f9 _–include-gtids[=value]:仅包括指定的GTID。
- ^0 a5 K1 A! G5 u0 D8 C* ?  X  s1 x8 z6 J8 j
–hexdump:以十六进制格式输出日志内容。( m5 ^8 \0 d) h. b6 o" ~6 z- L$ j

% K1 ]/ C# Q( U9 W& b/ @) ^( F–no-defaults:不读取默认的配置文件。
1 E: B" f: G: W2 ^# q" G8 d5 K
0 p8 n$ D! e' J
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 20:20 , Processed in 0.052077 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表