找回密码
 注册
查看: 44|回复: 4

通过binlog日志恢复数据

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-8-12 10:12:44 | 显示全部楼层 |阅读模式
1、执行4.1前置准备中的操作,生成一个新的binlog文件,假设我这里生成新的文件叫做mysql_bin.000004,后续数据的操作日志都会记录在这个日志文件中。+ |6 b; M" l1 y1 ~4 F

, d. n: s- Z: E: u  X! M2、准备数据,直接执行本文第三点制作测试数据中的SQL即可。
1 n1 _! M6 h% v( ~) k* L# X" p/ Z  @4 q+ n- o, k3 a9 M& q7 z
3、将mysql_bin.000004这个binlog日志归档,因为我们需要通过mysql_bin.000004这个日志恢复全部数据,所以要在删除数据库之前归档,如果删除数据库语句也被记录在mysql_bin.000004中,那么执行完mysql_bin.000004库又会被删除了。
+ J- F5 d  ]1 o3 |7 M6 I+ j
' x  Q" ], [* l/ ~( a1 E) `1 R1 P: {" L7 v* S

: ]) B" r$ b% {5 ~9 A4 |  s: `8 X0 ]一:登录数据库时执行刷新log日志,自此开始产生一个新编号的binlog日志文件
4 k/ o5 g6 W7 ~8 L7 e5 _- M
1 v$ v: \1 g* L* fmysql > flush logs;
6 F& X+ L6 R0 L6 p1 E" t$ M" D3 c9 @  g1 S! n
cd  /var/lib/mysql/2 X8 c3 Q$ M% \9 x- Y
$ _0 v+ L% [8 h8 X/ _" b  i
ls -l mysql.bin.*
+ O" h- h1 t$ Q9 a
6 e8 [* C6 v$ I& M4 y' Z, N! e二:通过mysqlbinlog执行恢复全部数据
" T( N! V9 }  l1 W mysqlbinlog是mysql自带的一个工具,一般在安装MySQL时mysqlbinlog也会放入可执行目录下,可以直接执行/ P  g- |* a1 w9 m; _6 w% {' u3 [
如果不能直接执行mysqlbinlog命令,可以通过  find / -name "mysqlbinlog"查找下这个工具在什么位置3 [# p4 t' W3 A' H& t
然后指定全路径执行即可: 如  /usr/bin/mysqlbinlog  --no-defaults  ...
. ?# Q( e! l$ f1 n) c& z
& `! n" c5 t/ W0 _* @( j9 f( ]/ f, X& Zmysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.00005  |mysql -h127.0.0.1 -P3306 -root -p- C6 x" X) j0 o. i: I4 O7 G- Q7 S
) l. H% l) a0 E# Q% O) d, b
三:即可检查数据库恢复情况0 y2 X7 D# G! O3 ?

. t( Y  x4 H! s# p8 ^! P) E2 q. {. ?7 K1 M) o) H& J

. a/ k6 p$ x) `# v通过mysqlbinlog将binlog转为sql,以方便查询具体位置
9 b5 w- W8 j7 B8 S; c3 amysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql_bin.0000x > binlog_00000x.sql/ b  }$ R+ x* E( H; [
查看生成的binlog_000006.sql,确定需要恢复的起始位置结束位置还有起始时间和结束时间
9 t# R- P& ?' `% l, e. K' b/ ]' G/ B$ w  q

* o0 j0 W( E) }, F/ D  D) b6 ?6 J$ Y, w! ]

/ P6 i* H/ w2 y9 b9 O6 g# G- |/ t6 U2 @6 k% X8 y) X* g
! A: r* j' |( X# U( [, j

+ O/ c2 b" Q% Y- h

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-12 10:50:10 | 显示全部楼层
通过mysqlbinlog执行恢复操作
& Z, z  `' Y- m8 M- T/ S# h通过位置区间恢复
: }, w/ J, T7 g" J0 Z& ?) ymysqlbinlog  --no-defaults  /var/lib/mysql/mysql_bin.00000x --start-position=231 --stop-position=2210 |mysql -h127.0.0.1 -P3306 -uroot -p

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-12 10:50:23 | 显示全部楼层
/var/lib/mysql/mysql_bin.000006 : 要操作binlog文件1 d  ?5 S) X: U# k# u
–start-position=232 :数据恢复的起始位置
) b/ g8 G0 ~9 g2 K+ c–stop-position=2220 :数据恢复的结束位置8 O! S9 R! L; m7 |# z6 X3 s
mysql -h127.0.0.1 -P3306 -uroot -p123456 : 数据恢复需要登录数据库

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-12 10:53:17 | 显示全部楼层
要通过binlog日志来查看数据库变更信息,你需要确保MySQL服务器已经开启了binlog日志记录功能。以下是如何查看和解析binlog日志的基本步骤:
5 x7 E4 y' a  M! r/ O. h: K5 t; B- p
查看当前的binlog日志列表:9 A, y5 X. J" k5 T1 W
, r. q* T' r- A
SHOW BINARY LOGS;
. L# @) x; L# z# C$ O查看特定binlog文件的内容:- C( C  f% h% t7 s3 x) j

+ u/ F% z. ^8 h8 vSHOW BINLOG EVENTS IN 'binlog_file_name';
6 t* \  w1 m4 Z" a" I如果需要解析binlog内容,可以使用MySQL提供的工具 mysqlbinlog。在命令行中使用该工具可以查看详细的日志内容:
) l) ~) a0 t1 d. _" P, [  }6 ?6 {2 Y  w  r, p  c7 S  P
mysqlbinlog binlog_file_name
' B. ^8 d3 F3 s$ U6 N如果你想要编写自己的解析程序,可以使用MySQL提供的BINLOG API进行解析。以下是一个简单的Python示例,使用mysql-replication库来解析binlog:  W9 r  {* X) M/ g8 R3 _! o4 F% [

4 L/ w$ ^9 b* i, g首先,安装mysql-replication库:+ ^9 R- R. |! l2 j5 x0 j" V
# Y: I1 g  r6 H: }0 A. t6 U+ A
pip install mysql-replication: e. U3 i8 V+ D' I
2 _  W# s. `, K' r, P: ?6 W% N
然后,使用以下Python脚本解析binlog:4 ]- V# |9 |! ^0 j

+ o1 B) ^' C) V' s+ L: O& H6 f) h/ qfrom mysql_replication import BinLogStreamReader
- P0 J/ d4 t1 `: s0 P' o* G( ]7 I
8 ]3 L" p& @  u3 ^  m% J3 ]2 |( D# 配置binlog服务器和认证信息
5 l( Y6 U* G7 X3 tconfig = {
+ u6 L4 l" X3 f    'host': 'localhost',7 t3 Y0 l3 X3 {; L2 G8 J. U& W9 [
    'port': 3306,: `  V' V9 v+ \7 H7 b& t' @9 c6 H
    'user': 'your_username',
6 W! Y; |$ q3 a/ h6 \6 j4 u0 ]    'password': 'your_password'
3 e1 Q  H: X* `- E" D3 s}
# T3 a( R" q9 \( x0 K) w2 Q ) R; h0 y" `% s4 K" q- r# Z
# 获取binlog文件列表% ?5 a0 @: h' o2 C
show_binlogs_result_set = client.query('SHOW BINARY LOGS;')
# _$ ]; H2 x: _& P$ Kbinlog_files = [row[0] for row in show_binlogs_result_set]
; S/ A- M) c1 D* V 8 I4 C2 J, c' u. F5 X% L# G! R
# 对于每个binlog文件,解析其内容
! p& W& a5 a& X) I" Ifor binlog_file in binlog_files:
% Z0 W$ b. K/ r* ]& V    stream = BinLogStreamReader(connection_settings=config, log_file=binlog_file)- P0 `8 Q5 P3 W
    for binlog_event in stream:
  a. ^  U: l/ U' m5 o0 ?# |6 h' j7 U        # 处理每个事件,例如:2 y' a* e6 C, l2 R
        print(binlog_event.row)  # 这将打印出事件中的数据行; e3 i  d. ~: w) s0 F2 s* P
    stream.close()
8 t: ^1 S' ^- q& Q- B! `请注意,这只是一个简单的示例,实际使用时你可能需要根据自己的需求处理更多复杂的情况,比如错误处理、事务管理等。

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-12 10:56:21 | 显示全部楼层
使用mysqlbinlog工具解析和恢复日志
4 a# t# q2 V5 ^: ^- U: c0 n6 ]- N默认情况下binlog日志是二进制格式,无法直接查看,除了使用上述命令查看二进制日志中的事务,还可以通过mysqlbinlog工具。
) X5 J$ |) \8 Xmysqlbinlog是mysql官方提供的一个binlog查看工具,也可使用 –read-from-remote-server 从远程服务器读取二进制日志,还可使用 –start-position –stop-position、–start-time –stop-time等选项精确解析binlog日志。
9 W& K1 ^- V) ~% E8 {) E1 F% t' k9 i5 [+ w
选项:
) C( v& h, u* K6 j5 |-h, --host=:连接MySQL服务器的主机名。
4 A, Q  o% c8 j' d8 _$ P7 ]  s! V  d) D7 e* S4 ^! P: M
-P, --port=<port_num>:连接MySQL服务器的端口号。
  G* Y- u) M  y6 W( d% a6 z/ E! y5 Y9 P% b1 f+ w% q
-u, --user=:连接MySQL服务器的用户名。
" G, _! M# b. ]6 z3 z# J& a, i. X- Z" t# U
-p, --password=:连接MySQL服务器的密码。
2 E; X' x5 b( I( T- L8 e, ~  S2 h0 s2 S7 k
–ssl-ca=<ca_file>:使用指定的CA证书文件进行SSL连接。
* |! l6 F1 i' [% f: }# |" R( A8 M
2 u3 Y8 t# r* P* w, p+ d–ssl-cert=<cert_file>:使用指定的SSL证书文件进行SSL连接。
& C3 R: ?- B: K. G8 E3 G4 S- m; @7 }6 S9 x$ E7 }' r
–ssl-key=<key_file>:使用指定的SSL密钥文件进行SSL连接。3 |+ G8 P3 F; k* h3 ^
2 h2 b* Y) t4 q- O$ V8 G1 Q6 |
-R, --read-from-remote-server:从远程MySQL服务器读取二进制日志。
" {* S& t2 r! B& U% ~% |) j% I
9 c' z6 c6 D& y5 `/ i-r, --result-file=<file_name>:将解析后的日志输出到指定的文件。, Y5 {4 p% O1 p2 s9 L$ H+ t
# D. H7 I$ N5 F, @
–base64-output[=value]:将blob字段以Base64编码的形式输出。
: e; y. ]/ f0 V6 \* ~0 B  d! k8 v" S
-v, --verbose:详细输出解析后的日志内容。
  z3 D/ s4 p1 [, q! D
2 p3 D4 b; e$ \& c9 ~-d, --database=<database_name>:仅输出指定数据库的日志内容。' H, x5 {; b4 b  _+ e. h3 w+ n
5 w+ v6 e% y) l
-t, --to-last-log:从当前日志文件开始读取,直到最新的日志文件结束。
, H0 [3 p9 ]6 _7 F; T1 D3 w- C2 A% i
-s, --start-datetime=:从指定的日期和时间开始读取日志。
6 @1 G( W4 M# k- |/ \& {, p& a) D) ^; |1 h- G+ ]1 ]
-e, --stop-datetime=:在指定的日期和时间停止读取日志。6 g- _* ^3 A5 Z/ N

4 ?+ w4 ^0 e0 W' A& _, p& H" Z–start-position=:从指定的位置开始读取日志。
0 A1 r+ D8 }. S, V3 Z8 _
/ R% I* [* B0 d) }  Y8 j–stop-position=:在指定的位置停止读取日志。
* h) w0 Q- {+ S8 _. }6 l
' R5 J8 ~% T) {, [–skip-gtids[=value]:跳过指定的GTID(全局事务标识符)。
" M! Y3 b2 D) g  K% }6 M6 G6 ]* H/ n; u- t- X  ?8 K2 Z
–include-gtids[=value]:仅包括指定的GTID。8 ]; n9 S" R  k5 F
" S: ], }: H+ g4 y' ~0 g4 \
–hexdump:以十六进制格式输出日志内容。
4 M& y* G8 G% I$ e( Y$ ^  H: D+ T' I# F7 O2 |6 u+ Y4 ]
–no-defaults:不读取默认的配置文件。
$ I+ y5 S5 a7 h- }/ e: f# s' y1 Q  I) [  I* t; K
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-11 23:04 , Processed in 0.017122 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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