易陆发现互联网技术论坛

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

通过binlog日志恢复数据

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

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

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

x
1、执行4.1前置准备中的操作,生成一个新的binlog文件,假设我这里生成新的文件叫做mysql_bin.000004,后续数据的操作日志都会记录在这个日志文件中。: c6 v$ U8 G* ~/ w

& r( J1 |/ a1 d1 c2、准备数据,直接执行本文第三点制作测试数据中的SQL即可。* [( U: |- L; _' z1 E# q
# E+ N7 Y" i' r3 |* W7 d
3、将mysql_bin.000004这个binlog日志归档,因为我们需要通过mysql_bin.000004这个日志恢复全部数据,所以要在删除数据库之前归档,如果删除数据库语句也被记录在mysql_bin.000004中,那么执行完mysql_bin.000004库又会被删除了。. V0 @! `% R! f) |9 d4 Y$ ?7 U. D
9 `7 k/ }8 W/ E1 S4 G6 n8 Q, H& ?

. Q! ~/ r) Z/ n6 e+ o' z% g& E1 h
! e2 s3 x. P0 p! _一:登录数据库时执行刷新log日志,自此开始产生一个新编号的binlog日志文件( B- A2 M8 p; \
/ y: ]: d& c  C1 k7 S9 R0 `1 V4 A
mysql > flush logs;
, L! h- P) J$ D$ D) D: B0 x- u/ A, a# ~. {- v# Z& ^1 e& v# L
cd  /var/lib/mysql/
/ T0 |4 a+ j5 M& ^9 z  O
: f9 C3 u  d" als -l mysql.bin.*+ [, o. d% d+ C

# ?1 i3 A8 N% P% B% ^4 c" b9 r+ ~二:通过mysqlbinlog执行恢复全部数据
* X; C1 u2 L6 s1 x# r9 M0 h mysqlbinlog是mysql自带的一个工具,一般在安装MySQL时mysqlbinlog也会放入可执行目录下,可以直接执行8 T& }2 L* d0 |) G; H) v5 T+ O: r5 B
如果不能直接执行mysqlbinlog命令,可以通过  find / -name "mysqlbinlog"查找下这个工具在什么位置8 s: ^! Z' T2 M4 J/ w1 T" t
然后指定全路径执行即可: 如  /usr/bin/mysqlbinlog  --no-defaults  ...; ~1 m! C+ \& j0 P; E9 p

1 b1 f: I# Q) N, R, ymysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.00005  |mysql -h127.0.0.1 -P3306 -root -p; n# w/ @' G* @

7 K! c6 ?( H3 N三:即可检查数据库恢复情况( Q. d9 W8 ?* n! n% [

! [) t% @. x: }8 ]0 q" b6 }' X
$ s' c/ Y  x. y% a: F5 S6 k
通过mysqlbinlog将binlog转为sql,以方便查询具体位置
/ K/ ]8 B. ]4 n# b- ?7 O- N$ M, D+ `mysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql_bin.0000x > binlog_00000x.sql( x  ]8 ~% N$ N  p' i
查看生成的binlog_000006.sql,确定需要恢复的起始位置结束位置还有起始时间和结束时间
! Q# `; }4 M# J
$ r% c3 S# p/ c) H4 b8 F

$ t0 C* q" G; J* \7 r  i6 u$ R- O7 ]

7 t8 E$ y% J: n) j& }  K
$ S% A# e" w9 ~) ~

$ W& O# V6 U1 `* t* l$ [+ H# ~- n4 f7 o; c: Z7 _
 楼主| 发表于 2024-8-12 10:50:10 | 显示全部楼层
通过mysqlbinlog执行恢复操作
& F, N9 a$ b5 E8 G4 a1 t通过位置区间恢复
) Y5 A6 y2 q( E$ \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文件
# L- Y! R/ z5 B* v7 N7 u. j- I/ ~2 T–start-position=232 :数据恢复的起始位置/ w& a5 U# G/ D6 t' H
–stop-position=2220 :数据恢复的结束位置7 S$ S2 g  m, A0 v& F9 {
mysql -h127.0.0.1 -P3306 -uroot -p123456 : 数据恢复需要登录数据库
 楼主| 发表于 2024-8-12 10:53:17 | 显示全部楼层
要通过binlog日志来查看数据库变更信息,你需要确保MySQL服务器已经开启了binlog日志记录功能。以下是如何查看和解析binlog日志的基本步骤:+ \' [: S! b0 {# O5 P5 p( g

& d$ W$ O/ z8 E查看当前的binlog日志列表:+ K, L7 z# ?9 i3 i, P

9 {3 t3 B: k: R4 G% PSHOW BINARY LOGS;- Z+ }! s$ V+ h% e) d
查看特定binlog文件的内容:
* r) {& P( p0 C
' y( c# K9 R2 ~& R  j7 ]SHOW BINLOG EVENTS IN 'binlog_file_name';
8 a/ y$ S  T9 g如果需要解析binlog内容,可以使用MySQL提供的工具 mysqlbinlog。在命令行中使用该工具可以查看详细的日志内容:
+ D4 S8 ]+ `- a8 K
, X' \. x. p1 z8 e& S7 [0 Nmysqlbinlog binlog_file_name6 M3 n' Z6 ?' U6 v8 V7 y- m
如果你想要编写自己的解析程序,可以使用MySQL提供的BINLOG API进行解析。以下是一个简单的Python示例,使用mysql-replication库来解析binlog:
) _) R$ Y+ G; P; N3 N* h. c
3 H: R0 O( N/ o- s! S3 [9 m+ H6 n首先,安装mysql-replication库:
- v3 Q* k9 B: [8 }( |9 M# a( B* S7 J- |( E- x# J+ j6 w) J6 @# p
pip install mysql-replication' p8 ?  p7 N! U. M0 @; q

* h0 K% o6 u  p然后,使用以下Python脚本解析binlog:% H% C' s8 j* t0 l+ c
& f+ m1 j$ H: H3 p
from mysql_replication import BinLogStreamReader
0 V! {5 Y/ y+ _: H- W ! q3 R, \1 L. C1 ]9 Z$ ]" S
# 配置binlog服务器和认证信息) }) g% g  v. ~
config = {  Z; u  A) M: J' ]) F
    'host': 'localhost',
4 A  b3 J% Q" a; P# H, O    'port': 3306,
, O" `$ G/ ]$ z  o; [2 ?    'user': 'your_username',0 p$ q. v7 Y8 s
    'password': 'your_password'
' }; A- H# Y+ O* z9 X}
+ \* N4 I- ~; X
! ?' |7 D# @% W/ d; y# 获取binlog文件列表
, v/ l8 W0 c) N) X: ]show_binlogs_result_set = client.query('SHOW BINARY LOGS;')
$ U% \. I/ n  P2 t$ F( d# F7 ~. Ebinlog_files = [row[0] for row in show_binlogs_result_set]
# H. n2 X' h- J; S5 l
' A* u9 ]" d4 U' |, }+ }: j+ ^# 对于每个binlog文件,解析其内容
+ K! X( ~, t, P. R; {for binlog_file in binlog_files:
% l( e3 ~2 d) j: [, V    stream = BinLogStreamReader(connection_settings=config, log_file=binlog_file)
* q+ k* a( ^* W9 N6 Y/ S    for binlog_event in stream:+ Q6 S% A9 B* z, r* _' y
        # 处理每个事件,例如:& |0 c- j' V& o; M: `# W( X* h
        print(binlog_event.row)  # 这将打印出事件中的数据行
) c: M1 X# M! g; M    stream.close()4 Z4 z) p9 \8 @
请注意,这只是一个简单的示例,实际使用时你可能需要根据自己的需求处理更多复杂的情况,比如错误处理、事务管理等。
 楼主| 发表于 2024-8-12 10:56:21 | 显示全部楼层
使用mysqlbinlog工具解析和恢复日志0 [8 c% _! M9 L2 V$ z4 }6 A# V3 `
默认情况下binlog日志是二进制格式,无法直接查看,除了使用上述命令查看二进制日志中的事务,还可以通过mysqlbinlog工具。2 Q( Z, e3 ^$ c3 I% o
mysqlbinlog是mysql官方提供的一个binlog查看工具,也可使用 –read-from-remote-server 从远程服务器读取二进制日志,还可使用 –start-position –stop-position、–start-time –stop-time等选项精确解析binlog日志。
/ k; q+ R- _! [+ a6 F0 {
" z1 G+ S; \0 t! o5 _选项:
2 G; e' g1 V5 P, E4 _4 [-h, --host=:连接MySQL服务器的主机名。0 K2 r- y+ F0 d( Y
2 z- [( e. l$ D5 D$ K$ L* J4 j
-P, --port=<port_num>:连接MySQL服务器的端口号。" M  F6 Q7 |# x  w) c8 o
3 {  u7 M/ V# }8 N- G, z
-u, --user=:连接MySQL服务器的用户名。  P9 l; e2 d6 s! H
- g# ]* Q( y2 o
-p, --password=:连接MySQL服务器的密码。
2 L! w) {5 Q' j7 q0 C) h2 z0 D
$ W. ^, L# \" h# s5 v* `–ssl-ca=<ca_file>:使用指定的CA证书文件进行SSL连接。
5 e$ b, }' h5 Y1 l- p* k( v& A; w- B. C, a) H
–ssl-cert=<cert_file>:使用指定的SSL证书文件进行SSL连接。
7 z4 f6 A! P6 E" H5 ^7 H: U, u) ~) m7 k
–ssl-key=<key_file>:使用指定的SSL密钥文件进行SSL连接。& A7 _7 A- I0 p9 e& i8 q
3 O. [8 S- K2 x, l& y
-R, --read-from-remote-server:从远程MySQL服务器读取二进制日志。
0 [' q% U- s/ C) p& J2 A
/ o! K6 e& Q* |4 J+ P-r, --result-file=<file_name>:将解析后的日志输出到指定的文件。' D2 n- n7 q! U+ _
. q+ G: w0 o6 N2 O
–base64-output[=value]:将blob字段以Base64编码的形式输出。. B0 r% m0 Y1 ], r1 K  c# k) G& u
5 T" D% U! b* p+ o
-v, --verbose:详细输出解析后的日志内容。1 R  {) S' Y% I9 J
) O. y/ @) t/ b' L6 y
-d, --database=<database_name>:仅输出指定数据库的日志内容。: R/ ?4 @# j( `

$ y! y6 y$ v8 g' q-t, --to-last-log:从当前日志文件开始读取,直到最新的日志文件结束。
8 W  M2 C& \( k" v0 q
; V: K& h  o2 q( I-s, --start-datetime=:从指定的日期和时间开始读取日志。
5 Z: w% f. Q) B+ A
+ F* L, N8 H6 c9 N  r-e, --stop-datetime=:在指定的日期和时间停止读取日志。
7 B9 h+ ~% B7 F4 w
' ?$ h" |. Q6 d$ m! p–start-position=:从指定的位置开始读取日志。$ H3 U# X* U7 }. o5 H% ~6 Z
. {/ |4 Z/ M2 O
–stop-position=:在指定的位置停止读取日志。
( A/ f+ V8 d- h7 R- ]
5 [$ j, W2 X( O0 `7 `; M8 H–skip-gtids[=value]:跳过指定的GTID(全局事务标识符)。4 B4 b! C  \) v$ P# H8 T
$ R- |* H8 P  L% P
–include-gtids[=value]:仅包括指定的GTID。
' h4 t* S( T  d9 N  a: @
! w! _! ~# ?; y- ^5 m  r( B–hexdump:以十六进制格式输出日志内容。/ @2 D' i4 e% O: ~4 M1 }' y; f' v
$ M8 _/ C6 D7 i9 |
–no-defaults:不读取默认的配置文件。
# `9 Z6 Z' c( S# K0 X
- f0 A4 E* ~; F4 S  |
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 点击这里给我发消息

GMT+8, 2026-4-8 13:43 , Processed in 0.041299 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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