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 命令执行