mysql日志文件开启及详解:General_log 和 Binlog

摘要:
General_log详解1.介绍开启generallog将所有到达MySQLServer的SQL语句记录下来。一般不会开启开功能,因为log的量会非常庞大。但个别情况下可能会临时的开一会儿generallog以供排障使用。

General_log 详解

1.介绍

开启 general log 将所有到达MySQL Server的SQL语句记录下来。

一般不会开启开功能,因为log的量会非常庞大。但个别情况下可能会临时的开一会儿general log以供排障使用。
相关参数一共有3:general_log、log_output、general_log_file

  1. show variables like 'general_log'; -- 查看日志是否开启
  2. set global general_log=on; -- 开启日志功能
  • 1
  • 2
  1. show variables like 'general_log_file'; -- 看看日志文件保存位置
  2. set global general_log_file='tmp/general.lg'; -- 设置日志文件保存位置
  • 1
  • 2
  1. show variables like 'log_output'; -- 看看日志输出类型 table或file
  2. set global log_output='table'; -- 设置输出类型为 table
  3. 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开启状态:

  1. mysql> show variables like 'log_bin';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | log_bin | OFF |
  6. +---------------+-------+
  7. 1 row in set (0.01 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

vim编辑打开mysql配置文件my.cnf:

  1. vim /etc/my.cnf
  2. 在【mysqld】中添加:
  3. log-bin=/home/data/mysql-log/mysql-bin
  4. 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用户权限。

还有一种配置方式(指定三个参数):

  1. log_bin=ON
  2. log_bin_basename=/var/lib/mysql/mysql-bin
  3. 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命令部分参数:

  1. -d //指定库的binlog
  2. -r //相当于重定向到指定文件
  3. --start-position--stop-position //按照指定位置精确解析binlog日志(精确),如不接--stop-positiion则一直到binlog日志结尾
  4. --start-datetime--stop-datetime //按照指定时间解析binlog日志(模糊,不准确),如不接--stop-datetime则一直到binlog日志结尾
  • 1
  • 2
  • 3
  • 4

备注:myslqlbinlog分库导出binlog,如使用-d参数,更新数据时必须使用use database。
例:解析yj-test数据库的binlog日志并写入my.sql文件

./mysqlbinlog -dyj-test/home/data/mysql-log/mysql-bin.000003 -r my.sql
  • 1
  • 2
  1. //使用位置精确解析binlog日志
  2. ./mysqlbinlog mysql-bin.000003 --start-position=100--stop-position=200-rmy.sql
  • 1
  • 2

可以直接查看所有binlog信息:

  1. mysql> show master logs;
  2. +------------------+-----------+
  3. | Log_name | File_size |
  4. +------------------+-----------+
  5. | mysql-bin.000001 | 177 |
  6. | mysql-bin.000002 | 154 |
  7. +------------------+-----------+
  8. 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模式;

MySql中查询日志相关:

show variables like 'log_bin';
show variables like '%general_log%';
show variables like '%log_%';

免责声明:文章转载自《mysql日志文件开启及详解:General_log 和 Binlog》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇eclipse中tomcat能正常启动,在浏览器中不能打开问题聚类分析 一、K-Means下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CentOS日常维护及常用脚本

[root@192-16.x.x xiewenming]# curl myip.ipip.net 当前 IP:42.62.x.x 来自于:中国 北京 北京 联通/电信 www.17ce.com cdn解析网站测试 如果遇到 -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8...

MySQL 8.0.14版本新功能详解

点击▲关注 “数据和云”   给公众号标星置顶 更多精彩 第一时间直达 作者:崔虎龙,云和恩墨-开源架构部-MySQL技术顾问,长期服务于数据中心(金融,游戏,物流)行业,熟悉数据中心运营管理的流程及规范,自动化运维 等方面。擅长MySQL,Redis,MongoDB 数据库高可用设计 和 运维故障处理,备份恢复,升级迁移,性能优化 。 MySQL已进...

Spring配置JDBC连接Orcale、MySql、sqlserver

阅读指南:本文章主要讲述如何在Spring框架中配置JDBC连接方式连接Oracle、Mysql、SqlServer。 原理如下: 一、导包 连接oracle11g所需的jar包:ojdbc6.jar连接mysql5.1所需的jar包:mysql-connector-java-5.1.12-bin.jar连接sqlserver2008所需的jar包:sql...

PHP 之mysql空字符串问题

有一张user表如下所示:字段name不能为空。 CREATE TABLE `user` ( `id` int(11) NOT NULLAUTO_INCREMENT, `name` char(20) NOT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY(`id`) ) ENGINE=MyISAM DE...

mysql同时使用order by和limit查询时的一个严重隐患 -- 丢失数据

转自: https://blog.csdn.net/tsxw24/article/details/44994835 我经常使用order by和limit来做数据分页显示并排序,一直也没发现过什么问题。但这两天缺遇到一个严重的问题,在按时间戳升序排列并用limit分批读取数据时,却发现在某些记录丢失了,表中明明有的记录确死活读取不到。研究了大半天终于发现了...

mysql 数据库的表中复制一条数据并添加到该表中

数据库的表中复制一条数据并添加到该表中: 需求: 复制一行数据,并把c_name=化学,tid=015  1、准备sql查询语句:介绍一种快速生成的查询语句  2、编写sql语句:    INSERT INTO `course`(SELECT `cid` + 1, '015', '化学', `ctype`, `ccredit`, `cmax`, `c...