mysql的备份和恢复的完整实践
一,备份数据库之间的环境设置
1,创建数据库test1,创建表tt插入如下数据
|
1
2
3
4
5
6
7
8
9
10
11
12
|
mysql> create database test1;
Query OK,
1
row affected (
0.04
sec)
mysql>
use
test1
Database changed
mysql> create table tt(id
int
,name
var
char(
100
),msg
var
char(
200
)) engine=myisam;
Query OK,
0
rows affected (
0.18
sec)
mysql> insert into tt values(
1
,
'chenzhongyang'
,
'how are you'
);
Query OK,
1
row affected (
0.00
sec)
mysql> insert into tt values(
2
,
'tianhongyan'
,
'BMW'
);
Query OK,
1
row affected (
0.00
sec)
mysql> insert into tt values(
3
,
'jisuanji'
,
'why'
);
Query OK,
1
row affected (
0.00
sec)
|
2,由于我设置的二进制日志文件的记录格式是row,所以每一行的数据改变就会记录一次日志
mysql>showvariableslike"%format%"
->;
+---------------------+-------------------+
|Variable_name|Value|
+---------------------+-------------------+
|binlog_format|ROW|
3,此时只有一个二进制日志文件
mysql>showbinarylogs;
+-----------------+-----------+
|Log_name|File_size|
+-----------------+-----------+
|mysqlbin.000161|1133|
+-----------------+-----------+
1rowinset(0.00sec)
4,查看二进制日志文件的内容
二进制日志文件end_log_pos1133
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
[root@test4 ~]# mysqlbinlog
'/tmp/mysqlbin.000161'
。。。。。。。。。。。。。。。。。。。
# at
588
#
130905
22
:
26
:
42
server id
1
end_log_pos
658
Query thread_id=
7
exec_time=
0
error_code=
0
SET TIMESTAMP=
1378391202
/*!*/
;
COMMIT
/*!*/
;
# at
658
#
130905
22
:
27
:
15
server id
1
end_log_pos
727
Query thread_id=
7
exec_time=
0
error_code=
0
SET TIMESTAMP=
1378391235
/*!*/
;
BEGIN
/*!*/
;
# at
727
# at
775
#
130905
22
:
27
:
15
server id
1
end_log_pos
775
Table_map: `test1`.`tt` mapped to number
21
#
130905
22
:
27
:
15
server id
1
end_log_pos
827
Write_rows: table id
21
flags: STMT_END_F
BINLOG '
w5QoUhMBAAAAMAAAAAcDAAAAABUAAAAAAAEABXRlc3QxAAJ0dAADAw8PBCwBWAIH
w5QoUhcBAAAANAAAADsDAAAAABUAAAAAAAEAA
//4AgAAAAsAdGlhbmhvbmd5YW4DAEJNVw==
'
/*!*/
;
# at
827
#
130905
22
:
27
:
15
server id
1
end_log_pos
897
Query thread_id=
7
exec_time=
0
error_code=
0
SET TIMESTAMP=
1378391235
/*!*/
;
COMMIT
/*!*/
;
# at
897
#
130905
22
:
27
:
56
server id
1
end_log_pos
966
Query thread_id=
7
exec_time=
0
error_code=
0
SET TIMESTAMP=
1378391276
/*!*/
;
BEGIN
/*!*/
;
# at
966
# at
1014
#
130905
22
:
27
:
56
server id
1
end_log_pos
1014
Table_map: `test1`.`tt` mapped to number
21
#
130905
22
:
27
:
56
server id
1
end_log_pos
1063
Write_rows: table id
21
flags: STMT_END_F
BINLOG '
7JQoUhMBAAAAMAAAAPYDAAAAABUAAAAAAAEABXRlc3QxAAJ0dAADAw8PBCwBWAIH
7JQoUhcBAAAAMQAAACcEAAAAABUAAAAAAAEAA
//4AwAAAAgAamlzdWFuamkDAHdoeQ==
'
/*!*/
;
# at
1063
#
130905
22
:
27
:
56
server id
1
end_log_pos
1133
Query thread_id=
7
exec_time=
0
error_code=
0
SET TIMESTAMP=
1378391276
/*!*/
;
COMMIT
/*!*/
;
DELIMITER ;
# End of log file
ROLLBACK
/* added by mysqlbinlog */
;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/
;
|
二,备份数据库test1
1,mysqldump备份数据库
[root@test4~]#mysqldump--databasestest1--skip-opt--quick--extended-insert=false--lock-all-tables--master-data=2-uroot-p123456>/tmp/test1.sql
2,查看备份文件
我们发现这个时候记录的开始位置正好是1133,如下就是证明
CHANGEMASTERTOMASTER_LOG_FILE='mysqlbin.000161',MASTER_LOG_POS=1133;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
[root@test4 ~]# cat /tmp/test1.sql
-- MySQL dump
10.13
Distrib
5.1
.
70
,
for
unknown-linux-gnu (x86_64)
--
-- Host: localhost Database: test1
-- ------------------------------------------------------
-- Server version
5.1
.
70
-log
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */
;
/*!40103 SET TIME_ZONE='+00:00' */
;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */
;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */
;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */
;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */
;
--
-- Position to start replication or point-
in
-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE=
'mysqlbin.000161'
, MASTER_LOG_POS=
1133
;
--
-- Current Database: `test1`
--
CREATE DATABASE
/*!32312 IF NOT EXISTS*/
`test1`
/*!40100 DEFAULT CHARACTER SET utf8 */
;
USE `test1`;
--
-- Table structure
for
table `tt`
--
/*!40101 SET @saved_cs_client = @@character_set_client */
;
/*!40101 SET character_set_client = utf8 */
;
CREATE TABLE `tt` (
`id`
int
(
11
) DEFAULT NULL,
`name`
var
char(
100
) DEFAULT NULL,
`msg`
var
char(
200
) DEFAULT NULL
);
/*!40101 SET character_set_client = @saved_cs_client */
;
--
-- Dumping data
for
table `tt`
--
INSERT INTO `tt` VALUES (
1
,
'chenzhongyang'
,
'how are you'
);
INSERT INTO `tt` VALUES (
2
,
'tianhongyan'
,
'BMW'
);
INSERT INTO `tt` VALUES (
3
,
'jisuanji'
,
'why'
);
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */
;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */
;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */
;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */
;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */
;
-- Dump completed on
2013
-
09
-
05
22
:
48
:
50
|
三,对表进行修改插入数据然后误删表
由于我们不小心把表tt给删除了,那么我们就要把表tt通过二进制日志给恢复过来
mysql>insertintottvalues(4,'shuijunyi','boss');
QueryOK,1rowaffected(0.01sec)
mysql>insertintottvalues(5,'zhujun','mayIknowyourname');
QueryOK,1rowaffected(0.00sec)
mysql>select*fromtt;
+------+---------------+----------------------+
|id|name|msg|
+------+---------------+----------------------+
|1|chenzhongyang|howareyou|
|2|tianhongyan|BMW|
|3|jisuanji|why|
|4|shuijunyi|boss|
|5|zhujun|mayIknowyourname|
+------+---------------+----------------------+
5rowsinset(0.01sec)
mysql>droptablett;
QueryOK,0rowsaffected(0.00sec)
四,查看执行误操作的位置
通过showmasterstatus;可以查看当前的二进制日志文件的位置
mysql>showmasterstatus;
+-----------------+----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+-----------------+----------+--------------+------------------+
|mysqlbin.000161|1622|||
+-----------------+----------+--------------+------------------+
1rowinset(0.00sec)
我们可以看到droptablett的开始位置是1622所以只需要恢复到1622的位置就可以恢复误删除的表tt
|
1
2
3
4
5
6
7
8
9
10
11
12
|
mysql> show binlog events
in
'mysqlbin.000161'
-> ;
| mysqlbin.
000161
|
1250
| Write_rows |
1
|
1301
| table_id:
22
flags: STMT_END_F |
| mysqlbin.
000161
|
1301
| Query |
1
|
1371
| COMMIT |
| mysqlbin.
000161
|
1371
| Query |
1
|
1440
| BEGIN |
| mysqlbin.
000161
|
1440
| Table_map |
1
|
1488
| table_id:
22
(test1.tt) |
| mysqlbin.
000161
|
1488
| Write_rows |
1
|
1552
| table_id:
22
flags: STMT_END_F |
| mysqlbin.
000161
|
1552
| Query |
1
|
1622
| COMMIT |
| mysqlbin.
000161
|
1622
| Query |
1
|
1699
|
use
`test1`; drop table tt |
| mysqlbin.
000161
|
1699
| Rotate |
1
|
1741
| mysqlbin.
000162
;pos=
4
|
+-----------------+------+-------------+-----------+-------------+---------------------------------------------------------------------------------------+
26
rows
in
set
(
0.00
sec)
|
五,还原数据库
这个时候我们发现只恢复了三条数据,但是我们一共有五条数据,这个时候就要通过二进制日志文件来恢复了。
注意的是当我们在恢复数据库的时候也会产生二进制日志文件,所以一定要分清楚备份前的二进制日志文件和恢复之后的二进制日志文件
mysql>dropdatabasetest1;
QueryOK,0rowsaffected(0.00sec)
mysql>showdatabases;
+--------------------+
|Database|
+--------------------+
|information_schema|
|mysql|
|test|
+--------------------+
3rowsinset(0.00sec)
[root@test4~]#mysql-uroot-p123456</tmp/test1.sql
mysql>showdatabases;
+--------------------+
|Database|
+--------------------+
|information_schema|
|mysql|
|test|
|test1|
+--------------------+
4rowsinset(0.00sec)
mysql>usetest1
Databasechanged
mysql>select*fromtt;
+------+---------------+-------------+
|id|name|msg|
+------+---------------+-------------+
|1|chenzhongyang|howareyou|
|2|tianhongyan|BMW|
|3|jisuanji|why|
+------+---------------+-------------+
3rowsinset(0.00sec)
六,恢复到误操作之前恢复其他的两条数据
这是时候恢复就要从开始备份的位置到删除表位置。因为这个位置是插入另外两条数据的位置
我们可以很清楚的看到这两条数据
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
[root@test4 ~]# mysqlbinlog -p123456 --start-position=
1133
--stop-position=
1622
-vv /tmp/mysqlbin.
000161
/*!40019 SET @@session.max_insert_delayed_threads=0*/
;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/
;
DELIMITER
/*!*/
;
# at
4
#
130905
21
:
02
:
49
server id
1
end_log_pos
106
Start: binlog v
4
, server v
5.1
.
70
-log created
130905
21
:
02
:
49
at startup
ROLLBACK
/*!*/
;
BINLOG '
+YAoUg8BAAAAZgAAAGoAAAAAAAQANS4xLjcwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD5gChSEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
'
/*!*/
;
# at
1133
#
130905
23
:
06
:
50
server id
1
end_log_pos
1202
Query thread_id=
7
exec_time=
0
error_code=
0
SET TIMESTAMP=
1378393610
/*!*/
;
SET @@session.pseudo_thread_id=
7
/*!*/
;
SET @@session.foreign_key_checks=
1
, @@session.sql_auto_is_null=
1
, @@session.unique_checks=
1
, @@session.autocommit=
1
/*!*/
;
SET @@session.sql_mode=
0
/*!*/
;
SET @@session.auto_increment_increment=
1
, @@session.auto_increment_offset=
1
/*!*/
;
/*!\C utf8 */
/*!*/
;
SET @@session.character_set_client=
33
,@@session.collation_connection=
33
,@@session.collation_server=
33
/*!*/
;
SET @@session.lc_time_names=
0
/*!*/
;
SET @@session.collation_database=DEFAULT
/*!*/
;
BEGIN
/*!*/
;
# at
1202
# at
1250
#
130905
23
:
06
:
50
server id
1
end_log_pos
1250
Table_map: `test1`.`tt` mapped to number
22
#
130905
23
:
06
:
50
server id
1
end_log_pos
1301
Write_rows: table id
22
flags: STMT_END_F
BINLOG '
Cp4oUhMBAAAAMAAAAOIEAAAAABYAAAAAAAEABXRlc3QxAAJ0dAADAw8PBCwBWAIH
Cp4oUhcBAAAAMwAAABUFAAAAABYAAAAAAAEAA
//4BAAAAAkAc2h1aWp1bnlpBABib3Nz
'
/*!*/
;
### INSERT INTO `test1`.`tt`
### SET
### @
1
=
4
/* INT meta=0 nullable=1 is_null=0 */
### @
2
=
'shuijunyi'
/* VARSTRING(300) meta=300 nullable=1 is_null=0 */
### @
3
=
'boss'
/* VARSTRING(600) meta=600 nullable=1 is_null=0 */
# at
1301
#
130905
23
:
06
:
50
server id
1
end_log_pos
1371
Query thread_id=
7
exec_time=
0
error_code=
0
SET TIMESTAMP=
1378393610
/*!*/
;
COMMIT
/*!*/
;
# at
1371
#
130905
23
:
07
:
39
server id
1
end_log_pos
1440
Query thread_id=
7
exec_time=
0
error_code=
0
SET TIMESTAMP=
1378393659
/*!*/
;
BEGIN
/*!*/
;
# at
1440
# at
1488
#
130905
23
:
07
:
39
server id
1
end_log_pos
1488
Table_map: `test1`.`tt` mapped to number
22
#
130905
23
:
07
:
39
server id
1
end_log_pos
1552
Write_rows: table id
22
flags: STMT_END_F
BINLOG '
O54oUhMBAAAAMAAAANAFAAAAABYAAAAAAAEABXRlc3QxAAJ0dAADAw8PBCwBWAIH
O54oUhcBAAAAQAAAABAGAAAAABYAAAAAAAEAA
//4BQAAAAYAemh1anVuFABtYXkgSSBrbm93IHlv
dXIgbmFtZQ==
'
/*!*/
;
### INSERT INTO `test1`.`tt`
### SET
### @
1
=
5
/* INT meta=0 nullable=1 is_null=0 */
### @
2
=
'zhujun'
/* VARSTRING(300) meta=300 nullable=1 is_null=0 */
### @
3
=
'may I know your name'
/* VARSTRING(600) meta=600 nullable=1 is_null=0 */
# at
1552
#
130905
23
:
07
:
39
server id
1
end_log_pos
1622
Query thread_id=
7
exec_time=
0
error_code=
0
SET TIMESTAMP=
1378393659
/*!*/
;
COMMIT
/*!*/
;
DELIMITER ;
# End of log file
ROLLBACK
/* added by mysqlbinlog */
;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/
;
|
正式开始恢复数据
[root@test4~]#mysqlbinlog--start-position=1133--stop-position=1622-vv/tmp/mysqlbin.000161|mysql-uroot-p123456
这个时候数据就回来了
mysql>select*fromtt;
+------+---------------+----------------------+
|id|name|msg|
+------+---------------+----------------------+
|1|chenzhongyang|howareyou|
|2|tianhongyan|BMW|
|3|jisuanji|why|
|4|shuijunyi|boss|
|5|zhujun|mayIknowyourname|
+------+---------------+----------------------+
5rowsinset(0.00sec)