MySQL学习笔记之六:MySQL日志

MySQL日志主要包括:查询日志、慢查询日志、错误日志、二进制日志、中继日志、事务日志

查看与日志相关的服务器变量:SHOW GLOBAL VARIABLES LIKE ‘%log%‘;

MariaDB [(none)]> show global variables like ‘%log%‘;
+-------------------------------------------+--------------------------------------------------------------------------------------------------------------+
| Variable_name                             | Value                                                                                                        |
+-------------------------------------------+--------------------------------------------------------------------------------------------------------------+
...
...
| binlog_annotate_row_events                | OFF                                                                                                          |
| binlog_cache_size                         | 32768                                                                                                        |
| binlog_checksum                           | NONE                                                                                                         |
| binlog_commit_wait_count                  | 0                                                                                                            |
| binlog_commit_wait_usec                   | 100000                                                                                                       |
| binlog_direct_non_transactional_updates   | OFF                                                                                                          |
| binlog_format                             | MIXED                                                                                                        |
| binlog_optimize_thread_scheduling         | ON                                                                                                           |
| binlog_stmt_cache_size                    | 32768                                                                                                        |
| expire_logs_days                          | 0                                                                                                            |
| general_log                               | OFF                                                                                                          |
| general_log_file                          | node1.log                                                                                                    |
| gtid_binlog_pos                           | 0-1-2218                                                                                                     |
| gtid_binlog_state                         | 0-1-2218                                                                                                     |
| innodb_api_enable_binlog                  | OFF                                                                                                          |
| innodb_flush_log_at_timeout               | 1                                                                                                            |
| innodb_flush_log_at_trx_commit            | 1 
...
...

1、一般查询日志:记录查询信息,I/O开销太大,不建议开启

general_log = {ON|OFF}: 是否启用一般查询日志;默认为OFF

log_output = {TABLE|FILE|NONE}: 一般查询和慢查询日志的输出方式;

默认为FILE,即记录于文件中;如果记录于表中,这个表位于mysql库中;可既记录在表中,又记录在文件中,如log_output = TABLE,FILE;NONE表示不记录

general_log_file = /path/to/somefile:当log_output有FILE类型时,日志信息的输出位置;若使用相对路径,则是相对数据目录而言;默认为HOSTNAME.log

2、慢查询日志:记录查询执行时长超过指定时长的查询操作信息;当mysql服务器性能较低时,可作排错参考。

查询超过多久可判定为慢查询?

SELECT @@GLOBAL.long_query_time;   #默认为10秒

slow_query_log = {ON|OFF}:是否启用慢查询日志;默认为OFF

slow_query_log_file = /path/to/somefile:日志文件路径;可使用相对路径;默认为HOSTNAME-slow.log

log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk

日志过滤器;查询慢的原因有时并非语句本身执行慢,而是被阻塞了,像这类查询信息就不应记录,我们应只记录那些语句本身执行慢的查询信息

log_slow_rate_limit = 1:是否对慢查询进行限速

log_slow_verbosity =  :是否以详细格式记录;默认为空

ERROR 1229 (HY000): Variable ‘slow_query_log‘ is a GLOBAL variable and should be set with SET GLOBAL
MariaDB [(none)]> select @@global.long_query_time;
+--------------------------+
| @@global.long_query_time |
+--------------------------+
|                10.000000 |
+--------------------------+
1 row in set (0.08 sec)

MariaDB [(none)]> set global slow_query_log = ‘ON‘;   #开启慢查询日志
Query OK, 0 rows affected (0.19 sec)

MariaDB [(none)]> \! vim /etc/my.cnf
...
[mysqld]
...
slow_query_log = ON   #在[mysqld]段下添加该项

3、错误日志,它会记录:

mysqld启动和关闭过程中输出的信息;

mysqld运行中产生的错误信息;

event scheduler运行一个event时产生的日志信息;

在主从复制架构中的从服务器上启动从服务器线程时产生的日志信息;

log_error = /path/to/somefile;默认为数据目录下HOSTNAME.err

log_warnings = {0|1}:是否记录警告信息于错误日志中;默认值为1

4、二进制日志:精确地记录引起数据改变的操作,常用于数据的备份和恢复中,很重要!

⑴服务器变量:

sql_log_bin = ON

log_bin = ON

可在配置文件中指定:log_bin = /path/to/somefile,可使用相对路径;

binlog_format = MIXED|STATEMENT|ROW:日志记录格式,默认为MIXED

基于“语句”记录是常用的方式,但有时也需要基于“行”记录(场景示例:UPDATE tb5 SET TIME =CURRENT_TIME() WHERE id = 1;),所以采用“混合”方式比较合理。

max_binlog_size = 1073741824:二进制日志文件的单文件上限;

如果超过该值,则自动滚动日志,后缀名+1,并记录到以.index结尾的日志索引文件

max_binlog_cache_size = 18446744073709547520:二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存,其上限由max_binlog_stmt_cache_size决定

max_binlog_stmt_cache_size = 18446744073709547520:语句缓存的大小

sync_binlog = 0:设定多久同步一次二进制日志文件至磁盘;0表示不同步;任何正值都表示记录多少个语句后同步一次;当autocommit的值为1时,每条语句的执行都会引起二进制日志同步,通常合理的做法是关闭autocommit,把会引起数据改动的操作放于事务中,再手动提交。

⑵二进制日志文件的构成:

日志文件:文件名前缀.文件名后缀,如mysql-bin.000001

日志索引文件:文件名前缀.index,如:mysql-bin.index

二进制日志的格式

# at 19364

#140829 15:50:07 server id 1  end_log_pos  19486 Query  thread_id=13  exec_time=0  error_code=0

SET TIMESTAMP=1409298607/*!*/;

GRANT SELECT ON tdb.* TO [email protected]

/*!*/;

# at 19486

140829 15:50:07:事件发生的日期和时间

server id 1:事件发生所在服务器的标识

end_log_pos 19486:事件的结束位置

Query:事件的类型

thread_id=13:事件发生时所在的服务器执行此事件的线程的ID

exec_time=0:语句的时间戳与将其写入二进制文件中的时间差

error_code=0:错误代码

SET TIMESTAMP=1409298607/*!*/;GRANT SELECT ON tdb.* TO [email protected]:事件内容

GTID 0-1-2:事件所属的全局事务的GTID,GTID事件专属

⑷二进制日志的相关命令:

SHOW {BINARY | MASTER} LOGS;  #查看主服务器端处于由mysqld维护状态中的二进制日志文件

SHOW MASTER STATUS;  #查看主服务器端当前正在使用的二进制日志及所处的位置

SHOW BINLOG EVENTS [IN ‘log_name‘] [FROM pos] [LIMIT [offset,] row_count];  #显示指定的二进制日志文件中的相关事件

例 show binlog events in ‘mysql-bin.000005‘ from 3339 limit 5;

FLUSH LOGS;  #滚动日志

PURGE { BINARY | MASTER } LOGS { TO ‘log_name‘ | BEFORE datetime_expr };

清除某个指定二进制文件或时间点之前的所有二进制文件

mysqlbinlog:一款用于处理二进制日志的mysql客户端工具

常用选项:

-j, --start-position=#:从指定的事件位置查看

--stop-position=#:只显示到指定的事件位置

--start-datetime=name

--stop-datetime=name

时间格式:YYYY-MM-DD hh:mm:ss

-u, --user=   #指定以哪个用户身份连接,缺省为root

-h, --host=   #指定连接到哪台服务器,缺省为localhost

-p, --password=

例:mysqlbinlog --start-datetime=‘2015-09-01 15:30:00‘ --stop-datetime=‘2015-09-01 16:00:00‘ /mydata/data/mysql-bin.* > /backup/incre-`date-F%`.sql

MariaDB [(none)]> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     67304 |
| mysql-bin.000002 |    977605 |
| mysql-bin.000003 |       345 |
| mysql-bin.000004 |       326 |
| mysql-bin.000005 |     16629 |
+------------------+-----------+
5 rows in set (0.07 sec)

MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |    16629 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.08 sec)

MariaDB [testdb]> show binlog events in ‘mysql-bin.000002‘ from 578 limit 4;
+------------------+-----+------------+-----------+-------------+---------------------------------------------------------------+
| Log_name         | Pos | Event_type | Server_id | End_log_pos | Info                                                          |
+------------------+-----+------------+-----------+-------------+---------------------------------------------------------------+
| mysql-bin.000002 | 578 | Gtid       |         1 |         616 | BEGIN GTID 0-1-2220                                           |
| mysql-bin.000002 | 616 | Query      |         1 |         720 | use `testdb`; delete from students where Name = ‘tom‘         |
| mysql-bin.000002 | 720 | Intvar     |         1 |         748 | INSERT_ID=14                                                  |
| mysql-bin.000002 | 748 | Query      |         1 |         860 | use `testdb`; insert students (Name,Gender) value (‘jack‘,25) |
+------------------+-----+------------+-----------+-------------+---------------------------------------------------------------+
4 rows in set (0.00 sec)

MariaDB [testdb]> exit

[[email protected] data]# mysqlbinlog mysql-bin.000001
...
# at 578
#160303  4:06:44 server id 1  end_log_pos 616 	GTID 0-1-2220
/*!100001 SET @@session.gtid_seq_no=2220*//*!*/;
BEGIN
/*!*/;
# at 616
#160303  4:06:01 server id 1  end_log_pos 720 	Query	thread_id=49	exec_time=0	error_code=0
SET TIMESTAMP=1456949161/*!*/;
delete from students where Name = ‘tom‘
/*!*/;
...

5、中继日志:主从架构中从服务器上同步主服务器操作的中间日志

max_relay_log_size = {4096..1073741824}:从服务器上中继日志的体积上限,超过此值会自动滚动日志。此参数值为0时,mysqld将使用max_binlog_size参数同时为二进制日志和中继日志设定日志文件体积上限。

relay_log = /path/to/somefile:中继日志的文件路径,默认为host_name-relay-bin。

relay_log_index = /path/to/somefile:中继日志的索引文件路径,默认为host_name-relay-bin.index。

relay-log-info-file = /path/to/somefile:中继服务用于记录中继信息的文件,默认为relay-log.info。

relay_log_purge = {ON|OFF}:对不再需要的中继日志是否自动进行清理。默认值为ON。

relay_log_space_limit = #:用于存储所有中继日志文件的可用空间大小。默认为0,表示不限定。最大值取决于系统平台位数。

6、事务日志(innodb存储引擎):将随机I/O转换为顺序I/O,以提升事务操作效率

innodb_log_buffer_size = {262144 .. 4294967295}:InnoDB用于辅助完成日志文件写操作的日志缓冲区大小,单位是字节,默认为8MB。较大的事务可以借助于更大的日志缓冲区来避免在事务完成之前将日志缓冲区的数据写入日志文件,以减少I/O操作进而提升系统性能。因此,在有着较大事务的应用场景中,建议为此变量设定一个更大的值。

innodb_log_file_size = {108576 .. 4294967295}:事务日志组中单文件的最大体积,单位是字节,默认值是5MB。较为明智的取值范围是从1MB到缓存池体积的1/n,其中n表示日志组中日志文件的个数。日志文件越大,在缓存池中需要执行的检查点刷写操作就越少,这意味着所需的I/O操作也就越少,然而这也会导致较慢的故障恢复速度。

innodb_log_files_in_group = {2 .. 100}:事务日志组中日志文件的个数。InnoDB以循环的方式使用这些日志文件。默认值为2。

innodb_log_group_home_dir = /PATH/TO/DIR:事务日志文件的存储目录,默认为数据目录。在缺省使用InnoDB日志相关的所有变量时,其默认会在数据目录中创建两个大小为5MB的名为ib_logfile0和ib_logfile1的日志文件。

innodb_mirrored_log_groups = #:事务日志镜像组数。默认值为1,表示只有原本,无副本

[[email protected] ~]# ls /mydata/data   #查看数据目录
aria_log.00000001  hellodb  ib_logfile0  multi-master.info  mysql-bin.000001  mysql-bin.000003  mysql-bin.000005  node1.err  performance_schema  testdb
aria_log_control   ibdata1  ib_logfile1  mysql              mysql-bin.000002  mysql-bin.000004  mysql-bin.index   node1.pid  test
#ib_logfile为事务日志文件,mysql-bin.00000#为二进制日志文件
 mysql-bin.index为二进制日志索引文件,node1.err为错误日志文件
时间: 2024-10-08 13:20:27

MySQL学习笔记之六:MySQL日志的相关文章

MySQL学习笔记之一 MySQL入门

本人之前接触的关系型数据库主要是oracle和sqlserver,而对于mysql知之甚少,但查阅网上资料发现,mysql与oracle非常相似,所以学起来应该不会很费劲,在总结的时候可能更多的把关注点放在它与oracle的不同之处. 一.简介 MySQL是一个真正的多用户.多线程SQL数据库服务器.SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言.MySQL是一个客户端/服务器结构的实现, 它由一个服务器守护程序mysqld和很多不同的客户程序和库组成. MySQL的普及并不局限于

MySQL学习笔记 初涉MySQL

1.在Linux下安装MySQL # yum -y install mysql mysql-server mysql-devel        修改字符集:/etc/my.conf配置文件 vi /etc/my.conf [mysqld] default-character-set=utf8 character_set_server=utf8 [client] default-character-set=utf8 2.启动和停止MySQL服务 # service mysqld start 3.登

mysql学习笔记之六(数据定义语言DDL)

SQL语言包括四类种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)还有事务控制语言(TCL). ※  数据定义语言(DDL),例如:CREATE.DROP.ALTER等语句. ※  数据操作语言(DML),例如:INSERT(插入).UPDATE(修改).DELETE(删除)语句. ※  数据查询语言(DQL),例如:SELECT语句.(一般不会单独归于一类,因为只有一个语句). ※  数据控制语言(DCL),例如:GRANT.REVOKE等语

MySQL学习笔记之MySQL安装详解

前言 虽然现在NoSQL发展迅速,但MySQL还是非常受欢迎的,成千上万的公司依旧采用LAMP OR LNMP的搭配来进行开发,因此MYSQL的学习还是有一定的必要. 安装环境:Windows 7,需要.NET FRAMEWORK 4.0的支持 MySQL版本:5.6.10.1 安装 1.双击SETUP安装文件开始安装,前面的三步都是点“下一步”即可. 2.到第四步出现如下图所示界面. 这步我是选择Custom安装类型,比较自由,然后指定安装目录和存放数据目录. 3.接下来的几步都可以直接“下一

MySQL学习笔记1 mysql简介

查询使用sql语言,(结构化查询语言) 传统数据库遵循ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).这是可靠数据库所应具备的几个特性.下面针对这几个特性进行逐个讲解. nosql (不遵循ACID) 关于sql与nosql google bigtable /amazon dynamo 开源 facebook cass

MySQL学习笔记:MySQL: ERROR 1064(42000)

ERROR 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax*** 出现此错误的一般原因为数据库的表名或字段名出现了MySql的关键字.解决方法主要有两种. 一.修改表名 二.加反引号 增加了一个group字段

【MySQL学习笔记】MySQL权限表

MySQL权限表,控制用户对数据库的访问,存在mysql数据库中,由mysql_install_db初始化,包括user,db,host,tables_priv,columns_priv,procs_priv 1.user表,记录允许连接到服务器的账号信息,权限为全局级. 用户列(包括host,user,password,前二者为user表的联合主键). 权限列,描述用户权限,值为N or Y,默认值都为N,修改需要靠grant或update 安全列 n  两个ssl相关,用于加密,show v

【mySQL学习笔记】mySQL远程访问

MySQL 连接方式: TCP/IP 套接字方式 这种方式会在TCP/IP 连接上建立一个基于网络的连接请求,一般是client连接跑在Server上的MySQL实例,2台机器通过一个TCP/IP 网络连接. c:\Users\LiuChao>mysql -h 210.45.250.3 -u remote -p 3925096 错误解决:mySQL不是内部或外部命令:mySQL ERROR 1130

mysql学习笔记之mysql数据库的安装

1.运行mysql安装包选择自定义安装(安装路径不要带中文,否则安装会出错!) 2.一个mysql想要操作成功需要有三部分:服务器端,数据段,数据. 3.服务器软件目录: 4.数据目录: 点击安装即可. 5.到这里mysql已经安装好了,接下来对mysql进行一些配置.比如配置mysql最多允许多少连接,是否可远程登录 7.机器类型: 8.是否支持事务 9.innodb表空间: 10.连接数量 11.字符集设定 最后执行配置即可. 接下里进入mysql安装目录下的bin目录查看下: 连接服务器: