日常运维工作中,数据库的备份非常重要!数据库对网站的重要性,让我们无法管理MySQL数据库!然而,人难免会犯错误。说不定哪天脑子短路了,数据库被误删了。我应该怎么办?下面就MySQL数据库被误删后的恢复方案进行说明。一、工作场景(1)MySQL数据库每晚12:00自动全量备份。(2)某天早上上班,9点钟,同事搞了一个数据库,晕滴!(3)需要紧急恢复!备份数据文件和增量binlog文件可用于数据恢复。2、数据恢复思路(1)利用准备充分的sql文件、binlog文件中记录的CHANGEMASTER语句及其位置点信息,找出binlog文件的增量部分。(2)使用mysqlbinlog命令将上面的binlog文件导出为sql文件,去掉其中的drop语句。(3)通过导出全量备份文件和增量binlog文件的sql文件,可以恢复完整的数据。3.实例说明首先要确保mysql开启了binlog日志功能。在/etc/my.cnf文件中的[mysqld]块中添加:log-bin=mysql-bin并重启mysql服务(1)在ops库下创建表customersmysql>useops;mysql>createtablecustomers(->idintnotnullauto_increment,->namechar(20)notnull,->ageintnotnull,->primarykey(id)->)engine=InnoDB;QueryOK,0rowsaffected(0.09sec)mysql>showtables;+---------------+|Tables_in_ops|+------------+|customers|+------------+1rowinset(0.00sec)mysql>desccustomers;+--------+---------+-----+-----+--------+--------------+|Field|Type|Null|Key|Default|Extra|+--------+----------+------+-----+--------+----------------+|id|int(11)|NO|PRI|NULL|auto_increment||name|char(20)|NO||NULL|||age|int(11)|NO||NULL||+------+----------+------+-----+--------+----------------+3rowsinset(0.02sec)mysql>insertintocustomersvalues(1"wangbo","24");QueryOK,1rowaffected(0.06sec)mysql>insertintocustomersvalues(2,"guohui","22");QueryOK,1rowaffected(0.06sec)mysql>insertintocustomersvalues(3,"zhangheng","27");QueryOK,1rowaffected(0.09sec)mysql>select*fromcustomers;+----+------------+------+|id|name|age|+----+------------+-----+|1|wangbo|24||2|guohui|22||3|zhangheng|27|+----+------------+-----+3rowsinset(0.00sec)(2)现在做一个完整的备份[root@vm-002~]#mysqldump-uroot-p-B-F-R-x--master-data=2ops|gzip>/opt/backup/ops_$(date+%F).sql.gzEnterpassword:[root@vm-002~]#ls/opt/backup/ops_2016-09-25.sql.gz参数说明:-B:指定数据库-F:刷新日志-R:备份存储过程等-x:锁定表–master-data:添加CHANGEMASTER语句和binlog文件及位置点信息备份语句(3)再次插入数据mysql>insertintocustomersvalues(4,"liupeng","21");QueryOK,1rowaffected(0.06sec)mysql>insertintocustomersvalues(5,"xiaoda","31");QueryOK,1rowaffected(0.07sec)mysql>insertintocustomersvalues(6,"fuaiai","26");QueryOK,1rowaffected(0.06sec)mysql>select*fromcustomers;+----+------------+-----+|id|name|age|+----+------------+-----+|1|wangbo|24||2|guohui|22||3|章痕g|27||4|liupeng|21||5|小达|31||6|fuaiai|26|+----+------------+------+6rowsinset(0.00sec)(4)此时误操作,删除test数据库mysql>dropdatabaseops;QueryOK,1rowaffected(0.04sec)此时,用户写入的数据在binlog中,介于全备份和误操作的时刻之间。恢复!(5)查看全量备份后新增的binlog文件[root@vm-002~]#cd/opt/backup/[root@vm-002backup]#lsops_2016-09-25.sql.gz[root@vm-002backup]#gzip-dops_2016-09-25.sql.gz[root@vm-002backup]#lsops_2016-09-25.sql[root@vm-002backup]#grepCHANGEops_2016-09-25.sql--CHANGEMASTERTOMASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=106;这里是全量备份时binlog文件的位置,即mysql-bin.000002的第106行,所以本次全量备份中已经包含了这个文件之前的binlog文件中的数据(6)移动binlog文件导出为sql文件,删除其中的drop语句,查看mysql数据存放目录。下面显示在/var/lib/mysql[root@vm-002backup]下#ps-ef|grepmysqlroot92721001:43pts/100:00:00/bin/sh/usr/bin/mysqld_safe--datadir=/var/lib/mysql--socket=/var/lib/mysql/mysql.sock--pid-file=/var/run/mysqld/mysqld.pid--basedir=/usr--user=mysqlmysql93779272001:43pts/100:00:00/usr/libexec/mysqld--basedir=/usr--datadir=/var/lib/mysql--user=mysql--log-error=/var/log/mysqld.log--pid-file=/var/run/mysqld/mysqld.pid--socket=/var/lib/mysql/mysql.sock[root@vm-002备份]#cd/var/lib/mysql/[root@vm-002mysql]#lsibdata1ib_logfile0ib_logfile1mysqlmysql-bin.000001mysql-bin.000002mysql-bin.indexmysql.socktest[root@vm-002mysql]#cpmysql-bin.000002/opt/备份/导出binlog文件到sql文件,用vim编辑删除里面的drop语句[root@vm-002backup]#mysqlbinlog-dopsmysql-bin.000002>002bin.sql[root@vm-002backup]#ls002bin.sqlmysql-bin.000002ops_2016-09-25.sql[root@vm-002backup]#vim002bin.sql#删除里面的drop语句注意:恢复全量备份数据前,必须先删除binlog文件,否则语句恢复过程中会不断写入binlog,最终导致增量恢复数据部分(七)恢复数据混乱[root@vm-002backup]#mysql-uroot-p
