您的位置:首页 > 数据库 > MySQL

MySQL备份与恢复之逻辑备份

2014-08-04 18:25 483 查看

逻辑备份Mysqldump

mysqldump为了保障备份点的数据一致,性,默认对所有表加上只读锁

基于时间点“不完全”恢复(point-to-time recovery)

T0:查看数据库的logs

注意数据库logs的变化
root@(none) 03:22:05>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |   1036642 |
| mysql-bin.000002 |       143 |
| mysql-bin.000003 |     53376 |
| mysql-bin.000004 |       120 |
+------------------+-----------+
4 rows in set (0.00 sec)
目前的log位置是000004

T1:备份数据库

root@cluster4 ~]# mysqldump -uroot --all-databases -F>all.db.T1.sql

T2:准备需要恢复的数据

执行SQL操作数据库

root@(none) 03:22:57>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |   1036642 |
| mysql-bin.000002 |       143 |
| mysql-bin.000003 |     53376 |
| mysql-bin.000004 |       167 |
| mysql-bin.000005 |       167 |
| mysql-bin.000006 |       167 |
| mysql-bin.000007 |       120 |
+------------------+-----------+
7 rows in set (0.00 sec)


000005 000006 000007是在mysqldump备份时指定-F切换日志产生的。

root@(none) 03:23:20>use test;
Database changed
root@test 03:23:31>create table t2(id int(10));
Query OK, 0 rows affected (0.12 sec)
root@test 03:23:44>insert into t2 values(1);
Query OK, 1 row affected (0.04 sec)
root@test 03:23:57>flush logs;
Query OK, 0 rows affected (0.05 sec)


以上SQL日志在000007中,再切换一次日志。

root@test 03:24:05>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |   1036642 |
| mysql-bin.000002 |       143 |
| mysql-bin.000003 |     53376 |
| mysql-bin.000004 |       167 |
| mysql-bin.000005 |       167 |
| mysql-bin.000006 |       167 |
| mysql-bin.000007 |       476 |
| mysql-bin.000008 |       120 |
+------------------+-----------+
8 rows in set (0.00 sec)
root@test 03:24:10>insert into t2 values(2);
Query OK, 1 row affected (0.00 sec)


这条ID=2的记录写在000008日志中。
root@test 03:24:18>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |   1036642 |
| mysql-bin.000002 |       143 |
| mysql-bin.000003 |     53376 |
| mysql-bin.000004 |       167 |
| mysql-bin.000005 |       167 |
| mysql-bin.000006 |       167 |
| mysql-bin.000007 |       476 |
| mysql-bin.000008 |       328 |
+------------------+-----------+
8 rows in set (0.00 sec)

T3:破坏数据库

root@test 03:24:23>drop table t2;
Query OK, 0 rows affected (0.03 sec)


这个时间点数据库遭到破坏!

T4:恢复数据库

[root@cluster4 ~]# mysql -uroot <all.db.T1.sql
这时候恢复的库里面没有t2这张表。只恢复到T1时间点。

使用binlog 000007做不完全恢复,恢复的时间点是 T3
[root@cluster4 mysql_3306]# mysqlbinlog --stop-datetime='2014-8-4 15:24:23' mysql-bin.000007 |mysql -uroot
第一条数据恢复
[root@cluster4 mysql_3306]# mysqlbinlog --stop-datetime='2014-8-4 15:24:23' mysql-bin.000008 |mysql -uroot
第二条数据也恢复了。

基于位置的“不完全”恢复

和point-to-time recovery原理一样。只是在redo binlog的时候,查看一下position

[root@cluster4 mysql_3306]# mysqlbinlog mysql-bin.000008 |more

。。。省略。。。

# at 199

#140804 15:24:18 server id 1  end_log_pos 297 CRC32 0x3bf9e3b6  Query   thread_id=21    exec_time=0     error_code=0

use `test`/*!*/;

SET TIMESTAMP=1407137058/*!*/;

insert into t2 values(2)

/*!*/;

# at 297

#140804 15:24:18 server id 1 <strong> end_log_pos 328</strong> CRC32 0x4ca081d0  Xid = 883

COMMIT/*!*/;

# at 328

at后的数字就是要用来基于位置恢复的点。

[root@cluster4 mysql_3306]# mysqlbinlog --stop-position="328" mysql-bin.000008 |mysql -uroot
恢复完成!

完全恢复

T0:查看数据库LOG

root@(none) 05:02:49>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |   1036642 |
| mysql-bin.000002 |       143 |
| mysql-bin.000003 |     53376 |
| mysql-bin.000004 |       167 |
| mysql-bin.000005 |       167 |
| mysql-bin.000006 |       167 |
| mysql-bin.000007 |       476 |
| mysql-bin.000008 |   3255287 |
+------------------+-----------+
8 rows in set (0.00 sec)

T1:备份

[root@cluster4 ~]# mysqldump -uroot --all-databases -F --all-databases>all.db.T2.sql

T2:写数据

root@test 05:09:18>select * from tfull;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

root@test 05:09:31>insert into tfull select * from tfull;
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@test 05:09:47>select * from tfull;
+------+
| id   |
+------+
|    1 |
|    2 |
|    1 |
|    2 |
+------+
4 rows in set (0.00 sec)
备份当前binlog

T3:恢复

[root@cluster4 ~]# mysql -uroot <all.db.T2.sql
[root@cluster4 mysql_3306]# mysqlbinlog mysql-bin.XXXXXX |mysql -uroot


恢复完成!

重点

mysqldump备份恢复的时候,想要实现不完全恢复和完全恢复,必须记录下备份时刻的binlog是哪个?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: