用binlog基于时间点恢复

检查是否开启binlog

#进入mysql
mysql -uroot -p --port=3308 -h 192.168.11.200
#
>show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+

修改my.cnf

#当时docker容器是这样创建的:
docker run -p 3308:3306 --name mysql  -v /home1/app/mysql/data/mysql_3308/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf  -v  /home1/app/mysql/data/mysql_3308/logs:/logs -v /home1/app/mysql/data/mysql_3308/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123asd -d mysql:5.7

可知:
/home1/app/mysql/data/mysql_3308/conf/my.cnf是配置文件目录
/home1/app/mysql/data/mysql_3308/data是数据映射到本地的目录
/var/lib/mysql是容器中的目录

编辑my.cnf

[mysqld]
# binlog 配置
log-bin = /var/lib/mysql/mysql-bin.log
expire-logs-days = 3
max-binlog-size = 500M
server-id = 1
binlog-do-db=ls365_goodquestion_20191205 #需要记录日志的数据库;如果不加这一条,则整个实例的数据库都会备份(每个数据库一行)

重启mysql

docker restart mysql

查看数据目录

增加了以下文件:
-rw-r----- 1 systemd-bus-proxy ssh_keys 154 12月 6 15:34 mysql-bin.000001
-rw-r----- 1 systemd-bus-proxy ssh_keys 32 12月 6 15:34 mysql-bin.index

查看binlog内容

# 用mysql终端查看
mysql>  show binlog events in 'mysql-bin.000001';
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.28-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids |         1 |         154 |                                       |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+

#用命令行查看
mysqlbinlog mysql-bin.000001

查看binlog的模式

binlog有三种模式:Row statment mixed

mysql> show global variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+

如要配置成mixed,在conf文件中加上:

binlog_format = MIXED       

基于时间点的恢复

一些可能用到的命令

# 删除所有的binlog,重新记录
mysql> reset master; 
# 生成一个新的日志文件,后续的操作写在新的日志文件中
mysqladmin -uroot -p -P3308 -h127.0.0.1 flush-logs

binlog的恢复原理其实就是sql重放,所以必须要有完全的备份

首先必须要有一个完全备份。因为binlog恢复实际上是SQL重放,如果没有完全备份,就不知道从哪个position开始重放,如果判断不准确的话,很容易导致数据错误(比如同一条数据插入两次)。特别的,如果出现删库跑路的情况,如果没有完全备份,就只能从创建数据库那一刻开始重放,而悲剧的是,一般不可能保留那么久的binlog。

所以,一般的做法是在热备份之前,手动切换日志(flush-log),让备份期间产生的事务写到新的日志中去,
生成了完全备份以后,手动清理一下binlog。

好了接下来的恢复建立在已经进行了完全备份还原的情况下。

#先观察一下需要还原的起始和结束position在哪里。
mysql>  show binlog events in 'mysql-bin.000001';
#然后恢复
mysqlbinlog  mysql-bin.000001 --stop-position=718 |mysql -uroot -p -P3308 -h127.0.0.1

刚刚说过了,恢复就是SQL重放,所以重放的SQL又会作为新的日志记录下来。

为什么一定要加上起止时间?起就不说了,因为起始的日志可能包含完全备份时间点之前的SQL,所以要把时间点限制在完全备份之后
为什么一定要加上结束时间?因为没有加的话,等同于重放了一遍之前所有操作,相当于没有恢复。

没有完全备份怎么办

没有完全备份,不能用binlog还原。只能考虑用percona等工具从ibd和iblog还原了。

你可能感兴趣的:(用binlog基于时间点恢复)