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

使用记录:

SHOW VARIABLES LIKE "general_log%";

SET GLOBAL general_log = ‘ON‘;

SET GLOBAL general_log_file = ‘d:\mysql.log‘;

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.  show variables like ‘general_log_file‘; -- 看看日志文件保存位置
  2.  set global general_log_file=‘tmp/general.lg‘; -- 设置日志文件保存位置

  1.  show variables like ‘log_output‘; -- 看看日志输出类型 table或file
  2.  set global log_output=‘table‘; -- 设置输出类型为 table
  3.  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开启状态:

  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)

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

  1.  vim /etc/my.cnf
  2.  在【mysqld】中添加:
  3.  log-bin=/home/data/mysql-log/mysql-bin
  4.  server-id=12345

网上很多教程都只是添加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

第一个参数是打开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命令部分参数:

  1.  -d //指定库的binlog
  2.  -r //相当于重定向到指定文件
  3.  --start-position--stop-position //按照指定位置精确解析binlog日志(精确),如不接--stop-positiion则一直到binlog日志结尾
  4.  --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
  1.  //使用位置精确解析binlog日志
  2.  ./mysqlbinlog mysql-bin.000003 --start-position=100 --stop-position=200 -r my.sql

可以直接查看所有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)

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,提高新能

(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_%‘;

原文地址:https://www.cnblogs.com/zhangzhiping35/p/12198949.html

时间: 2024-10-09 06:28:06

mysql日志文件开启及详解:General_log 和 Binlog的相关文章

Nginx内置变量以及日志格式变量参数详解

Nginx内置变量以及日志格式变量参数详解 $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为空字符串 $uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html". $d

CentOS 6.5 MySQL/MariaDB数据备份与恢复备份详解

MySQL/MariaDB数据备份与恢复备份 数据对我们来说再重要不过了,那我们如何做到对数据尽可能的安全呢,当我们的数据丢失了那又该怎么做呢,所以说数据备份对我们的数据安全性来说太重要了. 数据对我们来说再熟悉不过了,也最平常不过了,我们每天都在接触各色各样的数据,数据记录了我们平常相关的业务信息,所以数据对于我们来说是很重要的,这么重要的数据如果我们的数据丢失了那我们是不是相关的业务都没法进行了呢,这应该是个很麻烦的问题,那我们怎么保护我们的数据的安全呢,这就要用到我们的数据备份了. 如何执

深入MySQL用户自定义变量:使用详解及其使用场景案例

一.前言 在前段工作中,曾几次收到超级话题积分漏记的用户反馈.通过源码的阅读分析后,发现问题出在高并发分布式场景下的计数器上.计数器的值会影响用户当前行为所获得积分的大小.比如,当用户在某超级话题下连续第n(n即计数器的值)次进行转发帖子时,将会获得与n相关的分数.然而,在第一次改进后问题依然存在.所以,这次在之前的基础上,通过使用MySQL变量的途径来解决该问题. 二.到底MySQL的变量分哪几类? MySQL变量一共分为两大类:用户自定义变量和系统变量.如下: 用户自定义变量 局部变量 会话

MySQL日志文件

1)错误日志(error log) 错误日志对MySQL的启动.运行.关闭过程进行了记录. 通过show variables like 'log_error'来定位该文件. mysql> show variables like 'log_error'; +---------------+---------------------------------+ | Variable_name | Value | +---------------+----------------------------

Android AndroidManifest 清单文件以及权限详解

每个Android应用都需要一个名为AndroidManifest.xml的程序清单文件,这个清单文件名是固定的并且放在每个Android应用的根目录下.它定义了该应用对于Android系统来说一些非常重要的信息.Android系统需要这些信息才能正常运行该应用.Android程序清单文件主要具有下面作用: ·        它给应用程序Java包命名,这个包名作为应用程序唯一标识符. ·        它描述了应用程序中的每个程序组件-Activity,Service,Broadcast Re

mysql中event的用法详解

一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程. 二.适用范围对于每隔一段时间就有固定需求的操作,如创建表,删除数据等操作,可以使用event来处理. 例如:使用event在每月的1日凌晨1点自动创建下个月需要使用的三张表. 三.使用权限单独使用event调用SQL语句时,查看和创建

lnmp vps服务器删除mysql日志文件三种方法

我在上一篇文章介绍了著名的LNMP主机一键安装工具,对比了军哥lnmp和AMH主机的差别,由于AMH拥有用户后台界面,易于新手操作,值得推荐. 但是,上周末我网站宕机,收到DNSPOD发来了宕机提醒,不得不半夜爬起来处理VPS问题,最终查明原因是AMH运行产生了大量的mysql数据库二进制文件,25GB的VPS硬盘几乎占满,导致网站不稳定,出现502宕机错误. AMH作者给出了解决办法,我不喜欢,其实后台修改配置就好了.考虑到所有lnmp vps用户的方便,我把所有解决办法都列出来给各位参考:

php中读取大文件实现方法详解

php中读取大文件实现方法详解 来源:   时间:2013-09-05 19:27:01   阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解的同学可进入参考参考.需求如下: 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容.实现方法:1 直接采用file函数 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解的同学可进入参考参考. 需求如下: 现有一个1G左右的日志文件,大约有500多万行,

MySQL数据类型以及基本使用详解

MySQL数据类型以及基本使用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL服务器的主要组件 我们知道MySQL的主要组件主要是由服务端(mysqld)和客户端(mysql)组成的.它们都共用一个配置文件(通常叫做my.cnf),这个配置文件很独特,它需要使用中括号括起来标明是为哪种组件使用的,例如[mysql]下面的指令就表示为客户端配置的参数,如果[mysqld]下面的指令就表示为服务端配置的参数.其实MySQL的客户端组件有很多个,本篇博客是用的my