Mysql通过binlog二进制日志文件恢复数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012946310/article/details/82864582

1,登陆Mysql控制台查看Mysql日志文件位置

show variables like 'log_%'; // 查看日志文件开启状态和文件位置
show binary logs; // 查看所有的日志文件
show master status\G; // 查看当前写入的日志文件

mysql> show variables like 'log_%';
+----------------------------------------+---------------------------------------------------------+
| Variable_name                          | Value                                                   |
+----------------------------------------+---------------------------------------------------------+
| log_bin                                | ON                                                      |
| log_bin_basename                       | /usr/local/mysql/data/mysql/mysql-bin                   |
| log_bin_index                          | /usr/local/mysql/data/mysql/mysql-bin.index             |
| log_bin_trust_function_creators        | OFF                                                     |
| log_bin_use_v1_row_events              | OFF                                                     |
| log_error                              | /usr/local/mysql/data/mysql/izbp11gsqdkmgt6b1r4kajz.err |
| log_output                             | FILE                                                    |
| log_queries_not_using_indexes          | OFF                                                     |
| log_slave_updates                      | OFF                                                     |
| log_slow_admin_statements              | OFF                                                     |
| log_slow_slave_statements              | OFF                                                     |
| log_throttle_queries_not_using_indexes | 0                                                       |
| log_warnings                           | 1                                                       |
+----------------------------------------+---------------------------------------------------------+
13 rows in set (0.00 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     19739 |
+------------------+-----------+
1 row in set (0.00 sec)

mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 20911
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

如果log_bin 显示为 off 表示数据库没有开启日志文件,需要修改配置开启,修改Mysql的my.cnf文件(一般在/etc目录下),在[mysqld]行下面添加 log-bin=mysql-bin 行

[mysqld]
log-bin=mysql-bin

2,恢复数据

恢复有几种方式

1,binlog文件全量恢复

mysqlbinlog /usr/local/mysql/data/mysql/mysql-bin.000001 > a.sql

此操作会把mysql-bin.000001记录的操作日志全部转换为sql

2,按时间恢复--start-datetime

如果确定了时间点,那么按时间恢复是一个再好不过的事,一般是通过日常的定期备份+差异备份(日志)

如果日常备份在4点,出错的时间在12:00点,12:30发现的,首先我们要确认12点出了什么错,12点以后的数据还能不能继续使用,如果不影响,那么我们只需跳过12:00执行的数据即可

首先,恢复4点的备份

然后,通过binlog获取4点到11:59的数据,获取的数据可以直接作用到数据库中,避免二次污染,最好先生成sql文件

mysqlbinlog --start-datetime="2018-09-27 04:01:00"  --stop-datetime="2018-09-27 11:59:00" /usr/local/mysql/data/mysql/mysql-bin.000001 >a.sql

在获取12:01-12:30的数据

 mysqlbinlog --start-datetime="2018-09-27 12:01:00"  --stop-datetime="2018-09-27 12:30:00" /usr/local/mysql/data/mysql/mysql-bin.000001 >>a.sql

3,通过--start-position节点

思路和上面的一样,首先要确定节点的id,在恢复

3,异常处理

[root@izbp11gsqdkmgt6b1r4kajz mysql]# mysqlbinlog mysql-bin.000001 > a.sql
mysqlbinlog: unknown variable 'default-character-set=utf8mb4'

原因是mysqlbinlog这个工具无法识别binlog中的配置中的default-character-set=utf8mb4这个指令。

两个方法可以解决这个问题

一是在MySQL的配置/etc/my.cnf中将default-character-set=utf8mb4 修改为 character-set-server = utf8mb4,但是这需要重启MySQL服务,如果你的MySQL服务正在忙,那这样的代价会比较大。

二是用mysqlbinlog --no-defaults mysql-bin.000001 命令执行

猜你喜欢

转载自blog.csdn.net/u012946310/article/details/82864582