Day.5 留个纪录好办事 - Mysql Log (日志纪录)-上

遇到系统出问题时,第一个动作会是去查看系统上的Log纪录,各种日志都纪录着不同用途,透过日志纪录的内容能帮助管理者快速判断问题点,分析Mysql操作状况与错误资讯等,提供在MySQL管理和优化上的重要资讯。

前面有提到MYSQL设定档my.cnf用来设置Mysql全域参数初始化(EX:开启功能or调整参数限制&作用),没有设置会依照预设值运行,所以只要异动到设定档,需重启服务配置才会生效喔!

温馨提醒! 以下参数设定更动皆需重启Mysql服务来生效作用喔/images/emoticon/emoticon31.gif

systemctl restart mysql

首先从预设开启的错误日志开始,分别了解各日志纪录用途与设定 ~

1.错误日志- error log

  • 内容: mysqld服务器(启动/关闭/运行)期间发生的错误,警告与注释。

    EX:撷取error log 一小段关闭mysqld时纪录的log内容

https://ithelp.ithome.com.tw/upload/images/20210802/20130880ikbv4GJuVu.png

  • 用途: 查询mysql服务异常问题&诊断警告。

  • 相关配置: my.cnf设定档(/etc/mysql/my.cnf)

[mysqld]

#错误日志路径&档名
log-error=/var/log/mysql/error.log 

2.查询日志- general log

  • 内容: 纪录所有mysql相关SQL操作指令

    EX:撷取general log部分内容可以看到从使用者连线登入到对资料做异动的指令通通都会被纪录到log
    https://ithelp.ithome.com.tw/upload/images/20210802/20130880BbTa7saNlW.png

  • 用途: 排查错误时可能用到(还没遇过...XD) 或debug期间内有哪些执行语法。

    • 注意点: 因为执行的所有行为操作都会纪录到日志中,log累积量会占用很大的disk空间,请求量一多会产生不小的系统开销影响效能! 所以在环境上通常不会启用此日志。如果只是要针对效能语法的部分,不如透过slow log设定秒数去过滤。
  • 相关配置: my.cnf设定档(/etc/mysql/my.cnf)

[mysqld]

#general log是否开启(default:0禁用 / 1启用)
general_log = 1
#查询日志路径&档名
general_log_file = /mnt/mysql_data/mysql/general.log
#指定日志输出目的地(default:FILE=记录到general.log / TABLE=纪录到mysql.general_log表)
log-output=TABLE
  1. 慢查询日志- slow log
  • 内容: 纪录超过设定秒数执行的SQL语法。

    • 用途: 不适当的SQL指令会影响到资料库效能(EX:卡住变慢的状况)。
    • 注意点: 在开发的时候写的SQL指令就算有测过执行时间,但如果遇到资料量不足的问题,虽然看起来没问题但上线後资料量一大所造成的影响,执行秒数差异会越来越明显。可能是表结构索引关系设计上又或者是SQL语法本身问题,透过slowlog能找出这些语法发现问题并做优化。
      << 在资料库日常管理上非常重要!! >>/images/emoticon/emoticon23.gif

    EX: 把long_query_time设定秒数改成0,等於执行语法都会被纪录到log
    https://ithelp.ithome.com.tw/upload/images/20210802/20130880t0KIukv6P5.png

  • 相关配置: my.cnf设定档(/etc/mysql/my.cnf)

[mysqld]

#slow log是否开启(1启用/0禁用)
slow-query-log = 1
#慢查询日志路径&档名
slow_query_log_file=/mnt/mysql_data/mysql/slow.log
#执行超过x秒就纪录 (EX: 1s)
long_query_time = 1

补充: 在生产环境上不是随时都能重启服务的,总不可能为了不是必要到需立即修改的功能而重启服务 (马上被抬走.../images/emoticon/emoticon50.gif

所以在运行中状态时部分变数可以透过修改环境变数的方式达到不停机生效的作用。不过要注意使用set修改的变数值重启後是会失效的。<< 想要永久生效,还是得写入my.cnf档 >>

#无需修改my.cnf 依旧能开启log功能
mysql> SET GLOBAL slow_query_log = 1

简单介绍一下设定上差异:

区分: 1.全域(GLOBAL)级变数 2.会话(SESSION)级变数

MYSQL官方文件:变数范围Var Scope & 可否动态变更参数Dynamic

  • 使用( show variables like '变数名称' )指令查看变数值时会优先显示SESSION级变数值,如果不存在,则为全域级变数值。
  • 部分参数会提示read only 是无法动态更改的。
  • 修改时使用错误级别会无法修改。

EX:图中可以看到我们以SESSION级的方式更改。但因为slow_query_log属於GLOBAL变数级别所以会喷ERROR!以 global方式修改就能将日志功能关闭~
https://ithelp.ithome.com.tw/upload/images/20210802/20130880YiXJk2cTpu.png
https://ithelp.ithome.com.tw/upload/images/20210802/20130880vdnng7kdUi.png

作用范围: 以long_query_time来看Both等於2种方式都支援,Yes等於可动态更改。
https://ithelp.ithome.com.tw/upload/images/20210803/20130880JfOObnQkrD.png

  1. GLOBAL: 修改global变数,对所有新会话的global和session变数都会产生影响。

Example 图1-0中先开启2个SESSION连线资料库 SESSION-1 & SESSION-2,透过左边SESSION-1使用GLOBAL方式修改long_query_time变数,修改完成後再开启新连线SESSION-3。

  • SESSION-1 (左)
    起始设定值: 0
    参数修改後: SESSION = 0 , GLOBAL = 5

  • SESSION-2 (中)
    起始设定值: 0
    参数修改後: SESSION = 0 , GLOBAL = 5

  • SESSION-3 (右) 新建立的连线
    参数修改後: SESSION = 5 , GLOBAL = 5

当变数同时拥有两个级别,在建立连线时用全域级变数初始化会话级变数,但一旦连线建立之後,全域级不会影响到会话级变数!! 看图自己做一次马上就能知道差异罗~

图.1-0
https://ithelp.ithome.com.tw/upload/images/20210803/20130880KwlvUnpMuk.png

  1. SESSION: 修改session变数,只会对当前连线的会话产生影响。

Example 图1-1中开启2个SESSION连线资料库使用,透过左边SESSION-1用session方式修改long_query_time变数。

  • SESSION-1 (左)
    起始设定值: 0
    参数修改後: SESSION = 5 , GLOBAL = 0

  • SESSION-2 (右)
    起始设定值: 0
    参数修改後: SESSION = 0 , GLOBAL = 0

图.1-1
https://ithelp.ithome.com.tw/upload/images/20210803/20130880UO4JQbdOgE.png


以上内容目前配置参考:

[client]
#mysql 客户端连线服务端预设port
port=3306
socket=/mnt/mysql_data/mysql/mysql.sock

[mysqld]
#mysql使用socket方式登陆的sock档案路径
socket=/mnt/mysql_data/mysql/mysql.sock
#mysql 资料库档案所在目录
datadir=/mnt/mysql_data/mysql
#错误日志路径&档名
log-error=/var/log/mysql/error.log
#mysql服务端预设监听port
port=3306

# 设定字符集utf8
character_set_server=utf8

#general log是否开启(1启用/0禁用)
general_log = 1
#查询日志路径&档名
general_log_file = /mnt/mysql_data/mysql/general.log
#指定日志输出目的地(default: FILE) FILE=写入general.log , TABLE=写入mysql.general_log表
log-output=FILE

#slow log是否开启(1启用/0禁用)
slow-query-log = 1
#慢查询日志路径&档名
slow_query_log_file=/mnt/mysql_data/mysql/slow.log
#执行超过x秒就纪录 (EX: 1s)
long_query_time = 1

今天介绍了几个MYSQL日志的不同特点~

下集预告: 一样分享MYSQL相关日志但不同的是这些日志跟资料库的资料处理与数据恢复有关 !
还有( binlog / redo-log / undo-log / relay-log )後面都会提到....好多/images/emoticon/emoticon20.gif


<<:  Day 5 - TiDB架构

>>:  Day5 Game Frontend

Tcl语言和你 SAY HELLO!!

第七天 各位点进来的朋友,你们好阿 小的不才只能做这个系列的文章,但还是希望分享给点进来的朋友,知道...

30天Lua重拾笔记33】Java + Lua计算机

这是我前几年作为学习/练习的例子。 看过与C交互後,接着来看看一个更实际应用的例子。不过不用C,来...

AE极光制作1-Day7

终於来到第二个练习了! 练习范例:https://www.sixvfx.com/northern_l...

第29车厢-倒数一篇!人人有奖~抽奖抽起来了各位!

本篇分享自制一个简易抽奖程序码啦!---以JQ为例 ▼完成图如下 为了让大家比较好懂,程序码用这张...

【Day25】[演算法]-合并排序法Merge Sort

合并排序法(Merge Sort)原理是会先将原始资料分割成两个资料列,接着再将两个资料继续分割成两...