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.sqlT2:准备需要恢复的数据
执行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是哪个?相关文章推荐
- MySQL备份与恢复常用方法总结(mysqldump/xtrabackup/lvm快照备份/逻辑备份与恢复/二进制日志及时点恢复) 推荐
- Mydumper:MySQL多线程逻辑备份与恢复
- mysql的逻辑备份和恢复
- Mysql的逻辑备份与恢复
- mysql 开发进阶篇系列 42 逻辑备份与恢复
- MySql逻辑备份恢复方法简单总结
- mysql 逻辑备份和恢复
- mysql 开发进阶篇系列 43 逻辑备份与恢复(基于时间和位置的不完全恢复)
- mysql 逻辑备份数据恢复
- MySql逻辑备份恢复方法简单总结
- 记录一次 MySQL 逻辑备份与恢复的演练
- Mydumper:MySQL多线程逻辑备份与恢复
- 关于MYSQL InnoDB 表的备份与恢复
- MySQL 备份和恢复策略笔记(1)
- MYSQL数据备份/恢复简易方法
- MySQL 备份和恢复策略笔记(3)
- MySQL 备份和恢复策略笔记(2)
- mysql 数据库备份恢复
- MYSQL集群的备份与恢复最终版本
- MySQL 备份和恢复