日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复。
MySQL 日志类型:
主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;
错误日志
一般查询日志: DML, SELECT, 对于非常繁忙的数据库,会产生大量的日志
慢查询日志:执行时间很慢的查询操作,语句本身或者锁资源获取导致
二进制日志:DML, DDL, 任何可能引起数据库变化的操作,都会记录下来。
实现复制功能
实现即时点恢复
中继日志:
事务日志:ACID, 将随机ID转换为顺序ID
日志的启用、关闭是通过变量来控制的。但凡是跟文件相关操作的变量,都基本是静态的(不能通过 set 命令动态修改)。涉及到文件操作的,需要重启mysqld服务器。
错误日志:
在mysql数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在mysql数据库的数据目录(datadir)中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。
错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-err是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。
默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息。
总结一下,错误日志中记录的信息包括:
服务器启动和关闭过程中的信息
服务器运行过程中产生的错误信息
事件调度器(event)运行一个事件时产生的信息
在从服务器上如果启动了复制进程,复制进程的信息也会被记录
与错误日志相关的变量:
log_error = { PATH }
指定错误日志文件存放位置,默认保存在数据目录下,mysql用户必须对此目录有读写权限。 log_error 必须在配置文件中指定,并重启mysqld 服务器才会生效。
log_warnings = {0 | 1}
默认开启,服务器运行过程中产生的警告信息也会记录在错误日志中。
mysql> show global variables like ‘%log%‘; +-----------------------------------------+-----------------------------+ | Variable_name | Value | +-----------------------------------------+-----------------------------+ | back_log | 80 | | binlog_cache_size | 32768 | | binlog_checksum | CRC32 | | binlog_direct_non_transactional_updates | OFF | | binlog_format | STATEMENT | | binlog_max_flush_queue_time | 0 | | binlog_order_commits | ON | | binlog_row_image | FULL | | binlog_rows_query_log_events | OFF | | binlog_stmt_cache_size | 32768 | | expire_logs_days | 0 | | general_log | OFF | | general_log_file | /mydata/data/mysql.log | | innodb_api_enable_binlog | OFF | | innodb_flush_log_at_timeout | 1 | | innodb_flush_log_at_trx_commit | 1 | | innodb_locks_unsafe_for_binlog | OFF | | innodb_log_buffer_size | 8388608 | | innodb_log_compressed_pages | ON | | innodb_log_file_size | 50331648 | | innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | ./ | | innodb_mirrored_log_groups | 1 | | innodb_online_alter_log_max_size | 134217728 | | innodb_undo_logs | 128 | | log_bin | OFF | | log_bin_basename | | | log_bin_index | | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | log_error | /mydata/data/mysql.err | --定义错误日志 | log_output | FILE | | log_queries_not_using_indexes | OFF | | log_slave_updates | OFF | | log_slow_admin_statements | OFF | | log_slow_slave_statements | OFF | | log_throttle_queries_not_using_indexes | 0 | | log_warnings | 1 | --是否把警告信息写入错误日志 | max_binlog_cache_size | 18446744073709547520 | | max_binlog_size | 1073741824 | | max_binlog_stmt_cache_size | 18446744073709547520 | | max_relay_log_size | 0 | | relay_log | | | relay_log_basename | | | relay_log_index | | | relay_log_info_file | relay-log.info | | relay_log_info_repository | FILE | | relay_log_purge | ON | | relay_log_recovery | OFF | | relay_log_space_limit | 0 | | slow_query_log | ON | | slow_query_log_file | /mydata/data/mysql-slow.log | | sql_log_bin | ON | | sql_log_off | OFF | | sync_binlog | 0 | | sync_relay_log | 10000 | | sync_relay_log_info | 10000 | +-----------------------------------------+-----------------------------+ 57 rows in set (0.21 sec)
备份或删除错误日志:
在mysql5.5.7之前:数据库管理员可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法如下:mysqladmin –u root –p flush-logs ; 也可以使用登录mysql数据库中使用 FLUSHLOGS 语句来开启新的错误日志。
在mysql5.5.7之后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,然后手动冲洗日志创建一个新的:方式如下:
[root@mysql data]# mv mysql.err mysql.err.bak [root@mysql data]# mysqladmin -u root -p flush-logs Enter password: [root@mysql data]# ls auto.cnf ib_logfile0 mydb mysql.err mysql.pid performance_schema ibdata1 ib_logfile1 mysql mysql.err.bak mysql-slow.log stu
一般查询日志:
默认情况下是关闭的,否则将产生大量IO。对除了慢查询日志的其他所有查询信息都记录下来,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,这将对服务器产生极大的压力,会影响mysql的性能的。所以对于业务比较繁忙的服务器,强烈建议关闭该日志功能。
与一般查询日志相关的变量:
general_log = { ON | OFF }
启动或关闭查询日志,默认是关闭的。
general_log_file = { PATH }
指定查询日志的位置。
log_output = { TABLE | FILE | NONE }
指定一般查询日志的存储方式, 存储在表中或者文件中,或者同时指定二者。如果组合中出现了NONE,那么其它设定都将失效,同时,无论是否启用日志功能,也不会记录任何相关的日志信息
慢查询日志:
用来记录查询时间超过设定时长的查询语句,默认是关闭的。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。
慢查询的语句可能并非是语句执行的问题,也有可能是锁资源争用问题导致。
与慢查询相关的变量:
long_query_time = N
定义时长,超过多少秒被认定为慢查询,默认为10秒。时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中。其中这个慢查询时间并不是只表示语句自身执行超过10秒还包含由于其他资源被征用造成阻塞的查询执行时间或其他原因等都被记录到慢查询中。所以这个慢查的时长表示从查询开始到查询结束中间包含可能的任何原因所经历的所有时间。
log_query_not_using_indexes = {ON|OFF}
设定是否将没有使用索引的查询操作记录到慢查询日志
log_output = {TABLE|FILE|NONE}
定义一般查询日志和慢查询日志的保存方式,可以是TABLE、FILE、NONE,也可以是TABLE及FILE的组合(用逗号隔开),默认为FILE。如果组合中出现了NONE,那么其它设定都将失效,同时,无论是否启用日志功能,也不会记录任何相关的日志信息
slow_query_log = {ON | OFF}
是否开启慢查询日志,默认是关闭的
slow_query_log_file = {PATH}
定义慢查询日志存放路径,默认在数据目录下。如果不指定存储路径,慢查询日志默认存储到mysql数据库的数据文件下,如果不指定文件名,默认文件名为hostname-slow.log。
# vi /etc/my.cnf slow-query-log = ON long-query-time = 10 # service mysqld restart # mysql -u root -p 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 | ON | | slow_query_log_file | /mydata/data/mysql-slow.log | +---------------------------+-----------------------------+ 5 rows in set (0.00 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_waits_history_long_size | 10000 | +--------------------------------------------------------+-----------+ 4 rows in set (0.01 sec)
查看慢查询日志:
慢查询记录的格式为纯文本形式,所以可通过任何文本工具进行查看。如:vim, less, cat 等。
二进制日志
默认开启,DML, DDL 等等, 任何有可能引起数据库变化的操作,都会记录。
二进制日志文件的作用:
提供了增量备份的功能
即时点恢复:提供了数据基于时间点的恢复,这个恢复的时间点可以由用户控制
为mysql的复制架构提供基础,将这主服务器的二进制日志复制到从服务器上并执行同样的操作,就可将数据进行同步
二进制日志格式:
基于语句 statement : 默认的记录格式
基于行 row : 定义并非执行的SQL命令本身,而是表中的数据。
混合方式 mixed : 交替使用 row 和 statement , 具体由mysql服务器自行判断。
二进制日志事件:
position 基于位置
datetime 基于时间
与二进制日志相关变量:
sql_log_bin = {ON|OFF}
#用于控制二进制日志信息是否记录进日志文件。默认为ON,表示启用记录功能。用户可以在会话级别修改此变量的值,但其必须具有SUPER权限
binlog_cache_size = 32768
#默认值32768 Binlog Cache 用于在打开了二进制日志(binlog)记录功能的环境,是 MySQL 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域。一般来说,如果我们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择。但是如果我们的数据库大事务较多,写入量比较大,可与适当调高binlog_cache_size。同时,我们可以通过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了
binlog_stmt_cache_size = 32768
#当非事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句
log_bin = mysql-bin
#指定binlog的位置,默认在数据目录下,形式为 filename.number, number 形式为: 000001, 000002 等。。
binlog-
format
= {ROW|STATEMENT|MIXED}
#指定二进制日志的类型,默认为MIXED。如果设定了二进制日志的格式,却没有启用二进制日志,则MySQL启动时会产生警告日志信息并记录于错误日志中。
sync_binlog = 10
#设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次。当autocommit的值为1时,每条语句的执行都会引起二进制日志同步,否则,每个事务的提交会引起二进制日志同步
max_binlog_cache_size = {4096 .. 18446744073709547520}
#二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存,其上限由max_binlog_stmt_cache_size决定。
max_binlog_stmt_cache_size = {4096 .. 18446744073709547520}
#二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存
expire_log_days = {0..99}
#设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除。默认为0,表示不启用过期自动删除功能。如果启用此功能,自动删除工作通常发生在MySQL启动时或FLUSH日志时
每次重启mysql服务或运行mysql> flush logs;都会生成一个新的二进制日志文件,这些日志文件的number会不断地递增。除了生成上述的文件外还会生成一个名为filename.index的文件。这个文件中存储所有二进制日志文件的清单又称为二进制文件的索引。
# cd /mydata/data/ #ls -lh -rw-rw---- 1 mysql mysql 14K Aug 13 15:30 mysql-bin.000001 -rw-rw---- 1 mysql mysql 150 Aug 13 17:05 mysql-bin.000002 -rw-rw---- 1 mysql mysql 150 Aug 13 17:06 mysql-bin.000003 -rw-rw---- 1 mysql mysql 150 Aug 13 17:07 mysql-bin.000004 -rw-rw---- 1 mysql mysql 150 Aug 13 17:39 mysql-bin.000005 -rw-rw---- 1 mysql mysql 126 Aug 13 19:03 mysql-bin.000006 -rw-rw---- 1 mysql mysql 126 Aug 13 19:03 mysql-bin.000007 -rw-rw---- 1 mysql mysql 126 Aug 13 19:05 mysql-bin.000008 -rw-rw---- 1 mysql mysql 107 Aug 13 19:05 mysql-bin.000009 -rw-rw---- 1 mysql mysql 353 Oct 7 23:40 mysql-bin.000010 -rw-rw---- 1 mysql mysql 190 Oct 7 20:43 mysql-bin.index #cat mysql-bin.index ./mysql-bin.000001 ./mysql-bin.000002 ./mysql-bin.000003 ./mysql-bin.000004 ./mysql-bin.000005 ./mysql-bin.000006 ./mysql-bin.000007 ./mysql-bin.000008 ./mysql-bin.000009 ./mysql-bin.000010
二进制日志的查看与删除方式:
mysql> show binary logs; --显示当前服务器使用的二进制文件及大小 +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001| 13814 | | mysql-bin.000002| 150 | | mysql-bin.000003| 150 | | mysql-bin.000004| 150 | | mysql-bin.000005| 150 | | mysql-bin.000006| 126 | | mysql-bin.000007| 126 | | mysql-bin.000008| 126 | | mysql-bin.000009| 107 | | mysql-bin.000010| 353 | +------------------+-----------+ 10 rows in set (0.07sec) mysql> show master logs; --显示主服务器使用的二进制文件及大小 +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001| 13814 | | mysql-bin.000002| 150 | | mysql-bin.000003| 150 | | mysql-bin.000004| 150 | | mysql-bin.000005| 150 | | mysql-bin.000006| 126 | | mysql-bin.000007| 126 | | mysql-bin.000008| 126 | | mysql-bin.000009| 107 | | mysql-bin.000010| 353 | +------------------+-----------+ 10 rows in set (0.02sec) mysql> show master status; --当前使用的二进制文件及所处位置 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB |Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000010| 353 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00sec) --查看二进制日志记录的事件[from position] mysql> show binlog events in ‘mysql-bin.000001‘; +------------------+-----+-------------+-----------+-------------+----------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------+-----------+-------------+----------------------------------------------------+ | mysql-bin.000001 | 4 | Format_desc | 1 | 120 | Server ver: 5.6.16-log, Binlog ver: 4 | | mysql-bin.000001 | 120 | Query | 1 | 199 | BEGIN | | mysql-bin.000001 | 199 | Intvar | 1 | 231 | INSERT_ID=2 | | mysql-bin.000001 | 231 | Query | 1 | 343 | use `mydb`; insert into mytbl2(num) VALUES(324.23) | | mysql-bin.000001 | 343 | Xid | 1 | 374 | COMMIT /* xid=20 */ | +------------------+-----+-------------+-----------+-------------+----------------------------------------------------+ 5 rows in set (0.00 sec) mysql>flush logs; //二进制日志滚动 mysql>purge binary logs to ‘mysql-bin.000003‘; //删除二进制日志
文件系统中查看二进制日志的命令:
mysqlbinlog 相关选项, --start-position #开始位置 --stop-position #结束位置 --start-datetime ‘yyyy-mm-dd hh:mm:ss‘; #开始时间 --stop-datetime ‘‘; #结束时间
注:一般建议将binlog日志与数据文件分开存放,不但可以提高mysql性能,还可以增加安全性!
5.中继日志
说明:主要是在mysql服务器的中从架构中的从服务器上用到的,当从服务器想要和主服务器进行数据的同步时,从服务器将主服务器的二进制日志文件拷贝到己的主机上放在中继日志中,然后调用SQL线程按照拷中继日志文件中的二进制日志文件执行以便就可达到数据的同步
开启的方法:(只在从服务器上开启)
relay-log = file_name #指定中继日志的位置和名字,默认为host_name-relay-bin。也可以使用绝对路径,以指定非数据目录来存储中继日志
relay-log-index = file_name #指定中继日志的名字的索引文件的位置和名字,默认为数据目录中的host_name-relay-bin.index
relay-log-info-file = file_name #设定中继服务用于记录中继信息的文件,默认为数据目录中的relay-log.info
relay_log_purge = {ON|OFF} #设定对不再需要的中继日志是否自动进行清理。默认值为ON
relay_log_space_limit =
0
#设定用于存储所有中继日志文件的可用空间大小。默认为
0
,表示不限定。最大值取决于系统平台位数
max_relay_log_size = {
4096
..
1073741824
} #设定从服务器上中继日志的体积上限,到达此限度时其会自动进行中继日志滚动。此参数值为
0
时,mysqld将使用max_binlog_size参数同时为二进制日志和中继日志设定日志文件体积上限
说明:只要是针对二进制日志进行滚动的,对某个类型的日志文件滚动一次就生成一个新的相对应的日志文件,通过这种方法保证日志文件的特定大小,从而保证服务器在对日志文件查询时有较高的响应能力。
事务日志
说明:详细的记录了在什么时间发生了什么时候,在哪个时间对哪些数据进行了改变,能后实现事件的重放,一般只记录对数据进行改变的操作,对于读操作一般不进行记录。
使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。
事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的,我们通常称之为预写式日志,修改数据需要写两次磁盘。
如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。
事务日志为数据库服务器实现以下功能:
(1).将随机IO转换为顺序IO,大大的提高了数据库的性能,存储的数据可能存在在磁盘的不同位置,降低了数据的读取和操作性能。转换为顺序IO的原理为,先将数据存放在日志文件中,然后由RDBSM的后台将日志中的数据存放到磁盘上,这样就保证了存储的数据是连续的。
(2).为事件重放提供基础,事务日志详细的记录了时间发生的时间以及操作的数据对象,事务进程可以根据这些信息进行时间重放。
默认的事务日志文件有两个,位于数据目录下以ibdata+number结尾的数字,我们可以对事务日志的位置、文件大小、增长方式进行定义,定义的方法如下:
这里以使用支持事务的Innodb存储引擎为例,
innodb_data_home_dir =
/mydata/data
#InnoDB所有共享表空间数据文件的目录路径,默认在数据目录下
innodb_data_file_path = ibdata1:1024M
#指定InnoDB的各个数据文件及其大小,文件多于一个时彼此间用分号隔开
innodb_data_file_path = ibdata2:50M:autoextend
#定义数据大小的增长方式
innodb_log_group_home_dir =
/mydata/data
#设定InnoDB重要日志文件的存储目录。在缺省使用InnoDB日志相关的所有变量时,其默认会在数据目录中创建两个大小为5MB的名为ib_logfile0和ib_logfile1的日志文件
innodb_log_files_in_group = {2 .. 100}
#设定日志组中日志文件的个数。InnoDB以循环的方式使用这些日志文件。默认值为2
innodb_log_file_size = {108576 .. 4294967295}
#设定日志组中每个日志文件的大小,单位是字节,默认值是5MB。较为明智的取值范围是从1MB到缓存池体积的1/n,其中n表示日志组中日志文件的个数。日志文件越大,在缓存池中需要执行的检查点刷写操作就越少,这意味着所需的I/O操作也就越少,然而这也会导致较慢的故障恢复速度
innodb_log_buffer_size = {262144 .. 4294967295}
#设定InnoDB用于辅助完成日志文件写操作的日志缓冲区大小,单位是字节,默认为8MB。较大的事务可以借助于更大的日志缓冲区来避免在事务完成之前将日志缓冲区的数据写入日志文件,以减少I/O操作进而提升系统性能。因此,在有着较大事务的应用场景中,建议为此变量设定一个更大的值
mysql> SHOWGLOBAL VARIABLES LIKE ‘%log%‘; +-----------------------------------------+-----------------------------------+ | Variable_name | Value | +-----------------------------------------+-----------------------------------+ | innodb_flush_log_at_trx_commit | 1 | -- 在事务提交时innodb是否同步日志从缓冲到文件中:1表示事务以一提交就同步不提交每隔一秒同步一次,性能会很差造成大量的磁盘I/O;定义为2表示只有在事务提交时才会同步但是可能会丢失整个事务 |innodb_locks_unsafe_for_binlog |OFF | | innodb_log_buffer_size | 8388608 | |innodb_log_file_size |5242880 | | innodb_log_files_in_group | 2 | --至少有两个 |innodb_log_group_home_dir |./ | --定义innodb事务日志组的位置 |innodb_mirrored_log_groups |1 | --表示对日志组做镜像 每个事务日志都是大小为5兆的文件: #ls -lh -rw-rw---- 1 mysqlmysql 5.0M Oct 7 23:36 ib_logfile0 -rw-rw---- 1 mysqlmysql 5.0M Aug 12 01:06 ib_logfile1
本文出自 “Share your knowledge” 博客,请务必保留此出处http://skypegnu1.blog.51cto.com/8991766/1687849
原文地址:http://skypegnu1.blog.51cto.com/8991766/1687849