msql逻辑备份中,提供了增量备份和差异备份。
增量备份:备份上次备份后,产生的所有数据。
差异备份:备份上次完全备份后,产生的所有数据。
想要使用mysql提供的增量备份,就必须要用到binlog日志。
binlog日志:
是二进制日志
记录了除查询之外的所有sql命令
可以用于数据的备份与恢复
可以用于配置mysql主从同步
binlog日志默认没有开启,想要开启binlog日志需要修改配置文件/etc/my.cnf
开启binlog日志:
# 数据库版本不同就会有不同的操作。
# 我使用的mysql版本是8.0.17,不需要手动开启binlog日志
# 默认的日志是:/var/lib/mysql/binlog.xxxx
vim /etc/my.cnf
[mysqld]
...
server_id=5 #指明id,不能有重复,一般采用主机号
log_bin=/mylog/xxx #指明了binlog存放的目录为/mysql,日志名为xxx,这个目录的所有者和所有组必须要是mysql,否则无法写入,默认/var/lib/mysql/
max_binlog_size=500m #指定日志大小,超过500M则重新生成日志。如果binlog开启之后,每当mysql重新启动时也会新产生一个binlog日志文件
...
chown mysql:mysql /mylog #修改日志目录的所有者
systemctl restart mysqld #重新启动mysql服务
生成新的binlog日志:
1、重启mysql服务
2、mysql> flush logs #在登录mysql的状态下输入 flush logs
3、mysql -uroot -p123456 -e ‘flush logs’ #采用非交互式,不需要登录msql
# 使用非交互式访问数据库,mysql -uroot -p123456 -e 'sql命令或者语句'
4、mysqldump -uroot -p123456 --flush-logs spiderDB > xxx/xxx.sql
# 将spiderDB这个数据库完全备份之后,新产生一个binlog日志,之后的操作都记录在这里
查看binlog日志:
mysql> show master status #mysql当前使用的binlog日志,在登录mysql中使用命令查询
cat /mylog/xxx.index #这个文件记录了mysql所有的binlog日志文件
删除binlog日志:
1、使用系统命令rm删除。这种方法用于删除所有的binlog日志和index文件
2、使用mysql提供的命令删除:
purge master logs to 'binlog日志名' #删除指定日志之前的所有日志
reset master #清空所有binlog日志,从编号为000001的重新产生
修改日志记录格式:
使用mysqlbinlog查看日志时,默认是看不到执行的sql语句的
binlog日志有三种模式:
1.row
2.mixed #只有这种能看到执行的sql语句
3.statement
查看格式:
mysql> show variables like '%binlog%'
binlog_format
修改格式:
vim /etc/my.cnf
[mysqld]
...
binlog_format='mixed' #混合模式
...
读取binlog日志:
mysqlbinlog /var/lib/mysql/binlog.000001 #读取名为binlog.000001的日志文件
# at 1317
#191010 20:56:18 server id 1 end_log_pos 1426 CRC32 0x6f81dc24 Query thread_id=9 exec_time=0 error_code=0
SET TIMESTAMP=1570712178/*!*/;
insert into user values('3','c')
/*!*/;
# at 1426
#191010 20:56:18 server id 1 end_log_pos 1457 CRC32 0xa2e7032b Xid = 20
COMMIT/*!*/;
如何区分多条sql语句:
1、偏移量:at后面的就是偏移量,两个at之间就是一条sql语句
2、时间点:at下面那一行就是时间点
根据偏移量读取binlog日志:
mysqlbinlog --start-position=1317 --stop-position=1426
# --start-position是起始偏移量,--stop-position是结束偏移量
根据时间点读取binlog日志:
mysqlbinlog --start-datetime='2019-10-10 20:56:18' --stop-datetime='2019-10-10 21:56:18'
# --start-datetime是起始时间,--stop-datetime是结束时间
根据binlog恢复数据:
# 如果插入了很多数据,但是在最后把这些数据都给删除了,
# 那么通过整个binlog日志进行恢复数据明显无法达到恢复数据的效果。
# 因此需要从binlog日志中选择可以让数据恢复的语句。
根据偏移量恢复:
mysqlbinlog --start-position=1317 --stop-position=1426 | mysql -uroot -p123456
根据时间点恢复:
mysqlbinlog --start-datetime='2019-10-10 20:56:18' --stop-datetime='2019-10-10 21:56:18' \
| mysql -uroot -p123456
写总结的第三十五天!!!