码迷,mamicode.com
首页 > 数据库 > 详细

MySQL(十一)

时间:2015-09-04 02:20:27      阅读:347      评论:0      收藏:0      [点我收藏+]

标签:mysql、数据库

一、MySQL日志

   日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复。 主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志、中继日志; 

1、查询日志

   默认情况下查询日志是关闭的。由于查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的。如若不是为了调试数据库的目的建议不要开启查询日志。

查看查询日志是否开启参数:

MariaDB [mysql]> SHOW GLOBAL VARIABLES LIKE ‘%log%‘\G;
*************************** 16. row ***************************
Variable_name: general_log
        Value: OFF
*************************** 17. row ***************************
Variable_name: general_log_file
        Value: example.log
*************************** 41. row ***************************
Variable_name: log_output
        Value: FILE
  • general_log:是否启用查询日志;

  • general_log_file:定义一般查询日志保存的文件;

  • log_output:日志的输出方式,定义时一般有三个值:{TABLE|FILE|NONE}

   日志的输出方式一般有三种方式:file(文件),table(表),none(不保存);其中前两个输出位置可以同时定义,用逗号分隔即可。none表示是开启日志功能但是不记录日志信息。file所在位置就是通过general_log_file参数定义的,而输出位置定义为表时查看日志的内容方式为:

举例:

开启查询日志,记录形式为表和文件:

MariaDB [mysql]> SET GLOBAL general_log=‘ON‘;
Query OK, 0 rows affected (0.08 sec)

MariaDB [mysql]> SET GLOBAL log_output=‘file,table‘;
Query OK, 0 rows affected (0.02 sec)

[root@example.com ~]# cat /data/mydata/example.log
/usr/local/mysql/bin/mysqld, Version: 10.0.21-MariaDB-log (Source distribution). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
150831 14:19:56	    4 Query	SET GLOBAL log_output=‘file,table‘
150831 14:20:06	    4 Query	SHOW GLOBAL VARIABLES LIKE ‘%log%‘
150831 14:21:14	    4 Query	SELECT DATABASE()
    4 Init DB	hellodb
150831 14:21:25	    4 Query	SHOW TABLES
150831 14:21:42	    4 Query	SELECT * FROM classes
150831 14:21:48	    4 Query	SELECT * FROM students
150831 14:22:00	    4 Query	SELECT * FROM courses
MariaDB [mysql]> SELECT * FROM general_log;
+----------------------------+---------------------------+-----------+-----------+--------------+------------------------------------+
| event_time                 | user_host                 | thread_id | server_id | command_type | argument                           |
+----------------------------+---------------------------+-----------+-----------+--------------+------------------------------------+
| 2015-08-31 14:20:06.648747 | root[root] @ localhost [] |         4 |         1 | Query        | SHOW GLOBAL VARIABLES LIKE ‘%log%‘ |
| 2015-08-31 14:21:14.432517 | root[root] @ localhost [] |         4 |         1 | Query        | SELECT DATABASE()                  |
| 2015-08-31 14:21:14.432695 | root[root] @ localhost [] |         4 |         1 | Init DB      | hellodb                            |
| 2015-08-31 14:21:25.196230 | root[root] @ localhost [] |         4 |         1 | Query        | SHOW TABLES                        |
| 2015-08-31 14:21:42.338430 | root[root] @ localhost [] |         4 |         1 | Query        | SELECT * FROM classes              |
| 2015-08-31 14:21:48.701132 | root[root] @ localhost [] |         4 |         1 | Query        | SELECT * FROM students             |
| 2015-08-31 14:22:00.563751 | root[root] @ localhost [] |         4 |         1 | Query        | SELECT * FROM courses              |
| 2015-08-31 14:42:19.030252 | root[root] @ localhost [] |         4 |         1 | Query        | SELECT DATABASE()                  |
| 2015-08-31 14:42:19.030429 | root[root] @ localhost [] |         4 |         1 | Init DB      | mysql                              |
| 2015-08-31 14:42:27.950684 | root[root] @ localhost [] |         4 |         1 | Query        | SHOW TABLES                        |
| 2015-08-31 14:42:54.122161 | root[root] @ localhost [] |         4 |         1 | Query        | SELECT * FROM general_log          |
| 2015-08-31 14:42:59.459797 | root[root] @ localhost [] |         4 |         1 | Query        | SELECT * FROM general_log          |
+----------------------------+---------------------------+-----------+-----------+--------------+------------------------------------+


2、慢查询日志

   慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。

慢查询日志的相关参数:

MariaDB [mysql]> SHOW GLOBAL VARIABLES LIKE ‘long%‘;
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

MariaDB [mysql]> SHOW GLOBAL VARIABLES LIKE ‘%log%‘\G;
*************************** 58. row ***************************
Variable_name: slow_query_log
        Value: OFF
*************************** 59. row ***************************
Variable_name: slow_query_log_file
        Value: example-slow.log

参数说明:

long_query_time: 10.000000:慢查询的时长,超出此时间均会记录为慢查询;

slow_query_log={ON|OFF}:设定是否启用慢查询日志;其为全局变量,它的输出形式也取决log_output={TABLE|FILE|NONE};
slow_query_log_file=example-slow.log:定义日志文件路径及名称;

还有几个相关参数:
log_slow_filter=admin,filesort,***********,tmp_table_on_disk :过滤器。
log_slow_queries=ON:是否启用慢查询日志,此为会话变量,只是对当前用户有效。           log_slow_rate_limit=1:记录慢查询日志的速率。                               log_slow_verbosity :是否记录详细的慢查询日志。

举例:

启用慢查询日志:

MariaDB [mysql]> SET GLOBAL slow_query_log=‘ON‘;
Query OK, 0 rows affected (0.11 sec)

将慢查询日志的输出形式定义为文件和表:

MariaDB [mysql]> SET GLOBAL log_output=‘FILE,TABLE‘;
Query OK, 0 rows affected (0.00 sec)

若有慢查询日志可在下面两个表和文件中查询:

MariaDB [hellodb]> SELECT * FROM mysql.slow_log;
Empty set (0.00 sec)
[root@example.com ~]# cat /data/mydata/example-slow.log


3、错误日志

   在mysql数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在mysql数据库的数据文件中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。

   默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息。


相关参数说明:

log_error = /path/to/error_log_file :错误日志所在的位置;
log_warnings = {1|0}:是否记录警告信息于错误日志中;

由于错误日志是默认自动开启的,所以就可以查询错误日志的内容:

[root@example.com ~]# tail /data/mydata/example.com.err 
150831  9:25:34 [Note] InnoDB: Initializing buffer pool, size = 128.0M
150831  9:25:34 [Note] InnoDB: Completed initialization of buffer pool
150831  9:25:35 [Note] InnoDB: Highest supported file format is Barracuda.
150831  9:25:35 [Note] InnoDB: 128 rollback segment(s) are active.
150831  9:25:35 [Note] InnoDB: Waiting for purge to start
150831  9:25:35 [Note] InnoDB:  Percona XtraDB (
http://www.percona.com)
 5.6.25-73.1 started; log sequence number 1803679

更改错误日志位置可以使用log_error来设置形式如下:

[root@example.com ~]#  vim /etc/my.cnf

[mysqld]

Log_error=DIR/[filename]

   说明:其中,DIR参数指定错误日志的路径filename参数是错误日志的名称,没有指定该参数时默认为主机名。重启mysql服务器即可生效。

删除错误日志:

   由于错误日志长时间记录会导致其文件的 增大,所以下面就使用日志滚动来将错误日志更新:

查看系统原来的错误日志文件内容:

[root@example.com ~]# ls -lh /data/mydata/example.com.err 
-rw-r----- 1 mysql root 7.5K 8月  31 09:25 /data/mydata/example.com.err
[root@example.com ~]# mv /data/mydata/example.com.err{,.old}
[root@example.com ~]# ls /data/mydata/example.com.err.old 
/data/mydata/example.com.err.old


登录服务器,执行日志滚动命令:

MariaDB [hellodb]> FLUSH LOGS;
Query OK, 0 rows affected (0.01 sec)

这样就可以看到错误日志文件已经更新:

[root@example.com ~]# ls -lh /data/mydata/example.com.err*
-rw-rw---- 1 mysql mysql    0 8月  31 15:35 /data/mydata/example.com.err
-rw-r----- 1 mysql root  7.5K 8月  31 09:25 /data/mydata/example.com.err.old


4、二进制日志

   二进制日志也叫作变更日志,主要用于记录修改数据或有可能引起数据改变的mysql语句,并且记录了语句发生时间、执行时长、操作的数据等等。所以说通过二进制日志可以查询mysql数据库中进行了哪些变化。一般大小体积上限为1G。实际中二进制日志可以根据实际的需求做出日志滚动,可以在达到1G滚动,还可以根据时间需要进行手动滚动日志,同时服务器在重启后也会发生日志滚动。

mysql二进制日志说明:

安装时默认路径是在数据目录内,文件名可以在配置文件中更改,建议在初始化时就定义好日志的名字,不建议其和数据放在同一块物理设备上。

[root@example.com ~]# ls /data/mydata/mysql-bin.*
/data/mydata/mysql-bin.000001  /data/mydata/mysql-bin.000004
/data/mydata/mysql-bin.000002  /data/mydata/mysql-bin.000005
/data/mydata/mysql-bin.000003  /data/mydata/mysql-bin.index

日志的格式属于二进制,故不能用文本方式来打开文件,需要用专门的命令mysqlbinlog来查看该文件。

[root@example.com ~]# file /data/mydata/mysql-bin.000001 
/data/mydata/mysql-bin.000001: MySQL replication log

说明:二进制日志记录的方法有两种即:位置 position和时间time。二进制日志的功用:即时点恢复和复制;

几个关于日志的命令:

查看当前系统所在记录的二进制文件:

MariaDB [hellodb]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |      365 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.02 sec)

手动执行滚动日志,执行此命令会滚动二进制日志和中继日志:

MariaDB [hellodb]> FLUSH LOGS;
Query OK, 0 rows affected (0.01 sec)

查看当前服务器中能被mysql所使用的二进制日志文件

MariaDB [hellodb]> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      2361 |
| mysql-bin.000002 |     13752 |
| mysql-bin.000003 |      2103 |
| mysql-bin.000004 |      1153 |
| mysql-bin.000005 |       365 |
+------------------+-----------+
5 rows in set (0.00 sec)

基于shell命令行查看

[root@example.com ~]# cat /data/mydata/mysql-bin.index 
./mysql-bin.000001
./mysql-bin.000002
./mysql-bin.000003
./mysql-bin.000004
./mysql-bin.000005

查看二进制文件所记录的内容:

MariaDB [hellodb]> SHOW BINLOG EVENTS IN ‘log_file‘;

基于指定位置之后查询:

MariaDB [hellodb]> SHOW BINLOG EVENTS IN ‘log_file‘  FROM "End_log_pos";

查看二进制文件除了可以在mysql的交互窗口进行查看外还可以使用mysqlbinlog命令在shell环境进行查看。

常用选项:

  • --start-time:起始时间

  • --stop-time:结束时间

  • --start-position:起始位置

  • --stop-position:结束位置

举例:

下面两种方法均可查看的指定位置之后的二进制文件:

[root@example.com ~]# mysqlbinlog --start-position 2015 /data/mydata/mysql-bin.000001
MariaDB [hellodb]> SHOW BINLOG EVENTS IN ‘mysql-bin.000001‘ FROM 2015;

MySQL记录二进制日志的格式:

  • 基于语句:默认的记录格式;

  • 基于行:定义的并非数据本身而是这一行的数据是什么;

  • 混合模式:交替使用行和语句、由mysql服务器自行判断。

注意:其中基于行的定义格式数据量会大一些但是可以保证数据的精确性。

二进制日志文件内容格式:

  • 事件发生的日期和时间

  • 服务器ID:server id 1

  • 事件的结束位置:end_log_pos

  • 事件的类型:Query

  • 原服务器生成此事件时的线程ID:thread_id=26

  • 语句的时间戳和写入二进制日志文件的时间差:exec_time=1 

  • 错误代码:error_code=0

  • 事件内容

  • 事件位置,相当于下一事件的开始位置

 服务器参数:

  • log_bin = {ON|OFF}:是否启用二进制日志,如果为mysqld设定了--log-bin选项,则其值为ON,否则则为OFF。

  • log_bin_trust_function_creators:用于控制创建存储函数时如果会导致不安全的事件记录二进制日志条件下是否禁止创建存储函数。

  • sql_log_bin = {ON|OFF}:用于控制二进制日志信息是否记录进日志文件。默认为ON,表示启用记录功能。

  • sync_binlog:设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次。

  • binlog_format = {statement|row|mixed}:指定二进制日志的类型,默认为STATEMENT。

  • max_binlog_cache_size : 二进制日志缓冲空间大小,仅用于缓冲事务类的语句;

  • max_binlog_stmt_cache_size:非事务的与事务语句缓冲的共用大小。

  • max_binlog_size :二进制日志文件上限。

 建议:切勿将二进制日志与数据文件放在一同设备。


5、中继日志

   主要是在mysql服务器的中从架构中的从服务器上用到的,当从服务器想要和主服务器进行数据的同步时,从服务器将主服务器的二进制日志文件拷贝到己的主机上放在中继日志中,然后调用SQL线程按照拷中继日志文件中的二进制日志文件执行以便就可达到数据的同步。

配置参数:(只在从服务器上开启)

  • relay-log=  指定中继日志的位置和名字 

  • relay-log-index=  指定中继日志的名字的索引文件的位置和名字 

  • relay_log_purge={ON|OFF}:是否自动清理不再需要中继日志


6、事务日志

   详细的记录了在什么时间发生了什么事,在哪个时间对哪些数据进行了改变,能后实现事件的重放,一般只记录对数据进行改变的操作,对于读操作一般不进行记录 

事务日志为数据库服务器实现以下功能:

  • 将随机IO转换为顺序IO,大大的提高了数据库的性能,存储的数据可能存在在磁盘的不同位置,降低了数据的读取和操作性能。转换为顺序IO的原理为,先将数据存放在日志文件中,然后由RDBSM的后台将日志中的数据存放到磁盘上,这样就保证了存储的数据是连续的。 

  • 为事件重放提供基础,事务日志详细的记录了时间发生的时间以及操作的数据对象,事务进程可以根据这些信息进行时间重放 默认的事务日志文件有两个,位于数据目录下以ibdata+number结尾的数字,我们可以对事务日志的位置、文件大小、增长方式进行定义,定义的方法如下: 

这里以使用支持事务的Innodb存储引擎为例 ,其相关参数:

  • innodb_data_home_dir = /innodata  定义存放事务日志的目录 

  • innodb_data_file_path = ibdata1:1024M  定义日志的名字和大小 

  • innodb_data_file_path = ibdata2:50M:autoextend  定义日志大小的增长方式


本文出自 “粗茶淡饭” 博客,请务必保留此出处http://cuchadanfan.blog.51cto.com/9940284/1691244

MySQL(十一)

标签:mysql、数据库

原文地址:http://cuchadanfan.blog.51cto.com/9940284/1691244

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!