MySQL备份与恢复之逻辑备份

本文详细介绍如何使用mysqldump进行数据库的逻辑备份,并演示了基于时间点和位置的不完全恢复及完全恢复过程。

逻辑备份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是哪个?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值