mysql日志文件开启及详解:General_log 和 Binlog
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; -- 开启日志功能
 
- 1
 - 2
 
- show variables like 'general_log_file'; -- 看看日志文件保存位置
 - set global general_log_file='tmp/general.lg'; -- 设置日志文件保存位置
 
- 1
 - 2
 
- show variables like 'log_output'; -- 看看日志输出类型 table或file
 - set global log_output='table'; -- 设置输出类型为 table
 - set global log_output='file'; -- 设置输出类型为file
 
- 1
 - 2
 - 3
 
 
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)
 
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 
vim编辑打开mysql配置文件my.cnf:
- vim /etc/my.cnf
 - 在【mysqld】中添加:
 - log-bin=/home/data/mysql-log/mysql-bin
 - server-id=12345
 
- 1
 - 2
 - 3
 - 4
 
网上很多教程都只是添加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
 
- 1
 - 2
 - 3
 
第一个参数是打开binlog日志 
第二个参数是binlog日志的基本文件名,后面会追加标识来表示每一个文件 
第三个参数指定的是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录
重启后查看: 
3.常用binlog日志操作命令
1.查看所有binlog日志列表
mysql> show master logs;
- 1
 
2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
mysql> show master status;
- 1
 
3.刷新log日志,自此刻开始产生一个新编号的binlog日志文件
mysql> flush logs;
- 1
 
注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
4.重置(清空)所有binlog日志
mysql> reset master;
- 1
 
5.查看binlog日志内容(以表格形式)
mysql>  show binlog events in 'mysql-bin.000002';
- 1
 
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日志结尾
 
- 1
 - 2
 - 3
 - 4
 
备注:myslqlbinlog分库导出binlog,如使用-d参数,更新数据时必须使用use database。 
例:解析yj-test数据库的binlog日志并写入my.sql文件
./mysqlbinlog -d yj-test /home/data/mysql-log/mysql-bin.000003 -r my.sql
- 1
 - 2
 
- //使用位置精确解析binlog日志
 - ./mysqlbinlog mysql-bin.000003 --start-position=100 --stop-position=200 -r my.sql
 
- 1
 - 2
 
可以直接查看所有binlog信息:
- mysql> show master logs;
 - +------------------+-----------+
 - | Log_name | File_size |
 - +------------------+-----------+
 - | mysql-bin.000001 | 177 |
 - | mysql-bin.000002 | 154 |
 - +------------------+-----------+
 - 2 rows in set (0.00 sec)
 
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 
5.binlog的三种工作模式
查看binlog日志格式:
show variables like "binlog_format";
- 1
 
注:我的默认为 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,提高新能
(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模式;
show variables like 'log_bin';
show variables like '%general_log%';
show variables like '%log_%';
mysql日志文件开启及详解:General_log 和 Binlog的更多相关文章
- WAL日志文件名称格式详解
		
转自:http://blog.osdba.net/534.html WAL日志文件名称格式详解 PostgreSQL的WAL日志文件在pg_xlog目录下,一般情况下,每个文件为16M大小: osdb ...
 - Linux日志文件/var/log详解
		
更多内容推荐微信公众号,欢迎关注: 如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时 ...
 - MySQL Cluster 配置文件(config.ini)详解
		
MySQL Cluster 配置文件(config.ini)详解 ################################################################### ...
 - Mysql数据库导入命令Source详解
		
Mysql数据库导入命令Source详解 几个常用用例: 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u root -p dat ...
 - MySQL事务及隔离级别详解
		
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
 - MySQL数据类型以及基本使用详解
		
MySQL数据类型以及基本使用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL服务器的主要组件 我们知道MySQL的主要组件主要是由服务端(mysqld)和客户端 ...
 - 8.var目录下的文件和目录详解
		
1./var目录下的文件和目录详解. /var (该目录存放的是不断扩充且经常修改的目录,包括各种日志文件或者pid文件,存放linux的启动日志和正在运行的程序目录(变化的目录:一般是日志文件,ca ...
 - 浅谈MySQL日志文件|手撕MySQL|对线面试官
		
关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 上周五面试了字节的第三面,深感数据库知识的重要,我也意识到在平时的学习中,自己对于数据库的学习较为薄弱.甚至在有过一定实习经验之后,依旧因为 ...
 - mysql中event的用法详解
		
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
 - lnmp vps服务器删除mysql日志文件三种方法
		
我在上一篇文章介绍了著名的LNMP主机一键安装工具,对比了军哥lnmp和AMH主机的差别,由于AMH拥有用户后台界面,易于新手操作,值得推荐. 但是,上周末我网站宕机,收到DNSPOD发来了宕机提醒, ...
 
随机推荐
- 前端WebSocket的方法封装
			
一.封装方法 在项目根目录src下的utils中新增webSocketManager.js封装文件,代码内容如下: // webSocketManager.js /** WebSocketMessen ...
 - kubernetes集群之资源配额(Resource Quotas)
			
一.简单介绍 资源配额(Resource Quotas)是用来限制用户资源用量的一种机制. 它的工作原理为: 资源配额应用在Namespace上,并且每个Namespace最多只能有一个Resourc ...
 - 微信小程序消息推送
			
简介 微信小程序发送消息推送到用户微信上 基础流程 用户登录 :获取微信提供的openid 开发者去微信公众平台申请模板:获得模板id 授权消息推送:在小程序中调用wx.requestSubscrib ...
 - Review-Gate MCP,让你的 cursor request 次数翻 5 倍
			
最新资讯: cursor pro 改为无限制,但某些模型(新模型?)依旧限制,看起来是一个黑盒,具体没细说,因此你可以考虑装或者不装本文的 MCP. 另外,本文属于前端社区的一次分享,只是顺带迁移到个 ...
 - 利用 Kubernetes 降本增效?EasyMR 基于 Kubernetes 部署的探索实践
			
Kubernetes 是用于编排容器化应用程序的云原生系统.最初由 Google 创建,如今由 Cloud Native Computing Foundation(CNCF)维护更新. Kuberne ...
 - Jfinal启动报错-文件找不到
 - C++使用WinHTTP访问http/https服务
			
环境: window10_x64 & vs2022 python版本: 3.9.13 日常开发中,会遇到c/c++作为客户端访问http/https服务的情况,今天整理下windows10环境 ...
 - AtCoder Beginner Contest 187 ABCDE 题解
			
A - Large Digits 思路:签到题,读入字符串即可. view code #include<iostream> #include<string> #include& ...
 - 客户端和服务端通信的多种函数的对比。linux 网络编程
			
第一种普通的read recv write Makefile #LOCAL_LIBRARY += -L./lib -lpal #LOCAL_LDFLAGS += -lm -lopus -lwebsoc ...
 - SciTech-EECS-MCU/CPU: DMA(直接内存访问): 开始时由CPU进行协调配对+传数据时DMA+结束时触发硬件中断通知MCU/CPU并解除配对
			
MEM可以是: MCU/CPU自带的内存: 容量由"芯片设计师"根据常用场景统计确定大小. 常能满足大多数用途. MCU/CPU的外部内存: 容量由"硬件设计师" ...