恢复到备份状态,备份前先关闭对恢复过程的二进制日志记录,因为记录恢复语句是毫无意义的


1.mysql> set global sql_log_bin=0; 
2.mysql < /myback/2012-12-3.19-23.full.sql ##如果有账号密码记的-u -h哦 
3.打开记录并查看恢复状况 
4.mysql> set global sql_log_bin=1; 
5.mysql> show databases;
 


  打开二进制记录并查看恢复状况


1.mysql> set global sql_log_bin=1; 
2.mysql> show databases;
 


  2.3 模拟一种场景,我往linux表中新添加了数据,然后不小心将这个表删了,我们要恢复到删除之前的状态,并且新加的数据还存在。

  2.3.1 新增数据


1.mysql> use laoguang; 
2.mysql> insert into linux  (name) values ('haddop'), ('mysql'); 
3.mysql> drop table linux; 
4.mysql> show master status;   ##查看当前所在二进制日志中的位置 
5.+------------------+----------+--------------+------------------+ 
6.| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
7.+------------------+----------+--------------+------------------+ 
8.| mysql-bin.000001 |     9005 |              |                  |  
9.+------------------+----------+--------------+------------------+
 


  我们先恢复完整数据,再恢复完整备份后到删除之前的数据,对应二进制日志是完整备份后的二进制日志位置到删除表之前的位置

  2.3.2 先恢复完整备份,同样恢复过程不要记录日志


1.mysql > set global sql_log_bin=0; 
2.mysql < /myback/2012-12-3.19-23.full.sql
 


  2.3.3 查看删除表时的记录位置


1.mysqlbinlog /mybinlog/mysql-bin.000001  
2.# at 8893 
3.#121202 14:14:07 server id 1  end_log_pos 9005  Query  thread_id=5 exec_time=0 error_code=0 
4.SET TIMESTAMP=1354428847/*!*/; 
5.DROP TABLE `linux` /* generated by server */ 
6./*!*/; 
7.DELIMITER ; 
8.# End of log file
 


  2.3.4 由上图可知删除是在8893时做的,将二进制文件中完整备份到删除表之前的记录导出


1.mysqlbinlog --stop-position=8893 /mybinlog/mysql-bin.000001  > /tmp/change.sql 
2.--start-position 指定从哪开始导出二进制日志 
3.--stop-position 指定到哪结束 
4.--start-datetime 从哪个时间开始格式如"2005-12-25 11:25:56" 
5.--stop-datetime 到哪个时间结束
 


  由于这个二进制日志是我们完整恢复后才启用的,所以我们直接从头开始即可,如果你的二进制日志很多,请查看完整备份中记录的备份时的位置,从那开始到删除之前即可

  将这段二进制记录应用到mysql的库中


mysql < /tmp/change.sql


  进入数据库查看数据有没有恢复


mysql> select * from linux;


  基于mysqldump通常我们是完整备份+二进制日志来进行恢复的。

  三、利用lvm的快照来备份MySQL

  要求你的MySQL的数据目录必须在lvm卷上,下面来演示过程

  3.1 建立lvm卷组,挂载到/data/mydata下,这个我不演示了

  3.2 初始化MySQL时将数据目录指向/data/mydata,安装过程见上链接

  3.3 同样如第一步那样准备环境

  3.4 在MySQL中为所有表加读锁,不要关闭终端,否则锁将失效,滚动日志


1.mysql> flush tables with read lock; 
2.mysql> flush logs; 
3.mysql> show master status; 
4.+------------------+----------+--------------+------------------+ 
5.| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
6.+------------------+----------+--------------+------------------+ 
7.| mysql-bin.000002 |      107 |              |                  |  
8.+------------------+----------+--------------+------------------+