美文网首页
20230131--MySQL8.0 my.conf详解

20230131--MySQL8.0 my.conf详解

作者: 負笈在线 | 来源:发表于2023-01-29 21:26 被阅读0次

    1.MySQL客户端配置

    [client]
    port = 5550

    MySQL客户端端口号,默认3306

    socket = /usr/local/mysql/tmp/mysql.sock

    用于本地连接的Unix套接字文件存放路径

    default_character_set = utf8mb4

    MySQL客户端字符集,mysql的utf8字符集默认为3位的,不支持emoji表情及部分不常见的汉字,故推荐使用utf8mb4

    2.MySQL命令行配置

    [mysql]
    no_auto_rehash

    不通过 TAB 键提示

    auto-rehash

    允许通过 TAB 键提示

    default_character_set = utf8mb4

    MySQL命令行字符集

    socket = /usr/local/mysql/tmp/mysql.sock

    用于本地连接的Unix套接字文件存放路径

    max_allowed_packet = 67108864

    服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB 字段一起工作时相当必要), 每个连接独立的大小.大小动态增加。 设置最大包,限制server接受的数据包大小,避免超长SQL的执行有问题 默认值为64M,当MySQL客户端或mysqld服务器收到大于max_allowed_packet 字节的信息包时,将发出“信息包过大”错误,并关闭连接。对于某些客户端,如果通信信息包过大,在执行查询期间,可能会遇到“丢失与 MySQL 服务器的连接”错误。默认值 64M(mysql8.0,mysql5.7为4MB)。

    3.MySQL服务端配置

    [mysqld]

    1)服务端General配置

    port = 5550

    MySQL服务端监听的TCP/IP端口,默认3306

    socket = /usr/local/mysql/tmp/mysql.sock

    用于本地连接的Unix套接字文件存放路径

    pid_file = /usr/local/mysql/tmp/mysql.pid

    进程ID文件存放路径

    basedir = /usr/local/mysql

    MySQL软件安装路径

    datadir = /var/lib/mysql/mysql_data

    MySQL数据文件存放路径

    tmpdir = /var/lib/mysql/mysql_tmp

    MySQL临时文件存放路径 .例如,它被用来处理基于磁盘的大型排序,和内部排序一样,以及简单的临时表.如果不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好。另一种选择是也可以将其放置在独立的磁盘上.可以使用”;”来放置多个路径,他们会按照 roud-robin 方法被轮询使用.

    character_set_server = utf8mb4

    MySQL服务端字符集

    collation_server = utf8mb4_0900_ai_ci

    MySQL服务端校对规则,也可以utf8_general_ci

    default_storage_engine = InnoDB

    默认存储引擎

    autocommit = OFF

    默认为ON,设置为OFF,关闭事务自动提交

    transaction_isolation = REPEATABLE-READ

    设定默认的事务隔离级别.可用的级别如下:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ,SERIALIZABLE
    1.READ UNCOMMITTED-读未提交
    2.READ COMMITTE-读已提交
    3.REPEATABLE READ -可重复读
    4.SERIALIZABLE -串行

    event_scheduler = ON

    开启事件调度器event_scheduler

    explicit_defaults_for_timestamp = ON

    控制TIMESTAMP数据类型的特性,默认ON,设置为OFF,update 时timestamp列关闭自动更新。

    lower_case_table_names = 1

    库名、表名是否区分大小写。默认为0,设置1,不区分大小写,创建的表、数据库都以小写形式存放磁盘。

    2)Network & Connection参数配置

    max_connections = 1000

    指定MySQL允许的最大连接进程数。如果在访问数据库时经常出现"Too Many Connections"的错误提 示,则需要增大该参数值。

    max_user_connections = 800 # custom

    每个数据库用户的最大连接,(同一个账号能够同时连接到mysql服务的最大连接数),默认为0,表示不限制。

    back_log = 50

    MySQL监听TCP端口时设置的积压请求栈大小,默认-1,表示自动调整大小;最大值65535

    max_connect_errors = 99999999

    如果某个用户发起的连接 error 超过该数值,则该用户的下次连接将被阻塞,直到管理员执行 flush hosts ; 命令或者服务重启, 防止黑客非法的密码以及其他在链接时的错误会增加此值

    interactive_timeout = 3600

    关闭连接之前,允许 interactive_timeout(取代了wait_timeout)秒的不活动时间。客户端的会话 wait_timeout 变量被设为会话interactive_timeout 变量的值。如果前端程序采用短连接,建议缩短这2个值, 如果前端程序采用长连接,可直接注释掉这两个选项,默认配置(8小时)

    open_files_limit = 65535

    MySQL打开的文件描述符限制,默认最小1024;当open_files_limit没有被配置的时候,比较max_connections5和ulimit-n的值,哪个大用哪个,当open_file_limit被配置的时候,比较open_files_limit和max_connections5的值,哪个大用哪个。

    connect_timeout = 30

    连接超时之前的最大秒数,在 Linux 平台上,该超时也用作等待服务器首次回应的时间。

    wait_timeout = 3600

    等待关闭连接的时间

    net_read_timeout = 30

    从服务器读取信息的超时

    net_write_timeout = 60

    从服务器写入信息的超时

    net_retry_count = 10

    如果某个通信端口的读操作中断了,在放弃前重试多次

    net_buffer_length = 8192

    包消息缓冲区初始化为 net_buffer_length 字节,但需要时可以增长到 max_allowed_packet 字节

    3)Thread & Buffer参数配置

    sort_buffer_size = 2097152

    查询排序时所能使用的缓冲区大小。排序缓冲被用来处理类似 ORDER BY 以及 GROUP BY 队列所引起的排序.一个用来替代的基于磁盘的合并分类会被使用.查看 “Sort_merge_passes” 状态变量. 在排序发生时由每个线程分配 注意:该参数对应的分配内存是每连接独占!memeory < 16GB, suggest to set 2M

    read_buffer_size = 2097152

    读查询操作所能使用的缓冲区大小。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享!用来做 MyISAM 表全表扫描的缓冲大小.当全表扫描需要时,在对应线程中分配.memeory < 16GB, suggest to set 2M

    read_rnd_buffer_size = 2097152 # custom: memeory < 16GB, suggest to set 2M

    MyISAM 以索引扫描(Random Scan)方式扫描数据的 buffer大小 memeory < 16GB, suggest to set 2M

    join_buffer_size = 2097152 # custom: memeory < 16GB, suggest to set 2M

    联合查询操作所能使用的缓冲区大小,和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享!此缓冲被使用来优化全联合(full JOINs 不带索引的联合).类似的联合在极大多数情况下有非常糟糕的性能表现, 但是将此值设大能够减轻性能影响.通过 “Select_full_join”状态变量查看全联合的数量, 当全联合发生时,在每个线程中分配。memeory < 16GB, suggest to set 2M

    bulk_insert_buffer_size = 64M

    MyISAM 使用特殊的类似树的 cache 来使得突发插入(这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATAINFILE) 更快. 此变量限制每个进程中缓冲树的字节数.设置为 0 会关闭此优化.为了最优化不要将此值设置大于 “key_buffer_size”.当突发插入被检测到时此缓冲将被分配MyISAM 用在块插入优化中的树缓冲区的大小。注释:这是一个 per thread 的限制 ( bulk 大量).此缓冲当 MySQL 需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE到一个空表中引起重建索引时被分配.这在每个线程中被分配.所以在设置大值时需要小心.

    thread_cache_size = 20

    在 cache 中保留多少线程用于重用.当一个客户端断开连接后,如果 cache 中的线程还少于 thread_cache_size,则客户端线程被放入 cache 中.这可以在需要大量新连接的时候极大的减少线程创建的开销(一般来说如果有好的线程模型的话,这不会有明显的性能提升.)服务器线程缓存这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能.通过比Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。
    根据物理内存设置规则如下:
    1G —> 8
    2G —> 16
    3G —> 32
    大于3G —> 64

    thread_stack = 192K

    线程使用的堆大小. 此容量的内存在每次连接时被预留.MySQL 本身常不会需要超过 64K 的内存,如果使用需要大量堆的 UDF 函数或者操作系统对于某些操作需要更多的堆,也许需要将其设置的更高一点.默认设置足以满足大多数应用

    query_cache_type = 0

    关闭查询缓存

    query_cache_size = 64M

    指定 MySQL 查询缓冲区的大小。在高并发,写入量大的系统,建议把该功能禁掉。 可以通过在 MySQL 控制台执行以下命令观察:

    > SHOW VARIABLES LIKE '%query_cache%';
    > SHOW STATUS LIKE 'Qcache%';
    

    如果 Qcache_lowmem_prunes 的值非常大,则表明经常出现缓冲不够的情况;如果 Qcache_hits 的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲; Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。

    query_cache_limit = 2M

    不缓存查询大于该值的结果.只有小于此设定值的结果才会被缓冲, 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.

    tmp_table_size = 67108864

    临时表的最大大小,如果超过该值,则结果放到磁盘中,此限制是针对单个表的,而不是总和.

    max_heap_table_size = 8388608

    独立的内存表所允许的最大容量.此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.

    table_definition_cache = 400

    表定义缓存区,缓存frm文件。表定义(global)是全局的,可以被所有连接有效的共享。

    table_open_cache = 512

    所有SQL线程可以打开表缓存的数量,缓存ibd/MYI/MYD文件。 打开的表(session级别)是每个线程,每个表使用。

    table_open_cache_instances = 4

    对table cache 能拆成的分区数,用于减少锁竞争,最大值64.

    4)Safety参数配置

    sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER

    MySQL支持的SQL语法模式,与其他异构数据库之间进行数据迁移时,SQL Mode组合模式会有帮助

    local_infile = OFF

    禁用LOAD DATA LOCAL命令

    plugin-load = validate_password.so

    加密认证插件,强制mysql设置复杂密码

    skip-external-locking = ON

    避免MySQL的外部锁定,减少出错几率,增强稳定性

    skip-name-resolve = OFF

    禁止 MySQL 对外部连接进行 DNS 解析,使用这一选项可以消除 MySQL 进行 DNS 解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用 IP 地址方式,否则 MySQL 将无法正常处理连接请求!

    skip-networking

    开启该选项可以彻底关闭 MySQL 的 TCP/IP 连接方式,如果 WEB 服务器是以远程连接的方式访问 MySQL 数据库服务器则不要开启该选项!否则将无法正常连接! 如果所有的进程都是在同一台服务器连接到本地的 mysqld, 这样设置将是增强安全的方法。

    sysdate-is-now = 1

    把SYSDATE 函数编程为 NOW的别名

    skip-symbolic-links

    不能使用连接文件,多个客户可能会访问同一个数据库,因此这防止外部客户锁定 MySQL 服务器。 该选项默认开启

    5)Log参数配置
    General Log

    general_log = OFF

    将所有到达MySQL Server的SQL语句记录下来,默认关闭

    general_log_file = /var/lib/mysql/mysql_log/mysql.log

    general_log路径

    log_warnings = 1

    将警告打印输出到错误 log 文件.如果对于MySQL有任何问题,应该打开警告 log 并且仔细审查错误日志,查出可能的原因.

    Slow Log

    slow_query_log = ON

    指定是否开启慢查询日志. 慢查询是指消耗了比 “long_query_time” 定义的更多时间的查询.如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,

    slow_query_log_file = /var/lib/mysql/mysql_log/slow.log

    指定慢日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log

    long_query_time = 10

    设定慢查询的阀值,超出次设定值的SQL即被记录到慢查询日志,缺省值为10s.所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.不要在这里使用”1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).

    log_queries_not_using_indexes

    如果运行的SQL语句没有使用索引,则mysql数据库同样会将这条SQL语句记录到慢查询日志文件中。

    long_slow_admin_statements

    记录那些慢的optimize table,analyze table和alter table语句

    min_examined_row_limit = 1000

    记录那些由于查找了多余1000次而引发的慢查询

    log_slow_slave_statements

    记录由Slave所产生的慢查询

    log_output = FILE

    参数 log_output 指定了慢查询输出的格式,默认为 FILE,你可以将它设为 TABLE,然后就可以查询 mysql 架构下的 slow_log 表了

    log_long_format

    在慢速日志中记录更多的信息.一般此项最好打开,打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里.

    Error Log

    log_error = /var/lib/mysql/mysql_log/error.log

    错误日志路径

    log_error_verbosity = 2

    全局动态变量,默认3,范围:1~3;表示错误日志记录的信息。1:只记录error信息;2:记录error和warnings信息;3:记录error、warnings和普通的notes信息

    6)Replication参数配置
    Bin Log

    server_id = 12

    表示是本机的序号为12,唯一

    log_bin = /var/lib/mysql/mysql_log/binlog/binlog

    打开二进制日志功能.在复制(replication)配置中,作为 MASTER 主服务器必须打开此项.如果需要从最后的备份中做基于时间点的恢复,也同样需要二进制日志.

    log_bin_index = /var/lib/mysql/mysql_log/binlog/binlog.index

    二进制的索引文件名

    binlog_format = ROW

    binlog格式,复制有3种模式STATEMENT,ROW,MIXED

    expire_logs_days = 30

    超过 30 天的 binlog 删除

    binlog_cache_size = 4194304

    在一个事务中 binlog 为了记录 SQL 状态所持有的 cache 大小,如果经常使用大的,多声明的事务,可以增加此值来获取更大的性能.所有从事务来的状态都将被缓冲在 binlog 缓冲中然后在提交后一次性写入到 binlog 中,如果事务比此值大, 会使用磁盘上的临时文件来替代.此缓冲在每个连接的事务第一次更新状态时被创建.session 级别

    max_binlog_size = 134217728

    如果二进制日志写入的内容超出给定值,日志就会发生滚动。不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。如果正使用大的事务,二进制日志还会超过max_binlog_size

    binlog_cache_size = 4194304

    每个session分配的binlog缓存大小,事务提交前产生的日志,记录到Cache中;事务提交后,则把日志持久化到磁盘

    log_slave_updates = 1

    表示slave将复制事件写进自己的二进制日志

    sync_binlog = 1

    sync_binlog=0(默认),事务提交后MySQL不刷新binlog_cache到磁盘,而让Filesystem自行决定,或者cache满了才同步。sync_binlog=n,每进行n次事务提交之后,MySQL将binlog_cache中的数据强制写入磁盘。

    binlog_rows_query_log_events = ON

    将row模式下的sql语句,记录到binlog日志,默认是0(off)

    binlog_expire_logs_seconds = 604800 # custom: default(7days) /s
    binlog_row_image = minimal

    Relay Log

    relay_log = /var/lib/mysql/mysql_log/relaylog

    定义relay_log的位置和名称,如果值为空,则默认位置在数据文件的目录,文件名为host_name-relay-bin.nnnnnn(By default, relay log file names have the form host_name-relay-bin.nnnnnn in the data directory);

    relay_log_index = /var/lib/mysql/mysql_log/relaylog.index

    relay_log的索引文件名

    relay_log_purge = ON

    是否自动清空不再需要中继日志时。默认值为ON(启用)

    max_relay_log_size = 536870912

    标记relaylog允许的最大值,如果该值为0,则默认值为max_binlog_size(1G);如果不为0,则max_relay_log_size则为最大的relay_log文件大小;

    -- relay_log_recovery = ON # only for slave

    启用relaylog的自动修复功能,避免由于网络之类的外因造成日志损坏,主从停止。

    skip-slave-start

    启动 mysql,不启动复制

    slave_net_timeout = 600

    从服务器也能够处理网络连接中断。但是,只有从服务器超过slave_net_timeout 秒没有从主服务器收到数据才通知网络中断

    sync_master_info = 10000

    slave更新mysql.slave_master_info表的时间间隔

    sync_relay_log = 10000
    sync_relay_log_info = 10000

    slave更新mysql.slave_relay_log_info表的时间间隔

    gtid_mode = ON
    enforce_gtid_consistency = ON

    GTID即全局事务ID(global transaction identifier),GTID由UUID+TID组成的。
    UUID是一个MySQL实例的唯一标识,TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且会补全没有执行的事务)。下面是一个GTID的具体形式:4e659069-3cd8-11e5-9a49-001c4270714e:1-77

    auto_increment_offset = 1

    双主复制中,2台服务器的自增长字段初值分别配置为1和2,取值范围是1 .. 65535

    auto_increment_increment = 2

    双主复制中,2台服务器的自增长字段的每次递增值都配置为2,其默认值是1,取值范围是1 .. 65535

    log_replica_updates = 1
    skip_replica_start = ON
    sync_source_info = 10000

    replicate_wild_ignore_table = configdb.% # custom: only for slave

    replicate_wild_ignore_table = mysql.% # custom: only for slave

    read_only = ON # custom: only for slave

    replica_net_timeout = 900

    7)InnoDB参数配置

    innodb_data_home_dir = /var/lib/mysql/var/

    设置此选项是如果希望 InnoDB 表空间文件被保存在其他分区.默认保存在 MySQL 的 datadir 中.

    innodb_file_per_table = 1

    InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间
    独立表空间优点:
    1.每个表都有自已独立的表空间。
    2.每个表的数据和索引都会存在自已的表空间中。
    3.可以实现单表在不同的数据库中移动。
    4.空间可以回收(除drop table操作处,表空不能自已回收)
    缺点:
    1.单表增加过大,如超过100G
    结论:
    共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整:innodb_open_files

    skip-innodb

    如果 MySQL 服务包含 InnoDB 支持但是并不打算使用的话,使用此选项会节省内存以及磁盘空间,并且加速某些部分

    innodb_status_file = 1

    启用InnoDB的status file,便于管理员查看以及监控等

    innodb_open_files = 60000

    限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300

    innodb_additional_mem_pool_size = 100M

    设置InnoDB存储引擎用来存放数据字典信息以及一些内部数据结构的内存空间大小,所以当我们一个MySQL Instance中的数据库对象非常多的时候,是需要适当调整该参数的大小以确保所有数据都能存放在内存中提高访问效率的。

    innodb_buffer_pool_size = 2012954214

    包括数据页、索引页、插入缓存、锁信息、自适应哈希索引、数据字典信息.InnoDB 使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.这里设置越大,在存取表里面数据时所需要的磁盘 I/O 越少.在一个独立使用的数据库服务器上,可以设置这个变量到服务器物理内存大小的 80%,不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.注意在 32 位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,所以不要设置的太高.

    innodb_buffer_pool_instances = 8

    开启8个内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写,降低并发导致的内部缓存访问冲突。InnoDB缓存系统会把参数innodb_buffer_pool_size指定大小的缓存,平分为innodb_buffer_pool_instances个buffer_poo

    innodb_write_io_threads = 4
    innodb_read_io_threads = 4

    innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4
    注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64

    innodb_data_file_path = ibdata1:500M;ibdata2:2210M:autoextend

    InnoDB将数据保存在一个或者多个数据文件中成为表空间.如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.其他情况下.每个设备一个文件一般都是个好的选择.也可以配置 InnoDB 来使用裸盘分区

    innodb_file_io_threads = 4

    用来同步 IO 操作的 IO 线程的数量. 此值在 Unix 下被硬编码为 4,但是在 Windows 磁盘 I/O 可能在一个大数值下表现的更好.

    innodb_thread_concurrency = 0

    在 InnoDB核心内的允许线程数量,InnoDB 试着在 InnoDB 内保持操作系统线程的数量少于或等于这个参数给出的限制,最优值依赖于应用程序,硬件以及操作系统的调度方式.过高的值可能导致线程的互斥颠簸.默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量

    innodb_flush_log_at_trx_commit = 1

    如果设置为 1 ,InnoDB 会在每次提交后刷新(fsync)事务日志到磁盘上,这提供了完整的 ACID 行为.如果愿意对事务安全折衷, 并且正在运行一个小的事物, 可以设置此值到 0 或者 2 来减少由事务日志引起的磁盘 I/O
    1.日志写入日志文件并且日志文件刷新到磁盘.
    0.日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.
    2.日志写入日志文件并且调用文件系统的文件写入到磁盘(存在缓存机制)

    innodb_log_buffer_size = 8388608

    用来缓冲日志数据的缓冲区的大小.当此值快满时, InnoDB 将必须刷新数据到磁盘上.由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)

    innodb_log_file_size = 536870912 # custom(innodb_buffer_pool_size * 25%)

    事物日志大小.在日志组中每个日志文件的大小,应该设置日志文件总合大小到缓冲池大小的5%~100%,来避免在日志文件覆写上不必要的缓冲池刷新行为.不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.

    innodb_log_files_in_group = 2

    在日志组中的文件总数.通常来说 2~3 是比较好的.

    innodb_log_buffer_size = 8388608

    用来缓冲日志数据的缓冲区的大小.当此值快满时, InnoDB 将必须刷新数据到磁盘上.由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)

    innodb_log_group_home_dir = /var/lib/mysql/var/

    InnoDB 的日志文件所在位置. 默认是 MySQL 的 datadir.你可以将其指定到一个独立的硬盘上或者一个 RAID1 卷上来提高其性能

    innodb_max_dirty_pages_pct = 60

    InnoDB主线程刷新缓存池中的数据,使脏数据比例小于 90%,这是一个软限制,不被保证绝对执行.

    innodb_lock_wait_timeout = 100

    InnoDB 事务在被回滚之前可以等待一个锁定的超时秒数。InnoDB 在它自己的 锁定表中自动检测事务死锁并且回滚事务。 InnoDB 用 LOCK TABLES 语句注意到锁定设置。默认值是 50 秒

    innodb_flush_method = O_DIRECT

    InnoDB 用来刷新日志的方法.表空间总是使用双重写入刷新方法.有三个值fdatasync(默认),O_DSYNC,O_DIRECT
    默认是fdatasync,调用fsync()去刷数据文件与redo log的buffer
    为O_DSYNC时,innodb会使用O_SYNC方式打开和刷写redo log,使用fsync()刷写数据文件
    为O_DIRECT时,innodb使用O_DIRECT打开数据文件,使用fsync()刷写数据文件跟redo log

    innodb_force_recovery=1

    如果发现 InnoDB 表空间损坏, 设置此值为一个非零值可能帮助导出表.从1 开始并且增加此值直到能够成功导出表。

    innodb_fast_shutdown

    加速 InnoDB 的关闭. 这会阻止 InnoDB 在关闭时做全清除以及插入缓冲合并.这可能极大增加关机时间, 但是取而代之的是 InnoDB 可能在下次启动时做这些操作.

    innodb_sync_spin_loops = 40

    自旋锁的轮转数,可以通过show engine innodb status来查看。#如果看到大量的自旋等待和自旋轮转,则它浪费了很多cpu资源。浪费cpu时间和无谓的上下文切换之间可以通过该值来平衡。

    innodb_support_xa = ON

    第一,支持多实例分布式事务(外部xa事务),这个一般在分布式数据库环境中用得较多。第二,支持内部xa事务,即支持binlog与innodb redo log之间数据一致性。

    --innodb_file_format = barracuda

    InnoDB文件格式,Antelope是innodb-base的文件格式,Barracude是innodb-plugin后引入的文件格式,同时Barracude也支持Antelope文件格式。

    innodb_strict_mode = ON

    开启InnoDB严格检查模式,在某些情况下返回errors而不是warnings,默认值是OFF

    innodb_checksum_algorithm = strict_crc32

    checksum函数的算法,默认为crc32。可以设置的值有:innodb、crc32、none、strict_innodb、strict_crc32、strict_none

    innodb_io_capacity = 2000

    磁盘io的吞吐量,默认值是200.对于刷新到磁盘页的数量,会按照inodb_io_capacity的百分比来进行控制。

    innodb_purge_threads = 1

    使用独立线程进行purge操作。 每次DML操作都会生成Undo页,系统需要定期对这些undo页进行清理,这称为purge操作。

    innodb_purge_batch_size = 32

    在进行full purge时,回收Undo页的个数,默认是20,可以适当加大。

    innodb_old_blocks_pct = 75

    LRU算法,默认值是37,插入到LRU列表端的37%,差不多3/8的位置。 innodb把midpoint之后的列表称为old列表,之前的列表称为new列表,可以理解为new列表中的页都是最为活跃的热点数据。

    innodb_change_buffering = all

    用来开启各种Buffer的选项。该参数可选的值为:inserts、deletes、purges、changes、all、none。changes表示启用inserts和deletes,all表示启用所有,none表示都不启用。该参数默认值为all。

    innodb_thread_sleep_delay = 500
    innodb_undo_directory = /var/lib/mysql/mysql_log/undolog

    innodb_undo_tablespaces_total = 4

    innodb_undo_tablespaces_implicit = 2 # innodb-created

    innodb_undo_tablespaces_explicit = 2 # user-created

    innodb_undo_tablespaces_active = 4

    innodb_purge_rseg_truncate_frequency = 128
    innodb_page_size = 16384
    innodb_autoinc_lock_mode = 2 # only for [binlog_format]=row

    其他

    [mysqldump]
    quick

    支持较大数据库的转储,在导出非常巨大的表时需要此项。增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当发出长查询或mysqld必须返回大的结果行时mysqld才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 如果正是用大的BLOB值,而且未为mysqld授予为处理查询而访问足够内存的权限,也会遇到与大信息包有关的奇怪问题。如果怀疑出现了该情况,请尝试在mysqld_safe脚本开始增加ulimit -d 256000,并重启mysqld。

    [mysqlhotcopy]
    interactive-timeout

    [mysqld_safe]
    open-files-limit = 8192

    增加每个进程的可打开文件数量.确认已经将全系统限制设定的足够高!打开大量表需要将此值设大

    .................................................................................
    table_cache = 512

    所有线程所打开表的数量. 增加此值就增加了mysqld所需要的文件描述符的数量这样需要确认在[mysqld_safe]中 “open-files-limit” 变量设置打开文件数量允许至少4096

    thread_concurrency = 8

    此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.该参数取值为服务器逻辑CPU数量×2,在本例中,服务器有 2 颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为 4 × 2 = 8.设置 thread_concurrency的值的正确与否, 对 mysql 的性能影响很大, 在多个 cpu(或多核)的情况下,错误设置了 thread_concurrency 的值, 会导致 mysql 不能充分利用多 cpu(或多核),出现同一时刻只能一个 cpu(或核)在工作的情况。 thread_concurrency 应设为 CPU 核数的 2 倍.比如有一个双核的 CPU, 那么 thread_concurrency 的应该为 4; 2个双核的cpu,thread_concurrency 的值应为 8,属重点优化参数

    slave-load-tmpdir = /var/lib/mysql/mysql_tmp

    当 slave 执行 load data infile 时用

    replica_load_tmpdir = /var/lib/mysql/mysql_tmp
    skip_name_resolve = ON # custom
    skip_external_locking = ON
    event_scheduler = ON
    secure_file_priv = /var/lib/mysql/backup # custom
    mysqlx_port = 55550
    mysqlx_socket = /usr/local/mysql/tmp/mysqlx.sock

    query_cache_min_res_unit = 2K

    查询缓存分配的最小块大小.默认是 4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。
    查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
    如果查询缓存碎片率超过 20%,可以用 FLUSH QUERY CACHE 整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。
    查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size *100%
    查询缓存利用率在 25%以下的话说明 query_cache_size 设置的过大,可适当减小;查询缓存利用率在 80%以上而且 Qcache_lowmem_prunes > 50 的话说明 query_cache_size 可能有点小,要不就是碎片太多。
    查询缓存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

    memlock

    如果系统支持 memlock() 函数,打开此选项用以让运行中的 mysql 在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被 swapping out,此选项对于性能有益

    key_buffer_size = 67108864

    指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。如果是以InnoDB引擎为主的DB,专用于MyISAM引擎的 key_buffer_size 可以设置较小,8MB 已足够 如果是以MyISAM引擎为主,可设置较大,但不能超过4G. 在这里,强烈建议不使用MyISAM引擎,默认都是用InnoDB引擎.注意:该参数值设置的过大反而会是服务器整体效率降低!

    myisam_sort_buffer_size = 64M

    MyISAM 设置恢复表之时使用的缓冲区的尺寸,当在REPAIR TABLE 或用 CREATE INDEX 创建索引或 ALTER TABLE 过程中排序 MyISAM 索引分配的缓冲区

    myisam_max_sort_file_size = 10G

    mysql重建索引时允许使用的临时文件最大大小

    myisam_repair_threads = 1

    如果该值大于 1,在 Repair by sorting 过程中并行创建MyISAM 表索引(每个索引在自己的线程内).如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.这对于拥有多个 CPU 以及大量内存情况的用户,是一个很好的选择.

    myisam_recover = 64K

    允许的 GROUP_CONCAT()函数结果的最大长度

    replicate_wild_ignore_table = mysql.%

    复制时忽略表,仅用于slave

    slave_skip_errors=all

    定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors。默认情况下该参数值是off,我们可以列出具体的error code,也可以选择all,mysql5.6及MySQL Cluster NDB 7.3以及后续版本增加了参数ddl_exist_errors,该参数包含一系列error code(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)
    一些error code代表的错误如下:
    1007:数据库已存在,创建数据库失败
    1008:数据库不存在,删除数据库失败
    1050:数据表已存在,创建数据表失败
    1051:数据表不存在,删除数据表失败
    1054:字段不存在,或程序文件跟数据库有冲突
    1060:字段重复,导致无法插入
    1061:重复键名
    1068:定义了多个主键
    1094:位置线程ID
    1146:数据表缺失,请恢复数据库
    1053:复制过程中主服务器宕机
    1062:主键冲突 Duplicate entry '%s' for key %d

    max_execution_time = 3600000 # custom: (ms)
    group_concat_max_len = 1048576

    参考URL:
    https://blog.csdn.net/juan083/article/details/49489655
    https://blog.csdn.net/smooth00/article/details/72725941
    https://blog.csdn.net/jerryDzan/article/details/88942411
    https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
    http://blog.itpub.net/31397003/viewspace-2647250/

    相关文章

      网友评论

          本文标题:20230131--MySQL8.0 my.conf详解

          本文链接:https://www.haomeiwen.com/subject/dlwphdtx.html