千万个美丽的未来,抵不上一个温暖的现在,每一个真实的现在,都是我们曾经幻想的未来!
Jan
25
事情的起因是本月某日程序员一时操作失误删除了某表id大于或等于216内容,需要恢复到当天的数据,以免影响用户使用,这种恢复也很简单,通过mysql的二进制文件就可以,前提是你的mysql配置已经开启了二进制日志功能。
开始提取二进制日志,首先把某库22日00时开始的SQL语句提取出来,首先提取binlog.002895的某库SQL语句,mysql的二进制日志不是按天创建的,在my.cnf的配置文件有设置max_binlog_size最大值,日志的大小达到你设置的值时,mysql才会创建一个新的日志文件,如果大小达到设置的值了,最后的执行语句很长时会等到语句执行完毕,才会新建一个日志文件。
-rw-rw---- 1 mysql mysql 1073764199 Jan 20 09:55 binlog.002892
-rw-rw---- 1 mysql mysql 1073769146 Jan 20 20:43 binlog.002893
-rw-rw---- 1 mysql mysql 1073760451 Jan 21 10:39 binlog.002894
-rw-rw---- 1 mysql mysql 1073745436 Jan 21 17:31 binlog.002895
-rw-rw---- 1 mysql mysql 1073742546 Jan 22 05:28 binlog.002896
-rw-rw---- 1 mysql mysql 1073758697 Jan 22 13:44 binlog.002897
-rw-rw---- 1 mysql mysql 1073742021 Jan 22 21:27 binlog.002898
#/usr/local/webserver/mysql/bin/mysqlbinlog --no-defaults --database=testdb --start-datetime='2013-01-22 00:00:00' /home/mysql/binlog/binlog.002895 > log2895.txt
#/usr/local/webserver/mysql/bin/mysqlbinlog --no-defaults --database=testdb /home/mysql/binlog/binlog.002896 > log2896.txt
#/usr/local/webserver/mysql/bin/mysqlbinlog --no-defaults --database=testdb /home/mysql/binlog/binlog.002897 > log2897.txt
#/usr/local/webserver/mysql/bin/mysqlbinlog --no-defaults --database=testdb /home/mysql/binlog/binlog.002898 > log2898.txt
现在已经把那个时间段的某库(这里使用testdb)的sql语句全部提取出来了,我们现在只需要恢复被误删的那个库那段时间的数据,并不需要恢复整个数据库,所以接下来进行第二次提取sql内容。
#grep userlist log2895.txt> log2895-userlist.txt
#grep userlist log2896.txt> log2896-userlist.txt
#grep userlist log2897.txt> log2897-userlist.txt
#grep userlist log2898.txt> log2898-userlist.txt
现在提取出来的文件就只有对userlist表操作的SQL语句了,这里有两个需要注意的地方,一个是你需要把最后一个log2898-userlist.txt文件中程序员误操作的那个删除的SQL语句删除掉,一个是提取出来的SQL语句是每行一条,行尾没有“;”号,要在每个行SQL语句行尾加“;”使用vi编辑器打开SQL文件:%s/$/;即可在每行行尾加上“;”符号。
登陆MYSQL命令行,执行
mysql > source /home/dbbak/log2895-userlist.txt;
mysql > source /home/dbbak/log2896-userlist.txt;
mysql > source /home/dbbak/log2897-userlist.txt;
mysql > source /home/dbbak/log2898-userlist.txt;
执行完毕,该表的数据就恢复到当天误删除之前的状态了。
开始提取二进制日志,首先把某库22日00时开始的SQL语句提取出来,首先提取binlog.002895的某库SQL语句,mysql的二进制日志不是按天创建的,在my.cnf的配置文件有设置max_binlog_size最大值,日志的大小达到你设置的值时,mysql才会创建一个新的日志文件,如果大小达到设置的值了,最后的执行语句很长时会等到语句执行完毕,才会新建一个日志文件。
-rw-rw---- 1 mysql mysql 1073764199 Jan 20 09:55 binlog.002892
-rw-rw---- 1 mysql mysql 1073769146 Jan 20 20:43 binlog.002893
-rw-rw---- 1 mysql mysql 1073760451 Jan 21 10:39 binlog.002894
-rw-rw---- 1 mysql mysql 1073745436 Jan 21 17:31 binlog.002895
-rw-rw---- 1 mysql mysql 1073742546 Jan 22 05:28 binlog.002896
-rw-rw---- 1 mysql mysql 1073758697 Jan 22 13:44 binlog.002897
-rw-rw---- 1 mysql mysql 1073742021 Jan 22 21:27 binlog.002898
#/usr/local/webserver/mysql/bin/mysqlbinlog --no-defaults --database=testdb --start-datetime='2013-01-22 00:00:00' /home/mysql/binlog/binlog.002895 > log2895.txt
#/usr/local/webserver/mysql/bin/mysqlbinlog --no-defaults --database=testdb /home/mysql/binlog/binlog.002896 > log2896.txt
#/usr/local/webserver/mysql/bin/mysqlbinlog --no-defaults --database=testdb /home/mysql/binlog/binlog.002897 > log2897.txt
#/usr/local/webserver/mysql/bin/mysqlbinlog --no-defaults --database=testdb /home/mysql/binlog/binlog.002898 > log2898.txt
现在已经把那个时间段的某库(这里使用testdb)的sql语句全部提取出来了,我们现在只需要恢复被误删的那个库那段时间的数据,并不需要恢复整个数据库,所以接下来进行第二次提取sql内容。
#grep userlist log2895.txt> log2895-userlist.txt
#grep userlist log2896.txt> log2896-userlist.txt
#grep userlist log2897.txt> log2897-userlist.txt
#grep userlist log2898.txt> log2898-userlist.txt
现在提取出来的文件就只有对userlist表操作的SQL语句了,这里有两个需要注意的地方,一个是你需要把最后一个log2898-userlist.txt文件中程序员误操作的那个删除的SQL语句删除掉,一个是提取出来的SQL语句是每行一条,行尾没有“;”号,要在每个行SQL语句行尾加“;”使用vi编辑器打开SQL文件:%s/$/;即可在每行行尾加上“;”符号。
登陆MYSQL命令行,执行
mysql > source /home/dbbak/log2895-userlist.txt;
mysql > source /home/dbbak/log2896-userlist.txt;
mysql > source /home/dbbak/log2897-userlist.txt;
mysql > source /home/dbbak/log2898-userlist.txt;
执行完毕,该表的数据就恢复到当天误删除之前的状态了。