mysqlbinlog工具使用

mysqlbinlog工具

官网参考文档:
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,以免接收无用的邮件

如有错误请指正!

你可能感兴趣的:(mysql)