参考:
https://www.cnblogs.com/zouhong/p/14540380.html
https://www.iteye.com/blog/wx1568934009-2469938
获取二进制日志列表show binary logs
show binary logs
查看具体日志文件mysqlbinlog mysql-bin.000025
进入服务器
#存放binlog的地方,具体可看配置文件
cd /var/lib/mysql
mysqlbinlog mysql-bin.000025
日志全文
[root@129 home]# cd /var/lib/mysql
[root@129 mysql]# mysqlbinlog mysql-bin.000025
# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on server versions 8.0.24 and older.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#220407 20:56:18 server id 129 end_log_pos 126 CRC32 0xf0043ca2 Start: binlog v 4, server v 8.0.28 created 220407 20:56:18 at startup
ROLLBACK/*!*/;
BINLOG '
ct9OYg+BAAAAegAAAH4AAAAAAAQAOC4wLjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABy305iEwANAAgAAAAABAAEAAAAYgAEGggAAAAICAgCAAAACgoKKioAEjQA
CigAAaI8BPA=
'/*!*/;
# at 126
#220407 20:56:18 server id 129 end_log_pos 157 CRC32 0x8b107e3b Previous-GTIDs
# [empty]
# at 157
#220407 21:01:23 server id 129 end_log_pos 180 CRC32 0x65c055ca Stop
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
获取指定数据库的日志-d
#先把日志文件拿到备份的目录
cd /home/mysqlbak
cp /var/lib/mysql/mysql-bin.* ./
#获取指定库的日志文件 -d 指定数据库 -r 指定输出在哪个文件
mysqlbinlog -d clsn mysql-bin.000026 -r clsn.sql
禁止恢复过程产生日志 -D
在使用二进制日志文件进行数据库恢复时,该过程中也会产生日志文件,就会进入一个循环状态,继续恢复该过程中的数据。因此,当使用mysqlbinlog命令时,要禁用二进制日志,请使用下面所示的-D选项:
mysqlbinlog -d clsn -D mysql-bin.000026 -r clsn2.sql
对比有无-D文件发现如下,左侧是不加-D
文件开始
/*!32316 SET @OLD_SQL_LOG_BIN=@@SQL_LOG_BIN, SQL_LOG_BIN=0*/;
文件结尾
/*!32316 SET SQL_LOG_BIN=@OLD_SQL_LOG_BIN*/;
尝试恢复
mysql -uroot -p'123456' < clsn2.sql
观察mysql-bin.000026
文件发现文件大小和修改时间都未变化,代表恢复不会产生binlog日志。
控制输出base64编码的BINLOG语句 --base64-output
使用base64-output
选项,可以控制输出语句何时是输出base64
编码的BINLOG
语句。
以下是输出设置的可能值:
- never
- unspec
- decode-rows
- auto(默认)
never
:当指定如下所示的never时,它将不在输出中显示base64编码的BINLOG语句。
mysqlbinlog -d clsn --base64-output=never mysql-bin.000026 -r clsn3.sql
下面的语句不输出
BINLOG '
peBOYg+BAAAAegAAAH4AAAABAAQAOC4wLjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACl4E5iEwANAAgAAAAABAAEAAAAYgAEGggAAAAICAgCAAAACgoKKioAEjQA
CigAAcVeR9E=
对比有无base64编码的binlog语句
unspec
:当指定unspec选项时,只要有可能,它将只显示BINLOG项。因此,只有在专门调试一些问题时才使用它。
mysqlbinlog -d clsn --base64-output=unspec mysql-bin.000026 -r clsn4.sql
发现生成的文件和不加参数生成的文件一模一样这里也不是很懂,后续在推敲。
decode-rows
:这个选项将把基于行的事件解码成一个SQL语句,特别是当指定-verbose选项时,如下所示。
mysqlbinlog -d clsn --base64-output=decode-rows --verbose mysql-bin.000026 -r clsn5.sql
发现生成的文件和不加参数生成的文件一模一样这里也不是很懂,后续在推敲。
auto
这里不解释。
mysqlbinlog输出调试信息
[root@129 mysqlbak]# mysql -V
mysql Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)
很遗憾,我安装的是非调试版本此功能无法尝试。
跳过前N个条目 -o
mysqlbinlog -d clsn -o 500 mysql-bin.000026 -r clsn6.sql
打开clsn6.sql文件对比之前的完整文件,看到明显少了很多
保存输出到文件 -r
不介绍上面用到很多
从一个特定位置提取后续条目 -j
mysqlbinlog -j 10644 mysql-bin.000026 -r clsn7.sql
提取指定位置之前的条 --stop-position
有stop就有start,这里不举例
mysqlbinlog --stop-position 157 mysql-bin.000026 -r clsn8.sql
在输出中只显示语句 -s
默认情况下,正如在前面的示例输出中看到的一样,除了SQL语句之外,在mysqlbinlog输出中还会有一些附加信息。如果只想查看常规的SQL语句,而不需要其他内容,那么可以使用 -s 选项,如下所示。
[root@129 mysqlbak]# mysqlbinlog -s mysql-bin.000026 -r clsn9.sql
WARNING: --short-form is deprecated and will be removed in a future version
查看特定开始时间的条目 --start-datetime --stop-datetime
mysqlbinlog --start-datetime='2022-04-07 21:27:47' --stop-datetime='2022-04-08 18:17:21' mysql-bin.000026 -r clsn10.sql
从远程服务器获取二进制日志
- -R 选项指示mysqlbinlog命令从远程服务器读取日志文件
- -h 指定远程服务器的ip地址
- -p 将提示输入密码,注意是mysql数据库密码不是linux服务器密码。默认使用“root”作为用户名。也可以使用 -u 选项指定用户名
- -u 指定访问mysql的用户名,注意不是linux服务器的登录名
- -r 输出到文件
mysqlbinlog -R -h 192.168.106.140 -u root -p'123456' mysql-bin.000026 -r bin.sql