检查是否开启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还原了。