mysql日志文件General_log和Binlog开启及详解
作者:寒色的猫丶 发布时间:2024-01-17 08:20:44
背景:
周末归纳下mysql的日志文件,其中general_log在mysql入侵中已经用到过,binlog即将会用到。注:mysql版本为5.7.20
General_log 详解
1.介绍
开启 general log 将所有到达MySQL Server的SQL语句记录下来。
一般不会开启开功能,因为log的量会非常庞大。但个别情况下可能会临时的开一会儿general log以供排障使用。
相关参数一共有3:general_log、log_output、general_log_file
show variables like 'general_log'; -- 查看日志是否开启
set global general_log=on; -- 开启日志功能
show variables like 'general_log_file'; -- 看看日志文件保存位置
set global general_log_file='tmp/general.lg'; -- 设置日志文件保存位置
show variables like 'log_output'; -- 看看日志输出类型 table或file
set global log_output='table'; -- 设置输出类型为 table
set global log_output='file'; -- 设置输出类型为file
log_output='FILE’ 表示将日志存入文件,默认值是FILE
***log_output=‘TABLE’***表示将日志存入数据库,这样日志信息就会被写入到***mysql.slow_log***表中.
mysql数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=‘FILE,TABLE‘.日志记录到系统专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查日志,又需要比够获得更高的系统性能,那么建议优先记录到文件.
2.开启数据库general_log步骤
先执行sql指令:show variables like ‘%log%’;
可以看到默认general_log是OFF的,我们直接开启:***set global general_log = ON;***(永久修改需要在my.cnf的【mysqld】中添加:general_log = 1)
OK,现在mysql就会在***general_log_file***显示的路径文件里记录general日志了!(从现在开始记录)我默认的路径是 /usr/local/mysql/data/VM_0_17_redhat.log
Binlog 详解
1.介绍
MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句(记录mysql内部增删改等对mysql数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被binlog日志记录),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
一般来说开启二进制日志大概会有1%的性能损耗。
两个最重要的使用场景:
其一:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。
二进制日志包括两类文件:
二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件;
二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
2.开启binlog日志
查看binlog开启状态:
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.01 sec)
vim编辑打开mysql配置文件my.cnf:
vim /etc/my.cnf
在【mysqld】中添加:
log-bin=/home/data/mysql-log/mysql-bin
server-id=12345
网上很多教程都只是添加log-bin一行就行了,此处我们为什么要加 server-id?
因为我们用的是5.7及以上版本的话,不加server-id重启mysql服务会报错,5.7以下版本就不用加了。
所以必须添加server-id这个参数!随机指定一个不能和其他集群中机器重名的字符串,如果只有一台机器,那就可以随便指定了。
注意!修改配置文件后重启报错最好定位到mysql的errlog,查看具体错误,我出现过一个错误就是***用root自定义创建bin-log所在的目录,没给mysql用户权限***。
还有一种配置方式(指定三个参数):
log_bin=ON
log_bin_basename=/var/lib/mysql/mysql-bin
log_bin_index=/var/lib/mysql/mysql-bin.index
第一个参数是打开binlog日志
第二个参数是binlog日志的基本文件名,后面会追加标识来表示每一个文件
第三个参数指定的是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录
重启后查看:
3.常用binlog日志操作命令
1.查看所有binlog日志列表
mysql> show master logs;
2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
mysql> show master status;
3.刷新log日志,自此刻开始产生一个新编号的binlog日志文件
mysql> flush logs;
注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
4.重置(清空)所有binlog日志
mysql> reset master;
5.查看binlog日志内容(以表格形式)
mysql> show binlog events in 'mysql-bin.000002';
4.mysqlbinlog命令使用
mysqlbinlog功能是将mysql的binlog日志转换成Mysql语句,默认情况下binlog日志是二进制文件,无法直接查看。我们直接在mysql目录的bin目录下启动该命令。(在MySQL5.5以下版本使用mysqlbinlog命令时如果报错,就加上 “–no-defaults”选项)
mysqlbinlog命令部分参数:
-d//指定库的binlog
-r//相当于重定向到指定文件
--start-position--stop-position//按照指定位置精确解析binlog日志(精确),如不接--stop-positiion则一直到binlog日志结尾
--start-datetime--stop-datetime//按照指定时间解析binlog日志(模糊,不准确),如不接--stop-datetime则一直到binlog日志结尾
备注:myslqlbinlog分库导出binlog,如使用-d参数,更新数据时必须使用use database。
例:解析yj-test数据库的binlog日志并写入my.sql文件
./mysqlbinlog -d yj-test /home/data/mysql-log/mysql-bin.000003 -r my.sql
//使用位置精确解析binlog日志
./mysqlbinlog mysql-bin.000003 --start-position=100 --stop-position=200 -r my.sql
可以直接查看所有binlog信息:
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 177 |
| mysql-bin.000002 | 154 |
+------------------+-----------+
2 rows in set (0.00 sec)
注意:
查看binlog内容可能存在两个问题:
一是报错,比如不支持’default-character-set=utf8’,这种是binlog工具和mysql配置出现冲突,可以在binlog命令后添加--no--defaults
解决;
二是解析出来的binlog内容中sql语句出现乱码,如:
BINLOG '
Q738XBMBAAAAOwAAAFATAAAAAFsAAAAAAAEABHRlc3QAAnQxAAQPDw8KBigAKAAoAA8CA/z/AACU
U3Q=
Q738XB4BAAAALgAAAH4TAAAAAFsAAAAAAAEAAgAE/wABMgIxMQFSycYPZKuVcw==
'
这种可以添加 --base64-output=DECODE-ROWS -v
参数解决!
5.binlog的三种工作模式
查看binlog日志格式:
show variables like "binlog_format";
注:我的默认为 ROW 模式,和网上说的默认不一样(Statement)
(1)Row level
ROW是基于行级别的,他会记录每一行记录的变化,就是将每一行的修改都记录到binlog里面,记录的非常详细,但sql语句并没有在binlog里。
日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改。在replication里面也不会因为存储过程触发器等造成Master-Slave数据不一致的问题,但是有个致命的缺点日志量比较大.由于要记录每一行的数据变化,当执行update语句后面不加where条件的时候或alter table的时候,产生的日志量是相当的大。
(2)Statement level(默认)
每一条被修改数据的sql都会记录到master的bin-log中,slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql再次执行
优点:解决了 Row level下的缺点,不需要记录每一行的数据变化,减少bin-log日志量,节约磁盘IO,提高新能
缺点:statement level下对一些特殊功能的复制效果不是很好,比如:函数、存储过程的复制。由于row level是基于每一行的变化来记录的,所以不会出现类似问题
(3)Mixed(混合模式)
结合了Row level和Statement level的优点。
在默认情况下是statement,但是在某些情况下会切换到row状态,如当一个DML更新一个ndb引擎表,或者是与时间用户相关的函数等。在主从的情况下,在主机上如果是STATEMENT模式,那么binlog就是直接写now(),然而如果这样的话,那么从机进行操作的时间,也执行now(),但明显这两个时间不会是一样的,所以对于这种情况就必须把STATEMENT模式更改为ROW模式,因为ROW模式会直接写值而不是写语句(该案例是错误的,即使是STATEMENT模式也可以使用now()函数,具体原因以后再分析)。同样ROW模式还可以减少从机的相关计算,如在主机中存在统计写入等操作时,从机就可以免掉该计算把值直接写入从机。
一般企业binlog模式的选择:
互联网公司使用MySQL的功能较少(不用存储过程、触发器、函数),选择默认的Statement level;
用到MySQL的特殊功能(存储过程、触发器、函数)则选择Mixed模式;
用到MySQL的特殊功能(存储过程、触发器、函数),又希望数据最大化一直则选择Row模式;
先记录这么多吧,后面使用时再进一步记录。
来源:https://blog.csdn.net/Abysscarry/article/details/79949480


猜你喜欢
- form 表单中的button按钮<button>提交</button> :放在form表单中,会有一个提交事件,会
- 安装anaconda登录anaconda的官网下载,anaconda是一个集成的工具软件不需要我们再次下载。anaconda官网点击下载跳转
- 前言第一次尝试用Pyinstaller打包Pytorch,碰见了很多问题,耗费了许多时间!想把这个过程中碰到的问题与解决方法记录一下,方便后
- 说明本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,
- 本文实例讲述了Python根据区号生成手机号码的方法。分享给大家供大家参考。具体实现方法如下:# _*_ coding:utf-8 _*_#
- 遇到的问题网上找了一些代码,都是只能建立一次socket传输一张图片,然后断开重新连重新传。而建立一次socket代价不小,反复建立会非常消
- 在爬虫的获取数据上,一直在讲一些爬取的方法,想必小伙伴们也学习了不少。在学习的过程中遇到了问题,大家也会一起交流解决,找出不懂和出错的地方。
- 1 引子 Java,C#等各种高级语句的开发工具琳琅满目,争放异彩。但作为AJAX的主角的JavaScri
- FBVFBV,即 func base views,函数视图,在视图里使用函数处理请求。以用户注册代码为例,使用两个函数完成注册初级注册代码d
- 熟悉 C 语言的小伙伴一定对 goto 语句不陌生,它可以在代码之间随意的跳来跳去,但是好多老鸟都告诫大家,不要使用 goto,因为 got
- Python四种逐行读取文件内容的方法下面四种Python逐行读取文件内容的方法, 分析了各种方法的优缺点及应用场景,以下代码在python
- 除了C/C++以外,我也接触过不少流行的语言,PHP、java、javascript、python,其中python可以说是操作起来最方便,
- Dreamweaver快捷键大全,记住一些常用的快捷键会大大提高你的网页设计效率,如果你都使用快捷键,那么如果你去面试工作就容易被录取,呵呵
- SQL Server如何通过SQL语句直接操作另一个SQL SERVER的数据1、 现在执行SQL语句的数据库服务器开启Ad Hoc Dis
- 公司里很多部门,每个部门可以发多条信息,但每条信息只对应一个部门部门类:class Dep(models.Model): nam
- 获取用户信息调用 wx.getUserProfile 方法获取用户基本信息。页面产生点击事件(例如 button 上 bindtap 的回调
- 在执行iisapp.vbs时,可能会提示如下错误:Windows Script Component - file://C:WINDOWSsy
- 前言在发生故障切换后,经常遇到的问题就是同步报错,数据库很小的时候,dump完再导入很简单就处理好了,但线上的数据库都150G-200G,如
- 人类学是关于人的研究;社会人类学(social anthropology)是研究人类社会的学科。社会人类学还可以理解成“文化翻译”(the
- 目前网络上有许多图片验证码形式,那些没有生成图片的验证码的抗破解防御能力简直不堪一击;有人直接在网页源码里显示出具体的数字,然后要求访问者输