- 积分
- 16840
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
MySQL误删ibdata1 ib_logfile0,ib_logfile1 恢复方法:
3 O8 H( p2 U- h& R9 K. _
0 }5 L: V, E7 r. J+ v1 u$ z恢复的步骤和数据库版本没有太大关系。) u. {" R C- ]- ^! }
在linux操作系统中,如果文件从操作系统级别别rm掉,之前打开的文件进程仍持有相应的文件句柄,
, _9 H% e8 A- d; z- M0 N所指向的文件仍然可以读写,且该文件的描述符可以从/proc目录中获得(不关闭MySQLd情况下).
6 M4 F! q+ X0 ]( x/ E
4 ]9 X: Z' a6 `: `) e+ Y4 x在删除3个文件后,MySQLd 仍是可以运行,对外服务的,MySQL一只保持InnoDB文件打开,因此,; p. m1 W) j! s! P9 n8 e
在工作中有必要监控文件是否存在。
% Z' |6 A: S; r* o i3 |9 D发现文件被删除之后,不能重启InnoDB,因为启动InnoDB,检测到ibdata1,ib_logfile0,ib_logfile1
* L4 v" i/ z$ y( F |. G* L! ?不存在,所以,将创建对应的空文件,InnoDB数据字典是空的,InnoDB无法使用原先存在的ibd文件,故,* l$ _. a9 N- {. @4 a2 U) p2 k
MySQL不重启,快速恢复删除的文件是可能的。 n) j* U+ p4 K9 T a0 y; R1 a
9 r1 b* g7 z7 m' O/ h3 Z" [" u
在MySQLd运行过程中,ibdata1,ib_logfile0,ib_logfile1一直运行在. j9 v, M* q/ m g
/proc/mysql.pid/fd目录下,其中vm-mysql.pid是mysql进程的PID,获取方法:
6 o8 I- i6 U) f. F[root@mysql ~]# ls -l /proc/$(cat /opt/mysql/data2/mysql.pid)/fd | grep -e ibdata -e ib_+ A( G7 z. {- w* S
lrwx------ 1 root root 64 Oct 16 14:16 10 -> /opt/mysql/data2/ib_logfile1 (deleted)
/ ~2 m3 D: w6 F. `% L, \+ }6 ?lrwx------ 1 root root 64 Oct 16 14:16 4 -> /opt/mysql/data2/ibdata1 (deleted)
4 i, R% g8 d# olrwx------ 1 root root 64 Oct 16 14:16 9 -> /opt/mysql/data2/ib_logfile0 (deleted)$ J& k, M' A. \' j
1 \( A- U/ k: q D. W1 }( R
但是,我们不能简单copy回源目录中,因在buffer pool有已经修改的页,这些页没有被写入磁盘,如果改变的页
+ q+ P: s6 t8 E C" k6 Z" ~没有永久写入,数据将会丢失,这些导致数据损坏和丢失。
& o( g2 c' D6 ?" m同样原因,我们不能做MySQL备份,仅能coping那些文件。9 O9 [& G8 J( T3 {
因此,我们必须确保所有的修改全写入磁盘中。
1 F; `/ [. E+ h; C$ ?* f我们现在能做的阻止写,且等待InnoDB刷新所有的页。4 E7 T4 x0 K C/ R! }* B
1.为了阻止写,我们要么停止应用程序或锁表。' a! c9 p, p+ R. G# N
MariaDB [(none)]> flush tables with read lock;
x( C" } x7 @7 |3 |' `Query OK, 0 rows affected (0.01 sec)
3 p& ~. Q. Z* S5 V/ }
3 O9 r; N0 R: Z: ]& ?2. show engine innodb status 中脏页刷新到磁盘,% Z* h5 f5 @6 X2 t; G$ s& P/ }
---
% c/ i2 B8 P) |! C4 ~LOG
* c' I( L: z Z6 S: y---
0 e# z+ Z8 S" u' y; M* sLog sequence number 0 50355: X6 `- w1 Z% H! S: E- o
Log flushed up to 0 50355; j5 G8 j# w' c# n! s/ U* w2 Q" v
Last checkpoint at 0 50355
; [- c6 s3 e. D; _0 pending log writes, 0 pending chkp writes
! h9 R; k2 ~( ~5 j2 o39 log i/o's done, 0.00 log i/o's/second
( ]) _1 T, o+ x6 I' u( S! [, N
加速脏页刷新,设置dirty pages percentage to zero:
: K6 |, F5 V1 q+ e3 _9 hMariaDB [(none)]> set global innodb_max_dirty_pages_pct=0; J& K+ R0 {! A+ R1 m3 f$ L0 s0 Y
Query OK, 0 rows affected (0.00 sec)
. ]$ a3 T+ D9 D& l! m# q- T2 W3 M9 ]: ~
3.确保所有后台进程已经完成自己的工作,也是重要的。
0 c3 {& R9 Q$ `注意,插入缓冲线程,它的大小等于1' r9 o4 P W( z' p [
-------------------------------------
% V) @: a [/ M! h$ g6 _INSERT BUFFER AND ADAPTIVE HASH INDEX3 \/ n- F4 B. ^2 x1 S+ z( F7 C
-------------------------------------
% G# ?* |! ?& \8 YIbuf: size 1, free list len 0, seg size 2,% I0 e1 w# w- ~4 y5 E5 C- U
0 inserts, 0 merged recs, 0 merges
& E9 `7 j% ]$ L# x ?, L+ _Hash table size 34679, node heap has 1 buffer(s)7 J; ^. T8 g0 v, Y, f+ \. V
0.00 hash searches/s, 0.00 non-hash searches/s1 D( G: N6 m0 A3 e% A
7 q* F2 P4 q6 ?! o" S+ z( u- W) w& Z4.后台写进程purge thread,清除所有事务。
$ H, i8 q& A2 P O$ s* y3 e------------* A1 `" z9 K+ Q: s2 [! j) P5 r+ @4 G
TRANSACTIONS! b% X3 N' ~9 W2 K* f: Z3 B0 v
------------
% j8 H0 |7 o) O; {" E# ^; i/ uTrx id counter 0 784
( Q6 l( q! v4 [/ p- tPurge done for trx's n:o < 0 0 undo n:o < 0 0
. ?' H; b2 }' P' a但是,如果上次事务没有需要清理操作Trx id计数比较大(如,SELECT),
; D4 c3 ^9 x: r在这种情况下,至少要保证InnoDB不再做任何写动作。
& H, ?; W# d: b7 [, l6 x--------% Q; G2 q5 F, K
FILE I/O
; a5 m- _8 r- [4 e3 A" k% o& f/ M--------" [& Y, Q4 h2 o% i+ ]' b
I/O thread 0 state: waiting for i/o request (insert buffer thread)
2 X+ j0 x) P. a$ x! \- bI/O thread 1 state: waiting for i/o request (log thread); H" r6 n3 ?# S0 m9 t7 }0 z
I/O thread 2 state: waiting for i/o request (read thread)7 E* H/ t$ z R( a. N% b; R
I/O thread 3 state: waiting for i/o request (write thread)
" M; h3 L' R# |. QPending normal aio reads: 0, aio writes: 0,0 K: s! P0 d/ i5 O3 E. ^
ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0* L4 J! B: Z6 {2 h" |
Pending flushes (fsync) log: 0; buffer pool: 0
& C6 j) x- B) ~0 ~0 OS file reads, 81 OS file writes, 59 OS fsyncs
U6 ] L y) n0 X! r& S2 [0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
1 w- W* k7 q) z7 Y$ |3 `, K8 d* _8 x3 W( n7 c1 k8 ] i; t
经历了4步,所有被修改脏页刷新到磁盘,现在开始copy InnoDB 文件到源目录:* Q; z2 @! M( H, f! @& n& R
[root@mysql ~]# cp /proc/$(cat /opt/mysql/data2/mysql.pid)/fd/4 /opt/mysql/data2/ibdata1- ~5 U* l" J+ G* `9 i; t
[root@mysql ~]# cp /proc/$(cat /opt/mysql/data2/mysql.pid)/fd/9 /opt/mysql/data2/ib_logfile0
2 {5 r( N' u1 J+ U m {$ v[root@mysql ~]# cp /proc/$(cat /opt/mysql/data2/mysql.pid)/fd/10 /opt/mysql/data2/ib_logfile1
/ L4 e! I5 X- P' @/ |& s% }
. L1 S7 G7 L$ v; ]0 i w! Q5.修改ib*所属用户6 `. {4 p8 e/ ?/ ?! n
chown -R mysql ib*
A3 }& X; X3 o2 K; i) m: K% u' g
6.重启MySQLd
: ?$ Q7 _4 {, v........
& @& h: \# p8 X; L5 c: X
# w0 _7 q% ~! d, u9 k$ i结论:
& \1 o( [2 Y5 u& P1.监控InnoDB文件 ibdata 和 ib_logfile* 是否存在
/ }* T& a% T0 q8 Z, S: G2.清楚恢复策略,否则不要重启MySQLd$ D5 B; Y0 y7 ?( |3 v
|
|