MySQL 5.6.14 生产环境凌晨3点的备份,不完全恢复到中午12点. (xtrabackup_binlog_pos_innodb的内容是mysql-bin.006946 3784607) 第一种方式:mysqlbinlog 1.找到需要恢复的binlog 进入binlog目录,执行 ll | awk '{print $9}' > /tmp/binlog.index
然后修改/tmp/binlog.index文件,删除不需要恢复的文件名. 2.解析binlog time mysqlbinlog $(cat /tmp/binlog.index) --start-position=3784607 --stop-datetime='2015-07-13 12:00:00' > /tmp/binlog real 2m32.399s user 1m24.514s sys 1m5.803s 3.设置MySQL服务器参数 max_allowed_packet=100M innodb_flush_log_at_trx_commit=0
4.执行 time mysql -uroot -p -S mysql.sock --force < /tmp/binlog
real 50m24.341s user 5m1.426s sys 3m32.348s
执行3.4G的文件,用时50分钟. 第二种方式:复制,使用SQL线程执行 1.找到需要恢复的binlog 进入binlog目录,执行 ll | awk '{print $9}' > /tmp/binlog.index
然后修改/tmp/binlog.index文件,删除不需要恢复的文件名.
2.拷贝需要的binlog至一个新的目录 mkdir /tmp/testlog cp $(cat /tmp/binlog.index) /tmp/testlog/ 3.修改服务器参数 max_allowed_packet=100M innodb_flush_log_at_trx_commit=0 server_id=111 relay_log=/tmp/testlog/mysql-bin relay_log_index=/tmp/testlog/mysql-bin.index skip_slave_start = 1 其中 server_id一定要修改为一个不同的值,否则binlog被直接丢弃. skip_slave_start防止自动启动复制 4.启动实例,生成复制的相关文件 change master to master_host='localhost', master_port=3306, master_user='repl', master_password='repl', master_log_file='dummy.binlog', master_log_pos=777; master是一个随便的值,主要是生成master.info,relay-log.info等相关文件 5.关闭实例,修改文件 修改relay-log.info
修改/tmp/testlog/mysql-bin.index 为 awk '{print "/tmp/testlog/"$1'} /tmp/binlog.index > /tmp/testlog/mysql-bin.index 6.启动实例,启动复制 start slave sql_thread UNTIL RELAY_LOG_FILE = 'mysql-bin.006982', RELAY_LOG_POS = 37300415; 恢复用时43分钟. mysqlbinlog方式更简单,但是一旦出错,容易前功尽弃 复制的方式,前期配置比较复杂,但是出现错误,更容易修正. 从效率上看,相差不大 如果有大量的binlog需要恢复,建议使用复制的方式. 如果只有少量的binlog需要恢复,还是使用mysqlbinlog更简洁一些.