参数文件
在默认情况下,Mysql在启动时会按照一定顺序在指定的位置读取参数文件。
参数的形式是键值对。
查看数据库所有参数
SHOW VARIABLES
参数有静态和动态的,动态意味着可以在MySQL实例运行期间进行修改。
修改动态参数
set @@[global | session].system_var_name=expr
global是全局的,session是会话的。
查看参数
select @@[global | session].system_var_name
日志文件
参见的日志文件有几种:
- 错误日志(error log)
- 慢查询日志(slow query log)
- 查询日志(log)
- 二进制日志(binlog)
错误日志
错误日志记录了所有的错误信息,也记录了一些警告信息或正确的信息。
定位错误日志文件
show variables like ‘log_error’
当出现mysql不能正常启动时,第一个要查找的文件应该就是错误日志文件。
慢查询日志
可以在MySQL启动时设一个阈值(参数long_query_time,默认是10,表示10秒),将运行时间超过该值的所有SQL语句都记录到慢查询日志中。
在默认情况下,MySQL数据库并不启动慢查询日志,用户需要手工将这个参数设置为ON(log_show_queries)。
另一个和慢查询日志有关的参数是log_queries_not_using_indexes,如果运行的语句没有使用索引,则MySQL会将这条SQL记录到慢查询日志。
log_throttle_queries_not_using_indexes参数: 每分钟允许记录到slow log的且未使用索引的SQL语句次数。该值默认为0,表示没有限制,在生产环境下,若没有使用索引,此类SQL语句会频繁地被记录到slow log,从而导致slow log文件的大小不断增加,故DBA可通过此参数进行配置。该参数MySQL 5.6.5版本开始新增。
可以通过慢查询日志找出有问题的SQL语句并对其进行优化。但是当日志太多时,就显得很不直观了。可以使用mysqldumpslow命令。
查询日志(主机名.log)
查询日志记录了所有对MySQL数据库请求的信息,无论这些请求是否得到了正确的执行。默认名称:主机名.log
二进制日志(主机名.序列号)
记录了所有对数据库执行更改的操作,但是如果类似update语句,它并没有更改什么数据,也会被记录到二进制日志里。
二进制日志可以抵御意外停止。仅记录或回读完整的事件或事务。
binlog主要用于恢复和复制。
通过配置参数log-bin[=name]可以启动二进制日志(默认已启动),如果不指定name,则默认文件名是主机名,后缀名为二进制日志的序列号,所在路径为数据库所在目录(datadir参数)。
参数max_binlog_size:指定单个二进制文件的最大值(默认1G),超过该值,则产生新的二进制文件,后缀名+1。
参数binlog_cache_size:当使用InnoDB存储引擎时,所有未提交的二进制文件会被记录到一个缓冲中去,等该事务提交(commited)时直接将缓冲中的二进制日志写入到binlog,而该缓存的大小由binlog_cache_size决定,默认大小为32k。binlog_cache_size是基于会话的。当一个事务的大小超过binlog_cache_size,MySQL会把缓存中的日志写入一个临时文件中。通过SHOW GLOBAL STATUS命令查看binlog_cache_use、binlog_cache_disk_use的状态,可以判断当前binlog_cache_size的大小是否合适。
参数sync_binlog:是MySQL 的二进制日志(binary log)同步到磁盘的频率。取值:0-N。
- sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。
- sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
- 在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。
参数binlog_format
- STATEMENT:记录日志的逻辑SQL语句
- ROW:记录表的行更改情况,将参数binlog_format设置为ROW,可以为数据库的恢复和复制带来更好的可靠性,但会增加二进制文件的大小。
-
MIXED:STATEMENT和ROW混合
可以使用命令工具mysqlbinlog查看binlog里的内容
查看binlog里的内容:show binlog events
获取binlog文件列表:show binary logs
查看当前正在写入的binlog文件:show master status
socket文件
pid文件(pid)
存放mysql的进程ID,默认位于数据库目录下,名字是主机名.pid。
MySQL表结构文件(frm)
frm文件,存放表和视图的结构
InnoDB存储引擎文件
表空间文件(ibd)
默认表空间初始大小10MB,名字为ibdata1
可以设置innodb_data_file_path,指定多个表空间文件路径,还有初始大小,已经是否允许自动增长,使用多个文件可以提高数据库的整体性能。
独立表空间:若设置了参数innodb_file_per_table,则每一个InnoDB表都会产生一个独立的表空间,独立表空间的命名规则为:表名.ibd
重做日志文件
记录了事务日志,当数据库由于所在主机掉电导致实例失败,InnoDB存储引擎会使用重做日志恢复到掉电前的时刻。
每个InnoDB存储引擎至少有一个重做日志文件组,每个文件组下至少有2个重做日志文件,InnDB会先写第一个文件,当第一个文件写满之后,会切换到第二个文件,当第二个文件也写满之后,会切换回第一个文件。
用户可以设置重做日志文件的大小和数量。
和二进制日志文件的区别:
- 二进制日志文件会记录与MySQL数据库有关的日志记录,包括InnoDB、MyISAM、Heap等其他存储引擎的日志。而重做日志文件只记录InnoDB自己的。
- 重做日志文件记录关于每个页(Page)的更改,而二进制日志文件的记录格式是STATEMENT、ROW或MIXED。
- 二进制文件只在事务提交前提交,但在事务进行中的过程中,会不断有redo log被写入到重做日志文件中。
InnoDB为了保证REDO日志的刷写的高效,使用了内存的log buffer。
由于InnoDB大部分情况下使用的是文件系统,(linux文件系统本身也是有buffer的)而不是直接使用物理块设备,这样的话就有两种丢失日志的可能性:日志保存在log_buffer中,机器挂了,对应的事务数据就丢失了;日志从log buffer刷到了linux文件系统的buffer,机器挂掉了,对应的事务数据就丢失了。
InnoDB有一个参数用于设置这两个缓存的刷新: innodb_flush_log_at_trx_commit。而 innodb_flush_log_at_trx_commit 有三个值:0/1/2,默认是1。而innodb_flush_log_at_timeout 定义了每次日志刷新的时间,默认1s,与 innodb_flush_log_at_trx_commit 配合使用。
innodb_flush_log_at_timeout 的设置只针对 innodb_flush_log_at_trx_commit为0/2 起作用。
网友评论