mysql数据库管理-binlong介绍与管理

  

目录

检查工作:

1,查看是否开启binlog

2 查看binlog日志信息

3 查看binary log的event信息

4 使用如下命令切换日志

5 清理binary log 二进制日志

6 使用binlong恢复mysql数据库

7 mysql复制主要有三种方式:

8 binlog复制配置

9 binlog_format 参数设置


MySQL的binlog 日志对于生产环境非常有用,任何时间对数据库的修改都会记录在binglog中;当数据发生增删改,创建数据库对象都会记录到binlog中,数据库的复制也是基于binlog进行同步数据; 和SQL SERVER 数据库开启完整模式的原理一样,每一次的数据的变动都会记录在案;(对数据库的select,show这些操作不会记录在binlog)

1. On each slave server, use SHOW SLAVE STATUS to check which log file it is reading.
2. Obtain a listing of the binary log files on the master server with SHOW BINARY LOGS.
3. Determine the earliest log file among all the slaves. This is the target file. If all the slaves are up to
date, this is the last log file on the list.
4. Make a backup of all the log files you are about to delete. (This step is optional, but always
advisable.)
5. Purge all log files up to but not including the target file.
Syntax:
PURGE { BINARY | MASTER } LOGS
{ TO 'log_name' | BEFORE datetime_expr }

下面介绍mysqlbinlog工具查看 二进制日志内容;

检查工作:

1,查看是否开启binlog

 mysql> show variables like 'log_bin';

2 查看binlog日志信息

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set, 1 warning (0.01 sec)

mysql> show binary logs;
+------------+-----------+-----------+
| Log_name   | File_size | Encrypted |
+------------+-----------+-----------+
| log.000001 |       179 | No        |
| log.000002 |      6037 |No        |
| log.000003 |       156 | No        |
| log.000004 |       197 | No        |
| log.000005 |       316 | No        |
+------------+-----------+-----------+
5 rows in set (0.00 sec)

3 查看binary log的event信息

mysql> show binlog events in 'log.000005';
+------------+-----+----------------+-----------+-------------+--------------------------------------+

| Log_name   | Pos | Event_type     | Server_id | End_log_pos | Info                                 |

+------------+-----+----------------+-----------+-------------+--------------------------------------+

| log.000005 |   4 | Format_desc    |         1 |         125 | Server ver: 8.0.24, Binlog ver: 4    |

| log.000005 | 125 | Previous_gtids |         1 |         156 |                                      |

| log.000005 | 156 | Anonymous_Gtid |         1 |         233 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |

| log.000005 | 233 | Query          |         1 |         316 | use `mysql`; FLUSH TABLES            |

+------------+-----+----------------+-----------+-------------+--------------------------------------+

4 rows in set (0.00 sec)

mysql> show binlog events in 'log.000005' from 125;
+------------+-----+----------------+-----------+-------------+--------------------------------------+

| Log_name   | Pos | Event_type     | Server_id | End_log_pos | Info                                 |

+------------+-----+----------------+-----------+-------------+--------------------------------------+

| log.000005 | 125 | Previous_gtids |     1 |    156 |                                      |

| log.000005 | 156 | Anonymous_Gtid |   1 |  233 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |

| log.000005 | 233 | Query          |         1 |         316 | use `mysql`; FLUSH TABLES            |

+------------+-----+----------------+-----------+-------------+--------------------------------------+

3 rows in set (0.00 sec)

C:\Users\Administrator>mysqlbinlog --no-defaults d:\mysql-8.0.24-winx64\log.000005

C:\Users\Administrator>mysqlbinlog --no-defaults --start-datetime "2021-06-23 11:20:00"   d:\mysql-8.0.24-winx64\log.000005 >123.log

C:\Users\Administrator>mysqlbinlog --no-defaults --start-position 125 --stop-position 316 d:\mysql-8.0.24-winx64\log.000005

4 使用如下命令切换日志

mysql> flush logs;

5 清理binary log 二进制日志

使用purge清除binary log

mysql> show binary logs;
+------------+-----------+-----------+
| Log_name   | File_size | Encrypted |
+------------+-----------+-----------+
| log.000001 |       179 | No        |
| log.000002 |      6037 | No        |
| log.000003 |       156 | No        |
| log.000004 |       197 | No        |
| log.000005 |       551 | No        |
| log.000006 |       197 | No        |
| log.000007 |       197 | No        |
| log.000008 |       156 | No        |
+------------+-----------+-----------+
8 rows in set (0.00 sec)

mysql> purge binary logs to 'log.000005
Query OK, 0 rows affected (0.03 sec)

mysql> show binary logs;
+------------+-----------+-----------+
| Log_name   | File_size | Encrypted |
+------------+-----------+-----------+
| log.000005 |       551 | No        |
| log.000006 |       197 | No        |
| log.000007 |       197 | No        |
| log.000008 |       156 | No        |
+------------+-----------+-----------+
4 rows in set (0.00 sec)

mysql>purge binary logs before '2021-06-23 14:37:00:00';

使用reset master命令删除所有二进制文件

使用参数 

mysql> show variables like '%expire%';
+--------------------------------+---------+
| Variable_name                  | Value   |
+--------------------------------+---------+
| binlog_expire_logs_seconds     | 2592000 |
| disconnect_on_expired_password | ON      |
| expire_logs_days               | 0       |
+--------------------------------+---------+
3 rows in set, 1 warning (0.01 sec)

mysql> set global  expire_logs_days=2;
ERROR 3683 (HY000): The option expire_logs_days and binlog_expire_logs_seconds cannot be used together
. Please use binlog_expire_logs_seconds to set the expire time (expire_logs_days is deprecated)
mysql> set global  expire_logs_days=7;
ERROR 3683 (HY000): The option expire_logs_days and binlog_expire_logs_seconds cannot be used together
. Please use binlog_expire_logs_seconds to set the expire time (expire_logs_days is deprecated)
mysql>

6 使用binlong恢复mysql数据库

C:\Users\Administrator>mysqlbinlog --no-defaults --start-datetime "2021-06-23 11:20:00"   d:\mysql-8.0.24-winx64\log.000005|mysql -uroot -p

C:\Users\Administrator>mysqlbinlog --no-defaults --start-position 125 --stop-position 316 d:\mysql-8.0.24-winx64\log.000005|mysql -uroot -p

C:\Users\Administrator>mysql -uroot -p 〈d:\mysql-8.0.24-winx64\log.000005

(2)参数配置详细如下

server-id = 1003306
服务器id,如果启用binlog,则必须设置该值。

log-bin = /data/mysql/mysql3306/logs/my3306_binlog

log-bin = mysql-bin 

#启用binlog,在参数“datadir”的路径下,以mysql-bin.000001开始,并生成mysql-bin.index日志索引文件

表示启用binlog功能,并指定路径名称
•sync_binlog = 1
sync_binlog选项控制mysql怎么刷新二进制日志到磁盘,在MySQL5.7.7后,
默认为1:表示采用同步写磁盘的方式来写二进制日志。
为0时:表示禁用MySQL服务器将日志同步写磁盘,相反,而是依赖于操作系统不时地将二进制日志刷新到磁盘。
为N时:除了0与1之外的值,表示在提交N个事务后,binlog日志将同步到磁盘。

inlog_cache_size = 4M
使用事务表存储引擎(如innodb存储引擎)时,所有未提交的binlog日志会被记录到一个缓存中去,
等事务提交时再将缓存中的binlog写入到binlog文件中。缓存的大小由binlog_cache_size决定,默认大小为32K。
max_binlog_cache_size = 2G
表示的是binlog 能够使用的最大cache 内存大小

当我们执行多语句事务的时候 所有session的使用的内存超过max_binlog_cache_size的值时
就会报错:“Multi-statement transaction required more than 'max_binlog_cache_size' bytes ofstorage”
max_binlog_size = 1G
指定单个binlog文件最大值。默认值为1g,最大值1g,如果超过该值,则产生新的binlog文件,后缀名+1,并记录到.index文件。
binlog_rows_query_log_events = 1
默认为不启用,启用binlog_rows_query_log_events时,会在binlog日志中记录原始SQL语句。
binlog_format = row
记录binlog的格式。[statement,row,mixed],在MySQL5.7.7之后,默认为row。
binlog_checksum = 1
表示启用,该参数目的就是写入binlog进行校验,有两个值[crc32|none],默认为crc32
expire_logs_days = 7
表示binlog文件自动删除N天前的文件。默认值为0,表示不自动删除,最大值99。

max_binlog_size = 256M

#指定binlog文件的大小,指定为256M,如果遇到大事务,则可能超过该大小。

#个人认为该文件不宜过大,256合适。

[root@postgresql ~]# vi /etc/my.cnf

[mysqld]
server-id = 1003306
skip-grant-tables
secure_file_priv="/mysql5.17"
port = 3306
skip-ssl
basedir = /mysql5.17
datadir = /mysql5.17/data
socket=/tmp/mysql.sock
pid-file=/mysql5.17/data/mysql.pid
character_set_server=utf8
user=mysql
max_connections=1500
symbolic-links=0
!includedir /etc/my.cnf.d
log-bin=/mysql5.17/log/my3306_binlog
[mysql]
prompt="\U [\d] \R:\m:\s>"
~
~
~
~
Entering Ex mode.  Type "visual" to go to Normal mode.
:wq!
"/etc/my.cnf" 18L, 376C written
[root@postgresql ~]# /etc/init.d/mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 


[root@postgresql ~]# su - mysql
Last login: Wed Dec  4 02:10:48 PST 2019 on pts/0
-bash-4.2$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.27-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql@ [(none)] 02:15: >show variables like '%log_bin%';
+---------------------------------+------------------------------------+
| Variable_name                   | Value                              |
+---------------------------------+------------------------------------+
| log_bin                         | ON                                 |
| log_bin_basename      | /mysql5.17/log/my3306_binlog       |
| log_bin_index               | /mysql5.17/log/my3306_binlog.index |
| log_bin_trust_function_creators | OFF                                |
| log_bin_use_v1_row_events       | OFF                                |
| sql_log_bin                     | ON                                 |
+---------------------------------+------------------------------------+
6 rows in set (0.05 sec)

7 mysql复制主要有三种方式:

基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED。

① STATEMENT模式(SBR)

每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)

② ROW模式(RBR)

不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。

③ MIXED模式(MBR)

以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
 

8 binlog复制配置

在mysql的配置文件my.cnf中,可以通过一下选项配置binglog相关

 代码如下复制代码

binlog_format           = MIXED                         //binlog日志格式,mysql默认采用statement,建议使用mixed
log-bin                 = /data/mysql/mysql-bin.log    //binlog日志文件
expire_logs_days        = 7                           //binlog过期清理时间
max_binlog_size         = 100m                       //binlog每个日志文件大小
binlog_cache_size       = 4m                        //binlog缓存大小
max_binlog_cache_size   = 512m                     //最大binlog缓存大小

三 MIXED说明

对于执行的SQL语句中包含now()这样的时间函数,会在日志中产生对应的unix_timestamp()*1000的时间字符串,slave在完成同步时,取用的是sqlEvent发生的时间来保证数据的准确性。另外对于一些功能性函数slave能完成相应的数据同步,而对于上面指定的一些类似于UDF函数,导致Slave无法知晓的情况,则会采用ROW格式存储这些Binlog,以保证产生的Binlog可以供Slave完成数据同步。

现在来比较以下 SBR 和 RBR 2中模式各自的优缺点:

SBR 的优点:

历史悠久,技术成熟
binlog文件较小
binlog中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
binlog可以用于实时的还原,而不仅仅用于复制
主从版本可以不一样,从服务器版本可以比主服务器版本高


SBR 的缺点:

不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候。
调用具有不确定因素的 UDF 时复制也可能出问题
使用以下函数的语句也无法被复制:
* LOAD_FILE()
* UUID()
* USER()
* FOUND_ROWS()
* SYSDATE() (除非启动时启用了 --sysdate-is-now 选项)
INSERT ... SELECT 会产生比 RBR 更多的行级锁
复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁
对于有 AUTO_INCREMENT 字段的 InnoDB表而言,INSERT 语句会阻塞其他 INSERT 语句
对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记录产生影响
存储函数(不是存储过程)在被调用的同时也会执行一次 NOW() 函数,这个可以说是坏事也可能是好事
确定了的 UDF 也需要在从服务器上执行
数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
执行复杂语句如果出错的话,会消耗更多资源

RBR 的优点:

任何情况都可以被复制,这对复制来说是最安全可靠的
和其他大多数数据库系统的复制技术一样
多数情况下,从服务器上的表如果有主键的话,复制就会快了很多
复制以下几种语句时的行锁更少:
* INSERT ... SELECT
* 包含 AUTO_INCREMENT 字段的 INSERT
* 没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句
执行 INSERT,UPDATE,DELETE 语句时锁更少
从服务器上采用多线程来执行复制成为可能

RBR 的缺点:

binlog 大了很多
复杂的回滚时 binlog 中会包含大量的数据
主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写问题
UDF 产生的大 BLOB 值会导致复制变慢
无法从 binlog 中看到都复制了写什么语句
当在非事务表上执行一段堆积的SQL语句时,最好采用 SBR 模式,否则很容易导致主从服务器的数据不一致情况发生


另外,针对系统库 mysql 里面的表发生变化时的处理规则如下:
如果是采用 INSERT,UPDATE,DELETE 直接操作表的情况,则日志格式根据 binlog_format 的设定而记录
如果是采用 GRANT,REVOKE,SET PASSWORD 等管理语句来做的话,那么无论如何都采用 SBR 模式记录
注:采用 RBR 模式后,能解决很多原先出现的主键重复问题。

9 binlog_format 参数设置

  1. mysql> SET SESSION binlog_format = 'STATEMENT';

  2. mysql> SET SESSION binlog_format = 'ROW';

  3. mysql> SET SESSION binlog_format = 'MIXED';

  4. mysql> SET GLOBAL binlog_format = 'STATEMENT';

  5. mysql> SET GLOBAL binlog_format = 'ROW';

  6. mysql> SET GLOBAL binlog_format = 'MIXED';

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值