Chinaunix首页 | 论坛 | 博客
  • 博客访问: 380736
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1741
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-21 22:46
文章分类
文章存档

2014年(22)

2013年(45)

分类: Mysql/postgreSQL

2013-09-10 11:01:55

  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 varchar(100),msg varchar(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> show variables like "%format%"

   -> ;

+---------------------+-------------------+

| Variable_name       | Value             |

+---------------------+-------------------+

| binlog_format       | ROW               |

   3, 此时只有一个二进制日志文件

mysql> show binary logs;

+-----------------+-----------+

| Log_name        | File_size |

+-----------------+-----------+

| mysqlbin.000161 |      1133 |

+-----------------+-----------+

1 row in set (0.00 sec)

   4,查看二进制日志文件的内容

        二进制日志文件 end_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
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  --databases test1  --skip-opt --quick --extended-insert=false --lock-all-tables --master-data=2  -u root -p123456 >  /tmp/test1.sql

     2,查看备份文件

      我们发现这个时候记录的开始位置正好是1133,如下就是证明

CHANGE MASTER TO MASTER_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` varchar(100) DEFAULT NULL,
  `msg` varchar(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> insert into tt values(4,'shuijunyi','boss');

Query OK, 1 row affected (0.01 sec)


mysql> insert into tt values(5,'zhujun','may I know your name');

Query OK, 1 row affected (0.00 sec)


mysql> select * from tt;

+------+---------------+----------------------+

| id   | name          | msg                  |

+------+---------------+----------------------+

|    1 | chenzhongyang | how are you          |

|    2 | tianhongyan   | BMW                  |

|    3 | jisuanji      | why                  |

|    4 | shuijunyi     | boss                 |

|    5 | zhujun        | may I know your name |

+------+---------------+----------------------+

5 rows in set (0.01 sec)

mysql> drop table tt;

Query OK, 0 rows affected (0.00 sec)


四,查看执行误操作的位置

                 通过show master status; 可以查看当前的二进制日志文件的位置

mysql> show master status;

+-----------------+----------+--------------+------------------+

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-----------------+----------+--------------+------------------+

| mysqlbin.000161 |     1622 |              |                  |

+-----------------+----------+--------------+------------------+

1 row in set (0.00 sec)

我们可以看到drop  table tt的开始位置是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> drop  database test1;

Query OK, 0 rows affected (0.00 sec)


mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| test               |

+--------------------+

3 rows in set (0.00 sec)


[root@test4 ~]# mysql -uroot -p123456 < /tmp/test1.sql

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| test               |

| test1              |

+--------------------+

4 rows in set (0.00 sec)


mysql> use test1

Database changed

mysql> select * from tt;

+------+---------------+-------------+

| id   | name          | msg         |

+------+---------------+-------------+

|    1 | chenzhongyang | how are you |

|    2 | tianhongyan   | BMW         |

|    3 | jisuanji      | why         |

+------+---------------+-------------+

3 rows in set (0.00 sec)


六,恢复到误操作之前恢复其他的两条数据

  这是时候恢复就要从 开始备份的位置到删除表位置。因为这个位置是插入另外两条数据的位置

我们可以很清楚 的看到这两条数据    
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 * from tt;

+------+---------------+----------------------+

| id   | name          | msg                  |

+------+---------------+----------------------+

|    1 | chenzhongyang | how are you          |

|    2 | tianhongyan   | BMW                  |

|    3 | jisuanji      | why                  |

|    4 | shuijunyi     | boss                 |

|    5 | zhujun        | may I know your name |

+------+---------------+----------------------+

5 rows in set (0.00 sec)
阅读(2138) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~