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

通过binlog日志恢复数据

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-8-12 10:12:44 | 显示全部楼层 |阅读模式
1、执行4.1前置准备中的操作,生成一个新的binlog文件,假设我这里生成新的文件叫做mysql_bin.000004,后续数据的操作日志都会记录在这个日志文件中。% k% b9 z) p5 H( w/ e
$ d9 B& K9 d* Q; x4 ]: `9 v3 z
2、准备数据,直接执行本文第三点制作测试数据中的SQL即可。
% \4 Z6 ]% f- D: |( E5 _" f- K  T8 Q! n" X2 x- ?* a# Y' S, g
3、将mysql_bin.000004这个binlog日志归档,因为我们需要通过mysql_bin.000004这个日志恢复全部数据,所以要在删除数据库之前归档,如果删除数据库语句也被记录在mysql_bin.000004中,那么执行完mysql_bin.000004库又会被删除了。# t- [$ n; D% z4 `
. k+ q- j% n; a$ Q" F, P& }
* a. A# A0 S7 [
2 w1 w* |0 D% i' C' w! H
一:登录数据库时执行刷新log日志,自此开始产生一个新编号的binlog日志文件
9 r" {/ C6 G" _, v# y9 O( N/ G5 E+ t, p3 Y
mysql > flush logs;) F% `0 y+ ~7 w

8 F4 E5 {" X3 fcd  /var/lib/mysql/
& _7 i1 [9 ?( G  w
1 t& F+ ?% c& q0 jls -l mysql.bin.*
, Y4 L6 m1 H% i  ~$ L* R; W
: r& M/ U- o4 g6 C( C' B, T' Z二:通过mysqlbinlog执行恢复全部数据) n# ]9 x6 A' Q6 U" S% I6 I
mysqlbinlog是mysql自带的一个工具,一般在安装MySQL时mysqlbinlog也会放入可执行目录下,可以直接执行
) M3 ^3 v, V: h) S" w+ ~ 如果不能直接执行mysqlbinlog命令,可以通过  find / -name "mysqlbinlog"查找下这个工具在什么位置
# c6 G2 E  h* |: I9 N2 h& ^% G然后指定全路径执行即可: 如  /usr/bin/mysqlbinlog  --no-defaults  ...
6 i5 I- V' W, `7 i3 t1 y( I# R4 ]8 T  ?! Q6 ~
mysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.00005  |mysql -h127.0.0.1 -P3306 -root -p- J4 J( U: x, X5 V. r7 J( S) W. n9 C

1 i; X4 a+ v: `8 N三:即可检查数据库恢复情况  @6 p) g) K6 k, {
& M5 G+ u3 R* B. J" P% X' t

/ [/ e/ Z) U9 ~* {5 z; z$ k. [( U! L4 n  y
通过mysqlbinlog将binlog转为sql,以方便查询具体位置) W0 K9 _! ~' Y# f1 G) t3 ~
mysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql_bin.0000x > binlog_00000x.sql7 g) C! g- l$ _3 s2 c7 i' l# h
查看生成的binlog_000006.sql,确定需要恢复的起始位置结束位置还有起始时间和结束时间
9 E1 Y4 c: V( ]+ o  x8 ^) W- W8 A; x$ P: ^6 i3 K

+ T5 A+ o# M+ c- x
  v* x0 ^2 i% G" @2 \  s- W, I
4 n$ S* c9 I* k- t2 X3 l$ `5 E
' q" Z0 T8 |) S, h  |, j  A
0 w. ~  _+ O- C6 N# @

: Y* f5 n7 ]! y" z9 ?+ c  t$ {

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-12 10:50:10 | 显示全部楼层
通过mysqlbinlog执行恢复操作$ O6 ]6 b& D, x0 P# ~, ^/ G
通过位置区间恢复( v- V7 Y6 l8 b8 b4 K
mysqlbinlog  --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文件
" e7 V; ^; Q5 }5 y1 W( ]–start-position=232 :数据恢复的起始位置9 G1 A4 Z9 v6 T; d$ }, Y6 n
–stop-position=2220 :数据恢复的结束位置! ^) B, \4 k) D
mysql -h127.0.0.1 -P3306 -uroot -p123456 : 数据恢复需要登录数据库

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-12 10:53:17 | 显示全部楼层
要通过binlog日志来查看数据库变更信息,你需要确保MySQL服务器已经开启了binlog日志记录功能。以下是如何查看和解析binlog日志的基本步骤:, ^5 Q+ j4 Q; p
  Y5 x2 I6 {* }' W  ]% ?; ]
查看当前的binlog日志列表:. R5 U& u+ k+ _# j9 Q0 p# a
6 c8 B% ]& _: s4 k* r
SHOW BINARY LOGS;
# z& @7 Z0 [6 j4 z: [查看特定binlog文件的内容:
, M: Z* Q$ C4 [5 f
' D. i" U5 K2 [; v5 USHOW BINLOG EVENTS IN 'binlog_file_name';9 _9 O  S0 ?- `' m* C* b
如果需要解析binlog内容,可以使用MySQL提供的工具 mysqlbinlog。在命令行中使用该工具可以查看详细的日志内容:
& q: P1 w* p. F6 \
; P% N1 n, q# f; xmysqlbinlog binlog_file_name
# g3 J# F1 r5 |8 a3 L/ k$ U" R如果你想要编写自己的解析程序,可以使用MySQL提供的BINLOG API进行解析。以下是一个简单的Python示例,使用mysql-replication库来解析binlog:% h: o3 J9 f! S, R

) l5 g3 I$ ^$ M首先,安装mysql-replication库:7 u: O* i% b7 ~5 M, O

& [7 X2 M# Y0 ^+ B4 Cpip install mysql-replication( z, N: I: j' n
; y$ M3 U6 b! `. b! S) I& O
然后,使用以下Python脚本解析binlog:
, R  S" O, V  k! u" A
( J! G; N% v5 r+ C$ p  p. ]from mysql_replication import BinLogStreamReader9 {' H5 W' d3 v. V7 G) z5 p

: a9 v2 M  J' p" b' Q# 配置binlog服务器和认证信息
' H3 B! `5 \8 d  v( Rconfig = {
. Q! I$ A5 ]  U& l2 p1 l    'host': 'localhost',
& o' ~3 v! X, p    'port': 3306,7 [* R, j* W. T" N3 [, w
    'user': 'your_username',' Q* [- R$ n6 }/ m
    'password': 'your_password'
$ `+ e2 g+ C3 g* Q* e' N. z9 w}2 G/ O4 K- X1 r. Q
. X- |6 k. ~) H8 P, _7 S
# 获取binlog文件列表# z3 S9 I) x7 n& R, w2 Z4 e
show_binlogs_result_set = client.query('SHOW BINARY LOGS;')
3 j# c# i) Q. w$ B8 N) x5 f" f; U" c* ~5 Rbinlog_files = [row[0] for row in show_binlogs_result_set]
: `0 K2 P, V! a2 u& R - |7 V; k, D: y, K' v& x
# 对于每个binlog文件,解析其内容
6 b6 _4 P3 {8 |for binlog_file in binlog_files:
) J' ?2 O6 u5 ]4 |    stream = BinLogStreamReader(connection_settings=config, log_file=binlog_file)
4 b# Z/ R6 Q; u    for binlog_event in stream:+ Y0 [/ I8 x  F8 M
        # 处理每个事件,例如:9 A5 P8 P) W) }  D6 U" l
        print(binlog_event.row)  # 这将打印出事件中的数据行* n5 {/ D$ ~# H  l0 k7 o% G. p
    stream.close()
) L* M5 z: R! [请注意,这只是一个简单的示例,实际使用时你可能需要根据自己的需求处理更多复杂的情况,比如错误处理、事务管理等。

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-12 10:56:21 | 显示全部楼层
使用mysqlbinlog工具解析和恢复日志$ Q' m( ?2 o- o- g
默认情况下binlog日志是二进制格式,无法直接查看,除了使用上述命令查看二进制日志中的事务,还可以通过mysqlbinlog工具。
4 m- N2 c+ {; R' s; H" ymysqlbinlog是mysql官方提供的一个binlog查看工具,也可使用 –read-from-remote-server 从远程服务器读取二进制日志,还可使用 –start-position –stop-position、–start-time –stop-time等选项精确解析binlog日志。
6 K: c7 _( `7 O9 n: ?+ [, i; A
/ v) k/ D2 [; f; T. U选项:
" k* v6 |, S& F7 ^-h, --host=:连接MySQL服务器的主机名。2 S6 {4 G8 c: z, i# a. k) n

3 Y$ \; K6 n& k, w-P, --port=<port_num>:连接MySQL服务器的端口号。/ \* ?2 N3 v# L
# e; h4 {# h* a; V- R
-u, --user=:连接MySQL服务器的用户名。
! a$ T9 R' `* ]* ~0 m% ~8 O4 X# J: v( l' y- r* O
-p, --password=:连接MySQL服务器的密码。4 s' U( f; P4 _2 K$ V

* ^7 E' y* \: {8 \. ~–ssl-ca=<ca_file>:使用指定的CA证书文件进行SSL连接。
+ g2 m# k5 F2 x8 X  d0 J# X# b2 a/ j" @+ I/ [. G/ @, t3 A
–ssl-cert=<cert_file>:使用指定的SSL证书文件进行SSL连接。
3 E- H4 @4 _0 C9 v8 M6 t/ j8 J5 V$ x3 Z. k$ y/ s) M/ `
–ssl-key=<key_file>:使用指定的SSL密钥文件进行SSL连接。  h0 G* {, E0 p+ ]$ o( D/ U

7 d0 D! y9 W, n0 M# h-R, --read-from-remote-server:从远程MySQL服务器读取二进制日志。& W) z3 Z' M, l/ C* S
! E- e% G7 e' U9 [1 z2 j3 |
-r, --result-file=<file_name>:将解析后的日志输出到指定的文件。
& K/ g+ T$ M+ h/ J2 e
+ ?4 h0 g0 X) `$ U3 _# ^–base64-output[=value]:将blob字段以Base64编码的形式输出。: Q) }2 u/ H; u) O
8 r- t% s/ a9 z( v' ~, ]/ `
-v, --verbose:详细输出解析后的日志内容。
4 X% h, \0 ~3 R4 T2 r) r8 z4 ?- A+ @- ]$ N6 e. }
-d, --database=<database_name>:仅输出指定数据库的日志内容。
$ g! D& U2 \3 r: t0 Q& w; ?! O  x
-t, --to-last-log:从当前日志文件开始读取,直到最新的日志文件结束。
* J8 n+ \- D4 S) A' k! h' s* t+ L7 j/ r. }, e( b
-s, --start-datetime=:从指定的日期和时间开始读取日志。
/ P4 V. s9 G. f9 u; m* o8 L
; t4 V7 ]' K$ @1 i4 H-e, --stop-datetime=:在指定的日期和时间停止读取日志。# B$ g4 U, P1 ]6 E; ~0 D* ?
# \4 l9 T0 H3 L! r
–start-position=:从指定的位置开始读取日志。
3 X  W- s% ^# b% _- \- v% R) d+ P/ d, R% }0 H# A" {
–stop-position=:在指定的位置停止读取日志。) x/ V% {# V+ l- h

5 v1 a  @' a$ l: T6 k; Z–skip-gtids[=value]:跳过指定的GTID(全局事务标识符)。1 q7 R& Y5 N  z  f+ Y* t
" c. A2 ^, u9 Z" s  \
–include-gtids[=value]:仅包括指定的GTID。
6 t1 I/ k5 J: q+ k+ s
4 Z" r. X( j" b1 l& [4 Q- u% `–hexdump:以十六进制格式输出日志内容。) ^% g/ E$ W9 ]0 n' x( L  O
- T. `. C* h) l: t7 _7 Z& D) ^
–no-defaults:不读取默认的配置文件。
3 V) z+ {7 Q# n. V+ `# m" N3 H- \$ P6 p; ^; ]% z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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