MySQL学习之二进制日志

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

进制日志记录了数据库的所有改变,使得任何Slave都可以通过执行Master二进制日志保持数据的一致。

二进制日志仅包含可能改变数据库的语句。那些尚没有但是可能改变数据库的语句也会记录下来,注意那些可能带来变化的语句,如DROP TABLE IFEXISTS CREATE IF NOT EXISTS,以及那些不匹配任何行的语句,select语句一般不会被记录,因为它们不会对数据库做任何改动。

服务器上的事务通常不是一个接一个顺序执行的,而是交错的并行执行,为了防止两个事务之间产生冲突导致不一致的结果,服务器要确保事务的执行是顺序化的。二进制日志按Master上的提交顺序记录事务,虽然事务可能在Master上交错执行,但每个事务在二进制日志中的顺序是不变的,取决于事务的提交(commit)时间。


二进制日志的结构


wKioL1Q-bhvz628zAADCAobzMzM496.jpg

看上图,二进制日志由若干个文件组成,事件存储在一系列binlog文件中,文件名类似于host-bin.000001,还有一个索引文件通常文件名为host-bin.index,索引文件跟踪服务器使用的所以binlog文件,索引文件的每一行都包含了一个binlog文件的完整文件名,使用这些命令,如PURGE BINARY LOGSRESTART MASTER FLUSH LOGS,添加或删除binlog文件,也导致索引文件添加或删除行。


数据安全

    比较常见的敏感信息就是密码,当执行改变数据库中表的语句,并且它包含访问这个表所必须的密码的时候,包含密码的事件就会被写入二进制日志。

例:

       update employee set pass= password(‘123456’) where email = ‘mats@example.com’;

    如果复制是正确的,最好重写这个语句,可以通过以下方法实现:计算和存储哈希密码到用户自定义变量,然后在表达式中使用它:

       set @password =password(‘123456’);

       update employee set pass= @password  where email = ‘mats@example.com’;

    由于set语句没有被复制,密码将不会存储在二进制日志中,而仅在执行该语句的时候存储在服务器内存中。


清除binlog文件

随着时间的推移,服务器会集聚binlog文件,要使服务器自动清理旧的binlog文件,需设置expire-logs-days选项。这个选项可用来作为一个服务器变量,达到你想保留binlog文件的天数,如果希望在重启后仍保持自动清除,必须添加该设置到my.cnf文件。

使用PURGE BINARY LOGS 命令手工清除binlog文件,有如下两种格式:

PURGE BINARYLOGS BEFORE datetime

这个命令格式将清除在给定时间之前的所有binlog文件。如果datetime在一个日志文件的中间,那么datetime所在的那个文件之前的所有文件将被清除。

实战演练:

1、由于是通过日期时间删除,我们先要知道需要删除那个时间之前的二进制日志。

mysqlbinlog  --force-if-open--base64-output=never mysql-bin.000003

wKioL1Q-byHyk5DoAAJv_OFARIo967.jpg

2、假如我们需要删除2014/09/09之前的日志,执行如下命令:

PURGE BINARY LOGS BEFORE 140909

wKiom1Q-b2ahjwdVAAJM8b2znxw457.jpg

PURGE BINARY LOGS TO ‘filename’

这个命令格式将清除在给定文件之前的所有文件。也就是Show master logs 命令输出的所有文件中,在filename之前的文件都将被删除。

实战演练:

PURGE BINARY LOGS TO 'mysql-bin.000002';

wKioL1Q-b96x3XpCAAGBmvM3Ujg201.jpg


mysqlbinlog 工具的使用

mysqlbinlog

       --short-form 只打印被执行的SQL语句信息,忽略关于二进制日志的事件注释信息。

       --force-if-open 如果binlog文件正在被写入,或因为服务器崩溃,mysqlbinlog都将打印一条警告信息说这个binlog文件没有被正确关闭,这个选项忽略打印警告信息。

       --base64-output=never  阻止mysqlbinlog打印base64-encoded事件。

       start-position=bytepos 转储的第一个事件的字节位置。如果几个binlog是提供给mysqlbinlog的,这个位置将被解释为在序列号中第一个文件的位置。

       stop-position=bytepos 最后打印的事件的字节位置,如果给定了多个binlog文件,该位置将是序列中最后一个文件的位置。

       start-datetime=datetime 只打印那些有时间戳或datetime后的事件。

       stop-datetime=datetime 只打印那些有时间戳或datetime前的事件。

读取远程文件实例:

       mysqlbinlog  --read-from-remote-server --host=192.168.18.202 --base64-output=never --user=repl_user --password --start-position=386 --stop-position=643 mysqld-bin.000001


我们接下来使用mysqlbinlog来读取一个二进制日志文件:

mysqlbinlog --force-if-open--base64-output=never /mylogbin/mysql-bin.000001 | cat -n

 

     1    /*!50530 SET@@SESSION.PSEUDO_SLAVE_MODE=1*/;

     2    /*!40019SET @@session.max_insert_delayed_threads=0*/;

     3    /*!50003SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

     4    DELIMITER/*!*/;

     5    #at 4

     6    #141015  9:03:53 server id 1  end_log_pos 245      Start: binlog v 4, server v 5.5.32-MariaDB-log created141015  9:03:53 at startup

     7    ROLLBACK/*!*/;

     8    #at 245

     9    #141015  9:09:21 server id 1  end_log_pos 428      Query     thread_id=1    exec_time=0   error_code=0

    10    use`test`/*!*/;

    11    SETTIMESTAMP=1413335361/*!*/;

    12    SET@@session.pseudo_thread_id=1/*!*/;

    13    SET@@session.foreign_key_checks=1, @@session.sql_auto_is_null=0,@@session.unique_checks=1, @@session.autocommit=1/*!*/;

    14    SET@@session.sql_mode=0/*!*/;

    15    SET@@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;

    16    /*!\Cutf8 *//*!*/;

    17    SET@@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;

    18    SET@@session.lc_time_names=0/*!*/;

    19    SET@@session.collation_database=DEFAULT/*!*/;

    20    createtable employee ( id int auto_increment,name char(64) not null,emailchar(64),password char(64),primary key (id) )

    21    /*!*/;

    22    #at 428

    23    #141015  9:12:27 server id 1  end_log_pos 496      Query     thread_id=1    exec_time=0   error_code=0

    24    SETTIMESTAMP=1413335547/*!*/;

    25    BEGIN

    26    /*!*/;

 

    1~7行相对应的部分,它们修复序言中设置的值,然后回滚所有活动事务。

    每当数据库更改时,第10行的use语句会被打印,当一个use语句出现时,他就是一个新事件的第一行。

    紧接在use语句下面一行是SET TIMESTAMP 这个语句提供自纪元时间开始以秒计算的事件开始执行时的时间戳。

    12~19行包含常规设置,类似于第10行的use,只有第一个事件和当它们的值被改变时,它们才会被打印。

注释详解

# at 245

#141015  9:09:21 server id 1  end_log_pos 428    Query     thread_id=1

       exec_time=0   error_code=0

注释的各部分意义如下:

at 245

事件开始的字节位置,也就是该事件的第一个字节;

141015  9:09:21

事件被写入二进制日志的时间;

Server id 1

产生该事件的服务器的server id

end_log_pos 428

紧接着该事件之后,下一个事件开始的字节位置;

Query

事件类型,例如User_varIntvarXid

thread_id=1

执行该事件的线程ID

exec_time=0

以秒为单位的查询执行时间;

error_code=0

从语句执行结果得到的错误码;


二进制日志配置选项

expire-log-days=days

binlog需要保留的天数。当二进制日志已经轮换或服务器重启时,比指定数值老的文件将从文件系统中删除。这个选项默认是0,意味着binlog文件永远不会被删除。

 

log-bin [ =basename ]

通过在my.cnf中添加log-bin选项来开启二进制日志,这个选项还给出了binlog文件的基本名称,也就是在圆点之前的部分文件名。如果该选项没有指定basename,则基本名默认为host-bin,强烈建议给log-bin选项赋值。否则当hostname改变时,binlog文件将改名(除非pid-file被给定一个确切值)。

 

log-bin-index [ =filename ]

给出索引文件的名称,与log-bin选项情况类似,hostname将被用来组成索引文件名,意味着如果hostname改变,复制将中断,出于这个原因建议给这个选项赋值。

 

binlog-cache-size=bytes

事务缓存,当事务缓存的大小超过该值时,剩余的数据将进入磁盘。这有可能造成性能问题,因此如果你使用许多大型事务,增大该选项可以提高性能。

注意,只分配非常大的缓冲区并不是好主意,因为这意味着服务器的其他部分得到更少的内存,这可能导致性能下降。

 

max-binlog-cache-size=bytes

使用这个选项来限制在二进制日志中的每个事务的大小。由于大型事务有可能阻塞二进制日志很长时间,他们将导致其他线程为二进制日志护航二造成重大性能问题。如果事务的大小超过bytes,该语句将出错而被终止。

 

max-binlog-size=bytes

指定每个binlog文件的大小,如事务或语句超过了max-binlog-size,二进制日志将被轮换,该事务全部内容将被写入新的文件,因为事务永远不会被分割到不同的binlog文件。

 

sync-binlog=period (时段,周期)

指定多长时间通过fdatasync写二进制日志到磁盘一次,如果给定的数值为1,每次事务提交时调用fdatasync,而如果给定值为10,则每10个事务提交将调用一次fdatasync。数值为0表示永远不会调用,而且服务器相信操作系统会写二进制日志到磁盘,作为正常文件处理的一部分。

 

read-only

防止任何客户端进程(除了Slave进程和有SUPER权限的用户)更新服务器上的任何数据。


本篇内容纯手打,是笔者看书学到的知识,从中摘取了一些比较关键的内容和笔者的实验过程记录了下来。



本文转自qw87112 51CTO博客,原文链接:http://blog.51cto.com/tchuairen/1564555


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
1月前
|
Ubuntu 关系型数据库 MySQL
MySQL二进制包安装
本文详细介绍了在多种Linux系统上通过二进制包安装MySQL 8.0和8.4版本的完整过程,涵盖用户创建、glibc版本匹配、程序解压、环境变量配置、初始化数据库及服务启动等步骤,并提供支持多发行版的一键安装脚本,助力高效部署MySQL环境。
193 4
MySQL二进制包安装
|
1月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
278 5
|
2月前
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
101 6
|
2月前
|
关系型数据库 MySQL 数据管理
Mysql基础学习day03-作业
本内容包含数据库建表语句及多表查询示例,涵盖内连接、外连接、子查询及聚合统计,适用于员工与部门数据管理场景。
64 1
|
2月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01
本课程为MySQL基础学习第一天内容,涵盖MySQL概述、安装、SQL简介及其分类(DDL、DML、DQL、DCL)、数据库操作(查询、创建、使用、删除)及表操作(创建、约束、数据类型)。适合初学者入门学习数据库基本概念和操作方法。
165 6
|
2月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02-作业
本教程介绍了数据库表的创建与管理操作,包括创建员工表、插入测试数据、删除记录、更新数据以及多种查询操作,涵盖了SQL语句的基本使用方法,适合初学者学习数据库操作基础。
79 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day03
本课程为MySQL基础学习第三天内容,主要讲解多表关系与多表查询。内容涵盖物理外键与逻辑外键的区别、一对多、一对一及多对多关系的实现方式,以及内连接、外连接、子查询等多表查询方法,并通过具体案例演示SQL语句的编写与应用。
74 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01-作业
本教程包含三个数据库表的创建练习:学生表(student)要求具备主键、自增长、非空、默认值及唯一约束;课程表(course)定义主键、非空唯一字段及数值精度限制;员工表(employee)包含自增主键、非空字段、默认值、唯一电话号及日期时间类型字段。每个表的结构设计均附有详细SQL代码示例。
74 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02
本课程为MySQL基础学习第二天内容,涵盖数据定义语言(DDL)的表查询、修改与删除操作,以及数据操作语言(DML)的增删改查功能。通过具体SQL语句与实例演示,帮助学习者掌握MySQL表结构操作及数据管理技巧。
110 0

热门文章

最新文章

推荐镜像

更多