由于公司人员的一次大意操作,把一个只有表结构的空表,覆盖了线上的数据库。直接把生产系统上的数据库给覆盖了,生产数据全部没了。而碰巧的是这个新的数据库还没有进行每天的备份,直接炸锅.
幸好有binlog,在这里记录一下恢复过程.
1 先把生产线上的binlog 复制到了测试机器和本地上面。防止意外情况发生binlog破坏或者丢失.
2 在测试机器建立和破坏掉的数据库一样的表结构.
3 利用mysqlbinlog 命令进行对数据库的还原
3.1 binlog文件在的目录一般是在/var/lib/mysql/ 这个文件夹下面
3.2 执行mysqlbinlog 命令本机器是在/usr/bin/ 目录下面
3.3 执行命令
mysqlbinlog --no-defaults --database=【数据库名称】【binlog文件路径】 | mysql -u【mysql用户名】 -p【mysql用户密码】 -v 【数据库名】
例子:
/usr/bin/mysqlbinlog --no-defaults --set-charset=utf8 --database=db_mjm_015 /var/lib/mysql/mysql-binlog.|mysql -uroot -p123456 -v db_mjm_015
4 如果binlog 文件都在,即把每个binlog 文件都按照如上面进行执行.
binlog 只是对执行过的sql做记录操作,中间可能因为滚动或者覆盖而丢失一部分数据.
以上就是恢复的过程.
mysql 最好要开启binlog 不然真的有那一天mysql 没有进行备份,那么恰巧mysql又出现了意外操作,那是真的头大.
mysql 开启binlog 步骤
搜索my.cnf 文件 命令 locate my.cnf
在my.cnf 文件里面配置
log_bin=ON
log_bin_index=/var/lib/mysql/mysql-bin.index (此文件就是一个记录,记录了所有的binlog的文件)
配置好后进行数据库的重启
service mysql stop
service mysql start
下面一些是binlog的操作命令
在mysql里面执行
show master logs (可以查看binlogs)
/usr/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v --start-position='4' --stop-position='1000' /mysql_bin_log/mysql-bin.000046 >/mysql_bin_log/00046.out
可以把对应的开始位置和结束位置的binlog二进制文件输出到文本里面进行查看操作