03月02, 2016

MYSQL通过bin-log恢复数据

https://dev.mysql.com/doc/refman/5.7/en/point-in-time-recovery.html

mysql中bin-log在mysql默认状态下是没有打开的,我们要先打开mysql 开启bin-log功能,然后再通过备份的bin-log进行数据库恢复了。

具体的操作是通过mysqlbinlog这个指令来完成的

/mysql/bin/mysqlbinlog \
--database=fox \
--start-datetime="2013-01-22 5:00:00"  \
--stop-datetime="2013-01-22 9:00:00" \
/mysql/data/mysql-bin.000001 | \
/mysql/bin/mysql -u root -p123456 -f

具体的参数看下名字就能明白

  • -d or -database:指定具体的数据库
  • --start-datetime --stop-datetime 指定开始位和结束位置的数据
  • --start-position --stop-position 指定开始位和结束位置的数据
  • /mysql/data/mysql-bin.000001:指定日志文件

如果你没有备份数据的话,你就必须通过日志文件一个一个还原,记得顺序不能乱。如果你没有备份数据,日志又被部分删除的话,那么就悲剧了。因此,还原只是一种方法,最重要的还是定期备份数据。只要备份数据在,日志文件在,东西都可以解决。

bin-log功能

  1. 查看二进制日志

    shell> mysqlbinlog 二进制日志名 | more
    或者
    mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000083' LIMIT 0, 25
    
  2. 过滤指定数据库数据并导出到文件

    mysqlbinlog –d 库名 二进制日志名 > capinfo.log
    

3、使用二进制日志做增量恢复

  • 示例:指定位置的增量恢复

    mysqlbinlog -d capinfo --start-position=98 --stop-position=768 \
    mysql-bin.000038 |mysql -uroot -p123456 -S/data/3306/data/mysql.sock
    
  • 指定时间段的增量恢复

    mysqlbinlog -d capinfo --start-datetime=”2015-02-27 09:30:00”\
    --stop-datetime=”2015-02-27 12:30:00” mysql-bin.000038|mysql \
    -uroot -p123456 -S /data/3306/data/mysql.sock
    

同时记录一些操作日志的方法

查看所有日志:

show master logs;
或者
SHOW BINARY LOGS;

当前使用的binlog文件

SHOW MASTER STATUS;

产生一个新的binlog日志文件

flush logs;

删除所有二进制日志,并从新开始记录

flush logs;  
reset master;

这里突然有一种想法,是否每次备份完数据以后就把之前的日志清理下,这样一旦发生问题,就可以从最近的日志开始还原。这个只是我的一种想法,有什么问题请指正。

同时大家如果希望不在错误操作delete这个可以在mysql启动的时候加入-U这个参数

启动MySQL的时候加上参数 -U

-U, –safe-updates Only allow UPDATE and DELETE that uses keys.

他的作用是防止执行delete的时候没带有条件语句,如果没加上where则语句不执行。


一次完整的Mysqlbin-log日志恢复过程实例

1).创建一个表:

mysql>usetest;
mysql>createtable t1(id int);
mysql>showtables;

2).添加两行数据:

mysql>insertinto t1 values(1);
mysql>insertinto t1 values(2);
mysql>select *from t1;

3).备份现有数据(09:30):

#mysqldump -uroot-p123456 test -l -F > /tmp/test.sql

4).在备份完后再添加三行数据(记录):

mysql>insertinto t1 values(3);
mysql>insertinto t1 values(4);
mysql>insertinto t1 values(5);

5).此时突然数据库损损坏或者认为删除:

mysql>droptable t1;

6).用已备份的test.sql来恢复数据库:

#mysql -uroot-p123456 test < test.sql

7).从bin-log日志恢复:

#/usr/local/mysql/bin/mysqlbinlog–no-defaults mysql-bin.000006|more//查看bin-log日志,在我的虚力机上bin-log日志从mysql-bin.000005开始
#/usr/local/mysql/bin/mysqlbinlog--no-defaults --stop-position=”272” mysql-bin.000006 |/usr/local/mysql/bin/mysql -uroot -p123456 //恢复bin-log日志

如果你没有开启bin日志我们可参考正同方法开启

一、 Mysql bin-log 日志

1.开启Mysql bin-log 日志

#vi/etc/my.cnf

[client]
#password =your_password
port =3306
socket =/tmp/mysql.sock
default-character-set-utf8
.......
[mysqld]
port= 3306
socket= /var/lib/mysql/mysql.sock
log-slow-queries=mysql-slowlog
log-error=mysql.err
log=mysql.log
log-bin=mysql-bin//删除#符号

2.查看二进制文件(mysql-bin.**)

#cd /usr/local/mysql/bin/ && ls

3.查看mysqbinlog日志是否开启

mysql> showvariables like “%log-bin%;

4.与Mysqlbin-log有关的日志操作

mysql> flushlogs;//此时就会多一个最新的bin-log日志
mysql> show master status;//查看最后一个bin日志
mysql> reset master;//清空所有的bin-log日志
mysql> mysqlbinlog –no-defaults mysql-bin.******|more//查看bin-log日志

原文

原文

本文链接:https://blog.hijs.cc/post/mysql-binlog.html

-- EOF --

Comments