衡阳商城网站制作,网站能当做创业来做吗,asp网站开发国内外现状,如何查网站备案信息目录 #x1f341;MySQL日志分为4大类 #x1f341;错误日志 #x1f343;修改系统配置 #x1f341;二进制日志 #x1f343;查看二进制日志 #x1f343;删除二进制日志 #x1f343;暂时停止二进制日志的功能 #x1f341;事务日志(或称redo日志) #x1f341;慢查… 目录 MySQL日志分为4大类 错误日志 修改系统配置 二进制日志 查看二进制日志 删除二进制日志 暂时停止二进制日志的功能 事务日志(或称redo日志) 慢查询日志slow query log 博客主页大虾好吃吗的博客 MySQL专栏MySQL专栏地址 MySQL日志记录了MySQL数据库日常操作和错误信息。MySQL有不同类型的日志文件各自存储了不同类型的日志从日志当中可以查询到MySQL数据库的运行情况、用户的操作、错误的信息等。
MySQL日志分为4大类 错误日志记录mysql服务的启动运行或停止mysql服务时出现的问题 查询日志记录建立的客户端的连接和执行的语句 二进制日志记录所有更改数据的语句可以用于数据的复制 慢查询日志记录所有执行的时间超过long_query_time的所有查询或不使用索引的查询默认情况下所有日志创建与MySQL数据目录中通过刷新日志可以强制MySQL关闭和重新打开日志文件Flush logs刷新日志或者执行mysqladmin flush-logs 如果正使用MySQL复制功能在复制服务器上可以维护更多日志文件这种日志我们称为接替日志。启动日志功能会降低MySQL数据库的性能。
错误日志 在mysql数据库中错误日志功能是默认开启的。默认情况下错误日志存储在mysql数据库的数据目录中。错误日志文件通常的名称为hostname.err。其中hostname表示服务器主机名。 错误日志信息可以自己进行配置的错误日志所记录的信息是可以通过log-error和log-warnings来定义的其中log-error是定义是否启用错误日志的功能和错误日志的存储位置log-warnings是定义是否将警告信息也定义至错误日志中。 默认情况下错误日志大概记录以下几个方面的信息服务器启动和关闭过程中的信息未必是错误信息如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息 注1MySQL有很多系统变量可以设置系统变量设置不同会导致系统运行状态的不同。因此mysql提供两组命令分别查看系统设置和运行状态。
1、查看系统设置
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]
SHOW VARIABLES shows the values of MySQL system variables.
2、运行状态
SHOW [GLOBAL | SESSION] STATUS [like_or_where]
SHOW STATUS provides server status information.
修改系统配置
方法1配置文件设置my.cnf 如binlog_cache_size 1M
方法2set global binlog_cache_size 1048576;
注查看mysql的版本
[rootlocalhost ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.40, for linux-glibc2.12 (x86_64) using EditLine wrapper
或
mysql status;
--------------
mysql Ver 14.14 Distrib 5.7.40, for linux-glibc2.12 (x86_64) using EditLine wrapper
Connection id: 11
Current database:
Current user: rootlocalhost
SSL: Not in use
Current pager: stdout
Using outfile:
Using delimiter: ;
Server version: 5.7.40 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /tmp/mysql.sock
Uptime: 87 days 2 hours 22 min 4 sec
Threads: 1 Questions: 61 Slow queries: 0 Opens: 114 Flush tables: 1 Open tables: 107 Queries per second avg: 0.000
--------------
或
mysql select version();
-----------
| version() |
-----------
| 5.7.40 |
-----------
1 row in set (0.00 sec)
一般而言日志级别的定义没有会话变量都只是在全局级别下进行定义 错误日志的状态
mysql show global variables like %log_error%;
------------------------------------------------------
| Variable_name | Value |
------------------------------------------------------
| binlog_error_action | ABORT_SERVER |
| log_error | /usr/local/mysql/data/mysql.log |
| log_error_verbosity | 3 |
------------------------------------------------------
3 rows in set (0.00 sec)
其中 log_error定义为错误日志文件路径 log_error_verbosity:
verbosity valuemessage types logged1errors only2errors and warnings3errors,warinigs,and notes(default)
更改错误日志位置可以使用log-error来设置形式如下
[rootlocalhost ~]# vim /etc/my.cnf
log-error /usr/local/mysql/data/mysqld.err
查看mysql错误日志
[rootlocalhost ~]# tail /usr/local/mysql/data/mysqld.err 为了方便维护需要有时候会希望将错误日志中的内容做备份并重新开始记录这时候就可以利用MySQL 的FLUSH LOGS 命令来告诉MySQL 备份旧日志文件并生成新的日志文件。备份文件名以“.old”结尾。
删除错误日志 在mysql5.5.7之前数据库管理员可以删除很长时间之前的错误日志以保证mysql服务器上的硬盘空间。mysql数据库中可以使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法如下mysqladmin –uroot –p flush-logs也可以登录mysql数据库中使用FLUSH LOGS语句来开启新的错误日志。 在mysql5.5.7之后服务器将关闭此项功能。只能使用重命名原来的错误日志文件手动冲洗日志创建一个新的方式如下
[rootlocalhost ~]# cd /usr/local/mysql/data/
[rootlocalhost data]# mv mysqld.err mysql.bak
[rootlocalhost data]# mysqladmin -uroot -p flush-logs
Enter password: #输入root密码
更多信息请查阅官方文档
MySQL :: MySQL 8.0 Reference Manual :: 5.4.2 The Error Log
MySQL :: MySQL 8.0 Reference Manual :: 5.4.2 The Error Log
MySQL :: MySQL 5.7 Reference Manual :: 5.4.2 The Error Log
二进制日志 主要记录MySQL数据库的变化二进制日志以一种有效的格式并且是事务安全的方式包含更新日志中可用的信息。二进制日志包含了所有更新了数据或者已经潜在更新了数据。二进制日志还包含关于每个更新数据库的语句的执行时间它不包含没有修改任何数据的语句。使用二进制日志的主要目的是最大可能地恢复数据库。启动二进制日志默认情况下二进制日志是关闭的 编辑配置文件My.ini 或my.cnf
[rootlocalhost ~]# vim /etc/my.cnf
[mysqld]
log_binmy-bin //二进制日志[路径[指定日志文件的名字]]
Expire_logs_days 10 //清除日志的天数
Max_binlog_size 100M //单个日志文件的大小限制超出会新建一个默认为1GB
server_id1 //mysql5.7版本以后需要添加serverid
[rootlocalhost ~]# service mysqld restart
Show variables 或show variables like log_%; 语句来查询日志设置
mysql show variables like log_bin%;
---------------------------------------------------------------------
| Variable_name | Value |
---------------------------------------------------------------------
| log_bin | ON |
| log_bin_basename | /usr/local/mysql/data/my-bin |
| log_bin_index | /usr/local/mysql/data/my-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
---------------------------------------------------------------------
5 rows in set (0.00 sec)
查看二进制日志 MySQL二进制日志存储了所有的变更信息MySQL二进制日志经常使用。当MySQL创建二进制日志文件时首先创建一个以’filename’为名称以’.index’为后缀的文件在创建一个以’filename’为名称以’.000001’为后缀的文件。当MySQL服务重启一次以’.000001’为后缀的文件会增加一个并且后缀名加1递增。如果日志长度超过max_binlog_size的上限也会创建一个新的日志。 Show binary logs;可以查看当前的二进制日志文件个数及其文件名。二进制日志并不能直接查看如果想要查看日志内容可以通过mysqlbinlog命令查看。
mysql show binary logs;
--------------------------
| Log_name | File_size |
--------------------------
| my-bin.000001 | 154 |
--------------------------
1 row in set (0.00 sec)
或者
mysql show master logs;
--------------------------
| Log_name | File_size |
--------------------------
| my-bin.000001 | 154 |
--------------------------
1 row in set (0.00 sec)
查看二制日志的内容 退出mysql在命令行
[rootmysql ~]# mysqlbinlog myusql-bin.000001
/*!50530 SET SESSION.PSEUDO_SLAVE_MODE1*/;
/*!50003 SET OLD_COMPLETION_TYPECOMPLETION_TYPE,COMPLETION_TYPE0*/;
DELIMITER /*!*/;
mysqlbinlog: File myusql-bin.000001 not found (Errcode: 2 - No such file or directory)
SET SESSION.GTID_NEXT AUTOMATIC /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPEOLD_COMPLETION_TYPE*/;
/*!50530 SET SESSION.PSEUDO_SLAVE_MODE0*/;
删除二进制日志 MySQL的二进制文件可以配置自动删除同时MySQL提供了手动删除二进制文件的方法 RESET MASTER 删除所有的二进制日志文件PURGE MASTER LOGS只删除部分二进制日志文件。 Resetmaster; 删除所有二进制日志 Purge master logs to ‘二进制名’ 删除单个二进制日志之前的
语法格式
PURGE { BINARY | MASTER } LOGS {TO log_name| BEFORE datetime_expr
}
例
mysql purge master logs to my-bin.000001;
Query OK, 0 rows affected (0.02 sec)mysql purge master logs before 20230101; #删除指定日期之前的日志
Query OK, 0 rows affected, 1 warning (0.02 sec)
暂时停止二进制日志的功能 如果MySQL的配置文件已经启动了二进制日志MySQL会一直记录二进制日志修改配置文件可以停止二进制日志但是需要重启MySQL数据库。MySQL提供了暂时停止二进制日志的功能通过SET SQL_LOG_BIN语句可以使MySQL暂时停止二进制
mysql set sql_log_bin1; #0暂停 1恢复
Query OK, 0 rows affected (0.00 sec)
事务日志(或称redo日志) 事务日志InnoDB特有的日志可以帮助提高事务的效率。使用事务日志存储引擎在修改表的数据时只需要修改其内存拷贝再把修改行为记录到持久在硬盘上的事务日志中而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式因此写日志的操作是磁盘上一小块区域内的顺序I/O而不像随机I/O需要在磁盘的多个地方移动磁头所以采用事务日志的方式相对来说要快得多。事务日志持久以后内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的。 如果数据的修改已经记录到事务日志并持久化但数据本身还没有写回磁盘此时系统崩溃存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。
查看事务日志的定义
mysql show global variables like %log%;
#省略部分内容
| innodb_flush_log_at_timeout | 1
| innodb_flush_log_at_trx_commit | 1
| innodb_locks_unsafe_for_binlog | OFF
| innodb_log_buffer_size | 16777216
| innodb_log_checksums | ON
| innodb_log_compressed_pages | ON
| innodb_log_file_size | 50331648 #日志文件大小
| innodb_log_files_in_group | 2 # DB中设置几组事务日志默认是2
| innodb_log_group_home_dir | ./ #定义innodb事务日志组的位置,此位置设置默认为MySQL的datadir
#省略部分内容
每个事务日志都是大小为50兆的文件不同版本的mysql有差异 在mysql中默认以ib_logfile0,ib_logfile1名称存在 innodb_flush_log_at_trx_commit # 在事务提交时innodb是否同步日志从缓冲区到文件中当这个值为1默认值之时在每个事务提交时日志缓冲被写到日志文件对日志文件做到磁盘操作的刷新性能会很差造成大量的磁盘I/O但这种方式最安全如果设为2,每次提交事务都会写日志但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是并不能保证100%每秒一定都会刷到磁盘这要取决于进程的调度。每次事务提交的时候将数据写入事务日志而这里的写入仅是调用了文件系统的写入操作而文件系统是有 缓存的所以这个写入并不能保证数据已经写入到物理磁盘。设置为0日志缓冲每秒一次地被写到日志文件并且对日志文件做到磁盘操作的刷新但是在一个事务提交不做任何操作。
注刷写的概念 刷写其实是两个操作刷flush和写write区分这两个概念是很重要的。在大多数的操作系统中把Innodb的log buffer内存写入日志调用系统调用write只是简单的把数据移到操作系统缓存中操作系统缓存同样指的是内存。并没有实际的持久化数据。所以通常设为0和2的时候在崩溃或断电的时候会丢失最后一秒的数据因为这个时候数据只是存在于操作系统缓存。之所以说“通常”可能会有丢失不只1秒的数据的情况比如说执行flush操作的时候阻塞了。
总结 设为1当然是最安全的但性能页是最差的相对其他两个参数而言但不是不能接受。如果对数据一致性和完整性要求不高完全可以设为2,如果只最求性能例如高并发写的日志服务器设为0来获得更高性能
慢查询日志slow query log 顾名思义慢查询日志中记录的是执行时间较长的query也就是我们常说的slow query。 慢查询日志采用的是简单的文本格式可以通过各种文本编辑器查看其中的内容。其中 记录了语句执行的时刻执行所消耗的时间执行用户连接主机等相关信息。 慢查询日志的作用 慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志可以查找出哪些查询语句的执行效率很低以便进行优化。一般建议开启它对服务器性能的影响微乎其微但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。MySQL 还提供了专门用来分析满查询日志的工具程序mysqldumpslow用来帮助数据库管理人员解决可能存在的性能问题。
查看慢查询日志的定义
mysql show global variables like %slow_query_log%;
-----------------------------------------------------------
| Variable_name | Value |
-----------------------------------------------------------
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/mysql/data/mysql-slow.log |
-----------------------------------------------------------
2 rows in set (0.01 sec)mysql show global variables like %long%;
---------------------------------------------------------------------
| Variable_name | Value |
---------------------------------------------------------------------
| long_query_time | 10.000000 |
| performance_schema_events_stages_history_long_size | 10000 |
| performance_schema_events_statements_history_long_size | 10000 |
| performance_schema_events_transactions_history_long_size | 10000 |
| performance_schema_events_waits_history_long_size | 10000 |
---------------------------------------------------------------------
5 rows in set (0.00 sec)
启动和设置慢查询日志
方法1通过配置文件my.cnf开启慢查询日志
注在不同的mysql版本中开启慢查询日志参数不太一样不过都可以通过 show variables like %slow% 和show variables like %long%查看出来。
mysql show global variables like %slow%;
-----------------------------------------------------------------
| Variable_name | Value |
-----------------------------------------------------------------
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/mysql/data/mysql-slow.log |
-----------------------------------------------------------------
5 rows in set (0.00 sec) 其中 slow_query_log off关闭状态 on开启状态 slow_query_log_file 慢查询日志存放地点 long_query_time选项来设置一个时间值时间以秒为单位可以精确到微秒。如果查询时间超过了这个时间值默认为10秒这个查询语句将被记录到慢查询日志中, 设置为0的话表示记录所有的查询。 slow_launch_time 表示如果建立线程花费了比这个值更长的时间,slow_launch_threads 计数器将增加 注如果不指定存储路径慢查询日志默认存储到mysql数据库的数据文件下如果不指定文件名默认文件名为hostname-slow.log 修改my.cnf文件
[mysqld]
slow_query_log1
slow_query_log_file/usr/local/mysql/data/mysql-slow.log
long_query_time1
slow_launch_time1
#重启mysqld服务 再次查询慢查询日志定义
方法2通过登录mysql服务器直接定义方式如下
mysql set global slow_query_log1; #开启慢查询日志
Query OK, 0 rows affected (0.00 sec)mysql set session long_query_time0.0001; #更改时间当前session中退出则重置Query OK, 0 rows affected (0.00 sec)mysql set global long_query_time0.0001; #更改时间全局中重启服务则重置
Query OK, 0 rows affected (0.00 sec)mysql show variables like long%; #查询定义时间
---------------------------
| Variable_name | Value |
---------------------------
| long_query_time | 0.000100 |
---------------------------
1 row in set (0.00 sec)
查看慢查询日志
[rootmysql ~]# cat /usr/local/mysql/data/mysql-slow.log 用系统查看文件内容命令如cat直接查看慢日志文件第一行表示记录日志时的时间。其格式是 YYYY-MM-DD HH:MM:SS。我们可以看出上面的查询记录于 2016 年8 月 29 日下午 15:4724 - 注意这个是服务器时间. MySql 用户、服务器以及主机名第三行表示总的查询时间、锁定时间、发送或者返回的行数 Query_time: 0.000304 表示用了0.000304秒 Lock_time: 0.000128 表示锁了0.000128秒 Rows_sent: 4 表示返回4行 Rows_examined: 4 表示一共查了4行 SET timestampUNIXTIME; 这是查询实际发生的时间 何将其变成一个有用的时间将 Unix 时间转成一个可读的时间可以使用 date –d日志中的时间戳以看到查询进行的同时记录了该日志 但是对于一台超负载的服务器常常并非如此。因此记住SETtimestamp value 才是实际的查询的执行时间。 慢查询分析mysqldumpslow 们可以通过打开log文件查看得知哪些SQL执行效率低下。从日志中可以发现查询时间超过long_query_time时间的query为慢查询而小于long_query_time时间的没有出现在此日志中。 如果慢查询日志中记录内容很多可以使用mysqldumpslow工具MySQL客户端安装自带来对慢查询日志进行分类汇总。mysqldumpslow对日志文件进行了分类汇总显示汇总后摘要结果 进入log的存放目录运行
[rootmysql ~]# mysqldumpslow /usr/local/mysql/data/mysql-slow.log 注 mysqldumpslow -s c -t 10 /database/mysql/slow-query.log 这会输出记录次数最多的10条SQL语句其中 -s, 是表示按照何种方式排序c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序ac、at、al、ar表示相应的倒序 -t, 是top n的意思即为返回前面多少条的数据 -g, 后边可以写一个正则匹配模式大小写不敏感的 例如 /path/mysqldumpslow -s r -t 10/database/mysql/slow-log 得到返回记录集最多的10个查询。/path/mysqldumpslow -s t -t 10 -g “left join” /database/mysql/slow-log 得到按照时间排序的前10条里面含有左连接的查询语句。