[client] port = 3306 socket = /tmp/mysql.sock

[mysql] #prompt="\u@mysqldb \R:\m:\s [\d]> " #关闭自动补全sql命令功能 no-auto-rehash

##################################### 服务端参数配置 ##################################### [mysqld] port = 3306 datadir = /usr/local/mysql/data log-error = /usr/local/mysql/data/error.log pid-file = /usr/local/mysql/data/mysql.pid

只能用 IP 地址检查客户端的登录,不用主机名

skip_name_resolve = 1

指定时间存储默认时区

default_time_zone = "+8:00"

数据库默认字符集, 主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)

character-set-server = utf8mb4

数据库字符集对应一些排序等规则,注意要和 character-set-server 对应

collation-server = utf8mb4_general_ci

设置 client 连接 mysql 时的字符集, 防止乱码

init_connect='SET NAMES utf8mb4'

是否对 sql 语句大小写敏感,1: 不敏感

#lower_case_table_names = 1

执行 sql 的模式,规定了 sql 的安全等级, 暂时屏蔽,my.cnf 文件中配置报错

#sql_mode = STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

事务隔离级别,默认为可重复读,mysql 默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)

transaction_isolation = READ-COMMITTED

TIMESTAMP 如果没有显示声明 NOT NULL,允许NULL值

explicit_defaults_for_timestamp = true

控制 mysqld 进程能使用的最大文件描述(FD)符数量。

需要注意的是这个变量的值并不一定是你设定的值,mysqld 会在系统允许的情况下尽量获取更多的 FD 数量

open_files_limit = 65535

最大连接数

max_connections = 300

最大错误连接数

max_connect_errors = 600

MySQL 暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中

官方建议 back_log = 50 + (max_connections / 5), 封顶数为 65535, 默认值 = max_connections

back_log = 110

为所有线程打开的表的数量

例如,对于200个并发运行的连接,指定表缓存大小至少为 200 * N

其中N是您执行的任何查询中每个连接的最大表数

table_open_cache = 600

可以存储在定义缓存中的表定义数量, MIN(400 + table_open_cache / 2, 2000)

table_definition_cache = 700

为了减少会话之间的争用,可以将 opentables 缓存划分为 table_open_cache/table_open_cache_instances个小缓存

table_open_cache_instances = 64

每个线程的堆栈大小 如果线程堆栈太小,则会限制执行复杂 SQL 语句

thread_stack = 512K

禁止外部系统锁

external-locking = FALSE

SQL 数据包发送的大小,如果有 BLOB 对象建议修改成 1G

max_allowed_packet = 128M

order by / group by 时用到, 建议先调整为4M,后期观察调整

sort_buffer_size = 4M

inner left / right join 时用到, 建议先调整为4M,后期观察调整

join_buffer_size = 4M

如果您的服务器每秒达到数百个连接,则通常应将 thread_cache_size 设置得足够高,以便大多数新连接使用缓存线程

default value = 8 + ( max_connections / 100) 上限为 100

thread_cache_size = 20

MySQL 连接闲置超过一定时间后(单位:秒)将会被强行关闭

MySQL 默认的 wait_timeout 值为8个小时, interactive_timeout 参数需要同时配置才能生效

interactive_timeout = 1800 wait_timeout = 1800

Metadata Lock最大时长(秒),一般用于控制 alter 操作的最大时长 sine mysql5.6

执行 DML 操作时除了增加innodb事务锁外还增加 Metadata Lock,其他 alter(DDL)session 将阻塞

lock_wait_timeout = 3600

内部内存临时表的最大值。

比如大数据量的 group by / order by 时可能用到临时表,

超过了这个值将写入磁盘,系统IO压力增大

tmp_table_size = 64M max_heap_table_size = 64M

##################################### 慢 SQL 日志记录 #####################################

是否启用慢查询日志,1:启用,0:禁用

slow_query_log = 1

记录系统时区

log_timestamps = SYSTEM

指定慢查询日志文件的路径和名字

slow_query_log_file = /usr/local/mysql/data/slow.log

慢查询执行的秒数,必须达到此值可被记录

long_query_time = 5

将没有使用索引的语句记录到慢查询日志

log_queries_not_using_indexes = 0

设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间

log_throttle_queries_not_using_indexes = 60

对于查询扫描行数小于此参数的SQL,将不会记录到慢查询日志中

min_examined_row_limit = 5000

记录执行缓慢的管理SQL,如alter table,analyze table, check table, create index, drop index, optimize table, repair table等。

log_slow_admin_statements = 0

作为从库时生效, 从库复制中如何有慢sql也将被记录

对于 ROW 格式 binlog,不管执行时间有没有超过阈值,都不会写入到从库的慢查询日志

log_slow_slave_statements = 1

##################################### BinLog 设置 ##################################### server-id = 110

开启 bin log 功能

log-bin=mysql-bin

binlog 记录内容的方式,记录被操作的每一行

binlog_format = ROW

对于 binlog_format = ROW 模式时,FULL 模式可以用于误操作后的 flashBack。

如果设置为 MINIMAL,则会减少记录日志的内容,只记录受影响的列,但对于部分 update 无法 flashBack

binlog_row_image = FULL

bin log 日志保存的天数

如果 binlog_expire_logs_seconds 选项也存在则 expire_logs_days 选项无效

expire_logs_days 已经被标注为过期参数

#expire_logs_days = 7 binlog_expire_logs_seconds = 1209600

master status and connection information 输出到表 mysql.slave_master_info 中

master_info_repository = TABLE

the slave's position in the relay logs 输出到表 mysql.slave_relay_log_info 中

relay_log_info_repository = TABLE

作为从库时生效, 想进行级联复制,则需要此参数

log_slave_updates

作为从库时生效, 中继日志 relay-log 可以自我修复

relay_log_recovery = 1

作为从库时生效, 主从复制时忽略的错误

如果在备份过程中执行ddl操作,从机需要从主机的备份恢复时可能会异常,从而导致从机同步数据失败

如果对数据完整性要求不是很严格,那么这个选项确实可以减轻维护的成本

slave_skip_errors = ddl_exist_errors

##################################### RedoLog 日志和 BinLog 日志的写磁盘频率设置 #####################################

RedoLog 日志(用于增删改事务操作) + binlog 日志(用于归档,主从复制)

为什么会有两份日志呢?

因为最开始 MySQL 没有 InnoDB 引擎,自带 MyISAM 引擎没有 crash-safe 能力,binlog 日志只用于归档

InnoDB 引擎是另一个公司以插件形式引入 MySQL 的,采用 RedoLog 日志来实现 crash-safe 能力

redo log 的写入(即事务操作)拆成两阶段提交(2PC):prepare 阶段 和 commit 阶段

(事务步骤1) 执行 commit 命令,InnoDB redo log 写盘,然后告知 Mysql 执行器:[你可以写 binlog 了,且一并提交事务],事务进入 prepare 状态

(事务步骤2) 如果前面 prepare 成功,Mysql 执行器生成 binlog 并且将 binlog 日志写盘

(事务步骤3) 如果 binlog 写盘成功,Mysql 执行器一并调用 InnoDB 引擎的提交事务接口,事务进入 commit 状态,操作完成,事务结束

参数设置成 1,每次事务都直接持久化到磁盘

参数设置成 0,mysqld 进程的崩溃会导致上一秒钟所有事务数据的丢失。

参数设置成 2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。

即便都设置为1,服务崩溃或者服务器主机 crash,Mysql 也可能丢失但最多一个事务

控制 redolog 写磁盘频率,默认为1

innodb_flush_log_at_trx_commit = 1

控制 binlog 写磁盘频率

sync_binlog = 1

一般数据库中没什么大的事务,设成 1~2M,默认 32kb

binlog_cache_size = 4M

binlog 能够使用的最大 cache 内存大小

max_binlog_cache_size = 2G

单个 binlog 文件大小 默认值是 1GB

max_binlog_size = 1G

开启 GTID 复制模式

gtid_mode = on

强制 gtid 一致性,开启后对于 create table ... select ...或 CREATE TEMPORARY TABLE 将不被支持

enforce_gtid_consistency = 1

解决部分无主键表导致的从库复制延迟问题

其基本思路是对于在一个 ROWS EVENT 中的所有前镜像收集起来,

然后在一次扫描全表时,判断 HASH 中的每一条记录进行更新

该参数已经被标注为过期参数

#slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN'

default value is CRC32

#binlog_checksum = 1

default value is ON

#relay-log-purge = 1

##################################### MyISAM 性能设置 #####################################

对 MyISAM 表起作用,但是内部的临时磁盘表是 MyISAM 表,也要使用该值。

可以使用检查状态值 created_tmp_disk_tables 得知详情

key_buffer_size = 15M

对 MyISAM 表起作用,但是内部的临时磁盘表是 MyISAM 表,也要使用该值,

例如大表 order by、缓存嵌套查询、大容量插入分区。

read_buffer_size = 8M

对 MyISAM 表起作用 读取优化

read_rnd_buffer_size = 4M

对 MyISAM 表起作用 插入优化

bulk_insert_buffer_size = 64M

##################################### innodb 性能设置 #####################################

Defines the maximum number of threads permitted inside of InnoDB.

A value of 0 (the default) is interpreted as infinite concurrency (no limit)

innodb_thread_concurrency = 0

一般设置物理存储的 60% ~ 70%

innodb_buffer_pool_size = 8G

当缓冲池大小大于 1GB 时,将 innodb_buffer_pool_instances 设置为大于 1 的值,可以提高繁忙服务器的可伸缩性

innodb_buffer_pool_instances = 4

默认启用。指定在 MySQL 服务器启动时,InnoDB 缓冲池通过加载之前保存的相同页面自动预热。 通常与innodb_buffer_pool_dump_at_shutdown 结合使用

innodb_buffer_pool_load_at_startup = 1

默认启用。指定在 MySQL 服务器关闭时是否记录在 InnoDB 缓冲池中缓存的页面,以便在下次重新启动时缩短预热过程

innodb_buffer_pool_dump_at_shutdown = 1

定义 InnoDB 系统表空间数据文件的名称、大小和属性

#innodb_data_file_path = ibdata1:1G:autoextend

InnoDB 用于写入磁盘日志文件的缓冲区大小(以字节为单位)。默认值为 16MB

innodb_log_buffer_size = 32M

InnoDB 日志文件组数量

innodb_log_files_in_group = 3

InnoDB 日志文件组中每一个文件的大小

innodb_log_file_size = 2G

是否开启在线回收(收缩)undo log 日志文件,支持动态设置,默认开启

innodb_undo_log_truncate = 1

当超过这个阀值(默认是1G),会触发 truncate 回收(收缩)动作,truncate 后空间缩小到 10M

innodb_max_undo_log_size = 4G

The path where InnoDB creates undo tablespaces

没有配置则在数据文件目录下

innodb_undo_directory = /usr/mysql-8.0.32/undolog

用于设定创建的 undo 表空间的个数

已经弃用了,只能手动添加 undo 表空间

innodb_undo_tablespaces 变量已弃用,从 MySQL 8.0.14 开始不再可配置

innodb_undo_tablespaces = 95

提高刷新脏页数量和合并插入数量,改善磁盘 I/O 处理能力

根据您的服务器 IOPS 能力适当调整

一般配普通 SSD 盘的话,可以调整到 10000 - 20000

配置高端 PCIe SSD 卡的话,则可以调整的更高,比如 50000 - 80000

innodb_io_capacity = 4000 innodb_io_capacity_max = 8000

如果打开参数 innodb_flush_sync, checkpoint 时,flush 操作将由 page cleaner 线程来完成,此时 page cleaner 会忽略 io capacity 的限制,进入激烈刷脏

innodb_flush_sync = 0 innodb_flush_neighbors = 0

CPU 多核处理能力设置,假设 CPU 是 4 颗 8 核的,设置如下

读多,写少可以设成 2:6 的比例

innodb_write_io_threads = 8 innodb_read_io_threads = 8 innodb_purge_threads = 4 innodb_page_cleaners = 4 innodb_open_files = 65535 innodb_max_dirty_pages_pct = 50

该参数针对 unix、linux,window 上直接注释该参数.默认值为 NULL

O_DIRECT 减少操作系统级别 VFS 的缓存和 Innodb 本身的 buffer 缓存之间的冲突

innodb_flush_method = O_DIRECT

innodb_lru_scan_depth = 4000 innodb_checksum_algorithm = crc32

为了获取被锁定的资源最大等待时间,默认 50 秒,超过该时间会报如下错误:

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

innodb_lock_wait_timeout = 20

默认 OFF,如果事务因为加锁超时,会回滚上一条语句执行的操作。如果设置 ON,则整个事务都会回滚

innodb_rollback_on_timeout = 1

强所有发生的死锁错误信息记录到 error.log 中,之前通过命令行只能查看最近一次死锁信息

innodb_print_all_deadlocks = 1

在创建 InnoDB 索引时用于指定对数据排序的排序缓冲区的大小

innodb_sort_buffer_size = 67108864

控制着在向有 auto_increment 列的表插入数据时,相关锁的行为,默认为 2

0:traditonal(每次都会产生表锁)

1:consecutive( mysql 的默认模式,会产生一个轻量锁,simple insert 会获得批量的锁,保证连续插入)

2:interleaved(不会锁表,来一个处理一个,并发最高)

innodb_autoinc_lock_mode = 1

表示每个表都有自已独立的表空间

innodb_file_per_table = 1

指定 Online DDL 执行期间产生临时日志文件的最大大小,单位字节,默认大小为 128MB。

日志文件记录的是表在 DDL 期间的数据插入、更新和删除信息(DML操作),一旦日志文件超过该参数指定值时,

DDL 执行就会失败并回滚所有未提交的当前 DML 操作,所以,当执行 DDL 期间有大量 DML 操作时可以提高该参数值,

但同时也会增加 DDL 执行完成时应用日志时锁定表的时间

innodb_online_alter_log_max_size = 4G

[mysqldump] quick max_allowed_packet = 128M