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

通过binlog日志恢复数据

[复制链接]

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
发表于 2024-8-12 10:12:44 | 显示全部楼层 |阅读模式
1、执行4.1前置准备中的操作,生成一个新的binlog文件,假设我这里生成新的文件叫做mysql_bin.000004,后续数据的操作日志都会记录在这个日志文件中。) `, g, N; @) T7 ?3 y5 k
0 d- ?+ }4 G4 c$ D6 ~
2、准备数据,直接执行本文第三点制作测试数据中的SQL即可。. K5 U5 q7 I7 X) D

% C( w% p, d3 ]3、将mysql_bin.000004这个binlog日志归档,因为我们需要通过mysql_bin.000004这个日志恢复全部数据,所以要在删除数据库之前归档,如果删除数据库语句也被记录在mysql_bin.000004中,那么执行完mysql_bin.000004库又会被删除了。
  W* `6 P$ ^; O- l
. b* p5 ^) Q  w! H3 y/ }; p. Z) m6 ]# b+ `* g6 x

4 [: T2 D7 n' |% C7 C: d; K一:登录数据库时执行刷新log日志,自此开始产生一个新编号的binlog日志文件1 [- u6 D6 K) H

" H2 j  A) [: J0 K$ g' `) Nmysql > flush logs;" P' ]  o- T" ~
1 \$ ?& v6 e' G( S* ^: X
cd  /var/lib/mysql/4 v0 o" C6 I  k, R9 W3 I4 j) P
* \* w# G9 Y6 k2 V) [
ls -l mysql.bin.*7 K1 P4 ?1 G' I: L" u- b7 C
: Z* ?! l" q# f0 l+ A' K
二:通过mysqlbinlog执行恢复全部数据
& C- Y: h5 ~. z( p/ H mysqlbinlog是mysql自带的一个工具,一般在安装MySQL时mysqlbinlog也会放入可执行目录下,可以直接执行: W; t- [9 d) j
如果不能直接执行mysqlbinlog命令,可以通过  find / -name "mysqlbinlog"查找下这个工具在什么位置4 b1 Z) e% Z/ ]+ Z& p4 }
然后指定全路径执行即可: 如  /usr/bin/mysqlbinlog  --no-defaults  ...0 Y0 [  [' Y& `) ?# s! E' |
# `9 U" W  w* w  n" Q$ {
mysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.00005  |mysql -h127.0.0.1 -P3306 -root -p! h4 a8 S7 s+ \2 i1 J
; g; W7 I, C8 |8 q
三:即可检查数据库恢复情况
9 ~0 \: t) ]3 T: i* B9 K, x7 i6 y0 q1 x5 d% k% ~

$ h0 n5 }' ^& B2 G  `& k% m, r
1 U! @) P* R$ ?0 E3 `( |通过mysqlbinlog将binlog转为sql,以方便查询具体位置5 @1 q- H) a; m, G
mysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql_bin.0000x > binlog_00000x.sql8 o0 f4 y% H) c5 t# w
查看生成的binlog_000006.sql,确定需要恢复的起始位置结束位置还有起始时间和结束时间
+ L) Z9 D7 s6 R8 O# H; t3 ~$ w+ \! I$ y" a" E

; _# u6 F4 V" L1 C* q# h7 N5 e' g& m' p( a& n1 {
) |( ^- u: z7 H5 V$ h# u2 G+ s) ~

! r  c4 S0 F& R2 t1 r

# L2 r% D! J0 m, |5 X0 V
+ T8 q! K" e. A; ]8 O& }1 R" Q

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2024-8-12 10:50:10 | 显示全部楼层
通过mysqlbinlog执行恢复操作
  I  P* U, n. s7 t. i+ x' U, Z# s2 O通过位置区间恢复$ x# E2 I0 N. Z  t
mysqlbinlog  --no-defaults  /var/lib/mysql/mysql_bin.00000x --start-position=231 --stop-position=2210 |mysql -h127.0.0.1 -P3306 -uroot -p

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2024-8-12 10:50:23 | 显示全部楼层
/var/lib/mysql/mysql_bin.000006 : 要操作binlog文件
9 d0 E& H! {' \6 ~( O. B; U# ^–start-position=232 :数据恢复的起始位置$ n  Y, u+ ?( B% |) U+ b! X' p7 m
–stop-position=2220 :数据恢复的结束位置
; B* j# G5 F; O; ]9 ~7 q' lmysql -h127.0.0.1 -P3306 -uroot -p123456 : 数据恢复需要登录数据库

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2024-8-12 10:53:17 | 显示全部楼层
要通过binlog日志来查看数据库变更信息,你需要确保MySQL服务器已经开启了binlog日志记录功能。以下是如何查看和解析binlog日志的基本步骤:
% W$ {+ J1 m  }  T6 b
. a9 [( @, b* |; l! r查看当前的binlog日志列表:) [- c: o: Q0 i# k* ~- ^

- n; N. Z3 I' F( }SHOW BINARY LOGS;' d5 O' K( S( T. @
查看特定binlog文件的内容:' S- ~2 i$ d7 \* D6 k- R' Z

9 U. O. r/ @8 P/ c6 S% e! wSHOW BINLOG EVENTS IN 'binlog_file_name';
- j8 \! _' i3 A. J1 b+ I如果需要解析binlog内容,可以使用MySQL提供的工具 mysqlbinlog。在命令行中使用该工具可以查看详细的日志内容:
0 i! z! n( M: V6 V6 j# U% `* _* r% D) d
mysqlbinlog binlog_file_name
! o3 M, x; B# D& `如果你想要编写自己的解析程序,可以使用MySQL提供的BINLOG API进行解析。以下是一个简单的Python示例,使用mysql-replication库来解析binlog:, H) s: i% o6 E8 ^- R: O

! C4 P7 O8 y! ]& a4 D: B! N首先,安装mysql-replication库:+ u: p6 }: d2 n2 a# s
* i5 M  @' n. p5 V4 ]: Z; K
pip install mysql-replication
" T4 `  B) ]( Y, R
0 [. A# X$ g9 Q# t9 L% g; k8 C然后,使用以下Python脚本解析binlog:$ S6 G# S0 E0 q9 i2 t8 m

7 n' E, N: ~3 O4 Efrom mysql_replication import BinLogStreamReader! [3 |( U7 A- @! P8 i

9 U- {# b. W2 _, i# 配置binlog服务器和认证信息9 d6 t6 [5 O3 I
config = {
) @) f2 f9 I! E0 f    'host': 'localhost',8 m8 Y0 \) H6 E% ]
    'port': 3306,/ ?1 B+ }8 v, i, A
    'user': 'your_username',; i# `$ q4 Z7 [5 j
    'password': 'your_password'7 ~" m/ L- D6 [* _# K$ u3 R
}4 v9 h8 Q( D6 X; ?8 J- d5 |! K
- o* k5 n/ i- o$ U: T5 p
# 获取binlog文件列表
- h$ L& z8 [% I& v2 yshow_binlogs_result_set = client.query('SHOW BINARY LOGS;')' W0 S# M8 G: T
binlog_files = [row[0] for row in show_binlogs_result_set]# N, S/ m3 n# s6 y- x

3 H$ P9 _4 A2 H8 C% O4 x* [! _# 对于每个binlog文件,解析其内容! m, K0 W( b) [
for binlog_file in binlog_files:0 h9 }0 h& D2 l" j$ t, X; {+ o3 l4 _
    stream = BinLogStreamReader(connection_settings=config, log_file=binlog_file)
, X; x+ u$ a5 T% W. [7 L; S/ r3 f    for binlog_event in stream:
' L, f8 [* g: L2 J        # 处理每个事件,例如:
+ A4 g5 I, P) \, y5 `  d        print(binlog_event.row)  # 这将打印出事件中的数据行( C7 M: L1 R2 z% A/ r3 F$ D
    stream.close()
. z: O' N- E8 g) P请注意,这只是一个简单的示例,实际使用时你可能需要根据自己的需求处理更多复杂的情况,比如错误处理、事务管理等。

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2024-8-12 10:56:21 | 显示全部楼层
使用mysqlbinlog工具解析和恢复日志
3 j3 n2 b* O' e8 t9 r' P默认情况下binlog日志是二进制格式,无法直接查看,除了使用上述命令查看二进制日志中的事务,还可以通过mysqlbinlog工具。
! }  J" \& Y- ]mysqlbinlog是mysql官方提供的一个binlog查看工具,也可使用 –read-from-remote-server 从远程服务器读取二进制日志,还可使用 –start-position –stop-position、–start-time –stop-time等选项精确解析binlog日志。
: x4 [! H- E9 Y3 W$ E4 X
! ~$ o$ `3 s) i5 _$ A5 k6 l! f' x选项:
- o+ e( {" [9 N* z" E3 s-h, --host=:连接MySQL服务器的主机名。- Q: j  f6 ]3 Y! {% X0 r
' {' d  B. i+ ~& D1 t
-P, --port=<port_num>:连接MySQL服务器的端口号。
4 h7 k! e- a& u5 y
, D1 }- K, [" B3 M-u, --user=:连接MySQL服务器的用户名。& h1 l& O+ K* h+ R9 O9 u' n* ?% }

  S4 i; n. k  p6 D( F-p, --password=:连接MySQL服务器的密码。; n7 E8 \5 r" y

  E5 A  D  x8 l+ C3 t. r! D$ _5 M–ssl-ca=<ca_file>:使用指定的CA证书文件进行SSL连接。
( ]4 S8 y+ |. F$ D- `4 ~6 z/ `' o$ i" n0 S3 q+ x
–ssl-cert=<cert_file>:使用指定的SSL证书文件进行SSL连接。' P  l7 f5 c% p: [8 ?" s
8 b& d% W% d0 c' z- t1 h- K: ^" T
–ssl-key=<key_file>:使用指定的SSL密钥文件进行SSL连接。
) K1 X7 ]9 G8 Y; J0 e1 Q  {! F% F6 f( D6 F! _- ~
-R, --read-from-remote-server:从远程MySQL服务器读取二进制日志。
+ {6 L# V* z/ N( y/ T: i. I
9 O3 A3 y  r* R( i$ }) y1 V-r, --result-file=<file_name>:将解析后的日志输出到指定的文件。
: J9 i$ p1 r& T% h1 g- M! Q9 v" S. Y+ x. S
–base64-output[=value]:将blob字段以Base64编码的形式输出。
1 m1 x1 x  [: I0 J  L, m
6 A1 t5 s) U: u' n. @-v, --verbose:详细输出解析后的日志内容。
2 d- [( s) r/ O7 O: t# |
& X2 G0 g# F% W+ Z9 E-d, --database=<database_name>:仅输出指定数据库的日志内容。2 v; q0 D" m8 K! A% c
5 z9 p) z% [4 N! B6 L3 U- w
-t, --to-last-log:从当前日志文件开始读取,直到最新的日志文件结束。
5 Q# Y5 t( A& Z& p) I. F
3 p- Y" ~7 C6 k5 \$ E$ z-s, --start-datetime=:从指定的日期和时间开始读取日志。
' M, x$ |) X* ^
% w/ t1 H( N4 a- @# h' T' c-e, --stop-datetime=:在指定的日期和时间停止读取日志。' c( Q3 z( e+ v0 Z, [! e

2 E7 S' B' @$ a–start-position=:从指定的位置开始读取日志。
* O- j0 S& @* ~/ u% B8 y; `( D$ C; }6 w' }- ~. a" H( p
–stop-position=:在指定的位置停止读取日志。7 F8 l! P! U9 h/ L8 \
: E' K7 j; _! U- X2 }, v* _
–skip-gtids[=value]:跳过指定的GTID(全局事务标识符)。
) \- ~# N& y8 v1 z3 P
9 G  }6 B% _9 l9 g+ {–include-gtids[=value]:仅包括指定的GTID。
% `8 K5 W$ i1 U) ^$ Z  ~* X8 q& f, j+ d' o
–hexdump:以十六进制格式输出日志内容。; P1 @/ A; R, j, K# E

; F- V, m, }7 n7 C3 ^: A' h–no-defaults:不读取默认的配置文件。/ B, V  X+ v1 A. T  K# [" x

/ d0 e6 z6 _; ~$ |; b- T! _
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-11 22:57 , Processed in 0.020125 second(s), 21 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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