目录
一、参数读取顺序
二、参数类型
三、参数详解
四、参考资料
一、参数读取顺序
查询出来具有顺序性。以下查询可以看出,MySQL是按/etc/my.cnf → /etc/mysql/my.cnf → /usr/etc/my.cnf → ~/.my.cnf 顺序读取。
[root@micro-service-b-1 ~]$ which mysql
/bin/mysql
[root@micro-service-b-1 ~]$ /bin/mysql --verbose --help| grep -A 1 'Default options'
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
[root@micro-service-b-1 ~]$
多个配置文件配置相同参数,以最后的读取为准。同时,MySQL数据库可以没有配置文件的情况下,则按照MySQL编译时默认参数和源代码指定参数的默认值来启动MySQL实例。
二、参数类型
MySQL数据库的参数以键值对(key/value)的形式配置。通过show variables命令查询所有的参数配置,也可以通过like来过滤参数名。如下所示,查询Innodb存储引擎处理io的线程配置。
mysql> show variables like 'innodb_%io_threads'\G;
*************************** 1. row ***************************
Variable_name: innodb_read_io_threads
Value: 4
*************************** 2. row ***************************
Variable_name: innodb_write_io_threads
Value: 4
2 rows in set (0.01 sec)
MySQL的参数类型分为两类:
- 动态(dynamic)参数:MySQL实例运行中,可以修改的参数
- 静态(static)参数:整个MySQL实例生命周期不能修改(只读),启动实例前可以修改
mysql> set global datadir='/db/mysql';
ERROR 1238 (HY000): Variable 'datadir' is a read only variable
实例本身不会对参数文件中的值进行修改。
三、参数详解
以下参数,通过show variables或show variables like查询。
类型 | 名称 | 描述 |
错误日志 | log_error | 1. 不仅记录所有的错误信息,也记录警告和正常信息; 2. 默认路径数据目录下.err结尾的文件 |
查询日志 | general_log | 1. 是否开启查询日志文件(记录所有对MySQL请求信息); 2. 默认关闭OFF,原因是日志量非常庞大 |
general_log_file | 1. 查询日志文件路径; 2. 默认./(数据库数据目录,即:data目录) | |
慢查询日志 | slow_query_log | 1. 是否开启慢查询日志; 2. 默认关闭OFF,开启ON |
long_query_time | 1. 大于时间阈值时则记录; 2. 默认10s(>10s时记录) | |
slow_query_log_file | 1. 慢查询日志文件路径; 2. 默认./(数据库数据目录,即:data目录) | |
log_output | 1. 慢查询/通用查询日志输出格式; 2. 默认FILE;若TABLE时,则mysql.slow_log表 | |
log_queries_not_using _indexes | 1. SQL没有使用索引时,是否记录到慢查询日志; 2. 默认关闭OFF,ON开启 | |
log_throttle_queries_not _using_indexes | 1. SQL没有使用索引时,每分钟记录到慢查询日志中的个数; 2. 默认0,即:没有限制 | |
二进制日志 | log-bin | 1. 是否开启二进制日志文件,log-bin=[name]; 2. 默认路径是datadir指定,文件名称name指定 |
max_binlog_size | 1. 单个二进制日志文件的最大值,默认1073741824= 1G; 2. 超过该值后,则生成一个新文件,后缀名+1,并记录到index | |
binlog_cache_size | 1. 事务开始时,所有未提交的二进制日志记录到一个缓存中,等待事务提交时,直接将缓存写入二进制日志文件; 2. 当线程开启一个事务时,会自动创建一个缓存; 3. 默认缓存大小32768 = 32KB,超出时,则写入临时文件 | |
sync_binlog | 1. sync_binlog=[N],表示每写缓冲N次就触发同步到磁盘; 2. sync_binlog=1表示同步写磁盘,即:不使用缓存直接写入磁盘 | |
innodb_support_xa | 1. 是否支持XA事务,默认开启ON; 2. sync_binlog=1时,事务已提交,而写磁盘时宕机,通过该参数完成二进制日志与数据文件的同步 | |
binlog_format | 1. 二进制日志文件输出格式,默认ROW; 2. 格式类型:Statement(内容SQL语句,但是Mysql函数不会写入),Row(更新的记录),Mixed(SQL+Row) | |
表空间 | innodb_data_file_path | 1. 共享表空间的路径,默认数据目录下的ibdata1; 2. 多文件组成一个表空间; 3. 共享表空间存放所有表数据 |
innodb_file_per_table | 1. 是否开启为每个表建立独立表空间; 2. 默认开启ON,表空间为:表名.ibd; 3. 独立表空间存储:表数据、索引、插入缓冲的BITMAP信息,其他存储在默认共享表空间。 | |
重做日志 | innodb_log_file_size | 1. 每个重做日志文件的大小; 2. 不能大于512G |
innodb_log_files_in_group | 1. 重做日志文件组中的文件数量; 2. 默认2,数据目录下的:ib_logfile0、ib_logfile1 | |
innodb_log_group_home _dir | 1. 重做日志文件所在的路径; 2. 默认./,即:数据目录下 | |
innodb_log_buffer_size | 重做日志缓冲大小,默认8MB | |
innodb_flush_log_at_trx _commit | 1. 控制事务提交时处理重做日志方式; 2. 默认1:事务提交时,redo log buffer写入磁盘、 0:等待master thread每秒刷新到磁盘、 2:异步写入磁盘,注意事务提交时不能确保写入重做日志中 注意:0、2导致事务丢失 | |
PID文件 | pid_file | MySQL实例的进程ID文件,默认路径数据目录 |
临时目录 | tmpdir | 1. 临时文件存放路径,如:存放临时表、socket文件等; 2. 默认/tmp |
套接字文件 | socket | 1. 连接MySQL实例使用套接字方式; 2. 默认路径:/tmp目录 |
InnoDB版本 | innodb_version | 查看InnoDB版本,也可以使用select version()语句 |
读写线程 | innodb_read_io_threads | 配置InnoDB从磁盘读取数据的线程个数,默认4 |
innodb_write_io_threads | 配置InnoDB从缓冲写入磁盘的线程个数,默认4 | |
Purge线程 | innodb_purge_threads | 1. 配置线程个数回收事务提交后的undolog页; 2. 默认线程数4 |
Buffer Pool | innodb_buffer_pool_size | 1. 设置缓冲池大小,影响着MySQL整体性能; 2. 默认值128MB |
innodb_buffer_pool_instances | 缓冲池实例个数,默认1 | |
innodb_buffer_pool_filename | 1. 设置缓冲池名; 2. 默认ib_buffer_pool,在数据目录下 | |
LRU算法 | innodb_old_blocks_pct | 1. 新读取的页插入LRU列表中的位置(midpoint); 2. 默认37%,该位置的前部是new部分,后部是old部分 |
innodb_old_blocks_time | 1. 在midpoint等待多久移到到LRU列表的前端; 2. 默认1000ms=1s; 3. page made young:该时间过后,移动到LRU首端; page not made young:没有移动到LRU首端 | |
Checkpoint | innodb_fast_shutdown | 1. MySQL关闭时,所有脏页刷新到磁盘; 2. 默认1,表示开启; 3. 属于Sharp Checkpoint |
innodb_lru_scan_depth | 1. LRU列表可用页的数量,默认1024页; 2. 少于该值时,触发Checkpoint; 3. 属于Fuzzy Checkpoint | |
innodb_max_dirty_pages _pct | 1. 脏页占缓冲池的百分比,默认75%; 2. 占比超出该值后,触发Checkpoint; 3. 属于Fuzzy Checkpoint | |
Change Buffer | innodb_change_buffering | 1. 开启INSERT/DELETE/UPDATE的各种缓冲; 2. 默认all,开启以上三种缓冲 |
innodb_change_buffer _max_size | 1. Change Buffer占缓冲池的百分比,默认25%; 2. 该参数最大值50%,即:占缓冲池的一半 | |
Double Write | Innodb_dblwr_pages_written | 写的页数,使用show global status查询 |
Innodb_dblwr_writes | 1. 写入磁盘的次数,使用show global status查询; 2. 页数 : 次数远小于64:1,说明系统写入压力不高 | |
Native AIO | innodb_use_native_aio | 1. 是否开启Native AIO,即:使用内核的AIO; 2. 默认ON启用 |
刷新邻接页 | innodb_flush_neighbors | 1. 是否开启刷新邻接页,即:刷新页时,该页所在的区(extent)的所有脏页是否刷新到磁盘; 2. 默认开启1,关闭0 |
MySQL关闭 | innodb_fast_shutdown | 1. MySQL关闭时的操作,默认1; 2. 值:1:无需完成所有的purge和merge insert buffer,缓冲池的脏页刷新即可 0:完成所有的purge和merge insert buffer 2:没有完成1和2,需要日志写入日志文件 |
MySQL启动 | innodb_force_recovery | MySQL启动时的操作,默认0(进行所有的恢复) |
数据页 完整性检查 | innodb_checksums | 1. 是否开启页的完整性检查; 2. 默认开启ON(即:每次从磁盘读取页的时候,检查页的完整性) |
innodb_checksum _algorithm | 页的完整性检查的checksum函数算法,默认crc32 | |
行格式 | innodb_file_format | 1. 查询文件格式; 2. 当前值为Barracuda,包括:Antelope(老版本行记录格式:Compact/Redudant) + Dynamic + Compressed |
innodb_file_format _check | 1. 是否开启检查InnoDB对file_format的支持; 2. 默认开启ON(检查是否支持) | |
SQL入参审查 | sql_mode | 1. 审查sql的输入参数,可多值; 2. 默认:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION |
分区支持 | show plugins | 1. 查询MySQL是否支持分区; 2. 使用该命令,查看:Name: partition Status: ACTIVE |
外键检查 | foreign_key_checks | 1. 是否开启外键即时检查; 2. 默认开启ON,即:子表插入数据时检查外键; 3. 子表大批量插入数据时,可以暂时关闭外键检查 |
索引算法 | old_alter_table | 1. 创建或删除索引的算法; 2. 默认关闭OFF(采用INPLACE); 3. INPLACE:无需创建临时表,采用Online DDL; COPY:创建临时表 |
Online DDL 缓存 | innodb_online_alter _log_max_size | 1. Online DDL时,DML操作日志的缓存大小; 2. 默认128MB |
Cardinality值 采样 | innodb_stats_sample _pages | Cardinality的每次采样统计的页数,默认8 |
innodb_stats_method | 1. Cardinality采样统计对Null的处理; 2. 默认nulls_equal(NULL值作为相同记录)、 nulls_unequal(NULL值作为不同记录)、 nulls_ignored(忽略NULL) | |
innodb_stats_persistent | 1. analyze table触发Cardinality统计时,其值是否存入磁盘; 2. 默认ON(减少重新计算每个索引的Cardinality值) | |
innodb_stats_on _metadata | 1. show table status、show index、访问information_schema下的TABLES和STATISTICS时,是否开启Cardinality统计; 2. 默认OFF | |
innodb_stats_persistent _sample_pages | 1. 参数innodb_stats_persistent为ON时,使用analyze table每次采样统计的页数; 2. 默认20 | |
innodb_stats_transient _sample_pages | 代替innodb_stats_sample_pages参数,默认8 | |
优化器 | optimizer_switch | 1. 优化器开关,多值; 2. 如:可启用MRR(Multi-Range Read):mrr为on(默认)表示开启,mrr_cost_based为on(默认)表示是否通过cost based方式来启用MRR;为off时,表示总是启用MRR 如:可启用ICP(Index Condition Pushdown):index_condition_pushdown为on(默认)表示开启 |
read_rnd_buffer_size | MRR的键值对的缓冲区大小,默认256KB | |
自适应 Hash索引 | innodb_adaptive_hash _index | 开启自适应哈希索引,默认开启ON |
全文检索 索引 | innodb_ft_aux_table | 1. 哪些表通过INNODB_FT_INDEX_TABLE表来查询表的倒排索引的辅助表(Auxiliary Table); 2. 默认空 |
innodb_ft_cache_size | 全文检索索引缓存的大小设置,默认32MB | |
innodb_ft_server_stopword _table | 1. 用户自定义stopword(忽略的全文检索词)的表; 2. 默认空 | |
innodb_ft_min_token_size | 1. 全文检索查询字段的最小长度; 2. 默认3,若少于该值时,则忽略该查询 | |
innodb_ft_max_token_size | 1. 全文检索查询字段的最大长度; 2. 默认83,若大于该值时,则忽略该查询 | |
自增长 | innodb_autoinc_lock_mode | 1. 自增长模式; 2. 默认1(simple inserts则使用互斥量对内存中的计数器累加操作;bulk inserts则为表锁的AUTO-INC locking)、 0(表锁)、 2(insert-like则表锁,其他为非表锁) |
关闭 Gap Lock | innodb_locks_unsafe _for_binlog | 1. 是否关闭Gap Lock; 2. 默认OFF,即0(启用Gap Lock)、 1(关闭Gap Lock) |
阻塞事务 | innodb_lock_wait_timeout | 阻塞事务的等待时间 |
innodb_rollback_on_timeout | 1. 阻塞事务超时后,是否进行回滚; 2. 默认OFF不回滚(静态参数) | |
undo log | innodb_undo_directory | 1. undo日志rollback segment所在的路径; 2. 默认./(ibdata1) |
innodb_undo_logs | 1. undo日志rollback segment的个数; 2. 默认128 | |
innodb_undo_tablespaces) | 1. undo日志空间数量(构成rollback segment的文件数); 2. 默认0 | |
purge操作 | innodb_purge_batch_size | 1. 每次purge操作需要清理的undo page的数量; 2. 默认300 |
innodb_max_purge_lag | 1. 控制history list(事务提交的顺序列表)的最大长度; 2. 默认0(不对history list做任何限制), 若大于0时,则每次DML操作时,更新行有延迟 | |
innodb_max_purge_lag _delay | 更新行,最大延迟的毫秒数,默认0 | |
group commit | binlog_max_flush_queue _time | 1. 组提交(group commit)时的flush阶段中等待时间; 2. 默认0(不等待) |
事务提交后的行为 | completion_type | 1. 控制事务提交后的行为; 2. 默认0(NO_CHAIN没有任何操作,即:commit=commit work)、 1(commit work等同于commit and chain,链式事务:事务提交后,自动开启相同隔离级别的事务)、 2(自动断开与服务器的连接) |