今天和徐州论坛技术在沟通上出现问题导致用一个月前的备份数据覆盖掉了线上正在运行的数据库,而且一个月前的
数据库是最新的数据库了。所以,只能通过二进制日志文件来进行数据库恢复工作了。
通过my.cnf文件,可以知道二进制日志存放的路径:
- log-bin=/home/mysql/mysql-bin
- binlog-do-db=phpwind //记录二进制日志文件的数据库
徐州论坛在2011年6月28号因为
升级备份过一次数据库,以后就没有再备份过数据库了。当时备份的时候,会记录下一个二进制日志文件。
因此用6.28号的备份数据库还原到线上以后,然后通过二进制日志文件进行数据恢复操作,简单总结如下:
mysql数据存放路径:/usr/local/mysql51/var
6.28号备份数据为:/usr/local/mysql51/var/2011-6-28.tar.gz 备份具体时间:Jun 28 15:37
线上数据库名称:phpwind
命令如下:
- mv phpwind phpwind_old
- tar -zxvf 2011-6-28.tar.gz //得到6.28号备份的phpwind
接下来,查看2011.06.28备份后启动mysql生成的二进制日志文件,将从那时候开始的二进制日志文件到今天的日志一起刷到6.28号备份的数据库:
有这么些文件都是从6.28号到今天8.3号期间数据库行为产生的二进制文件
可以看下后缀为76和77的二进制日志文件,命令如下,针对后缀是77的日志文件:
- /usr/local/mysql51/bin/mysqlbinlog mysql-bin.000077 | more
得到:
根据上面客户备份的数据时间 Jun 28 15:37 可以判定,后缀77的二进制文件应该就是客户在备份完数据库后,启动数据库生成的新的二进制文件了。
那么,现在就从这个文件开始进行数据恢复:
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000077 | /usr/local/mysql51/bin/mysql -f -uroot -p
回车后,会提示输入root账号的密码,然后就是执行数据恢复了。
上面 -f 主要是为在日志文件导入的时候,忽略提示的错误比如主键冲突什么的,考虑加上这个参数
这个时候可以通过:
来查看数据库导入二进制日志文件的进程,数据库就是模拟之前用户在论坛里边的操作,不断的插数据和更新数据。这个时候务必让论坛处于关闭的状态。
执行后缀为77的二进制日志后,最好可以备份当前经过二进制日志文件恢复后的数据库,作为出现重大错误后备用最新数据库。
接下来执行:
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000078 | /usr/local/mysql51/bin/mysql -f -uroot -p []
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000079 | /usr/local/mysql51/bin/mysql -f -uroot -p
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000080 | /usr/local/mysql51/bin/mysql -f -uroot -p
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000081 | /usr/local/mysql51/bin/mysql -f -uroot -p
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000082 | /usr/local/mysql51/bin/mysql -f -uroot -p
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000083 | /usr/local/mysql51/bin/mysql -f -uroot -p
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000084 | /usr/local/mysql51/bin/mysql -f -uroot -p
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000085 | /usr/local/mysql51/bin/mysql -f -uroot -p
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000086 | /usr/local/mysql51/bin/mysql -f -uroot -p
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000087 | /usr/local/mysql51/bin/mysql -f -uroot -p
- /usr/local/mysql51/bin/mysqlbinlog /home/mysql_bak/mysql-bin.000088 | /usr/local/mysql51/bin/mysql -f -uroot -p
都执行完毕以后,数据就是今天最新的了