易陆发现互联网技术论坛

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

通过binlog日志恢复数据

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

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

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

x
1、执行4.1前置准备中的操作,生成一个新的binlog文件,假设我这里生成新的文件叫做mysql_bin.000004,后续数据的操作日志都会记录在这个日志文件中。
& n7 S) B* U0 V( R; J/ O) n
  }* M: K% L* F# |" q! G2、准备数据,直接执行本文第三点制作测试数据中的SQL即可。# d- Y- T6 k/ A/ j& x6 {1 s: H
/ Z) g7 r* s6 S4 Y0 p- k$ _
3、将mysql_bin.000004这个binlog日志归档,因为我们需要通过mysql_bin.000004这个日志恢复全部数据,所以要在删除数据库之前归档,如果删除数据库语句也被记录在mysql_bin.000004中,那么执行完mysql_bin.000004库又会被删除了。/ z, ?- {% K% \9 J# R  e  k* |7 m

% i# |( a$ p- t- x! S3 L. |, c3 W5 }

) e* W" w+ S4 E一:登录数据库时执行刷新log日志,自此开始产生一个新编号的binlog日志文件6 k* `1 O8 y9 K# y

9 L. `6 P) r+ E7 emysql > flush logs;
/ O5 r+ p0 O, S4 [
! W) Z' P0 f8 V' ^cd  /var/lib/mysql/2 F; i: i& k& L2 {$ K
% z3 b8 e: L" f' g" B9 z6 q
ls -l mysql.bin.*+ o1 e6 E- j% @% @" B0 J

: G  ?- l$ t9 `$ W7 J! [) X二:通过mysqlbinlog执行恢复全部数据' ?' z2 L) |) ?- }" ]% }
mysqlbinlog是mysql自带的一个工具,一般在安装MySQL时mysqlbinlog也会放入可执行目录下,可以直接执行. K9 B/ E5 ^6 l. g
如果不能直接执行mysqlbinlog命令,可以通过  find / -name "mysqlbinlog"查找下这个工具在什么位置! p$ _# E) h) R9 @
然后指定全路径执行即可: 如  /usr/bin/mysqlbinlog  --no-defaults  ...
: `$ h) [! e7 c* Y8 X8 D$ Y6 K& }* b( ]8 h' Z- P5 w+ b2 R
mysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.00005  |mysql -h127.0.0.1 -P3306 -root -p
+ x' W, s: ?; L# w
4 o' J+ ?! P! n; V三:即可检查数据库恢复情况7 G' ?! ]8 L. H6 Z, c3 T
3 d6 L5 [' [& s' s, H8 n5 u

+ d9 e& _# b) z% o  z" c- `* i; _/ f* k
1 [, v7 N6 Q2 P7 o通过mysqlbinlog将binlog转为sql,以方便查询具体位置
# {6 O: J+ m. i7 bmysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql_bin.0000x > binlog_00000x.sql0 W0 ^3 V  e# L$ M
查看生成的binlog_000006.sql,确定需要恢复的起始位置结束位置还有起始时间和结束时间0 h! N' X9 \% J. _

3 A' ]& H1 S- m% P
! Y; h1 z: i! n' H1 y
. K8 a/ O; b8 K. ^
. n* o/ E5 d1 j
4 ~- I- y) }7 @* g* a' s

. N5 v. P8 @- n1 p$ }& s' }: @
' U: j* }- Y# I8 r
 楼主| 发表于 2024-8-12 10:50:10 | 显示全部楼层
通过mysqlbinlog执行恢复操作$ Y8 J+ P. j- V  u
通过位置区间恢复' ?, I0 U  \$ A" ?, K& n
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文件
  r- m* w" c: ]. f5 w1 d–start-position=232 :数据恢复的起始位置
& D& K7 j. O' l–stop-position=2220 :数据恢复的结束位置
" P# Z9 H* v9 V. Jmysql -h127.0.0.1 -P3306 -uroot -p123456 : 数据恢复需要登录数据库
 楼主| 发表于 2024-8-12 10:53:17 | 显示全部楼层
要通过binlog日志来查看数据库变更信息,你需要确保MySQL服务器已经开启了binlog日志记录功能。以下是如何查看和解析binlog日志的基本步骤:7 b, c& K' ?' N( D

4 V, @8 ]- p8 j6 D查看当前的binlog日志列表:
; z* j6 d1 A6 Z" E# r: R1 q3 }8 [& p3 T
SHOW BINARY LOGS;7 y7 A3 U4 u; z: v, b: B0 `
查看特定binlog文件的内容:( e. O* ~, u2 _- e, `
. F7 M* f7 p# a
SHOW BINLOG EVENTS IN 'binlog_file_name';* X& I2 j, p! Q9 @) d: y
如果需要解析binlog内容,可以使用MySQL提供的工具 mysqlbinlog。在命令行中使用该工具可以查看详细的日志内容:8 {9 G3 G/ @3 P

# d0 H9 F6 H  F2 m0 Imysqlbinlog binlog_file_name
2 H& h6 E" d7 J" J如果你想要编写自己的解析程序,可以使用MySQL提供的BINLOG API进行解析。以下是一个简单的Python示例,使用mysql-replication库来解析binlog:! L0 T# L  O# ]( B! u$ A% w4 P, I

( a0 I7 |3 i+ F4 `/ V首先,安装mysql-replication库:
, t: i4 E$ ?* w5 i* j! A9 ?% c$ W. z
  P1 {& i% N' Z' a2 {, P1 Mpip install mysql-replication! X0 i% U7 z9 d0 j" X% ^7 q

' g/ n+ \4 }% P$ d; m6 D6 i" j然后,使用以下Python脚本解析binlog:# ?2 A/ M" B  I& o8 y5 v
$ l8 S; g: [, t3 r
from mysql_replication import BinLogStreamReader
* D* w! p& w, z8 U, Z, W, A  B) {
' m  W4 E' A: D$ x  {: w# 配置binlog服务器和认证信息' n) |# e$ n& ^% e
config = {( v5 D3 K3 T+ e+ q8 ]* f; g
    'host': 'localhost',
! I) b4 L1 ]5 L/ R+ u    'port': 3306,
& |) w" t+ Q0 x* p- T8 O    'user': 'your_username',
. K1 y  I3 }# W5 k5 V    'password': 'your_password'
8 W  F. F+ \, p: ]}
1 e) ]6 u; o9 N4 k0 Q' ~. V2 w" a
/ \' J3 G9 g. i( u! A' l5 C# 获取binlog文件列表
9 W  l. ?- g0 j0 H, O0 E8 yshow_binlogs_result_set = client.query('SHOW BINARY LOGS;')
% p4 o1 Q; U) Z: i3 c5 Qbinlog_files = [row[0] for row in show_binlogs_result_set]6 ~) U8 y, T  h% x0 D
! G; f, k% J. }$ I' U9 F$ Q) N* i
# 对于每个binlog文件,解析其内容
0 F9 j, r( B% e# `6 u1 z9 wfor binlog_file in binlog_files:- D' X3 x/ G! `" `$ a6 |7 X
    stream = BinLogStreamReader(connection_settings=config, log_file=binlog_file)
( C: b0 x' Y! y4 O! G    for binlog_event in stream:" C7 @& [) i0 |* {
        # 处理每个事件,例如:. w+ N5 t5 ]6 A/ M- u2 }9 B
        print(binlog_event.row)  # 这将打印出事件中的数据行% H# S, K: {0 T' _- G
    stream.close()
, l1 S5 e* I2 x' o. W5 E请注意,这只是一个简单的示例,实际使用时你可能需要根据自己的需求处理更多复杂的情况,比如错误处理、事务管理等。
 楼主| 发表于 2024-8-12 10:56:21 | 显示全部楼层
使用mysqlbinlog工具解析和恢复日志. H9 \2 k+ V4 i
默认情况下binlog日志是二进制格式,无法直接查看,除了使用上述命令查看二进制日志中的事务,还可以通过mysqlbinlog工具。
4 m/ r, U+ F2 s+ _, R2 pmysqlbinlog是mysql官方提供的一个binlog查看工具,也可使用 –read-from-remote-server 从远程服务器读取二进制日志,还可使用 –start-position –stop-position、–start-time –stop-time等选项精确解析binlog日志。$ v( t  F2 Q; T5 T1 U6 A. e

& L* T- v. c- y( p% F( w选项:
! g2 s% ?$ ^+ e% w- [8 _-h, --host=:连接MySQL服务器的主机名。% R% Y9 y$ U* M
/ q$ a( a/ L7 g# x; Z! J
-P, --port=<port_num>:连接MySQL服务器的端口号。
7 T/ z7 I1 ^% G! h3 w1 C6 O/ R% w, M+ z# |
-u, --user=:连接MySQL服务器的用户名。
5 O5 i/ `$ f! v" a8 R; n/ M. F6 u
-p, --password=:连接MySQL服务器的密码。$ `+ g  _/ p( R; n3 F7 H: j9 W; a8 C
5 {7 Z, F; |9 Y2 g
–ssl-ca=<ca_file>:使用指定的CA证书文件进行SSL连接。! L' W: s7 F/ l1 V4 p7 y. X. Z' {
# o. r; b; F5 d+ O- P8 V4 ?
–ssl-cert=<cert_file>:使用指定的SSL证书文件进行SSL连接。
! I( K: W3 D. J- b. |! S* y5 x
; I# Z) K/ F3 F5 `% F. }–ssl-key=<key_file>:使用指定的SSL密钥文件进行SSL连接。% [  i& }! s9 a7 _8 J, \( V4 Y% T
4 _9 B% X: R2 _, R5 ]: _
-R, --read-from-remote-server:从远程MySQL服务器读取二进制日志。' B, r, p; o0 G5 w$ A' \4 _

% l& Y' w; D/ v! q1 a) X. f-r, --result-file=<file_name>:将解析后的日志输出到指定的文件。
) g. c& v7 z+ R' T8 D5 S6 _" u) n, t2 P) T
–base64-output[=value]:将blob字段以Base64编码的形式输出。' b0 r; \8 A  |3 u4 q- D
3 p) C0 [9 T! O! ~
-v, --verbose:详细输出解析后的日志内容。
. i0 Y4 K* `) E) I% q
6 w3 i$ X6 `7 m+ r' J. M-d, --database=<database_name>:仅输出指定数据库的日志内容。9 ]0 W. G) I4 ~7 p

$ M& n  P2 Q( |, c( W-t, --to-last-log:从当前日志文件开始读取,直到最新的日志文件结束。
1 f4 V7 H4 m" G! L' N8 e# h, d0 G3 k  ~/ H
-s, --start-datetime=:从指定的日期和时间开始读取日志。
5 z2 O3 ^7 O% l/ {9 S! i1 |  W5 |  U1 S7 U5 F
-e, --stop-datetime=:在指定的日期和时间停止读取日志。3 c5 l% p8 y2 J* U! B0 l% [' ~& B% q+ w( ^
$ T& g1 D$ f/ q3 Z: D* M
–start-position=:从指定的位置开始读取日志。1 o; l& b( V$ ^# T& K# z4 P' Z
% C$ B# U/ x5 k6 r3 `3 u
–stop-position=:在指定的位置停止读取日志。
8 p9 f9 y( n$ d  b/ \! t8 o5 m1 Y& o
–skip-gtids[=value]:跳过指定的GTID(全局事务标识符)。
% A4 X/ e" Z9 L5 s! P7 y9 n) K$ i/ O
–include-gtids[=value]:仅包括指定的GTID。! [& L6 {! T4 J0 J. p  h
. I1 {! Z1 v/ I8 M. V
–hexdump:以十六进制格式输出日志内容。; t! B- b: q- ]0 Z. r

; u3 Y3 y4 u9 j  }) N$ c2 D2 {–no-defaults:不读取默认的配置文件。% S2 D8 W; P8 w3 i5 q8 N/ U
( D3 j, g- t4 ^
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

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

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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