官网参考文档:
https://dev.mysql.com/doc/refman/5.6/en/mysqlbinlog.html
服务器的二进制日志由包含“ 事件 ”的文件组成,这些事件描述了对数据库内容的修改。
服务器以二进制格式写入这些文件。要以文本格式显示其内容,请使用 mysqlbinlog实用程序。
还可以使用 mysqlbinlog显示复制设置中从属服务器写入的中继日志文件的内容,因为中继日志的格式与二进制日志相同。
mysqlbinlog是二进制日志的客户端命令工具,用于查看或备份二进制日志文件转换为一个sql文件,恢复时直接source引用即可
常用选项:
mysqlbinlog [option] log_file...
--start-position=# 指定开始位置
--stop-position=# 指定结束位置
--start-datetime= 起始时间
--stop-datetime= 结束时间
时间的格式:YYYY-MM-DD hh:mm:ss,2019-11-11 11:11:11
--base64-output[=name]
-v -vvv :详细信息,默认是看不到执行的语句的,使用-v可以变相的看到执行的语句
与二进制日志相关的配置:
vim /etc/my.cnf
[mysqld]
# 日志记录路径及日志名称,会在mysql-bin后面自动添加.000001后缀,要确保/data/binlog目录存在。并且权限正确
log-bin=/data/binlog/mysql-bin
# 记录二进制日志的格式,row行格式,取值有statement|row|mixed
binlog-format=row
# 日志产生后多长时间清除,天为单位
expire_logs_days=30
在数据库中:
MariaDB [hello]> show master logs ; # 此命令查看当前日志记录的位置
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 508970 |
+------------------+-----------+
1 row in set (0.00 sec)
在shell中:
mysqlbinlog工具会将经过base64编码过的二进制日志转换为适用于读的SQL语句类型,以便查看
# 查看二进制日志
mysqlbinlog /data/binlog/mysql-bin.000001 -vvv | less
注意:其中并不能显示像普通的SQL语句,像以下内容
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` tinyint(4) DEFAULT '25',
`sex` enum('F','M') DEFAULT 'M',
`phone` char(11) DEFAULT NULL,
`class` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4
用mysqlbinlog导出,实现备份文件
# 全备,当二进制日志文件过多过大时,不建议使用mysqlbinlog备份,有其他工具实现
mysqlbinlog /data/binlog/mysql-bin.000001 > all.sql
# 指定一个时间到某时间的部分备份,备份的只是两个时间段中间产生的数据
mysqlbinlog --start-datetime="2019-11-11 18:05:00" --stop-datetime="2019-11-11 18:10:00" > time.sql
# 指定位置实现部分备份
在数据库中:查看目前的日志位置
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 508970 |
+------------------+-----------+
在shell中:使用位置并备份
mysqlbinlog --start-position=400000 --stop-position=500000 > point.sql
注意:此处只是示例,真的备份要根据你的实际情况来,这里只是说明方法
用mysqlbinlog恢复数据
删除数据库全备恢复
恢复时建议暂时将二进制日志记录关闭,因为恢复操作都是之前的数据,记录日志也是无用的
备份出来的文件中的SQL语句会事先做判断,如果某库存在,则该库不予创建,如果库或表不存在,则创建
破坏:rm -rf /var/lib/mysql/hello/ # hello为我做实验的数据库
恢复:登录到数据库中,执行source命令
MariaDB [(none)]> source all.sql;
MariaDB [mysql]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| hello |
| mysql |
| performance_schema |
| test |
+--------------------+
注意
1)如果使用导出的脚本恢复数据,前提是脚本中必须要有创建的命令,他会认为就是创建脚本。如果没有创建的命令那就不能恢复
2)如果drop删除了一个表,那么导出的脚本中应该要有create命令,要不没法恢复
3)delete删除的数据要有insert命令
4)二进制日志文件中只是记录了每条命令的执行,要在有数据库的基础上才能执行命令不是吗
脚本实现每小时备份binlog
1、编辑脚本
vim bac-binlog.sh
#!/bin/bash
#
#Description backup mysql binlog
TIME=`date -d "-1 hours" +"%F %T"`
mysqlbinlog --start-datetime="$TIME" /data/binlog/mysql-bin.0* > /tmp/binlog/mysql-binlog-`date +"%F-%H"`.sql
2、为脚本添加执行权限
chmod +x bac-binlog.sh
3、添加cron任务计划
crontab -e
01 * * * * /root/bak-binlog.sql &> /dev/null # 将产生的信息全部丢到/dev/null,以免接收无用的邮件
如有错误请指正!