mysql二进制日志
二进制日志
- 记录导致数据改变或潜在导致数据改变的SQL语句
- 记录已提交的日志
- 不依赖于存储引擎类型
事务日志和二进制日志区别
- 事务日志在线,二进制离线
- 事务日志记录事务执行的过程,包括提交和未提交,二进制日志记录只记提交的过程
- 事务日志只支持innodb,二进制都支持MyiSAM和innoDB
功能:通过"重放"日志文件中的事件来生成数据副本
注意:建议二进制日志和数据文件分开存放
每次重启服务就会生成新的文件
相关变量
sql_log_bin=ON|OFF:#是否记录二进制日志,默认ON,支持动态修改,系统变量,而非服务器选项 --> 变量,备份前后关闭开启
log_bin=/PATH/BIN_LOG_FILE:#指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可以 -->选项,只能配置生效
binlog_format=STATEMENT|ROW|MIXED:#二进制日志记录的格式,mariadb5.5默认STATEMENT
max_binlog_size=1073741824:#单个二进制日志文件的最大体积,到达最大值会自动滚动,默认为1G
#说明:文件达到上限时的大小未必为指定的精确值
binlog_cache_size=4m #此变量确定在每次事务中保存二进制日志更改记录的缓存的大小(每次连接)
max_binlog_cache_size=512m #限制用于缓存多事务查询的字节大小。
sync_binlog=1|0:#设定是否启动二进制日志即时同步磁盘功能,默认0,由操作系统负责同步日志到磁盘
expire_logs_days=N:#二进制日志可以自动删除的天数。 默认为0,即不自动删除
二进制日志记录三种格式
- 基于"语句"记录:statement,记录语句,默认模式( MariaDB 10.2.3 版本以下 ),日志量较少
- 只记录当前时间now()执行语句,不能作为恢复依据
- 基于"行"记录:row,记录数据,日志量较大,更加安全,建议使用的格式,MySQL8.0默认格式
- 记录具体时间执行语句后原始数据,可以作为数据恢复依据
- 混合模式:mixed, 让系统自行判定该基于哪种方式进行,默认模式( MariaDB 10.2.4及版本以上)
#默认
mysql> select @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| ROW |
+-----------------+
1 row in set (0.00 sec)
服务开启和路径设置
[root@rocky8 ~]#cat /etc/my.cnf
[mysqld]
server-id=8
log-bin --> 选项开启
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
default_authentication_plugin=mysql_native_password
#default_authentication_plugin=caching_sha2_password
log_bin=/data/mysql-binarylog/mysql-binlog --> 变量设置,生成路径和名称
#开启设置
mysql> select @@log_bin;
+-----------+
| @@log_bin |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
#开启后
mysql> show master logs;
+---------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+---------------------+-----------+-----------+
| mysql-binlog.000001 | 157 | No |
+---------------------+-----------+-----------+
1 row in set (0.00 sec)
[root@rocky8 ~]#ll /data/mysql-binarylog/
total 8
-rw-r----- 1 mysql mysql 157 Nov 13 13:55 mysql-binlog.000001 --> 日志文件,文件名后缀,二进制格式
-rw-r----- 1 mysql mysql 42 Nov 13 13:55 mysql-binlog.index --> 索引文件,文本格式,记录当前已有的日志文件列表
[root@rocky8 ~]#file /data/mysql-binarylog/*
/data/mysql-binarylog/mysql-binlog.000001: MySQL replication log, server id 8 MySQL V5+, server version 8.0.31
/data/mysql-binarylog/mysql-binlog.index: ASCII text
[root@rocky8 ~]#cat /data/mysql-binarylog/mysql-binlog.index
/data/mysql-binarylog/mysql-binlog.000001
查看日志
#在线查看 --不详细--binlog events
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
例:show binlog events in 'mysql-bin.000001' from 6516 limit 2,3
#范例:
mysql> show master logs;
+---------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+---------------------+-----------+-----------+
| mysql-binlog.000001 | 30489742 | No |
+---------------------+-----------+-----------+
1 row in set (0.00 sec)
mysql> insert teachers(name,age) values('cc','28');
Query OK, 1 row affected (0.00 sec)
mysql> show master logs;
+---------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+---------------------+-----------+-----------+
| mysql-binlog.000001 | 30490040 | No | --> 更改记录后文件大小改变
+---------------------+-----------+-----------+
1 row in set (0.00 sec)
mysql> show binlog events in 'mysql-bin.000001'; --> 显示全部,并不详细
...
*************************** 500011. row ***************************
Log_name: mysql-binlog.000001
Pos: 30490009 --> 操作位置,可以利用mysqlbinlog 获取节点的操作进行还原x
Event_type: Xid
Server_id: 8
End_log_pos: 30490040
Info: COMMIT /* xid=300059 */
500011 rows in set (0.47 sec)
#离线查看详细信息-要借助mysql自带工具--mysqlbinlog
[root@rocky8 ~]#mysqlbinlog --help
mysqlbinlog Ver 8.0.31 for Linux on x86_64 (MySQL Community Server - GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Dumps a MySQL binary log in a format usable for viewing or for piping to
the mysql command line client.
Usage: mysqlbinlog [options] log-files
-?, --help Display this help and exit.
#范例
mysqlbinlog --start-position=678 --stop-position=752 /var/lib/mysql/mariadbbin.
000003 -v
mysqlbinlog --start-datetime="2018-01-30 20:30:10" --stop-datetime="2018-01-
30 20:35:22" mariadb-bin.000003 -vvvx
#还原范例
mysql> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| testlog |
| toc |
+-------------------+
8 rows in set (0.00 sec)
mysql> drop table testlog; --> 删除
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| toc |
+-------------------+
7 rows in set (0.00 sec)
#binlog备份还原
[root@rocky8 ~]#mysqlbinlog /data/mysql-binarylog/mysql-binlog.000001 --stop-position=30490117 > 30490117.log
[root@rocky8 ~]#ll
total 731412
-rw-r--r-- 1 root root 144081926 Nov 13 15:03 30490117.log
-rw-------. 1 root root 1093 Aug 16 08:58 anaconda-ks.cfg
-rw-r--r-- 1 root root 7786 Aug 22 2020 hellodb_innodb.sql
-rw-r--r-- 1 root root 4177 Nov 4 14:43 install_mysql5.7or8.0.sh
-rw-r--r-- 1 root root 604856088 Nov 12 20:22 mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
-rw-r--r-- 1 root root 352 Feb 4 2021 testlog.sql
[root@rocky8 ~]#mysql -uroot -p123456 < /root/30490117.log
mysql: [Warning] Using a password on the command line interface can be insecure.
#查看还原结果
mysql> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| testlog | --> 还原成功
| toc |
+-------------------+
8 rows in set (0.01 sec)
mysql> select count(*) from testlog;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
1 row in set (0.01 sec)
同步远程主机的二进制文件
mysql> show master logs;
+---------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+---------------------+-----------+-----------+
| mysql-binlog.000001 | 776 | No |
| mysql-binlog.000002 | 180 | No |
| mysql-binlog.000003 | 180 | No |
| mysql-binlog.000004 | 696 | No |
+---------------------+-----------+-----------+
4 rows in set (0.00 sec)
#主机创建授权账号
mysql> create user bkbinlog@'10.0.0.%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to bkbinlog@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| bkbinlog | 10.0.0.% |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
#授权账号备份二进制文件 --备份02以后的文件到从服务器 stop-never 主服务的二进制文件有变化会实时同步到从服务器
[root@10.0.0.7 ~]#mysqlbinlog -R --host=10.0.0.8 --user=bkbinlog --password=123 --raw --stop-never mysql-binlog.000002
mysqlbinlog: [Warning] Using a password on the command line interface can be insecure.
#会备份文件到当前目录
[root@10.0.0.7 ~]#ll
total 590704
-rw-r----- 1 root root 180 Nov 13 16:11 mysql-binlog.000002
-rw-r----- 1 root root 180 Nov 13 16:11 mysql-binlog.000003
-rw-r----- 1 root root 696 Nov 13 16:11 mysql-binlog.000004
注意:主服务器重启mysql服务时从服务器的自动备份命令会停止,需要手动再执行一次
手动清理
#格式 二进制日志index文件会自动更新
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
#范例
PURGE BINARY LOGS TO 'mariadb-bin.000003'; #删除mariadb-bin.000003之前的日志
PURGE BINARY LOGS BEFORE '2017-01-23';
PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';