-
2021-01-18 21:10:06
日志文件类型
MySQL有几个不同的日志文件,可以帮助你找出mysqld内部发生的事情:
日志文件
记入文件中的信息类型
错误日志
记录启动、运行或停止mysqld时出现的问题。
查询日志
记录建立的客户端连接和执行的语句。
更新日志
记录更改数据的语句。不赞成使用该日志。
二进制日志
记录所有更改数据的语句。还用于复制。
慢日志
记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询。
默认情况下,所有日志创建于mysqld数据目录中。通过刷新日志,你可以强制 mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。当你执行一个FLUSH LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,出现日志刷新。
错误日志
错误日志文件包含了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。
如果mysqld莫名其妙地死掉并且mysqld_safe需要重新启动它,mysqld_safe在错误日志中写入一条restarted mysqld消息。如果mysqld注意到需要自动检查或着修复一个表,则错误日志中写入一条消息。
在一些操作系统中,如果mysqld死掉,错误日志包含堆栈跟踪信息。跟踪信息可以用来确定mysqld死掉的地方。
可以用--log-error[=file_name]选项来指定mysqld保存错误日志文件的位置。如果没有给定file_name值,mysqld使用错误日志名host_name.err并在数据目录中写入日志文件。如果你执行FLUSH LOGS,错误日志用-old重新命名后缀并且mysqld创建一个新的空日志文件。(如果未给出--log-error选项,则不会重新命名)。
如果不指定--log-error,或者(在Windows中)如果你使用--console选项,错误被写入标准错误输出stderr。通常标准输出为你的终端。
通用查询日志
如果你想要知道mysqld内部发生了什么,你应该用--log[=file_name]或-l [file_name]选项启动它。如果没有给定file_name的值, 默认名是host_name.log。所有连接和语句被记录到日志文件。当你怀疑在客户端发生了错误并想确切地知道该客户端发送给mysqld的语句时,该日志可能非常有用。
mysqld按照它接收的顺序记录语句到查询日志。这可能与执行的顺序不同。这与更新日志和二进制日志不同,它们在查询执行后,但是任何一个锁释放之前记录日志。(查询日志还包含所有语句,而二进制日志不包含只查询数据的语句)。
服务器重新启动和日志刷新不会产生新的一般查询日志文件(尽管刷新关闭并重新打开一般查询日志文件)。在Unix中,你可以通过下面的命令重新命名文件并创建一个新文件:
shell> mv hostname.log hostname-old.log
shell> mysqladmin flush-logs
shell> cp hostname-old.log to-backup-directory
shell> rm hostname-old.log
慢速查询日志
用--log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件。获得初使表锁定的时间不算作执行时间。
如果没有给出file_name值, 默认未主机名,后缀为-slow.log。如果给出了文件名,但不是绝对路径名,文件则写入数据目录。
语句执行完并且所有锁释放后记入慢查询日志。记录顺序可以与执行顺序不相同。
慢查询日志可以用来找到执行时间长的查询,可以用于优化。但是,检查又长又慢的查询日志会很困难。要想容易些,你可以使用mysqldumpslow命令获得日志中显示的查询摘要来处理慢查询日志。
在MySQL 5.1的慢查询日志中,不使用索引的慢查询同使用索引的查询一样记录。要想防止不使用索引的慢查询记入慢查询日志,使用--log-short-format选项。
在MySQL 5.1中,通过--log-slow-admin-statements服务器选项,你可以请求将慢管理语句,例如OPTIMIZE TABLE、ANALYZE TABLE和 ALTER TABLE写入慢查询日志。
用查询缓存处理的查询不加到慢查询日志中,因为表有零行或一行而不能从索引中受益的查询也不写入慢查询日志。
二进制日志
二进制文件介绍
二进制日志以一种更有效的格式,并且是事务安全的方式包含更新日志中可用的所有信息。
二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。
备注:二进制日志已经代替了老的更新日志,更新日志在MySQL 5.1中不再使用。
二进制文件的行为
二进制日志还包含关于每个更新数据库的语句的执行时间信息。它不包含没有修改任何数据的语句。如果你想要记录所有语句(例如,为了识别有问题的查询),你应使用一般查询日志。
二进制日志的主要目的是在恢复使能够最大可能地更新数据库,因为二进制日志包含备份后进行的所有更新。
二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。
运行服务器时若启用二进制日志则性能大约慢1%。但是,二进制日志的好处,即用于恢复并允许设置复制超过了这个小小的性能损失。
二进制文件的文件路径
当用--log-bin[=file_name]选项启动时,mysqld写入包含所有更新数据的SQL命令的日志文件。如果未给出file_name值, 默认名为-bin后面所跟的主机名。如果给出了文件名,但没有包含路径,则文件被写入数据目录。建议指定一个文件名.
如果你在日志名中提供了扩展名(例如,--log-bin=file_name.extension),则扩展名被悄悄除掉并忽略。
mysqld在每个二进制日志名后面添加一个数字扩展名。每次你启动服务器或刷新日志时该数字则增加。如果当前的日志大小达到max_binlog_size,还会自动创建新的二进制日志。如果你正使用大的事务,二进制日志还会超过max_binlog_size:事务全写入一个二进制日志中,绝对不要写入不同的二进制日志中。
为了能够知道还使用了哪个不同的二进制日志文件,mysqld还创建一个二进制日志索引文件,包含所有使用的二进制日志文件的文件名。默认情况下与二进制日志文件的文件名相同,扩展名为'.index'。你可以用--log-bin-index[=file_name]选项更改二进制日志索引文件的文件名。当mysqld在运行时,不应手动编辑该文件;如果这样做将会使mysqld变得混乱。
二进制日志选项
可以使用下面的mysqld选项来影响记录到二进制日志知的内容。又见选项后面的讨论。
·--binlog-do-db=db_name
告诉主服务器,如果当前的数据库(即USE选定的数据库)是db_name,应将更新记录到二进制日志中。其它所有没有明显指定的数据库被忽略。如果使用该选项,你应确保只对当前的数据库进行更新。
对于CREATE DATABASE、ALTER DATABASE和DROP DATABASE语句,有一个例外,即通过操作的数据库来决定是否应记录语句,而不是用当前的数据库。
一个不能按照期望执行的例子:如果用binlog-do-db=sales启动服务器,并且执行USE prices; UPDATE sales.january SET amount=amount+1000;,该语句不写入二进制日志。
·--binlog-ignore-db=db_name
告诉主服务器,如果当前的数据库(即USE选定的数据库)是db_name,不应将更新保存到二进制日志中。如果你使用该选项,你应确保只对当前的数据库进行更新。
一个不能按照你期望的执行的例子:如果服务器用binlog-ignore-db=sales启动,并且执行USE prices; UPDATE sales.january SET amount=amount+1000;,该语句不写入二进制日志。
类似于--binlog-do-db,对于CREATE DATABASE、ALTER DATABASE和DROP DATABASE语句,有一个例外,即通过操作的数据库来决定是否应记录语句,而不是用当前的数据库。
要想记录或忽视多个数据库,使用多个选项,为每个数据库指定相应的选项。
服务器根据下面的规则对选项进行评估,以便将更新记录到二进制日志中或忽视。请注意对于CREATE/ALTER/DROP DATABASE语句有一个例外。在这些情况下,根据以下规则,所创建、修改或删除的数据库将代替当前的数据库。
1.是否有binlog-do-db或binlog-ignore-db规则?
·没有:将语句写入二进制日志并退出。
·有:执行下一步。
2.有一些规则(binlog-do-db或binlog-ignore-db或二者都有)。当前有一个数据库(USE是否选择了数据库?)?
·没有:不要写入语句,并退出。
·有:执行下一步。
3.有当前的数据库。是否有binlog-do-db规则?
·有:当前的数据库是否匹配binlog-do-db规则?
o有:写入语句并退出。
o没有:不要写入语句,退出。
·No:执行下一步。
4.有一些binlog-ignore-db规则。当前的数据库是否匹配binlog-ignore-db规则?
·有:不要写入语句,并退出。
·没有:写入查询并退出。
例如,只用binlog-do-db=sales运行的服务器不将当前数据库不为sales的语句写入二进制日志(换句话说,binlog-do-db有时可以表示“忽视其它数据库”)。
如果你正进行复制,应确保没有从服务器在使用旧的二进制日志文件,方可删除它们。
更多相关内容 -
mysql正确安全清空在线慢查询日志slow log的流程分享
2020-09-10 16:40:19主要介绍了正确安全清空在线慢查询日志slow log的流程,需要的朋友可以参考下 -
MySQL 日志
2020-05-21 11:15:33MySQL日志记录了MySQL数据库日常操作和错误信息。MySQL有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到MySQL数据库的运行情况、用户的操作、错误的信息等。 MySQL的日志分为以下四大类: ...MySQL日志记录了MySQL数据库日常操作和错误信息。MySQL有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到MySQL数据库的运行情况、用户的操作、错误的信息等。
MySQL的日志分为以下四大类:
错误日志:记录mysql服务的启动,运行或停止mysql服务时出现的问题; 查询日志:记录建立的客户端的连接和执行的语句; 二进制日志:记录所有更改数据的语句,可以用于数据的复制; 慢查询日志:记录所有执行的时间超过long_query_time的所有查询或不使用索引的查询;
默认情况下,所有日志创建于MySQL数据目录中,通过刷新日志,可以强制MySQL关闭和重新打开日志文件,Flush logs刷新日志或者执行mysqladmin flush-logs 如果正使用MySQL复制功能,在复制服务器上可以维护更多日志文件,这种日志我们称为接替日志。启动日志功能会降低MySQL数据库的性能。
1)查看系统设置#查看全局的系统状态 mysql> show global variables\G mysql> show global variables like '%log%'; #查看当前会话的系统状态 mysql> show session variables\G mysql> show session variables like '%log%';
若要修改上面查看出来的参数,可以在MySQL的主配置文件中的mysqld字段中写入即可,如:binlog_cache_size = 1M。又或者可以在MySQL数据库中进行临时修改:set global binlog_cache_size = 1048576,这种临时修改在MySQL重启后就会失效。
2)查看运行状态#查看全局的运行状态= mysql> show global status\G #查看当前会话的运行状态 mysql> show session status; #查看MySQL的版本 [root@mysql ~]# mysql -V mysql> status; mysql> select version();
1、错误日志
在mysql数据库中,错误日志功能是默认开启的。默认情况下,错误日志存储在mysql数据库的数据目录中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。 错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-error是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息,MySQL有很多系统变量可以设置,系统变量设置不同,会导致系统运行状态的不同。因此mysql提供两组命令,分别查看系统设置和运行状态。一般而言,日志级别的定义没有会话变量都只是在全局级别下定义错误日志的状态:
mysql> show global variables like '%log_error%'; +---------------------+---------------------------------+ | Variable_name | Value | +---------------------+---------------------------------+ | binlog_error_action | ABORT_SERVER | | log_error | /usr/local/mysql/data/mysql.err | | log_error_verbosity | 3 | +---------------------+---------------------------------+ 3 rows in set (0.00 sec)
其中 log_error定义为错误日志文件路径 ,log_error_verbosity值得含义如下:
Verbosity Message 1 Error only 2 Error and warnings 3 Errors, warnings,and notes(default)
错误日志的存放路径在my.cnf的主配置文件中指定,如下:
[root@mysql ~]# cat /etc/my.cnf [client] socket=/usr/local/mysql/mysql.sock [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data pid-file=/usr/local/mysql/data/mysql.pid socket=/usr/local/mysql/mysql.sock log-error=/usr/local/mysql/data/mysql.err # 此行定义错误日志位置
为了方便维护需要,有时候会希望将错误日志中的内容做备份并重新开始记录,这时候就可以利用MySQL 的FLUSH LOGS 命令来告诉MySQL 备份旧日志文件并生成新的日志文件。备份文件名以“.old”结尾。
删除错误日志
在mysql5.5.7之前:数据库管理员可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法如下:mysqladmin –u root –p flush-logs也可以登录mysql数据库中使用FLUSH LOGS语句来开启新的错误日志。 在mysql5.5.7之后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的,方式如下:[root@mysql ~]# cd /usr/local/mysql/data/ [root@mysql data]# mv mysql.err{,.old} [root@mysql data]# mysqladmin -uroot -p flush-logs Enter password: #再次ls查看就会有一个新的mysql.err 文件诞生
2、二进制日志
二进制日志主要记录MySQL数据库的变化,二进制日志以一种有效的格式,并且是事务安全的方式包含更新日志中可用的信息。二进制日志包含了所有更新了数据或者已经潜在更新了数据。还包含关于每个更新数据库的语句的执行时间,它不包含没有修改任何数据的语句。使用二进制日志的主要目的是最大可能地恢复数据库。
1)启动二进制日志(默认情况下二进制日志是关闭的)[root@mysql ~]# vim /etc/my.cnf [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data pid-file=/usr/local/mysql/data/mysql.pid socket=/usr/local/mysql/mysql.sock log-error=/usr/local/mysql/data/mysql.err port=3306 server_id=1 log-bin=/usr/local/mysql/data/binary_log #指定二进制日志的路径及名称 expire_logs_days=10 #清除日志的天数 max_binlog_size=100M #单个日志文件的大小限制,超出会新建一个日志文件 [root@mysql ~]# systemctl restart mysqld [root@mysql ~]# ll /usr/local/mysql/data/ | grep binary -rw-r----- 1 mysql mysql 154 May 20 15:57 binary_log.000001 -rw-r----- 1 mysql mysql 40 May 20 15:57 binary_log.index
注:在开启二进制日志时需要在my.cnf中指定server_id,否则回启动失败,日志文件中也只是会报一个警告,而不会报错
登录到数据库中也可以查看到,如下:
2)查看二进制日志
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 | +-------------------+-----------+ | binary_log.000001 | 154 | +-------------------+-----------+ 1 row in set (0.00 sec)
也可以退出MySQL在命令行使用mysqlbinlog命令查看:
[root@mysql data]# mysqlbinlog binary_log.000001
3)删除二进制日志
MySQL的二进制文件可以配置自动删除,同时MySQL提供了手动删除二进制文件的方法:
RESET MASTER:删除所有的二进制日志文件;
PURGE MASTER LOGS:只删除部分二进制日志文件;
Reset master:删除所有二进制日志 ;
Purge master logs to ‘二进制名’ :删除单个二进制日志之前的。mysql> purge master logs to "binary_log.000003"; #删除...03之前的二进制日志文件 mysql> purge master logs before '20180101'; #删除2018-01-01之前的日志文件
4)通过二进制日志还原MySQL数据
参考博文:mysql备份与恢复
3、事务日志
事务日志(InnoDB特有的日志,因为只有Innodb支持事务)可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的。 如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。
1)查看事务日志的定义mysql> show global variables like 'innodb_lo%';
在上述指令输出的部分内容解释如下:
| innodb_flush_log_at_trx_commit | 1 #在事务提交时innodb是否同步日志从缓冲区到文件
中,当这个值为1(默认值)之时,在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新,性能会很差造成大量的磁盘I/O但这种方式最安全;如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒一定都会刷到磁盘,这要取决于进程的调度。每次事务提交的时候将数据写入事务日志,而这里的写入仅是调用了文件系统的写入操作,而文件系统是有缓存的,所以这个写入并不能保证数据已经写入到物理磁盘。设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作。
注:刷写的概念
刷写其实是两个操作,刷(flush)和写(write),区分这两个概念是很重要的。在大多数的操作系统中,把Innodb的log buffer(内存)写入日志(调用系统调用write),只是简单的把数据移到操作系统缓存中,操作系统缓存同样指的是内存。并没有实际的持久化数据。所以,通常设为0和2的时候,在崩溃或断电的时候会丢失最后一秒的数据,因为这个时候数据只是存在于操作系统缓存。之所以说“通常”,可能会有丢失不只1秒的数据的情况,比如说执行flush操作的时候阻塞了。
总结
设为1当然是最安全的,但性能页是最差的(相对其他两个参数而言,但不是不能接受)。如果对数据一致性和完整性要求不高,完全可以设为2,如果只最求性能,例如高并发写的日志服务器,设为0来获得更高性能。+--------------------------------+----------+ | Variable_name | Value | +--------------------------------+----------+ | innodb_lock_wait_timeout | 50 | | 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 | innodb_log_write_ahead_size | 8192 | +--------------------------------+----------+
每个事务日志都是大小为50兆的文件(不同版本的mysql有差异): 在mysql中默认以ib_logfile0,ib_logfile1名称存在。
4、慢查询日志(slow query log)
顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slow query。 慢查询日志采用的是简单的文本格式,可以通过各种文本编辑器查看其中的内容。其中 记录了语句执行的时刻,执行所消耗的时间,执行用户,连接主机等相关信息。 慢查询日志的作用: 慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。MySQL 还提供了专门用来分析满查询日志的工具程序mysqldumpslow,用来帮助数据库管理人员解决可能存在的性能问题。
1)查看慢查询日志的定义
注:在不同的mysql版本中,开启慢查询日志参数不太一样,不过都可以通过 show variables like “%slow%” 和show variables like "%long%"查看出来。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.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_transactions_history_long_size | 10000 | | performance_schema_events_waits_history_long_size | 10000 | +----------------------------------------------------------+-----------+ 5 rows in set (0.00 sec) #在上面的结果中,long_query_time的值就是慢查询超时时间, 默认为10s,只要执行耗时超过10s的语句就被定义为慢查询语句
2)启动和设置慢查询日志
启动慢查询日志记录:方法1:通过配置文件my.cnf开启慢查询日志:
[root@mysql data]# vim /etc/my.cnf slow_query_log=1 # 1表示开启慢查询 slow_query_log_file=/usr/local/mysql/data/mysql-slow.log #指定慢查询日志位置 long_query_time=0.0001 #指定超时时间,也就是超过这个时间就会被记录到慢查询日志 slow_launch_time=1 #如果建立线程花费了比这个值更长的时间,slow_launch_threads计数器将增加 [root@mysql ~]# systemctl restart mysqld #重启服务使配置生效
再次登录数据库查看相关信息,会发现更改已经生效,如下:
方法2:通过登录MySQL服务器直接定义,方式如下:mysql> set global slow_query_log=1; mysql> set global long_query_time=0.0001;
在上面的定义中,global表示全局生效,还有一个选项是session,表示仅在当前会话生效,其区别是,session在退出当前会话后就会被重置,global则是在重启MySQL服务后才会被重置,而方法1中写入配置文件中的方法,则是真正的永久生效。
注意:如果主配置文件中定义了long_query_time的值,并且MySQL命令行中使用set指令又定义了long_query_time的值,则配置文件中定义的值优先生效。
修改后的相关设置如下:
在终端命令行使用mysqldumpslow命令工具查看慢查询日志:
若想要查询到慢查询日志,必须保证两点,首先是将慢查询的超时时间设置的短一些,比如我在上面设置为了0.0001,只要查询的时间超过了这个值,则被定义为慢查询。(为了验证效果,在生产环境中还是要结合实际情况)。第二呢,就是在开启慢查询后还需要执行几条查询语句,以便产生日志记录信息(自己随便查询两句吧)。
mysqldumpslow指令的部分选项解释:
使用选项查看慢查询日志:[root@mysql data]# mysqldumpslow -t 2 -a -s c mysql-slow.log #以次数来排序,查询前两条,并且显示语句的所有内容
5、数据文件
在MySQL 中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中各种表数据文件。不同的MySQL 存储引擎有各自不同的数据文件。如MyISAM 用“.MYD”作为扩展名,Innodb 用“.ibd”,Archive 用“.arc”,CSV 用“.csv”,等等。“.frm”文件 与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定义信息等。不论是什么存储引擎(MySQL常用的两个存储引擎是MyISAM和InnoDB),每一个表都会有一个以表名命名的“.frm”文件。所有的“.frm”文件都存放在所属数据库的文件夹下面。
MyISAM数据库表文件.MYD文件:表数据文件;.MYI文件:索引文件 “.MYD”文件 “.MYD”文件是MyISAM存储引擎专用,存放MyISAM 表的数据。每一个MyISAM 表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起 “.MYI”文件 “.MYI”文件也是专属于MyISAM 存储引擎的,主要存放MyISAM 表的索引相关信息。对于MyISAM 存储来说,可以被cache 的内容主要就是来源于“.MYI”文件中。每 一个MyISAM 表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。
Innodb数据库表文件
InnoDB采用表空间(tablespace)来管理数据,存储表数据和索引。
.ibd文件:单表表空间文件,每个表使用一个表空间文件(file per table),存放用户数据库表数据和索引。
InnoDB共享表空间(即InnoDB文件集,ibfile set):ibdata1、ibdata2等,存储InnoDB系统信息和用户数据库表数据和索引,所有表共用。
“.ibd”文件和ibdata 文件 这两种文件都是存放Innodb 数据的文件,之所以有两种文件来存放Innodb 的数据(包括索引),是因为Innodb 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。独享表空间存储方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件,文件存放在和MyISAM数据相同的位置。
如果选用共享存储表空间来存放数据,则会使用ibdata 文件来存放,所有表共同使用一个
(或者多个,可自行配置)ibdata 文件。 ibdata 文件可以通过innodb_data_home_dir 和innodb_data_file_path两个参数共同配置组成, innodb_data_home_dir 配置数据存放的总目录, 而innodb_data_file_path 配置每一个文件的名称。 innodb_data_file_path 中可以一次配置多个ibdata 文件。文件可以是指定大小,也可以是自动扩展的,但是Innodb 限制了仅仅只有最后一个ibdata 文件能够配置成自动扩展类型。当我们需要添加新的ibdata 文件的时候,只能添加在innodb_data_file_path配置的最后,而且必须重启MySQL 才能完成ibdata 的添加工作。不过如果我们使用独享表空间存储方式的话,就不会有这样的问题
总结
共享表空间以及独占表空间都是针对数据的存储方式而言的。 共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中。 独占表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。其中这个文件包括了单独一个表的数据内容以及索引内容。两者之间的优缺点
共享表空间:
优点: 可以放表空间分成多个文件存放到各个磁盘上。数据和文件放在一起方便管理。
缺点: 所有的数据和索引存放到一个文件中,多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。
独立表空间:
优点:每个表都有自已独立的表空间。
每个表的数据和索引都会存在自已的表空间中。
可以实现单表在不同的数据库中移动。
空间可以回收
a) Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。
b)对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
缺点: 单表增加过大,如超过100个G。 相比较之下,使用独占表空间的效率以及性能会更高一点。
1)查看当前数据库的表空间管理类型mysql> show variables like '%innodb_file_per%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.00 sec)
ON代表独立表空间管理,OFF代表共享表空间管理;(查看单表的表空间管理方式,需要查看每个表是否有单独的数据文件)。
2)修改为Innodb共享表空间[root@mysql data]# vim /etc/my.cnf innodb_file_per_table=0 #0为使用共享表空间,1为独占表空间 innodb_data_file_path=ibdata1:100M:autoextend #设置一个可自动扩展大小,尺寸为100M的数据文件 innodb_data_home_dir=/usr/local/mysql/data #定义共享表空间默认存放路径 [root@mysql ~]# systemctl restart mysqld #启动报错了 Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
查看日志如下:
注:不同版本的mysql报错略有不同,注意看错误日志的内容。大概意思就是设置的pages页为6400,超过了它的最大值4864,那么算一下,设置的初始大小100M,pages大小就是6400,则表示1M=64pages,它的最大值是4864,也就是说,我们设置初始大小最大可以是4864/64=76M。
再次修改配置文件如下:[root@mysql ~]# vim /etc/my.cnf #再次修改主配置文件 innodb_data_file_path=ibdata1:76M:autoextend #修改初始大小为76M [root@mysql ~]# systemctl restart mysqld #再次重启MySQL服务 #同样,如果还是启动失败,则再次查看错误日志,是否pages页大小设置的还是不合理
3)查看修改后数据库的表空间管理类型
-
MySQL8.0 日志
2022-02-20 10:41:55MySQL日志记录了MySQL数据库日常操作和错误信息。MySQL有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到MySQL数据库的运行情况、用户操作、错误信息等,可以为MySQL管理和优化提供必要的...MySQL日志记录了MySQL数据库日常操作和错误信息。MySQL有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到MySQL数据库的运行情况、用户操作、错误信息等,可以为MySQL管理和优化提供必要的信息。对于MySQL的管理工作而言,这些日志文件是不可缺少的。
PART1. 日志简介
MySQL 日志主要分4类,使用这些日志文件,可以查看MySQL内部发生的事情
1)错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题。
2)查询日志:记录建立的客户端连接和执行的语句。
3)二进制日志:记录所有更改数据的语句,可以用于数据复制。
4)慢查询日志:记录所有执行时间超过long_query_time 的所有查询或不使用索引的查询。
默认情况下,所有日志创建于MySQL数据目录中。通过刷新日志,可以强制MySQL关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。当执行一个FLUSH LOGS语句或执行MySQLadmin flush-logs或MySQLadmin refresh时,将刷新日志。
如果正使用MySQL复制功能,在复制服务器上可以维护更多日志文件,这种日志称为接替日志。
启动日志功能会降低MySQL数据库的性能。例如,在查询非常频繁的MySQL数据库系统中,如果开启了通过查询日志和慢查询日志,MySQL数据库会花费很多时间记录日志。同时,日志会占用大量的磁盘空间。
PART2. 二进制日志
二进制日志主要记录MySQL数据库的变化。二进制日志以一种有效的格式并且是事务安全的方式包含更新日志中可用的所有信息。二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的语句。语句以“事件”的形式保存,描述数据更改。
二进制日志还包含关于每个更新数据库的语句的执行时间信息。它不包含没有修改任何数据的语句。如果想要记录所有语句(例如,为了识别有问题的查询),需要使用一般查询日志。使用二进制日志的主要目的时最大可能地恢复数据库,因为二进制日志包含备份后进行的所有更新。
1. 启动和设置二进制日志
默认情况下,二进制日志是开启的,可以通过修改MySQL的配置文件来启动和设置二进制日志。
my.ini中[MySQLd]组下面有关于二进制日志的设置:
log-bin [=path/ [filename]]
log-bin定义开启二进制日志;path表明日志文件所在的目录路径;filename指定了日志文件的名称,如文件的全名为filename.000001、filename.000002等,除了上述文件之外,还有一个名为filename.index的文件,文件内容为所有日志的清单,可以使用记事本打开该文件。
expire_logs_days 定义了MySQL清除过期日志的时间,即二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。当MySQL启动或刷新二进制日志时可能删除该文件。
max_binlog_size定义了单个文件的大小限制,如果二进制日志写入的内容大小超出给定值,日志就会发生回滚(关闭当前日志,重新打开一个新的日志文件)。不能将该变量设置为大于1GB或小于4960B,默认是1GB。
如果正在使用大的事务,二进制日志文件大小还可能会超过max_binlog_size 定义的大小。
在my.ini 配置文件中的[MySQLd]组下,添加以下几个参数与参数值:
[mysqld] log-bin expire_logs_days = 10 man_binlog_size = 100M
添加完毕之后,关闭并重新启动MySQL服务进程,即可打开二进制日志,然后可以通过show variables 语句来查询日志设置。
通过上面的查询结果可以看出,log_bin变量的值为ON,表明二进制日志已经打开。MySQL重新启动之后,读者可以在自己机器上的MySQL数据文件夹下面看到新生成的文件后缀为.000001和.index的两个文件,文件名称为默认主机名称。
注意:数据库文件最好不要与日志文件放在同一个磁盘上,这样当数据库文件所在的磁盘发生故障时,可以使用日志文件恢复数据。
2. 查看二进制日志
MySQL二进制日志存储了所有的变更信息,MySQL二进制日志是经常用到的。当MySQL创建二进制日志文件时,先创建一个以“filename”为名称、以“.index”为后缀的文件,再创建一个以“filename”为名称,以“.000001”为后缀的文件。MySQL服务重新启动一次,以“.000001”为后缀的文件会增加一个,并且后缀名加1递增;如果日志长度超过了max_binlog_size的上限(默认是1GB),就会创建一个新的日志文件。
show binary logs语句可以查看当前的二进制日志文件个数及其文件名。MySQL二进制日志并不能直接查看,如果要查看日志内容,可以通过MySQLbinlog命令查看。
3. 删除二进制日志
MySQL的二进制文件可以配置自动删除,同时MySQL也提供了安全的手动删除二进制文件的方法:RESET MASTER删除所有二进制日志文件;PURGE MASTER LOGS只删除部分二进制日志文件。
1. 使用RESET MASTER语句删除所有二进制日志文件
RESET MASTER;
执行完该语句后,所有二进制日志将被删除,MySQL会重新创建二进制日志,新的日志文件扩展名将重新从000001开始编号。
2. 使用PUGRE MASTER LOGS语句删除指定日志文件
PURGE MASTER LOGS 语法如下:
PURGE [MASTER | BINARY] LOGS TO 'log_name' PURGE [MASTER | BINARY] LOGS BEFORE 'date'
第一种方法指定文件名,执行该命令将删除文件名编号比指定文件名编号小的所有日志文件。第二种方法指定日期,执行该命令将删除指定日期以前的所有日志文件。
4. 使用二进制日志恢复数据库
如果MySQL服务器启用了二进制日志,在数据库出现意外丢失数据时,可以使用MySQLbinlog工具从指定的时间点开始(例如,最后一次备份)直到现在,或另一个指定的时间点的日志中恢复数据。
要想从二进制日志恢复数据,需要知道当前二进制日志文件的路径和文件名,一般可以从配置文件(my.cnf或者my.ini,文件名取决于MySQL服务器的操作系统)中找到路径。
MySQLbinlog恢复数据的语法如下:
mysqlbinlog [option] filename |mysql -uuser -ppass
option是一些可选的选项,filename是日志文件名。比较重要的两对option参数是--start-date、--stop-date和--start-position、--stop-position。--start-date、--stop-date可以指定恢复数据库的起始时间点和结束时间点。--start-position、--stop-position可以指定恢复数据的开始位置和结束位置。
5. 暂时停止二进制日志功能
如果在MySQL的配置文件中配置启动了二进制日志,MySQL会一直记录二进制日志。修改配置文件,可以停止二进制日志,但是需要重启MySQL数据库。MySQL提供了暂时停止二进制日志的功能。通过SET SQL_LOG_BIN语句可以使用MySQL暂停或者启动二进制日志。
SET sql_log_bin = {0|1} SET sql_log_bin = 0;--暂停记录二进制日志 SET sql_log_bin = 1;--恢复记录二进制日志
PART3 错误日志
错误日志文件包含了当MySQLd启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。在MySQL中,错误日志也是非常有用的,MySQL会将启动和停止数据库信息以及一些错误信息记录到错误日志文件中。
1. 启动和设置错误日志
在默认情况下,错误日志会记录到数据库的数据目录下。如果没有在配置文件中指定文件名,则文件名默认为hostname.err。例如,MySQL所在的服务器主机名为MySQL-db,记录错误信息的文件名为MySQL-db.err。如果执行了FLUSH LOGS,错误日志会重新加载。
错误日志的启动和停止以及指定日志文件名都可以通过修改my.ini(或者my.cnf)来配置。错误日志的配置项时log-error。在[MySQLd]下配置log-error,则启动错误日志。如果需要指定文件名,则配置项如下:
[mysqld] log-error=[path / [file_name]]
path为日志文件所在的目录路径,file_name为日志文件名。修改配置项后,需要重启MySQL服务以生效。
2. 查看错误日志
通过错误日志可以监视系统的运行状态,便于及时发现故障、恢复故障。MySQL错误日志是以文本文件形式存储的,可以使用文本编辑器直接查看MySQL错误日志。
如果不知道日志文件的存储路径,可以使用SHOW VARIABLES 语句查询错误日志的存储路径。SHOW VARIABLES语句如下:
SHOW VARIABLES LIKE 'log_error';
3. 删除错误日志
MySQL的错误日志是以文本文件的形式存储在文件系统中的,可以直接删除。
对于MySQL5.5.7以前的版本,flush logs可以将错误日志文件重命名为filename.err_old,并创建新的日志文件。但是从MySQL5.5.7开始,flush logs只是重新打开日志文件,并不做日志备份和创建的操作。如果日志文件不存在,MySQL启动并不会自动创建日志文件。flush logs在重新加载日志的时候,如果日志不存在,则会自动创建。所以在删除错误日志之后,如果需要重建日志文件需要在服务器执行如下命令:
mysqladmin -u root -p flush-logs
或者在客户端登录MySQL数据库,执行flush logs语句:
flush logs;
PART4. 通用查询日志
通过查询日志记录MySQL的所有用户操作,包括启动和关闭服务、执行查询和更新语句等。
1. 启动通用查询日志
MySQL服务器默认情况下并没有开启通用查询日志。通过show variables like '%general%'; 语句可以查询当前日志的状态。
开启通用日志的方法:
set @@global.general_log = 1;
关闭通用日志:
set @@global.general_log=0;
2. 查看通用查询日志
通用查询日志中记录了用户的所有操作。通过查看通用查询日志,可以了解用户对MySQL进行的操作。通过查询日志是以文本文件的形式存储在文件系统中的。
3. 删除通用查询日志
通过查询日志是以文本文件的形式存储在文件系统中。通过查询日志记录用户的所有操作,因此在用户查询、更新频繁的情况下,通用查询日志会增长得很快。数据库管理员可以定期删除比较早的通用日志,以节省磁盘空间。本小节将介绍通用日志的删除方法。
可以直接删除日志文件的方式删除通用查询日志。要重新建立新的日志文件,可使用语句MySQLadmin-flush logs。
PART5 慢查询日志
慢查询日志是记录查询时长超过指定时间的日志。慢查询日志主要用来记录执行时间较长的查询语句。通过慢查询日志,可以找出执行时间较长、执行效率较低的语句,然后进行优化。
1. 启动和设置慢查询日志
MySQL中慢查询日志默认是关闭的,可以通过配置文件my.ini 或者my.cnf 中的log-slow-queries 选项打开,也可以在MySQL服务启动的时候使用--log-slow-queries[=file_name]启动慢查询日志。启动慢查询日志时,需要在my.ini 或者 my.cnf 文件中配置long_query_time 选项指定记录阈值,如果某条查询语句的查询时间超过了这个值,这个查询过程将被记录到慢查询日志文件中。
[mysqld] log-slow-queries[=path/[filename]] long_query_time=n
在my.ini 或者my.cnf 开启慢查询日志的配置如下:
path 为日志文件所在目录路径,filename 为日志文件名。如果不指定目录和文件名称,默认存储在数据目录中,文件为hostname-slow.log,hostname是MySQL服务器的主机名。参数n 是时间值,单位是秒。如果没有设置long_query_time选项,默认时间为10秒。
2. 查看慢查询日志
MySQL的慢查询日志是以文本形式存储的,可以直接使用文本编辑器查看。在慢查询日志中,记录着执行时间较长的查询语句,用户可以从慢查询日志中获取执行效率较低的查询语句,为查询优化提供重要的依据。
注意:借助慢查询日志分析工具,可以更加方便地分析慢查询语句。比较著名的慢查询工具有MySQL Dump Slow、MySQL SLA、MySQL Log Filter、MyProfi。关于这些慢查询分析工具的用法,可以参考相关软件的帮助文档。
3. 删除慢查询日志
和通用查询日志一样,慢查询日志也可以直接删除。删除后在不重启服务器的情况下,需要执行MySQLadmin -u root-p flush-logs 重新生成日志文件,或者在客户端登录到服务器执行flush logs语句重建日志文件。
PART6 MySQL8.0 的新特性——日志分类更详细
在MySQL8.0版本中,日志分类将更加详细。例如,在错误信息中添加了错误信息编号[MY-010311]和错误所属子系统[Server]。
-- end
-
MySQL中的日志
2022-03-13 14:53:27错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何 严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。 查询日志 查询日志...文章目录
前言
MySQL日志记录了MySQL数据库日常操作和错误信息。MySQL有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到MySQL数据库的运行情况、用户的操作、错误的信息等。
MySQL的日志分为以下四大类:
错误日志:记录mysql服务的启动,运行或停止mysql服务时出现的问题;
查询日志:记录建立的客户端的连接和执行的语句;
二进制日志:记录所有更改数据的语句,可以用于数据的复制;
慢查询日志:记录所有执行的时间超过long_query_time的所有查询或不使用索引的查询;默认情况下,所有日志创建于MySQL数据目录中,通过刷新日志,可以强制MySQL关闭和重新打开日志文件,Flush logs刷新日志或者执行mysqladmin flush-logs 如果正使用MySQL复制功能,在复制服务器上可以维护更多日志文件,这种日志我们称为接替日志。启动日志功能会降低MySQL数据库的性能。
1)查看系统设置#查看全局的系统状态
mysql> show global variables\G
mysql> show global variables like ‘%log%’;
#查看当前会话的系统状态
mysql> show session variables\G
mysql> show session variables like ‘%log%’;若要修改上面查看出来的参数,可以在MySQL的主配置文件中的mysqld字段中写入即可,如:binlog_cache_size = 1M。又或者可以在MySQL数据库中进行临时修改:set global binlog_cache_size = 1048576,这种临时修改在MySQL重启后就会失效。
2)查看运行状态#查看全局的运行状态=
mysql> show global status\G
#查看当前会话的运行状态
mysql> show session status;
#查看MySQL的版本
[root@mysql ~]# mysql -V
mysql> status;
mysql> select version();错误日志
错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何
严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。
错误日志存储在mysql数据库的数据目录中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。 错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-error是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息,MySQL有很多系统变量可以设置,系统变量设置不同,会导致系统运行状态的不同。因此mysql提供两组命令,分别查看系统设置和运行状态。
一般而言,日志级别的定义没有会话变量都只是在全局级别下定义错误日志的状态:
mysql> show global variables like ‘%log_error%’;
±--------------------±--------------------------------+
| Variable_name | Value |
±--------------------±--------------------------------+
| binlog_error_action | ABORT_SERVER |
| log_error | /usr/local/mysql/data/mysql.err |
| log_error_verbosity | 3 |
±--------------------±--------------------------------+
3 rows in set (0.00 sec)其中 log_error定义为错误日志文件路径 ,log_error_verbosity值得含义如下:
Verbosity Message
1 Error only
2 Error and warnings
3 Errors, warnings,and notes(default)错误日志的存放路径在my.cnf的主配置文件中指定,如下:
[root@mysql ~]# cat /etc/my.cnf
[client]
socket=/usr/local/mysql/mysql.sock
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
pid-file=/usr/local/mysql/data/mysql.pid
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/mysql.err # 此行定义错误日志位置为了方便维护需要,有时候会希望将错误日志中的内容做备份并重新开始记录,这时候就可以利用MySQL 的FLUSH LOGS 命令来告诉MySQL 备份旧日志文件并生成新的日志文件。备份文件名以“.old”结尾。
删除错误日志
在mysql5.5.7之前:数据库管理员可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法如下:mysqladmin –u root –p flush-logs也可以登录mysql数据库中使用FLUSH LOGS语句来开启新的错误日志。 在mysql5.5.7之后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的,方式如下:[root@mysql ~]# cd /usr/local/mysql/data/
[root@mysql data]# mv mysql.err{,.old}
[root@mysql data]# mysqladmin -uroot -p flush-logs
Enter password:
#再次ls查看就会有一个新的mysql.err 文件诞生查询日志
查询日志中记录了客户端的所有操作语句,而二进制日志不包含查询数据的SQL语句。
慢查询日志
慢查询日志记录了所有执行时间超过参数 long_query_time 设置值并且扫描记录数不小于
min_examined_row_limit 的所有的SQL语句的日志。long_query_time 默认为 10 秒,最小为 0, 精度可以到微
秒。
慢查询日志中记录的是执行时间较长的query,也就是我们常说的slow query。 慢查询日志采用的是简单的文本格式,可以通过各种文本编辑器查看其中的内容。其中 记录了语句执行的时刻,执行所消耗的时间,执行用户,连接主机等相关信息。 慢查询日志的作用: 慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。MySQL 还提供了专门用来分析满查询日志的工具程序mysqldumpslow,用来帮助数据库管理人员解决可能存在的性能问题。
1)查看慢查询日志的定义
注:在不同的mysql版本中,开启慢查询日志参数不太一样,不过都可以通过 show variables like “%slow%” 和show variables like "%long%"查看出来。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.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_transactions_history_long_size | 10000 |
| performance_schema_events_waits_history_long_size | 10000 |
±---------------------------------------------------------±----------+
5 rows in set (0.00 sec)
#在上面的结果中,long_query_time的值就是慢查询超时时间,
默认为10s,只要执行耗时超过10s的语句就被定义为慢查询语句启动和设置慢查询日志
启动慢查询日志记录:方法1:通过配置文件my.cnf开启慢查询日志:
[root@mysql data]# vim /etc/my.cnf
slow_query_log=1 # 1表示开启慢查询
slow_query_log_file=/usr/local/mysql/data/mysql-slow.log #指定慢查询日志位置
long_query_time=0.0001 #指定超时时间,也就是超过这个时间就会被记录到慢查询日志
slow_launch_time=1 #如果建立线程花费了比这个值更长的时间,slow_launch_threads计数器将增加
[root@mysql ~]# systemctl restart mysqld #重启服务使配置生效再次登录数据库查看相关信息,会发现更改已经生效,
方法2:通过登录MySQL服务器直接定义,方式如下:mysql> set global slow_query_log=1;
mysql> set global long_query_time=0.0001;在上面的定义中,global表示全局生效,还有一个选项是session,表示仅在当前会话生效,其区别是,session在退出当前会话后就会被重置,global则是在重启MySQL服务后才会被重置,而方法1中写入配置文件中的方法,则是真正的永久生效。
注意:如果主配置文件中定义了long_query_time的值,并且MySQL命令行中使用set指令又定义了long_query_time的值,则配置文件中定义的值优先生效。在终端命令行使用mysqldumpslow命令工具查看慢查询日志:
若想要查询到慢查询日志,必须保证两点,首先是将慢查询的超时时间设置的短一些,比如我在上面设置为了0.0001,只要查询的时间超过了这个值,则被定义为慢查询。二进制日志(binlog)
二进制日志(BINLOG)记录了所有的 DDL(data define language数据定义语言)语句和 DML(data manage language数据操纵语言 insert 等)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制, 就是通过该binlog实现的。
二进制日志主要记录MySQL数据库的变化,二进制日志以一种有效的格式,并且是事务安全的方式包含更新日志中可用的信息。二进制日志包含了所有更新了数据或者已经潜在更新了数据。还包含关于每个更新数据库的语句的执行时间,它不包含没有修改任何数据的语句。使用二进制日志的主要目的是最大可能地恢复数据库。
1)启动二进制日志(默认情况下二进制日志是关闭的)[root@mysql ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
pid-file=/usr/local/mysql/data/mysql.pid
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/mysql.err
port=3306
server_id=1
log-bin=/usr/local/mysql/data/binary_log #指定二进制日志的路径及名称
expire_logs_days=10 #清除日志的天数
max_binlog_size=100M #单个日志文件的大小限制,超出会新建一个日志文件
[root@mysql ~]# systemctl restart mysqld
[root@mysql ~]# ll /usr/local/mysql/data/ | grep binary
-rw-r----- 1 mysql mysql 154 May 20 15:57 binary_log.000001
-rw-r----- 1 mysql mysql 40 May 20 15:57 binary_log.index注:在开启二进制日志时需要在my.cnf中指定server_id,否则回启动失败,日志文件中也只是会报一个警告,而不会报错
登录到数据库中也可以查看到,如下:2)查看二进制日志
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 |
±------------------±----------+
| binary_log.000001 | 154 |
±------------------±----------+
1 row in set (0.00 sec)也可以退出MySQL在命令行使用mysqlbinlog命令查看:
[root@mysql data]# mysqlbinlog binary_log.000001
3)删除二进制日志
MySQL的二进制文件可以配置自动删除,同时MySQL提供了手动删除二进制文件的方法:
RESET MASTER:删除所有的二进制日志文件;
PURGE MASTER LOGS:只删除部分二进制日志文件;
Reset master:删除所有二进制日志 ;
Purge master logs to ‘二进制名’ :删除单个二进制日志之前的。mysql> purge master logs to “binary_log.000003”; #删除…03之前的二进制日志文件
mysql> purge master logs before ‘20180101’; #删除2018-01-01之前的日志文件4)通过二进制日志还原MySQL数据
通过MySQL提供的二进制日志来间接实现增量备份。
现在所有对数据库的修改,都将记录mysql-bin.000001文件中,当执行“mysqladmin -u root -p flush-logs”刷新二进制日志后,将会继续生成一个名为mysql-bin.000002的文件,之后所有的更改又将存在mysql-bin.000002文件中,以此类推,每刷新一次,就会生成一个新文件!
录入新的数据,并进行增量备份
[root@mysql /]# mysqladmin -u root -p flush-logs # 刷新日志文件,这样在000002中只有两条数据的操作
Enter password:
[root@mysql /]# cp /usr/local/mysql/logs/mysql-bin.000002 /mysql_bak/ # 将日志文件复制到备份目录中
[root@mysql /]# mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002 | mysql -u root -p # 恢复增量备份,–no-defaults 选项必须要有
[root@mysql /]# mysql -u root -p -e ’ select * from test.user_info;’ # 确认,增量备份恢复成功
Enter password:InnoDB 存储引擎的日志
undo log 和 redo log 其实都不是 MySQL 数据库层面的日志,而是 InnoDB 存储引擎的日志。二者的作用联系紧密,事务的隔离性由锁来实现,原子性、一致性、持久性通过数据库的 redo log 或 undo log 来完成。
redo log 又称为重做日志,用来保证事务的持久性,undo log 用来保证事务的原子性和 MVCC。
redo 记录的是物理上 值的修改 不像 binlog 是记录的是逻辑语句
和大多数关系型数据库一样,InnoDB 记录了对数据文件的物理更改,并保证总是日志先行,也就是所谓的 WAL,即在持久化数据文件前,保证之前的 redo 日志已经写到磁盘。由于 redo log 是顺序整块写入,所以性能要更好。
重做日志两部分组成:一是内存中的重做日志缓冲(redo log buffer),是易失的;二是重做日志文件(redo log file),是持久的。redo log 记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。
在一条语句进行执行的时候,InnoDB 引擎会把新记录写到 redo log 日志中,然后更新内存,更新完成后就算是语句执行完了,然后在空闲的时候或者是按照设定的更新策略将 redo log 中的内容更新到磁盘中。
实现持久性,避免事务提交之后每次都要刷新到磁盘
回滚日志(undo log)
undo log 有两个作用:提供回滚和多版本并发控制下的读(MVCC),也即非锁定读
在数据修改的时候,不仅记录了redo,还记录了相对应的 undo,如果因为某些原因导致事务失败或回滚了,可以借助该 undo 进行回滚。
undo log 和 redo log 记录物理日志不一样,它是逻辑日志。可以认为当 delete 一条记录时,undo log 中会记录一条对应的 insert 记录,反之亦然,当 update 一条记录时,它记录一条对应相反的 update 记录。
有时候应用到行版本控制的时候,也是通过 undo log 来实现的:当读取的某一行被其他事务锁定时,它可以从 undo log 中分析出该行记录以前的数据是什么,从而提供该行版本信息,让用户实现非锁定一致性读取。
-
mysql最佳安全配置手册
2018-05-16 12:22:18mysql基本安全配置、操作系统级别安全配置、文件系统权限安全配置、审计和日志安全配置等内容 -
使用Navicat查看MySQL日志的具体方法
2021-01-19 02:37:26使用Navicat查看MySQL日志的具体方法发布时间:2020-05-18 14:04:52来源:51CTO阅读:699作者:三月下文主要给大家带来使用Navicat查看MySQL日志的具体方法,希望这些内容能够带给大家实际用处,这也是我编辑使用... -
mysql日志总结
2019-12-05 14:48:23(1)mysql的日志有哪些? ①错误日志error_log:记录Mysql启动,运行,停止期间的问题。 ②常规日志general_log:记录所有发向mysql的请求。 ③慢查询日志slow_query_log: 记录符合条件的查询。 ④二进制日志... -
MySQL 8 服务器日志
2021-01-20 12:08:07错误日志:启动、运行、停止 mysqld(MySQL Server) 遇到的问题通用查询日志:建立客户端连接和从客户端接收的语句二进制日志:更改数据的语句(也用于复制)中继日志:从复制master server接收到的数据更改慢查询日志... -
mysql 安全和日志 备份
2018-08-02 20:06:43一,mysql 安全机制管理 1.权限表 mysql 数据库中得表说明 mysql.user 用户字段:Host,User,Password 权限字段:_priv结尾的字段 安全字段:ssl x509字段 资源控制字段:max_开头的字段 mysql.db ... -
MySQL其他数据库日志
2022-03-18 11:28:17之前写数据库事务的时候,写过两...MySQL有不同类型的日志文件,用来存储不同类型的日志,分为二进制日志、错误日志、通用查询日志和慢查询日志,这是常用的4种日志。MySQL8.0又新增了两种支持的日志:中继日志和数... -
全面解析MySQL日志
2019-05-22 03:39:41日志简介 、二进制日志 、错误日志 、通用查询日志 、慢查询日志 -
Mysql日志审计工具
2019-06-27 10:00:07Mysql日志审计工具 参考网址:http://www.omgdba.com/mysql-audit-plugin-now-available-in-percona-server-5-5-and-5-6.html 个人感觉审计没啥用处,偶然间看到这个功能总结了解下。 ... -
解说mysql之binlog日志以及利用binlog日志恢复数据的方法
2020-12-16 06:40:18MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。 ————————... -
MySQL利用日志获取WEBSHELL
2019-04-09 11:32:27前言:近期在学习Mysql提权的时候,很多文章都说到了通过文件导入导出来进行写入webshell,但是自己复现时出现了问题,一直失败。然后有了这篇文章! 0x00 MySQL通过文件导出提权的过程 首先找一张有插入权限的... -
MYSQL数据库日志
2020-08-29 11:11:20Mysql数据库日志 4 .日志讲解 一、innodb引擎中的redo/undo log是什么 二、什么是binlog 三、binlog的三种模式 5. 日志原理 事务的原语操作 延迟的数据库修改redo 立即的数据库修改undo + redo 缓冲区管理 ... -
MySQL 中继日志
2020-08-23 18:04:31MySQL 中继日志 什么是中继日志 log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致 理解:relay log很多方面都跟binary log差不多。 区别是:从服务器I/O线程将主服务器的二进制日志读取过来... -
mysql安全审计,记录mysq的用户的登陆日志
2019-09-10 09:49:38最近做mysql的安全审计,粗略记录一下先整理资料 开启general_log日志,默认文本记录 show global variables like '%general%'; set global general_log = on; show global variables like '%log_output%'; ... -
MySQL安全加固
2021-11-29 10:10:33MySQL安全加固 口令加固 show plugins; 查看当前插件信息,了解到当前已开启插件 安装validate_password插件 install plugin validate_password soname 'validate_password.dll'; 查看当前密码规则强度 SELECT @@... -
mysql 正确清理binlog日志的两种方法
2020-12-15 23:40:33MySQL中的binlog日志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会日渐增大,占用很大的磁盘空间,因此,要对binlog使用正确安全的方法清理掉一部分没用的日志。 【方法一】... -
mysql删除日志方法.docx
2019-06-14 09:43:24mysql的LOG日志占用空间如果比较大的话,需要进行清理,整理了日志清理的四种方法,方便大家安全清理日志 -
Mysql之安全清理mysql-slow.log
2021-07-02 10:39:49经过一段时间的运行,开发数据库的mysql-slow.log文件已经比较大,为了释放磁盘空间,需要对该文件进行清理。mysql-slow.log文件是记录sql语句的执行时间超过设置的long_query_time的语句,默认1秒钟,可以根据... -
MySQL数据库安全加固方法
2021-01-27 22:29:14MySQL数据库安全加固方法基本安全原则选择稳定、无漏洞版本并及时升级更新、打补丁配置防火墙策略,更改默认端口避免使用弱口令,定期更新口令严格的权限分配和访问控制具体安全配置系统层面配置系统安装时,需要... -
MySQL安全你不知道的事
2020-11-30 11:35:49总结 安全存在于系统的方方面面,涉及安全的都是大事,今天主要聊的是MySQL安全的那些事,主要包括MySQL服务器安全,数据库安全以及数据安全,聊完之后发现安全的东西还蛮多,这些能够让我们对MySQL安全有更加深刻... -
如何提高mysql的安全性
2021-01-18 21:14:23一 作为最流行的开源数据库引擎,MySQL本身是非常安全的。即便如此,你仍然需要添加额外的安全层来保护你的MySQL数据库不受攻击,毕竟任何经营网上在线业务的人都不想冒数据库受到损坏的风险。接下来,我们将介绍... -
MySQL binlog日志优化
2021-01-19 03:17:01mysql中日志类型有慢查询日志,二进制日志,错误日志,默认情况下,系统只打开错误日志,因为开启日志会产生较大的IO性能消耗。一般情况下,生成系统中很少打开二进制日志(bin log),bin log日志的优化策略:mysql&... -
MySQL 自动清理binlog日志的方法
2020-12-16 03:15:14使用下面方法可以安全清理binlog日志 一、没有主从同步的情况下清理日志 mysql -uroot -p123456 -e ‘PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ),INTERVAL 5 DAY)’; #mysql 定时清理5天前的binlog mysql -u root -... -
ELK收集MySQL慢日志
2019-03-04 15:37:20ELK6.6.1+FileBeat6.6.1收集mysql慢日志 一、elk简单介绍 1、之前常说的elk,现已被官方整合为Elastic Stack,官网地址(https://www.elastic.co/cn/products),官网给出的架构如下,其中Beats是一系列轻量级日志... -
MySQL 5.6 如何更改安全的处理密码探讨
2020-12-15 15:25:43MySQL 5.6 将会自动的在日志中隐藏密码信息。这不只是混淆,然后将单向哈希值存放在日志文件中。... 尽管如此,还是别忘记给 MySQL 服务器和客户端日志文件予以核实的权限保护,包括其他的一些如 mas -
mysql 日志文件mysql-bin文件清除方法
2021-02-07 07:47:50首先要说明一下,这些文件都是mysql的日志文件,如果不做主从复制的话,基本上是没用的,虽然没用,但是不建议使用rm命令删除,这样有可能会不安全,正确的方法是通过mysql的命令去删除。#mysql-uroot-...