易陆发现互联网技术论坛

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

通过binlog日志恢复数据

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

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

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

x
1、执行4.1前置准备中的操作,生成一个新的binlog文件,假设我这里生成新的文件叫做mysql_bin.000004,后续数据的操作日志都会记录在这个日志文件中。
1 f: q+ |/ k3 Y6 a! Q+ x
0 V$ w+ P) i3 c2 s4 O# k2、准备数据,直接执行本文第三点制作测试数据中的SQL即可。
2 s3 T4 E6 @9 v, b' F4 c% G) }! Z& o; |4 @$ {" Z
3、将mysql_bin.000004这个binlog日志归档,因为我们需要通过mysql_bin.000004这个日志恢复全部数据,所以要在删除数据库之前归档,如果删除数据库语句也被记录在mysql_bin.000004中,那么执行完mysql_bin.000004库又会被删除了。) A7 u0 @( S4 u8 [

9 ^; N& {" K) ^, M+ u
- j8 L' V) w7 t# H  x3 Y) d) w4 M, |
4 O- W+ q# |* Y# ~  b$ [0 B; Z& H一:登录数据库时执行刷新log日志,自此开始产生一个新编号的binlog日志文件
$ U+ x7 l$ h* q% X2 w. s
; ]- ~7 ]& A1 `9 B: y- l7 M3 Amysql > flush logs;
$ V: v! x$ s: V" v8 W6 w. u; M, n8 @6 j* H& i, p
cd  /var/lib/mysql/
! [" }% n$ D& }. [% \& t6 X1 }
/ i3 g1 J' u3 h! a' C. R6 Gls -l mysql.bin.*8 P# |' W9 B2 Q% x1 g1 G7 }5 m

1 w8 `* [4 g1 ]/ j二:通过mysqlbinlog执行恢复全部数据! a: s; Y5 |" O% G! B9 d1 @% P
mysqlbinlog是mysql自带的一个工具,一般在安装MySQL时mysqlbinlog也会放入可执行目录下,可以直接执行
, g2 }1 _/ f2 B4 e" Y' ~ 如果不能直接执行mysqlbinlog命令,可以通过  find / -name "mysqlbinlog"查找下这个工具在什么位置
$ N  f" r! e1 b) A然后指定全路径执行即可: 如  /usr/bin/mysqlbinlog  --no-defaults  ...* z. }" Q" W2 T% O% \6 }1 c% `- t
' ]+ [$ J& j* `9 U: M4 B" C
mysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.00005  |mysql -h127.0.0.1 -P3306 -root -p
% k2 u: ]. ?9 F: `( ?/ L
$ Z+ ^0 {' B- l三:即可检查数据库恢复情况/ A$ O# @6 q! T# E
9 K. P8 W% K/ u1 K

$ f4 M3 _+ I8 K# b* E2 J
$ e, y, ]$ f) ]( e" [, [9 k7 O: S通过mysqlbinlog将binlog转为sql,以方便查询具体位置
( G9 @- m  m1 l% \+ D. G0 n7 I( a& rmysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql_bin.0000x > binlog_00000x.sql
6 m9 c4 D4 p+ y/ V4 I查看生成的binlog_000006.sql,确定需要恢复的起始位置结束位置还有起始时间和结束时间
5 D" p9 I9 [! r5 j7 d" U7 w8 g& U: B6 X/ A
! t2 c4 ^- P* u! j8 j( T
. i# @$ s" \6 i# |. \* v

( Q$ r% a$ C  y" K3 b7 B
9 r8 b- A/ x. W. _; [
  P1 |! X+ V7 x* _, V% [! y2 T" w

8 Q# N! {' P5 x( V* G/ ]0 N. S
 楼主| 发表于 2024-8-12 10:50:10 | 显示全部楼层
通过mysqlbinlog执行恢复操作0 p! @: e: j1 _+ Z: o0 Q  c, |
通过位置区间恢复! I/ ^% {. Q' ~8 z
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文件
9 `  V" K: L+ ]& ?8 _  W" \) M5 ?1 X–start-position=232 :数据恢复的起始位置
- v# y0 B- U0 b+ g2 c0 X–stop-position=2220 :数据恢复的结束位置
# u+ ~* d, m- H) i7 w4 I/ A2 @mysql -h127.0.0.1 -P3306 -uroot -p123456 : 数据恢复需要登录数据库
 楼主| 发表于 2024-8-12 10:53:17 | 显示全部楼层
要通过binlog日志来查看数据库变更信息,你需要确保MySQL服务器已经开启了binlog日志记录功能。以下是如何查看和解析binlog日志的基本步骤:/ d9 n; x& K! ^% L

( ^; d9 ]2 f8 ]查看当前的binlog日志列表:
  q1 J8 J! i1 T# P
. p* v0 S& o: y! JSHOW BINARY LOGS;
* s5 W$ B; E/ t5 G- d& |查看特定binlog文件的内容:& N2 ?+ Z3 q' T, H! \$ I+ }7 Q
! y0 R+ j2 k/ |# \+ h2 h, a
SHOW BINLOG EVENTS IN 'binlog_file_name';6 ^! p  [) O7 l* m+ q
如果需要解析binlog内容,可以使用MySQL提供的工具 mysqlbinlog。在命令行中使用该工具可以查看详细的日志内容:7 v5 B$ O1 O$ H
- o4 a* i* J; O/ X, @
mysqlbinlog binlog_file_name
0 r8 R; b0 A3 e! S5 o如果你想要编写自己的解析程序,可以使用MySQL提供的BINLOG API进行解析。以下是一个简单的Python示例,使用mysql-replication库来解析binlog:# d: b2 g# x! ~9 Q. R" f* t2 p

# s: j. F; S- `0 ~- Q/ ?/ J' {首先,安装mysql-replication库:
- ~! u6 O0 T" u+ s' k( `: O! B4 u8 l8 N) W' e2 \
pip install mysql-replication
. B0 [  Y7 x9 Z, o3 L7 A4 v5 x* H- C" L; {, Y6 }" B5 B( b
然后,使用以下Python脚本解析binlog:
9 l0 L* b. u- S9 l6 Y) f$ l
9 R  e+ [5 \( v' w. Dfrom mysql_replication import BinLogStreamReader' w) @! j9 B% r" f! k) Y7 Q

) a- b# R; L5 _8 z" X! J( d# 配置binlog服务器和认证信息( S  [# S1 c/ q# D& U/ _4 t
config = {8 q, I5 e( L$ @4 R  k* F" R
    'host': 'localhost',( f7 M8 O. j! \  H
    'port': 3306,. r" R& v  {* {& [$ F( S( q9 H
    'user': 'your_username',
- f8 _2 A) `  K/ N+ a# }0 _    'password': 'your_password'9 T0 S$ ~1 `! s4 v
}
; ], U  ]; F& b3 P# ?9 _ 6 x3 x6 a, S4 m
# 获取binlog文件列表
& D; j3 q: e8 E2 f+ Eshow_binlogs_result_set = client.query('SHOW BINARY LOGS;')
3 b+ c' Z, L$ y; F! bbinlog_files = [row[0] for row in show_binlogs_result_set]
0 n6 P. a( r, {3 A, @4 T- @
. B; K1 e  Q7 n5 z  x! q+ h# 对于每个binlog文件,解析其内容, x$ g2 W% F/ [9 e. y0 R6 U
for binlog_file in binlog_files:
, B3 K) ?- N4 ?. s5 F    stream = BinLogStreamReader(connection_settings=config, log_file=binlog_file)
4 E- c( Y  F3 x9 L1 c5 f) n    for binlog_event in stream:+ v: c9 j1 f& }) Z& l- C& T+ a" T" Z* f
        # 处理每个事件,例如:# ?/ Q9 v& r& m; ?2 D5 r
        print(binlog_event.row)  # 这将打印出事件中的数据行' e: {9 ?% x: w" d
    stream.close()
! x+ t! r% V: M& u: K5 a) L请注意,这只是一个简单的示例,实际使用时你可能需要根据自己的需求处理更多复杂的情况,比如错误处理、事务管理等。
 楼主| 发表于 2024-8-12 10:56:21 | 显示全部楼层
使用mysqlbinlog工具解析和恢复日志
; D1 F1 w9 j$ h6 N( q默认情况下binlog日志是二进制格式,无法直接查看,除了使用上述命令查看二进制日志中的事务,还可以通过mysqlbinlog工具。
0 }  ^5 V; t" }7 smysqlbinlog是mysql官方提供的一个binlog查看工具,也可使用 –read-from-remote-server 从远程服务器读取二进制日志,还可使用 –start-position –stop-position、–start-time –stop-time等选项精确解析binlog日志。
# i7 b! t; m% j) D7 t2 H
8 l4 A  v# V6 k" k2 g  @2 ?: O选项:  P6 g. X& o( n: x! f/ S
-h, --host=:连接MySQL服务器的主机名。6 R) Y9 ]  Z4 D5 {, F- ]8 s- n

, k% ]( {/ ]. ~-P, --port=<port_num>:连接MySQL服务器的端口号。
/ X& ^1 {1 i/ ^( ?
  L( g9 @4 j" C/ i$ x-u, --user=:连接MySQL服务器的用户名。! B. {7 L$ E& \+ m* Z) T

  S% P* [, X4 Y* _& V' c/ [-p, --password=:连接MySQL服务器的密码。" F, E0 X) C8 g3 \" [

0 A" Z7 {- k( q+ w–ssl-ca=<ca_file>:使用指定的CA证书文件进行SSL连接。
! S5 E- S7 g# R: O1 |8 e
  E6 d( {6 i9 J5 `7 {$ L  O2 J& d–ssl-cert=<cert_file>:使用指定的SSL证书文件进行SSL连接。
% l/ T6 s) G4 _5 N# m% ?( T- b% T' @& A% c
–ssl-key=<key_file>:使用指定的SSL密钥文件进行SSL连接。
. j7 u$ e  |+ n+ F  _. a
. L& n' ]% ^8 S-R, --read-from-remote-server:从远程MySQL服务器读取二进制日志。3 T4 J. x0 c% z" c! H6 X
8 W: W9 u9 `  f# S" q" Y% _
-r, --result-file=<file_name>:将解析后的日志输出到指定的文件。8 ?2 k8 p, r9 _( o& U% X( ^

3 `& i9 x: c  j9 q- I- I5 C1 J–base64-output[=value]:将blob字段以Base64编码的形式输出。, n! z3 [; ?- v& z! Q0 {

' l! e2 @) x, y' F-v, --verbose:详细输出解析后的日志内容。1 m7 }, M2 @: m9 D8 Y& \7 j# k
7 ~! h" x1 k( ^* _
-d, --database=<database_name>:仅输出指定数据库的日志内容。6 ]) f  F* K; C7 K5 v4 Q* l/ ]

; R1 z5 T- M: |-t, --to-last-log:从当前日志文件开始读取,直到最新的日志文件结束。
8 t7 G0 g! K3 k) Y6 @0 x
( l5 c! E4 {- W, `: [+ ~-s, --start-datetime=:从指定的日期和时间开始读取日志。9 N2 T! |( i. A! _: q& L0 S! o
# x0 \7 z: H' S$ X, w, f7 d3 b
-e, --stop-datetime=:在指定的日期和时间停止读取日志。
& V$ z, l  w& W7 O8 F! I; O; [: ~
# ~9 R- @3 V7 `1 @4 `% c9 b1 H" M3 L1 k–start-position=:从指定的位置开始读取日志。) ^0 g) t4 Z4 _; @4 f! g. y
: i7 z  i* G0 p  z& ?: A* H" H3 W
–stop-position=:在指定的位置停止读取日志。+ Q+ G( N7 e5 v0 R9 m

3 q: ]8 C" a, j–skip-gtids[=value]:跳过指定的GTID(全局事务标识符)。
/ D0 W  r  D7 q: Y6 M' r% S
# D% P0 Z7 Q7 U) F–include-gtids[=value]:仅包括指定的GTID。
* `% T& l( v. u7 V6 X
1 o9 H2 P0 V# `; D3 _9 Z- Q–hexdump:以十六进制格式输出日志内容。- f2 ?) J, Q6 l2 y
8 X) m8 c* z/ i  B6 D# u/ Y
–no-defaults:不读取默认的配置文件。
% ~' b9 d; h+ h0 \7 h' S2 J/ m3 }; ^; U' j
8 k3 ?+ q) r( P% g5 y8 _: ~
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-8 21:19 , Processed in 0.042886 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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