Files
rikako-note/mysql/mysql文档/mysql_文件.md
2025-01-30 18:41:31 +08:00

12 KiB
Raw Blame History

文件

参数

参数查看

mysql参数为键值对可以通过show variables命令查看所有的数据库参数,并可以通过like来过滤参数名称。

除了show variables命令之外,还能够在performance_schema下的global_variables视图来查找数据库参数,示例如下:

-- 查看innodb_buffer_pool_size参数
show variables like 'innodb_buffer_pool_size'

上述show variables命令的执行结果为

Variable_name Value
innodb_buffer_pool_size 4294967296
select * from performance_schema.global_variables where variable_name like 'innodb_buffer_pool%';

上述sql的执行结果如下

VARIABLE_NAME VARIABLE_VALUE
innodb_buffer_pool_chunk_size 134217728
innodb_buffer_pool_dump_at_shutdown ON
innodb_buffer_pool_dump_now OFF
innodb_buffer_pool_dump_pct 25
innodb_buffer_pool_filename ib_buffer_pool
innodb_buffer_pool_in_core_file ON
innodb_buffer_pool_instances 4
innodb_buffer_pool_load_abort OFF
innodb_buffer_pool_load_at_startup ON
innodb_buffer_pool_load_now OFF
innodb_buffer_pool_size 4294967296

参数类型

mysql中的参数可以分为动态静态两种类型,

  • 动态动态参数代表可以在mysql运行过程中进行修改
  • 静态:代表在整个实例的声明周期内都不得进行修改

动态参数修改

对于动态参数,可以在运行时通过SET命令来进行修改,SET命令语法如下:

set 
    | [global | session] system_var_name=expr
    | [@@global. | @@session. | @@] system_var_name = expr

在上述语法中,globalsession关键字代表该动态参数的修改是针对当前会话还是针对整个实例的生命周期

  • 有些动态参数只能在会话范围内进行修改,例如autocommit
  • 有些参数修改后,实例整个生命周期内都会生效,例如binglog_cache_size
  • 有些参数既可以在会话范围内进行修改,又可以在实例声明周期范围内进行修改,例如read_buffer_size

使用示例如下:

查询read_buffer_size的global和session值

-- 查询read_buffer_size的global和session值
select @@session.read_buffer_size,@@global.read_buffer_size;

返回结果为

@@session.read_buffer_size @@global.read_buffer_size
131072 131072

设置@@session.read_buffer_size为524288

set @@session.read_buffer_size = 1024 * 512;

设置后再次查询read_buffer_size的global和session值结果为

@@session.read_buffer_size @@global.read_buffer_size
524288 131072

在调用set命令修改session read_buffer_size参数后session参数发生变化但是global参数仍然为旧的值。

set session xxx命令并不会对global参数的值造成影响新会话的参数值仍然为修改前的值。

之后再对global read_buffer_size值进行修改执行如下命令

set @@global.read_buffer_size = 496 * 1024;

执行该命令后sesion和global参数值为

@@session.read_buffer_size @@global.read_buffer_size
524288 507904

set global xxx命令只会修改global参数值对session参数值不会造成影响新的session其session参数值, global参数值和修改后的global参数值保持一致

即使针对参数的global值进行了修改其影响范围是当前实例的整个生命周期但是其并不会对参数文件中的参数值进行修改故而下次启动mysql实例时仍然会从参数文件中取值新实例的值仍然是修改前的值

如果想要修改下次启动实例的参数值,需要修改参数文件中该参数的值。(参数文件路径通常为/etc/my.cnf

静态参数修改

在运行时,如果尝试对静态参数进行修改,那么会发生错误,示例如下:

> set global datadir='/db/mysql'
[2025-01-30 15:05:17] [HY000][1238] Variable 'datadir' is a read only variable

日志文件

mysql中常见日志文件如下

  • 错误日志(error log)
  • 二进制日志binlog
  • 慢查询日志slow query log
  • 查询日志log

错误日志

错误日志针对mysql的启动、运行、关闭过程进行了记录用户可以通过show variables like 'log_error';来获取错误日志的路径:

show variables like 'log_error';

其输出值如下:

Variable_name Value
log_error /var/log/mysql/mysqld.log

当mysql数据库无法正常启动时应当首先查看错误日志。

慢查询日志

慢查询日志存在一个阈值,通过long_query_time参数来进行控制,该参数默认值为10代表慢查询的限制为10s。

通过slow_query_log参数,可以控制是否日志输出慢查询日志,默认为OFF,如果需要开启慢查询日志,需要将该值设置为ON

关于慢查询日志的输出地点,可以通过log_output参数来进行控制。该参数默认为FILE,支持FILE, TABLE, NONElog_output支持制定多个值,多个值之间可以通过,分隔,当值中包含NONE时,以NONE优先。

log_queries_not_using_indexes

log_queryies_not_using_indexes开启时如果运行的sql语句没有使用索引那么这条sql同样会被输出到慢查询日志。该参数默认关闭。

log_throttle_queries_not_using_idnexes用于记录每分钟允许记录到慢查询日志并且没有使用索引的sql语句次数该参数值默认为0代表每分钟输出到慢查询日志中的数量没有限制。

该参数主要用于防止大量没有使用索引的sql添加到慢查询日志中造成慢查询日志大小快速增加。

当慢查询日志中的内容越来越多时可以通过mysql提供的工具mysqldumpslow命令,示例如下:

mysqldumpslow -s at -n 10 ${slow_query_log_path}

查询日志

查询日志记录了对mysql数据库所有的请求信息无论请求是否正确执行。

查询日志通过general_log参数来进行控制,默认该参数值为OFF.

二进制日志

二进制日志binary log记录了针对mysql数据库执行的所有更改操作不包含select以及show这类读操作

对于update操作等即使没有对数据库进行修改affected rows为0也会被写入到binary log中。

二进制日志的主要用途如下:

  • 恢复recovery某些数据恢复需要二进制日志例如在数据库全备份文件恢复后用户可以通过二进制日志进行point-in-time的恢复
  • 复制replication通过将一台主机master的binlog同步到另一台主机slave并且在另一台主机上执行该binlog可以令slave与master进行实时同步
  • 审计audit用户可以对binlog中的信息进行审计判断是否存在对数据库进行的注入攻击

通过参数log_bin可以控制是否启用二进制日志。

binlog通常存放在datadir参数所指定的目录路径下。在该路径下,还存在binlog.index文件该文件为binlog的索引文件文件内容包含所有binlog的文件名称。

max_binlog_size

max_binlog_size参数控制单个binlog文件的最大大小如果单个文件超过该值会产生新的二进制文件新binlog的后缀会+1并且新文件的文件名会被记录到.index文件中。

max_binlog_size的默认值大小为1G

binlog_cache_size

当使用innodb存储引擎时所有未提交事务的binlog会被记录到缓存中等到事务提交后会将缓存中的binlog写入到文件中。缓存大小通过binlog_cache_size决定,该值默认为32768,即32KB

binlog_cache_size是基于会话的,在每个线程开启一个事务时mysql会自动分配一个大小为binlog_cache_size大小的缓存因而该值不能设置过大

当一个事务的记录大于设定的binlog_cache_sizemysql会将缓冲中的日志写入到一个临时文件中故而该值无法设置过小。

通过show global status like 'binlog_cache%命令可以查看binlog_cache_usebinlog_cache_disk_use的状态可以通过上述两个状态判断binlog cache大小是否合适。

binlog_cache_use

binlog_cache_use记录了使用缓冲写binlog的次数

binlog_cache_disk_use

binlog_cache_disk_use记录了使用临时文件写二进制日志的次数

sync_binlog

sync_binlog参数控制mysql server同步binlog到磁盘的频率该值默认为1

  • 0: 如果参数值为0代表mysql server禁用binary log同步到磁盘。mysql会依赖操作系统将binary log刷新到磁盘中该设置性能最佳但是遇到操作系统崩溃时可能会出现mysql事务提交但是还没有同步到binary log的场景
  • 1: 如果参数值设置为1代表在事务提交之前将binary log同步到磁盘中该设置最安全但是会增加disk write次数对性能会带来负面影响。在操作系统崩溃的场景下binlog中缺失的事务还只处于prepared状态从而确保binlog中没有事务丢失
  • N当参数值被设置为非01的值时每当n个binlog commit groups被收集到后同步binlog到磁盘。在这种情况下可能会发生事务提交但是还没有被刷新到binlog中当n值越大时性能会越好但是也会增加数据丢失的风险

为了在使用innodb事务和replciation时获得最好的一致性和持久性请使用如下设置

sync_binlog=1
innodb_flush_log_at_trx_commit=1

innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit用于控制redo log的刷新。

该参数用于平衡commit操作ACID的合规性以及更高性能。通过修改该参数值,可以实现更佳的性能,但是在崩溃时可能会丢失事务:

  • 1: 1为该参数默认值代表完全的ACID合规性日志在每次事务提交后被写入并刷新到磁盘中
  • 0: 日志每秒被写入和刷新到磁盘中,如果事务没有被刷新,那么日志将会在崩溃中被丢失
  • 2: 每当事务提交后,日志将会被写入,并且每秒钟都会被刷新到磁盘中。如果事务没有被刷新,崩溃同样会造成日志的丢失

如果当前数据库为slave角色那么其不会把从master同步的binlog写入到自己的binlog中如果要实现master=>slave=>slave的同步架构,必须设置log_slave_updates参数。

binlog_format

binlog_format用于控制二进制文件的格式可能有如下取值

  • statement: 二进制文件记录的是日志的逻辑sql语句
  • row记录表的行更改情况默认值为row
  • mixed: 如果参数被配置为mixedmysql默认会采用statement格式进行记录,但是在特定场景能够下会使用row格式:
    • 使用了uuid, user, current_user,found_rows, row_count等不确定函数
    • 使用了insert delay语句
    • 使用了用户自定义函数
    • 使用了临时表
使用statement可能会存在的问题

在使用statement格式时可能会存在如下问题

  • master运行randuuid等不确定函数时或使用触发器操作时会导致主从服务器上的数据不一致
  • innodb的默认事务隔离级别为repetable_read,如果使用read_commited级别时statement格式可能会导致丢失更新的情况从而令master和slave的数据不一致

binlog为动态参数可以在数据库运行时进行修改并且可以针对session和global进行修改。

mysqlbinlog

在查看二进制日志时,可以使用mysqlbinlog命令,示例如下

mysqlbinlog --start-position=203 ${binlog_path}