MySQL参数

常用的一些调整:1-11

  1sql_mode   //根据业务需要进行调整,由开发人员定,我们需要将sql_mode列的各个值列出来让开发人员去确定,参照官方文档。

  2autocommit    //是否隐式提交,这个需要开发的去确认

  3character_set_server=utf8mb4    //字符集也需要开发人员去定,互联网企业一般字符集设置为utf8

  4transaction_isolation = READ-COMMITTED  //默认隔离级别可重复读会存在MVCCgap锁,对并发相比已提交读会产生影响

  5explicit_defaults_for_timestamp = 1      //1表示关闭时间戳默认属性

    [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

    对于timestap列,会有很多的默认属性,这些默认属性在新的版本中已经被废弃,建议使用explicit_defaults_for_timestamp关闭默认属性。

  6max_allowed_packet = 16777216   //允许最大包的大小,如果表中有大列或一次插入大SQL,可以提高性能:

    比如对于sql

    insert into values(),(),.;  //这个sql可能很大

    insert into values;表中带有blob字段

  7event_scheduler = 1            //允许建立eventevent周期性执行

  8、强密码策略validate_password_policy=STRONG

    validate-password=FORCE_PLUS_PERMANENT

  9loose_innodb_numa_interleave=1 //数据库层面关闭numa,尽量在MySQL数据库服务器在BIOS层面关闭NUMA

  10log_timestamps=system  //系统报错的时候,以os系统当前时间为准记录错误时间

  11show_compatibility_56=on       //在新版本中兼容旧版本的information_schema中的数据字典信息

 

连接相关的参数:12-18

  12interactive_timeout = 1800   //限制一些空闲连接

    Wait_timeout = 1800    //连接上来长时间不做任何操作就剔除,控制空闲连接的超时时间

  13lock_wait_timeout = 1800 //表锁的超时,可以适当的减小,降低锁冲突的发生

  14skip_name_resolve = 1          //关闭反向解析

  15max_connections = 1500           //最大连接数一般不要超过2000

  16table_open_cache=9000 //所有线程打开表的数量

    需要适当调整,最大连接数*表关联涉及到的表的数量,最大连接数*6基本就够了

    监控 Opened_tables 参数的值,如果这个值很大,说明table_open_cache设置小了。

  17max_connect_errors = 1000000 //最大连接错误数,防止暴力破解

    对于生产用户,账号被lock以后,整个生产全部停止监控最大错误连接数:| Connection_errors_max_connections | 0 |

  18Thread_cache_size(线程缓存数量)

    对于频繁的连接建立和断开的情况下,防止线程频繁的建立和销毁

    要想办法降低Threads_created

 

 

用户线程工作空间:谨慎调整,针对每一个会话,19-23

  19read_buffer_size = 16777216  //只是对于 myisam 表生效,myisam 表不经过共享内存,但是索引经过共享内存。强烈降低这个参数

  20read_rnd_buffer_size = 16777216  //针对所有的表都生效,可以调整的大一些,16M 即可对于通过索引批量取数据有意义;可以降低通过索引访问表的时候,物理读的次数批量访问有意义

  21sort_buffer_size = 33554432  //排序空间尽量调整成16M以上,如果持续产生 Sort_merge_passes,可以在会话级别临时修改排序空间大小:mysql> set @@session.sort_buffer_size=320000000;

  22、都是针对每一个会话,尽量调整成16M以上

    tmp_table_size = 67108864——临时表空间大小

    join_buffer_size = 134217728——表连接空间,多表关联会用到

    binlog_cache_size=2048000——二进制日志缓存空间

      mysql> show global status like '%disk%';

      +----------------------------+-------+

      | Variable_name | Value |

      +----------------------------+-------+

      | Binlog_cache_disk_use | 0 | //针对事务 SQL

      | Binlog_stmt_cache_disk_use | 0 |       //针对非事务 SQL

      | Created_tmp_disk_tables | 2 |  //针对 tmp join

        产生tmp的两种情况:

        1create temporary table

        2sql子查询

            select ..

              from

                (select);

  23max_length_for_sort_data=1024  //当达到这个值的时候就使用两次访问表的模式排序,一般调大该值。

 

日志相关参数:redobinlogslowerrundo log 等,24-43

  24log_error = error.log  //记录错误日志

  25slow_query_log = 1  //开启慢查询

  26slow_query_log_file = slow.log  //指定慢查询日志

  27log_queries_not_using_indexes = 1  //没有使用索引的SQL会被记录到慢日志中

  28log_slow_admin_statements = 1  //对于一些管理性的语句,也被记录到慢查询中去

  29log_slow_slave_statements = 1  //从库上需要开启复制,SQL线程执行速度慢也会被抓取

  30log_throttle_queries_not_using_indexes = 10  //每分钟允许全表扫描的SQL记录到慢查询日志的次数,防止slowlog暴增

  31log-bin=MySQLserver  //开启binlog

  32binlog_format = ROW  //可以使用rowmixed模式;row 模式可能会带来一些问题,比如:当主库表中没有主键进行dml时,对从库来说意味着灾难

  33expire_logs_days = 90  //启用自动删除binlog,保留binlog 90天。可能会导致性能的抖动,主要是因为io被占用

  34long_query_time = 2  //慢查询阀值

  35min_examined_row_limit = 100  //访问的行数(Rows_examined)大于100才记录到慢日志中哪个参数真正反映一个SQL的性能?

    # Query_time: 0.000306 Lock_time: 0.000145 Rows_sent: 1 Rows_examined: 1

    哪个参数真正反映数据库的负载?

    mysql> show global status like '%_rows_%';

    +----------------------+-------+

    | Variable_name | Value |

    +----------------------+-------+

    | Innodb_rows_deleted | 0 |

    | Innodb_rows_inserted | 6 |

    | Innodb_rows_read | 22 |

    | Innodb_rows_updated | 1 |

    +----------------------+-------+

  36binlog-rows-query-log-events = 1 update set where id=1;    //以注释的方式记录原生 SQL

  37log-bin-trust-function-creators = 1  //在数据库中假设我们开启了 binlog,默认不能建立函数,如果需要建立函数, 就需要打开这个参数值

  38log-slave-updates = 1     //这个需要在从库上打开,开启从库的 binlog,用于级联复制

  39innodb_undo_logs = 128   //undo段的数量,默认128就可以

  40innodb_undo_tablespaces = 3     //生成三个 undo 文件,会把 undo ibdata 中独立出来

  415.7undo表空间可以主动收缩,不建议使用

    innodb_undo_log_truncate = 1:清空收缩,清空数据压缩空间

    innodb_max_undo_log_size = 20G:超出undo的最大值后就执行上面参数的清空收缩,2G有点小,一般设置成20G以上,这里超出2G后,对比较老的数据进行mark标记,标记可以被清空purge了。

    innodb_purge_rseg_truncate_frequency = 128purge启动128次以后

  42innodb_log_file_size = 17179869184        //redo日志的大小

  43innodb_log_files_in_group = 5    //redo日志的组数,必须要调整的参数,至少5组,每组至少2G

 

innodb 相关的参数:44-62

  44innodb_page_size = 16384         //innodb页大小,一般就是16k

  45innodb_buffer_pool_size = 160G        //innodb 内存缓冲池大小,一般设置成物理内存的50%~80%

    真正影响 IO,如果物理读很高,从参数层面这是重要设置

  46innodb_buffer_pool_instances = 16   //一般10G要分配一个pool

    如果 latchmutex 争用比较厉害的情况下,从参数的角度可以增加池子的数量

  47innodb_buffer_pool_load_at_startup = 1    //5.6的新特性,数据库启动时加载热数据

  48innodb_buffer_pool_dump_at_shutdown = 1    //保证重启以后,热数据会继续加载和保留在热数据区

  49innodb_buffer_pool_dump_pct = 40    //保存热数据的比例,会影响数据库的启动时间

  50innodb_flush_neighbors = 0      //关闭刷新邻接页,对于update频繁的系统刷新邻接页会导致页频繁进出内存,造成资源不必要的浪费,对于insert频繁的系统开启这个参数有意义

  51innodb_lock_wait_timeout = 5     //行锁的等待事件

  52innodb_file_format = Barracuda

  53innodb_file_format_max = Barracuda      //文件格式,52-53 这两个参数不要调

  54innodb_sort_buffer_size = 67108864  //这个是用来建立 innodb 表索引的时候使用可以增加大小,加快建立索引的速度

  55innodb_large_prefix = 1  //允许在列长度大于 767 字节的列上建立索引一般不建议在这么长的列上建立索引

  56innodb_print_all_deadlocks = 1     //死锁记录到errlog日志中

  57innodb_strict_mode = 1         //warning当初错误来报

  58innodb_file_per_table = 1      //一个表一个文件,这个需要打开

  59innodb_stats_persistent_sample_pages = 64    //mysql收集统计信息的时候,收集的页数

  60innodb_autoinc_lock_mode = 2     //0,1,2  自增长锁,建议调整成2;保证唯一,但是保证增长和连续

  61innodb_max_dirty_pages_pct //如果io能力足够强,也就是使用了闪卡,可以将这个参数调小

  62innodb_doublewrite    //可以关闭doublewrite,但是可能会导致数据库出现问题

 

读写线程相关的参数:63-71

  63、innodb_write_io_threads = 16   //默认情况下会调成cpu核数

  64、innodb_read_io_threads = 16    //默认情况下会调成cpu核数

  65innodb_lru_scan_depth = 4096     //影响脏数据的写入力度,要保证有写缓存或者使用PCIe闪卡

  66innodb_io_capacity = 10000   //每次写的量,如果脏数据占比设置为90%,当前涨到 80%,还在持续的涨, 说明需要调大innodb_io_capacity的值了,让他写的多点。如果每秒写达到80了,每次写200、这时候需要降低 innodb_io_capacity 的值。如果是闪盘,io足够可以调大。

  67innodb_io_capacity_max = 20000      //告诉mysql,我的IO能力有多强,会影响MySQL每次写入的数据页的数量假设我们采用的是PCIe闪卡,这个参数可以调大,加大写入的粒度

  68innodb_flush_method = O_DIRECT  //对于innodb表在写入的时候,跳过文件系统缓存,如果写到问文件系统缓存,断电的时候数据会丢失,造成数据不一致。

  69innodb_purge_threads = 4  //回收undodeleted数据行

  70innodb_page_cleaners

  71innodb_thread_concurrency = 64 //允许MySQL并发执行的线程的数量;保护系统不被hang住,一般要求是cpu核数的4

 

事务相关参数:72

  72、双1问题

    sync_binlog=1,影响binlog写入的参数innodb_flush_log_at_trx_commit=1

    影响redo log写入的参数innodb_support_xa=1

    当主库开启双一参数时,为了防止主从数据不一致,要把xa参数打开。

    主库上可以开启双一参数,从库上可以采用双0,提升数据库的性能

    开启双一时,最安全,但性能最差。

 

主从、并行复制相关参数:73-75

  73、默认info信息放在文件中

    master_info_repository = TABLE,将info信息放在表中,可以保护info信息,因为info表被innodb引擎保护

    relay_log_info_repository = TABLE

    relay_log_recovery = 1,自动恢复损坏的relayloginfo文件损坏的话,这个从库基本上被废掉

  74slave_skip_errors = ddl_exist_errors

    从库将来可能会出现一些执行错误

    默认情况下,如果出现执行错误,从库的sql线程就会停止很多时候需要手工干预,让从库跳过一些错误,继续执行

    ERROR 1292 (22007): Incorrect datetime value: 'abc' for column 't1' at row 1

  75、重点调整并行复制,从库调整

    slave-parallel-type = LOGICAL_CLOCK

    这个参数必须要设置成 LOGICAL_CLOCK,否则下面的参数设置不生效

    slave-parallel-workers = 16 #开启16个并行 SQL 线程去应用,减小应用延迟

    slave_preserve_commit_order=1  #这个一定要是1,因为开启了并行SQL线程去应用,1保证事务在 slave 上执行的顺序与 relay log 中的顺序严格一致,只有当“slave-parallel-workers”>0 时有效

    slave_transaction_retries=128  #SQL线程执行事务发生锁超时时,先尝试着再执行128 次,不至于一被锁住就马上回滚事务。

 

posted @ 2019-08-05 09:39  Tech_Shrimp  阅读(398)  评论(0编辑  收藏  举报