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

通过binlog日志恢复数据

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-8-12 10:12:44 | 显示全部楼层 |阅读模式
1、执行4.1前置准备中的操作,生成一个新的binlog文件,假设我这里生成新的文件叫做mysql_bin.000004,后续数据的操作日志都会记录在这个日志文件中。5 d2 t% y( l8 n2 ?  A) r

" K# I' _" |! a2、准备数据,直接执行本文第三点制作测试数据中的SQL即可。
$ ~$ P1 o9 ~# j3 p( Q7 Z3 i9 W8 I: q$ h/ N* }$ d) C
3、将mysql_bin.000004这个binlog日志归档,因为我们需要通过mysql_bin.000004这个日志恢复全部数据,所以要在删除数据库之前归档,如果删除数据库语句也被记录在mysql_bin.000004中,那么执行完mysql_bin.000004库又会被删除了。/ Q( d3 m% G4 R1 ^- G5 R/ D- r
1 h- ~4 F, }# K0 s( m
$ I- T( A$ D) \% [
& n1 C- t$ Y, u: D
一:登录数据库时执行刷新log日志,自此开始产生一个新编号的binlog日志文件( ~, R. L) ]( N9 ?- `3 T9 [! Q9 `7 X3 h
  Z( `5 b# E) V7 U5 Q
mysql > flush logs;& d& r7 |6 ^( e+ W

: q$ G  C; P* s/ v" o6 i* K" ]8 ]cd  /var/lib/mysql/
- d8 Y; `0 C( o1 E4 z7 [" B5 Y+ {6 g# S( z6 x9 H& k) F9 U# y, l: @! L
ls -l mysql.bin.*
  e+ J4 e4 w0 l, Z& m9 B8 T) e8 e8 I' I3 p
二:通过mysqlbinlog执行恢复全部数据
" Y! Z3 {! q6 X  m  b2 f mysqlbinlog是mysql自带的一个工具,一般在安装MySQL时mysqlbinlog也会放入可执行目录下,可以直接执行  @  j, z( [& S9 P/ x8 d
如果不能直接执行mysqlbinlog命令,可以通过  find / -name "mysqlbinlog"查找下这个工具在什么位置. k0 x9 p3 A! V& ?5 j8 b" A8 x: A! Q# F
然后指定全路径执行即可: 如  /usr/bin/mysqlbinlog  --no-defaults  .... L8 p( c( o9 Z8 c) \: g

) k4 {7 P, E+ x1 i. Qmysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.00005  |mysql -h127.0.0.1 -P3306 -root -p
* d' d1 Z4 e" x$ e4 j7 p
( _# @, j! e8 F% B6 t三:即可检查数据库恢复情况4 r8 C5 i% k7 A7 h2 i* H

+ {- _; A# Z' a  m: D2 ~+ {4 U+ k/ I
7 `( @4 f7 J% v  M1 R1 X+ }6 s
通过mysqlbinlog将binlog转为sql,以方便查询具体位置
, I4 N; p. ^1 w5 Q: F% d3 pmysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql_bin.0000x > binlog_00000x.sql6 L* O3 A+ w8 M1 C/ q  t
查看生成的binlog_000006.sql,确定需要恢复的起始位置结束位置还有起始时间和结束时间3 u3 |2 _. [! n7 a

' t: u0 k1 s( Q- @2 {3 U

1 ^# ]. R; r  ~* l) u% Q" g" J; l2 T8 L) y( K; M" _3 a

, o& I/ D7 l* s8 h" W4 g9 h2 v2 h4 i, i
5 D9 q/ O% g: r: n' u* b& }1 S" T

8 {6 y( z$ n. v' g" E

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-12 10:50:10 | 显示全部楼层
通过mysqlbinlog执行恢复操作# P9 q4 O1 f0 B7 e
通过位置区间恢复
9 T( z: x# c/ `1 B0 Z( y; Tmysqlbinlog  --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文件6 _( m, ]1 {; H% ~- z
–start-position=232 :数据恢复的起始位置& Q$ K/ L: p+ W
–stop-position=2220 :数据恢复的结束位置2 `" w+ F) c- V. F+ j5 _
mysql -h127.0.0.1 -P3306 -uroot -p123456 : 数据恢复需要登录数据库

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-12 10:53:17 | 显示全部楼层
要通过binlog日志来查看数据库变更信息,你需要确保MySQL服务器已经开启了binlog日志记录功能。以下是如何查看和解析binlog日志的基本步骤:, \( n3 e; `/ F$ i& `0 f% j1 p* E

2 w6 L- B' d5 W8 r& _查看当前的binlog日志列表:! Y6 i, C8 n5 C8 y+ G. G+ i# x# w
# i. q& c7 H/ W
SHOW BINARY LOGS;4 o3 O3 J* z" j6 O# x
查看特定binlog文件的内容:2 r3 z# X. @: X' F9 S
! T' L2 R" k2 U4 `, x5 x
SHOW BINLOG EVENTS IN 'binlog_file_name';" |6 X2 g6 l. J) C* }& D
如果需要解析binlog内容,可以使用MySQL提供的工具 mysqlbinlog。在命令行中使用该工具可以查看详细的日志内容:
. F: g: e3 |) Z5 f2 P. l% N4 D0 A5 I# e
mysqlbinlog binlog_file_name$ ?3 t2 y) Z3 m  {) y  {# s7 p
如果你想要编写自己的解析程序,可以使用MySQL提供的BINLOG API进行解析。以下是一个简单的Python示例,使用mysql-replication库来解析binlog:
4 a# Y0 Z. C% v7 R5 L3 `$ ^6 h
6 X% E1 X+ P. v4 Y1 [2 E首先,安装mysql-replication库:
! s) D" ?3 Z& m3 p" C
2 R* Y# ]1 {( @4 a5 Vpip install mysql-replication
$ k- z0 e2 o  n6 H9 l! y, ~
) z" e, Y9 `* G7 X( H然后,使用以下Python脚本解析binlog:
: r+ p! @+ R) v$ o; Z  O
0 \: C* {6 F4 I: K- M% |from mysql_replication import BinLogStreamReader
9 D) o" R' w, }+ U. F  Z& M & H  @2 }( @* m$ B
# 配置binlog服务器和认证信息
- U7 v( N0 X8 n: _config = {
/ w) D1 }* P4 ~* \    'host': 'localhost',
4 R) C; c) C3 o    'port': 3306,( D4 B" k/ i6 a& b
    'user': 'your_username'," _# N* |. ^0 o
    'password': 'your_password'
3 n) D, J3 J, J1 B' S9 O}; q' `7 n8 l5 I/ |4 U
' k7 f- z$ U0 @9 C, ?" Q6 v
# 获取binlog文件列表
+ P" b& P% c+ M3 t8 wshow_binlogs_result_set = client.query('SHOW BINARY LOGS;')
9 v( h& _, f" C) rbinlog_files = [row[0] for row in show_binlogs_result_set]
) P& ?$ O: V; \
2 y1 E% i1 u+ l/ d$ u% U# 对于每个binlog文件,解析其内容( |- U7 g+ u& U" T
for binlog_file in binlog_files:
, S1 }8 F4 `5 F, m    stream = BinLogStreamReader(connection_settings=config, log_file=binlog_file)% W* Y- A# I' y' l) C6 T$ E/ t
    for binlog_event in stream:
+ o) f2 O1 G5 c  n        # 处理每个事件,例如:
) A9 }4 L% e, w        print(binlog_event.row)  # 这将打印出事件中的数据行1 l7 u/ s6 Y3 u6 g3 [
    stream.close()$ f5 M2 q  R1 Z5 O  F) P
请注意,这只是一个简单的示例,实际使用时你可能需要根据自己的需求处理更多复杂的情况,比如错误处理、事务管理等。

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-12 10:56:21 | 显示全部楼层
使用mysqlbinlog工具解析和恢复日志) p4 J& o: `$ f' Q4 P
默认情况下binlog日志是二进制格式,无法直接查看,除了使用上述命令查看二进制日志中的事务,还可以通过mysqlbinlog工具。) |$ h3 X1 \/ X$ d% Z; e
mysqlbinlog是mysql官方提供的一个binlog查看工具,也可使用 –read-from-remote-server 从远程服务器读取二进制日志,还可使用 –start-position –stop-position、–start-time –stop-time等选项精确解析binlog日志。
+ ^9 S6 p# ~6 G' i, |+ C7 J# O
' i) i( c+ N" T  a) s! W& [选项:" S9 T3 F. `4 Y0 ?' S9 C4 ?
-h, --host=:连接MySQL服务器的主机名。
3 U. l2 v( T" [& k# }% B/ g4 D3 _' q4 ^& I! D
-P, --port=<port_num>:连接MySQL服务器的端口号。/ Q* u2 t* x4 ~. y0 k! [

2 \1 `$ ^. C+ Z  v5 m% ^5 [4 r-u, --user=:连接MySQL服务器的用户名。
5 n3 K- R6 E1 |
6 ^& Q' n+ i# n3 t5 V' [/ Y-p, --password=:连接MySQL服务器的密码。( |. L* {6 Q& s# g% W
6 f& W. V. Y. b3 B& @
–ssl-ca=<ca_file>:使用指定的CA证书文件进行SSL连接。
  D2 g9 v- v3 r0 [% K5 D0 y+ R( k$ c9 d5 b2 o" G! ?8 L
–ssl-cert=<cert_file>:使用指定的SSL证书文件进行SSL连接。5 a- p! w' [0 V+ e1 p4 U

. {! x* M" C% S; s7 W$ p( z–ssl-key=<key_file>:使用指定的SSL密钥文件进行SSL连接。- q3 R1 \' j1 w% k' M
; |' V7 K. s" H
-R, --read-from-remote-server:从远程MySQL服务器读取二进制日志。, Y1 z. w( h, v2 y) l

! j' G, i+ U* R-r, --result-file=<file_name>:将解析后的日志输出到指定的文件。
; K: N/ T+ s- F0 Q. T) h. p9 f! @. V0 Q) t1 |1 h6 b5 y2 q* r6 `
–base64-output[=value]:将blob字段以Base64编码的形式输出。
2 m( s! m& j7 `/ V; |4 d
8 c% r7 J* N1 H; W-v, --verbose:详细输出解析后的日志内容。8 q* G3 O$ T% h# Q

& N( J5 y# {4 z( J-d, --database=<database_name>:仅输出指定数据库的日志内容。
& i5 g6 \$ U' K+ h2 L, I# f+ F) I7 o; L
-t, --to-last-log:从当前日志文件开始读取,直到最新的日志文件结束。
- |4 l# `" I5 c: o1 A- ^$ H0 ^
2 S# \" K% b4 J2 x2 l$ L-s, --start-datetime=:从指定的日期和时间开始读取日志。
0 I7 P- E0 Q$ ?, @$ l7 ?! t8 A1 A4 X/ z  ?
-e, --stop-datetime=:在指定的日期和时间停止读取日志。( F; a  d' r& g. W  ^+ W- Q

' g/ [0 w6 T$ H1 n" C/ `–start-position=:从指定的位置开始读取日志。# c: B, ~2 o4 g% v& ^" |! O
. R5 f; t& \) Y! x, D% ]8 r
–stop-position=:在指定的位置停止读取日志。
% q8 r% H4 Y7 I  B( b' p6 }5 l; ?+ \+ A4 m
–skip-gtids[=value]:跳过指定的GTID(全局事务标识符)。
* _. b. ^2 Y- Y' q
6 {2 z! @* g9 i; s–include-gtids[=value]:仅包括指定的GTID。
: i" \/ ~+ B( h* h8 U* M
& V5 m# K! J9 A, L–hexdump:以十六进制格式输出日志内容。; @9 y# w  r8 J8 C* W( u
. K) H+ K7 E/ E" \8 Z5 z" ~
–no-defaults:不读取默认的配置文件。0 F8 B; {4 ^6 m2 a- ]
2 T- R4 p, W: y9 C! I+ A
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 04:22 , Processed in 0.017917 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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