记一次使用mysqlbinlog恢复数据库

mysqlbinlog

记得项目还没上线的时候因为一次误操作清空了数据库,不是非常要命但是如果手动恢复的话还是很麻烦的,所以就用了mysql的binlog机制进行了数据库的恢复,因为没有上线,binlog并不大,也没有删除过binlog,所以很容易就恢复了,不过没有做记录,前几天另外一个项目组的数据库数据也因为误操作被清空了,正好又实践了一次…这次把mysqlbinlog的使用记录下来。


首先mysql启动前要配置一些字段才能使binlog生效。

vi /usr/local/mysql/etc/my.cnf


配置文件中配置如下的binlog相关配置

log-bin=/data/mysql_binlog/4306/mysql-bin
binlog_format=MIXED
binlog_cache_size = 1M
max_binlog_size=512M
expire_logs_days = 5  #我这里只记录了五天,因为binlog特别大,容易将硬盘占满,需要定时清理,但是如果binlog不全是没法恢复数据库的。

binlog中保存了修改数据库的所有语句(增删改查中,除了selec语句的其他所有语句),完全按照顺序写入binlog,如果数据库不幸被删了,那么从binlog的第一条记录开始恢复就会恢复binlog保存的所有数据。
使用binlog恢复数据的命令:

mysqlbinlog mysql-bin.000001 --start-position=4 --stop-position=7128197 -d db_launcher_hz | mysql -uroot -h 127.0.0.1 -P 4306 -D db_launcher_hz

命令中指定了要恢复的binlog文件 mysql-bin.000001,开始位置和结束位置,要恢复的数据库名字,用户名密码等等。开始位置和结束位置可以通过查看binlog内容来确定,查看binlog内容的命令:

mysqlbinlog mysql-bin.000001

会输出binlog的内容:

.......
SET TIMESTAMP=1519733350/*!*/;
BEGIN
/*!*/;
# at 261731
#180227 20:09:10 server id 1  end_log_pos 262082 CRC32 0x69ff7fd5       Query   thread_id=31923 exec_time=0     error_code=0
SET TIMESTAMP=1519733350/*!*/;
UPDATE tbl_activity SET fld_channel='', fld_status='1', fld_show_status='1', fld_start_time='2014-12-31 16:00:00', fld_stop_time='2015-01-01 16:00:00', fld_show_start_time='2014-12-31 16:00:00', fld_show_stop_time='2015-01-01 16:00:00' WHERE fld_id='7393'
/*!*/;
# at 262082
#180227 20:09:10 server id 1  end_log_pos 262184 CRC32 0x243a0c9d       Query   thread_id=31923 exec_time=0     error_code=0
SET TIMESTAMP=1519733350/*!*/;
COMMIT
/*!*/;
# at 262184
#180227 20:09:10 server id 1  end_log_pos 262285 CRC32 0xad2078ed       Query   thread_id=31923 exec_time=0     error_code=0
.......

我们可以把binlog的内容输出到文本中寻找想要恢复的的起止位置。

两次通过binlog恢复数据库内容的操作都是在项目早期,数据量并不多,binlog没有删除过,所以恢复起来并没有什么压力,但是binlog占用的硬盘空间非常大,如何管理binlog以保证数据库数据的安全性是之后需要考虑的一个问题。