二进制日志的介绍与配置

1.二进制日志的介绍
二进制日志的作用是记录数据库里的数据被修改的SQL语句,一般为DDL和DML语句,例如含有insert、update、delete、create、drop、alter等关键字的语句。
2.二进制日志的作用
二进制日志最重要的作用有2个,第一个是记录MySQL数据的增量数据,用来做增量数据库恢复,没有二进制日志功能,MySQL的备份将无法完整还原数据。
第二个是实现主从复制功能,具体见MySQL主从复制的相关内容。
3.二进制日志的配置
在/etc/my.cnf
log-bin=/data/mysql/bin/binlog.bin
[root@songls
data]# grep log_bin /etc/my.cnf
log_bin #<==默认情况下记录日志前缀为“主机名-bin”。
mysql>
show variables like ‘log_bin’;

±--------------±------+

|
Variable_name | Value |

±--------------±------+

|
log_bin | ON | #<==记录binlog开关。

±--------------±------+

1 row in
set (0.00 sec)

mysql>
show variables like ‘%log_bin’;

±--------------±------+

|
Variable_name | Value |

±--------------±------+

|
log_bin | ON | #<==记录binlog开关。

|
sql_log_bin | ON | #<==临时不记录binlog开关。

±--------------±------+

2 rows in
set (0.00 sec)

有个参数可以实现在开启binlog功能的前提下,临时不记录binlog,示例如下:

mysql>
set session sql_log_bin = OFF; #<==临时停止记录binlog

Query OK,
0 rows affected (0.00 sec)

mysql>
show variables like ‘%log_bin’;

±--------------±------+

|
Variable_name | Value |

±--------------±------+

|
log_bin | ON |

|
sql_log_bin | OFF | #<==已关闭。

±--------------±------+

2 rows in
set (0.00 sec)

mysql>
create database oldgirl; #<==建库测试。

Query OK,
1 row affected (0.00 sec)

mysql>
show binary logs; #<==查看binlog文件列表及位置点。

±------------------±----------+

|
Log_name | File_size |

±------------------±----------+

|
oldboy-bin.000001 | 143 |

|
oldboy-bin.000002 | 168 |

|
oldboy-bin.000003 | 168 |

|
oldboy-bin.000004 | 9299 |

|
oldboy-bin.000005 | 211 | #<==最新的binlog文件及位置点,也可以通过

                                “show

master status;”来确定。

±------------------±----------+

5 rows in
set (0.00 sec)

mysql>
system mysqlbinlog oldboy-bin.000005|grep “oldgirl”

#<==过滤binlog文件,没有记录binlog。

mysql>
set session sql_log_bin = On; #<==开启开关。

Query OK,
0 rows affected (0.00 sec)

mysql>
drop database oldgirl; #<==删除数据库。

Query OK,
0 rows affected (0.00 sec)

mysql>
system mysqlbinlog oldboy-bin.000005|grep “oldgirl”

#<==继续过滤,发现记录了binlog。

drop
database oldgirl
4.二进制日志文件的刷新条件
1)数据库重启会自动刷新binlog为新文件。
2)执行“mysqldump -F”或“mysqladmin flush-logs”会将binlog刷新为新文件。
3)binlog文件达到1GB左右时,会自动刷新binlog为新文件。
)人为配置切割及调整。
binlog最大值控制参数及默认大小查看方法如下:
mysql>
show variables like ‘max_binlog_size’;

±----------------±-----------+

|
Variable_name | Value |

±----------------±-----------+

| max_binlog_size
| 1073741824 |

±----------------±-----------+

1 row in
set (0.00 sec)

5.二进制日志索引文件
除了很多按序列生成的binlog文件列表之外,还有一个索引文件,例如下文里的oldboy-bin.index:

[root@oldboy
data]# pwd

/application/mysql/data

[root@oldboy
data]# ls -l oldboy-bin.*

-rw-rw----.
1 mysql mysql 143 Mar 3 05:50 oldboy-bin.000001

-rw-rw----.
1 mysql mysql 168 Mar 3 05:57 oldboy-bin.000002

-rw-rw----.
1 mysql mysql 168 Mar 3 05:57 oldboy-bin.000003

-rw-rw----.
1 mysql mysql 9299 Mar 19 19:34 oldboy-bin.000004

-rw-rw----.
1 mysql mysql 211 Mar 19 20:15
oldboy-bin.000005

-rw-rw----.
1 mysql mysql 100 Mar 19 19:34
oldboy-bin.index

索引文件的文件名和binlog文件一样,只是扩展名为index,查看索引文件内容的命令如下:

[root@oldboy
data]# cat oldboy-bin.index

./oldboy-bin.000001

./oldboy-bin.000002

./oldboy-bin.000003

./oldboy-bin.000004

./oldboy-bin.000005

binlog索引文件的控制参数为:

mysql>
show variables like ‘log_bin_index’;

±--------------±------------------------------------------------+

|
Variable_name | Value |

±--------------±------------------------------------------------+

log_bin_index |
/application/mysql-5.6.40/data/oldboy-bin.index |

±--------------±------------------------------------------------+

1 row in
set (0.00 sec)

6.删除二进制日志的方法

binlog日志很重要,不能随意清除,有些读者看到所维护的服务器空间满了,竟然会直接删除binlog物理文件,这样的操作是错误的,应避免。那么如何正确删除binlog文件呢?

首先,要确定什么时候可以删除binlog。

理论上每天的数据库全备时刻以前的binlog都是无用的,但是工作中我们会根据需要保留3~7天的本地binlog文件。

下面来看看具体的删除方式。

(1)设置参数自动删除binlog

设置参数自动删除binlog是每个管理员都应该做的,参数设置示例如下。

假设参数为:

expire_logs_days
= 7 #<==删除7天前的日志

该参数默认是没有配置的,生产中可以同时实现在线更改以及永久更改配置文件:

mysql>
show variables like ‘expire_logs_days’;

±-----------------±------+

|
Variable_name | Value |

±-----------------±------+

| expire_logs_days
| 0 |

±-----------------±------+

1 row in
set (0.00 sec)

mysql>
set global expire_logs_days = 7;

Query OK,
0 rows affected (0.00 sec)

mysql>
show variables like ‘expire_logs_days’;

±-----------------±------+

|
Variable_name | Value |

±-----------------±------+

|
expire_logs_days | 7 |

±-----------------±------+

1 row in
set (0.00 sec)

[root@oldboy
data]# grep expir /etc/my.cnf

expire_logs_days
= 7

(2)从最开始一直删除到指定的文件位置(不含指定文件)

这种方法一般用于处理临时的需求,操作如下:

[root@oldboy
data]# cp oldboy-bin.* /tmp

登录数据库时执行如下命令:

mysql>
show binary logs;

±------------------±----------+

|
Log_name | File_size |

±------------------±----------+

|
oldboy-bin.000001 | 143 |

|
oldboy-bin.000002 | 168 |

|
oldboy-bin.000003 | 168 |

|
oldboy-bin.000004 | 9299 |

|
oldboy-bin.000005 | 211 |

±------------------±----------+

4 rows in
set (0.00 sec)

mysql>
purge binary logs to ‘oldboy-bin.000002’;

Query OK,
0 rows affected (0.00 sec)

mysql>
show binary logs;

±------------------±----------+

|
Log_name | File_size |

±------------------±----------+

|
oldboy-bin.000002 | 168 | #<==序列000002以前的就没了。

|
oldboy-bin.000003 | 168 |

| oldboy-bin.000004
| 9299 |

|
oldboy-bin.000005 | 211 |

±------------------±----------+

4 rows in
set (0.00 sec)

(3)按照时间删除binlog日志

这种方法也是用于处理临时的需求,操作如下:

[root@oldboy
data]# ls -l --time-style=long-iso oldboy-bin*

-rw-rw----.
1 mysql mysql 168 2018-03-03 05:57
oldboy-bin.000002

-rw-rw----.
1 mysql mysql 168 2018-03-03 05:57
oldboy-bin.000003

-rw-rw----.
1 mysql mysql 9299 2018-03-19 19:34 oldboy-bin.000004

-----------------------±---------------------+

2 rows in
set (0.00 sec)

(2)max_binlog_size

该参数用于设置binlog日志的最大大小,默认为1GB,但是该值并不能严格控制binlog的大小。若binlog大小接近1GB,而此时又在执行一个较大的事务,那么为了保证事务的完整性,数据库不会做日志刷新动作,而是直到该事务的日志全部记录进入当前binlog日志后才会进行刷新。该参数的默认值查询结果为:

mysql>
show variables like ‘%max_binlog_size%’;

±----------------±-----------+

|
Variable_name | Value |

±----------------±-----------+

|
max_binlog_size | 1073741824 |

±----------------±-----------+

1 row in
set (0.00 sec)

(3)sync_binlog

这个参数的作用是控制binlog什么时候同步到磁盘。对数据库来说,这是很重要的参数,它不仅会影响数据库的性能,还会影响数据库数据的完整性。

对于“sync_binlog”参数的说明具体如下。

·“sync_binlog=0”表示在事务提交之后,数据库不会将binlog_cache中的数据刷新到磁盘,而是让文件系统自行决定什么时候来做刷新或者在缓存满了之后才刷新到磁盘。

·“sync_binlog=n”表示每进行n次事务提交之后,数据库都会进行一次将缓存数据强制刷新到磁盘的操作。

该参数默认的设置是0,示例如下:

mysql>
show variables like ‘%sync_binlog%’;

±--------------±------+

|
Variable_name | Value |

±--------------±------+

|
sync_binlog | 0 |

±--------------±------+

1 row in
set (0.00 sec)

设置为0时数据库的性能是最好的,但数据风险也是最大的,对于数据安全性要求较高的数据库,应该调整该参数将其改为1,值得注意的是,即使参数设置为1,仍然有binlog记录的内容与数据库的实际内容不一致的风险。
7.记录二进制日志的三种模式
MySQL使用不同的模式记录二进制日志信息,常见的有三种模式。
(1)语句模式
语句(statement-based)模式是MySQL5.6版本默认的模式,简单地说,就是每一条被修改的数据的SQL语句都会记录到master的binlog中。在复制slave库的时候,SQL进程会解析成与原来master端执行过的相同的SQL来再次执行。
该模式的优点是不需要记录细到每一行数据的更改变化,因此,可减少binlog日志量,实际上是减少了很多,节约了磁盘I/O,提高了系统性能。
但该模式同样有一些缺点,由于语句模式记录的是执行的SQL语句,所以,对于某些具有特殊功能的SQL语句来说,就可能会导致无法在从库上正确执行,从而导致主从库数据不一致的问题。
例如,当特殊的函数被执行时,当触发器、存储过程等特殊功能被执行时,而row level模式是基于每一行来记录变化的,所以不会出现类似的问题(更多详情请参考混合模式)。
(2)行级模式
简单地说,行级(row-based)模式就是将数据被修改的每一行的情况记录为一条语句。
优点:在行级模式下,binlog中可以不记录执行的SQL语句的上下文相关信息,仅仅记录哪一条记录被修改了,修改成什么样了即可,所以row level的日志内容会非常清楚地记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程或function以及trigger的调用和触发无法被正确复制的问题。
缺点:行级模式下,所有的执行语句都将根据修改的行来记录,而这就可能会产生大量的日志内容,例如一条语句修改了100万行,语句模式就用一条语句即可搞定,而行级模式执行之后,日志中记录的就是100万行的修改记录,binlog日志的量可能会大得惊人。
(3)混合模式
混合(mixed-based)模式默认采用语句模式记录日志,在一些特定的情况下会将记录模式切换为行级模式记录,这些特殊情况包含但不限于以下情况。
·当函数中包含UUID()时。
·当表中有自增列(AUTO_INCREMENT)被更新时。
·当执行触发器(trigger)或者存储过程(stored function)等特殊功能时。
·当FOUND_ROWS()、ROW_COUNT()、USER()、CURRENT_USER()、CURRENT_USER等执行时。
8.企业中如何选择二进制日志模式
在互联网公司中,使用MySQL的特殊功能比较少(存储过程、触发器、函数),此时可以选择默认的语句模式。
如果公司较多用到MySQL的特殊功能,如存储过程、触发器、函数等,并且需要做主从复制请首选行级模式,次选mixed模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值