MySQL配置文件

MySQL的配置文件须要根据版本及实际状况进行相应配置,本人使用的是Percona版本,主要是用到线程池等功能,因此选择Percona版本,配置文件内容以下,大部分参数信息我参考了相关资料作了说明,若有不当之处欢迎你们来指正。mysql

 [mysqld]

######################################################################################################################3
#file config
######################################################################################################################3
pid-file=/data/mysql/mysql3307/tmp/mysqld.pid
basedir=/usr/local/mysql
datadir=/data/mysql/mysql3307/data
socket=/data/mysql/mysql3307/tmp/mysql.sock
user=mysql
port=3306

#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
back_log = 500     
######################################################################################################################
#back_log值指出在mysql暂时中止回答新请求以前的短期内多少个请求能够被存在堆栈中。也就是说,若是MySql的链接数
#达到max_connections时,新来的请求将会被存在堆栈中,以等待某一链接释放资源,该堆栈的数量即back_log,若是等待链接的数量
#超过back_log,将不被授予链接资源。将会报:unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL
#的待链接进程时.back_log值不能超过TCP/IP链接的侦听队列的大小。若超过则无效,查看当前系统的TCP/IP链接的侦听队列的大小
#命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog,目前系统为1024。对于Linux系统推荐设置为大于512的整数
#######################################################################################################################
server-id=394406
skip-name-resolve=1  # 跳过域名解析
character_set_server=utf8
max_connections = 1000
max_connect_errors = 100 ##max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的状况。max_connect_errors的值与性能并没有太大关系
interactive_timeout=600 #服务器关闭交互式链接前等待活动的秒数,同时设置interactive_timeout和wait_timeout才会生效
wait_timeout=600  # 服务器关闭非交互链接以前等待活动的秒数。
          #长时间的执行批量的MYSQL语句。最多见的就是采集或者新旧数据转化
event_scheduler=1 #开启事件调度器,0 off 1 on
explicit_defaults_for_timestamp #显示指定默认值为timestamp类型的字段 http://www.jb51.net/article/71105.htm
log_timestamps=SYSTEM ##5.7.2新增参数log_timestamps 参数默认使用 UTC 时区,这样会使得日志中记录的时间比中国这边的慢了 8 个小时,致使查看日志不方便。修改成 SYSTEM 就能解决问题
sql_mode='' #sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是能够容许一些非法操做的,好比容许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,因此开发、测试环境的数据库也必需要设置,这样在开发测试阶段就能够发现问题
######################################################################################################################
#若是使用mysql,为了继续保留你们使用oracle的习惯,能够对mysql的sql_mode设置以下:
#在my.cnf添加以下配置
#[mysqld]
#sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
#ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES'
######################################################################################################################
default_storage_engine=innodb

slow_query_log=1;#经过使用--slow_query_log[={0|1}]选项来启用慢查询日志。全部执行时间超过long_query_time秒(缺省值为10s)的SQL语句都会被记录到慢查询日志
long_query_time = 600 #slow_query_log 这句是开启记录慢查询功能,slow_query_log=0关闭;slow_query_log=1开启(这个1能够不写)
                      #long_query_time = 1 这句是记录超过1秒的SQL执行语句
slow_query_log_file='/data/mysql/mysql3307/data/DBDWARE01-slow.log'
log_error_verbosity=1 #全局动态变量,默认3,范围:1~3。表示错误日志记录的信息,1:只记录error信息;2:记录error和warnings信息;3:记录error、warnings和普通的notes信息。
#slow_launch_time=2 #slow_launch_time的设定跟慢查询日志的查询阀值设定不一样,表示了thread create的一个阀值,若是thread create的时间超过了这个值,这变量slow_launch_time的值加1

myisam_repair_threads=2 # 若是该值大于1,在Repair by sorting过程当中并行建立MyISAM表索引(每一个索引在本身的线程内)  
myisam_recover_options=FORCE #myisam_recover_options=force,那么即便此时key cache不存在了也会进行强制修复,此时作的就是对比数据文件和索引文件,而后删除数据文件中多余的行,所以这样可能会丢数据
                 #配置了参数myisam_recover_options=default,这个配置表示每次访问MyISAM表以前都会先检测表是否须要修复,若是须要则自动进行,这也就是前面看到信息last (automatic?) repair failed。而修复失败是由于这个参数带来的修复行为默认是从key cache里面找须要修复的数据,而我当时是shutdown实例,rsync到新环境中起实例,此时已没有当时的现场(key cache环境),加上default不会强制进行修复(强制修复表若是索引文件和数据文件数据不一致则自动进行删除或者增长行),(若是是myisam_recover_options=force,那么即便此时key cache不存在了也会进行强制修复,此时作的就是对比数据文件和索引文件,而后删除数据文件中多余的行,所以这样可能会丢数据)

######################################################################################################################3
#memory config
######################################################################################################################3
table_open_cache = 10000 #MYSQL默认的table_open_cache为64,这个数值是偏小的,若是max_connections较大,则容易引发性能问题。
             #表现:数据库查询效率慢,show processlist 发现比较多的查询正在opening table。
max_allowed_packet = 16M #用来控制其通讯缓冲区的最大长度,解决执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。好比,图片数据的处理
max_heap_table_size = 64M #这个变量定义了用户能够建立的内存表的大小,这个值用来计算内存表的最大行数值
tmp_table_size = 1073741824    #copy to tmp talbe 语句产生的缘由是查询须要Order By 或者Group By等须要用到结果集时,
                                #参数中设置的临时表的大小小于结果集的大小时,就会将该表放在磁盘上,这个时候在硬盘上的IO
                #要比内销差不少。所耗费的时间也多不少。另外Mysql的另一个参数max_heap_table_size
                #比tmp_table_size小时,则系统会把max_heap_table_size的值做为最大的内存临时表的上限,
                #大于这个时,改写硬盘
sort_buffer_size = 50M #你能够考虑增长sort_buffer_size 来加速ORDER BY 或者GROUP BY 操做,不能经过查询或者索引优化的。
                       #在任何状况下, 设置它大于须要的全局会减慢不少的查询。最后是做为一个会话设置来增长,
                       #只有对须要大量的内存的会话, 在Linux上,有阀值为256KB 和2MB ,大的值可能显著的减慢内存分配
join_buffer_size = 50M #若是应用中,不多出现join语句,则能够不用太在意join_buffer_size参数的设置大小。
                       #若是join语句不是不多的话,我的建议能够适当增大join_buffer_size到1MB左右,若是内存充足能够设置为2MB
thread_cache_size = 8 #根据物理内存设置规则以下1G  —> 8, 2G  —> 16 ,3G  —> 32 ,>3G  —> 64

# thread_concurrency = 8
ft_min_word_len = 2 #中文分词,ft_min_word_len设置为2,调用'repair table your_table quick',修复索引。相比方案2,此方案较节省空间。对于主要使用中文的系统而言,此方案更佳
memlock  #服务器是否锁定在内存中
default-storage-engine = MyISAM
thread_stack = 192K    #每一个链接线程被建立时,MySQL给它分配的内存大小.当MySQL建立一个新的链接线程时,须要给它分配必定大小的
            #内存堆栈空间,以便存放客户端的请求的Query及自身的各类状态和处理信息。
transaction_isolation = REPEATABLE-READ ##事务隔离级别,全局默认是REPEATABLE-READ,其实MySQL原本默认也是这个级别

key_buffer_size = 1024M    #这个参数是用来设置索引块(index blocks)缓存的大小,它被全部线程共享,严格说是它决定了数据库索引处理的速度
                        #尤为是索引读的速度。那咱们怎么才能知道key_buffer_size的设置是否合理呢,通常能够
            #检查状态值Key_read_requests和Key_reads,比例key_reads / key_read_requests应该尽量的低,
            #好比1:100,1:1000 ,1:10000。其值能够用以i下命令查得:mysql> show status like 'key_read%';
read_buffer_size = 2M    # MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。
                        # 若是对表的顺序扫描请求很是频繁,而且你认为频繁扫描进行得太慢,能够经过增长该变量值以及内存缓冲区大小提升其性能
read_rnd_buffer_size = 16M #MySql的随机读(查询操做)缓冲区大小.当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。
                           #进行排序查询时,MySql会首先扫描一遍该缓冲,以免磁盘搜索,提升查询速度,若是须要排序大量数据,
               #可适当调高该值。但MySql会为每一个客户链接发放该缓冲空间,因此应尽可能适当设置该值,以免内存开销过大。
bulk_insert_buffer_size = 4294967296 #批量插入数据缓存大小,能够有效提升插入效率,默认为8M
myisam_sort_buffer_size = 128M  #MyISAM表发生变化时从新排序所需的缓冲
myisam_max_sort_file_size = 10G    # MySQL重建索引时所容许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
                                # 若是文件大小比此值更大,索引会经过键值缓冲建立(更慢)
myisam_repair_threads = 1    # 若是一个表拥有超过一个索引, MyISAM 能够经过并行排序使用超过一个线程去修复他们.
                                # 这对于拥有多个CPU以及大量内存状况的用户,是一个很好的选择
#myisam_recover

######################################################################################################################3
#innodb config
######################################################################################################################3
innodb_buffer_pool_size = 40G    #这对Innodb表来讲很是重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM能够在默认的 key_buffer_size 设置下运行的能够,
  #然而Innodb在默认的 innodb_buffer_pool_size 设置下却跟蜗牛似的。因为Innodb把数据和索引都缓存
                #起来,无需留给操做系统太多的内存,所以若是只须要用Innodb的话则能够设置它高达 70-80% 的可用内存。
                #一些应用于 key_buffer 的规则有 — 若是你的数据量不大,而且不会暴增,
                #那么无需把 innodb_buffer_pool_size 设置的太大了
innodb_data_file_path = ibdata1:10M:autoextend    #数据文件配置,共享表空间地址及初始化大小,自动扩展属性
innodb_read_io_threads=8
innodb_write_io_threads=8        # innodb_read_io_threads innodb_write_io_threads 多核cpu能够经过这两个参数更有效的利用cpu性能
innodb_thread_concurrency = 16   # 调节  并发线程数的限制值
innodb_flush_log_at_trx_commit = 2  
## innodb_flush_log_at_trx_commit ##
# 0:log buffer将每秒一次地写入log file中,而且log file的flush(刷到磁盘)操做同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操做。
#1:每次事务提交时MySQL都会把log buffer的数据写入log file,而且flush(刷到磁盘)中去,该模式为系统默认。
#2:每次事务提交时MySQL都会把log buffer的数据写入log file,可是flush(刷到磁盘)操做并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操做
innodb_log_buffer_size = 8M   # InnoDB的写操做,将数据写入到内存中的日志缓存中,因为InnoDB在事务提交前,并不将改变的日志写入到磁盘中,所以在大事务中,能够减轻磁盘I/O的压力。一般状况下,若是不是写入大量的超大二进制数据(a lot of huge blobs),4MB-8MB已经足够了
innodb_max_dirty_pages_pct = 75 # 关于innodb_max_dirty_pages_pct值的争议,若是值过大,内存也很大或者服务器压力很大,那么效率很下降,若是设置的值太小,那么硬盘的压力会增长,建议是在75-80.而且innodb plugin引进了innodb_adaptive_flushng(自适应的刷新),该值影响每秒刷新脏页的数量
innodb_flush_method = O_DIRECT  
##innodb_flush_method这个参数控制着innodb数据文件及redo log的打开、刷写模式,对于这个参数,文档上是这样描述的:
#有三个值: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_lock_wait_timeout = 120 #  innodb_lock_wait_timeout指的是事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败;参数的时间单位是秒,最小可设置为1s(此时须要考虑应用端的频繁异常处理会消耗性能,不能设置太小),最大可设置1073741824秒以上
innodb_buffer_pool_instances=8  #当 innodb_buffer_pool_size 设置的 大于 1GB 之后  那么此参数设置就尤其重要了,   MySQL 5.6.6开始 此参数默认为 8,  主要目的是为了解决 互斥锁, 每一个缓冲池管理其本身的空闲列表,提升查询并发性, 对于互斥锁 能够自行补脑吧,若是innodb_buffer_pool_size大于1.3GB,则innodb_buffer_pool_instances的默认值为innodb_buffer_pool_size/ 128MB   即大体为 10 左右.每一个实例 具备独立的缓存区块
innodb_page_cleaners=8  # 为了提高扩展性和刷脏效率,在5.7.4版本里引入了多个page cleaner线程。从而达到并行刷脏的效果。
                        # 在该版本中,Page cleaner并未和buffer pool绑定,其模型为一个协调线程 + 多个工做线程,协调线程自己也是工做线程。所以若是innodb_page_cleaners设置为8,那么就是一个协调线程,加7个工做线程
#innodb_force_recovery=1

######################################################################################################################3
#log file config
######################################################################################################################3
expire_logs_days=30
innodb_log_files_in_group=5
innodb_log_file_size=500m
binlog_format=row
log_bin=on
log_bin=/data/mysql/mysql3307/logs/mysql-bin
log_bin_index=/data/mysql/mysql3307/logs/mysql-bin.index

######################################################################################################################3
#replication config
######################################################################################################################3
#slave_parallel_type=LOGICAL_CLOCK
slave-parallel-workers=0   # MySQL 5.6版本也支持所谓的并行复制,可是其并行只是基于schema的,也就是基于库的。若是用户的MySQL数据库实例中存在多个schema,对于从机复制的速度的确能够有比较大的帮助
master_info_repository=table # 从机把主的信息存在主信息仓库里。主信息库能够是文件也能够上表,具体由—master-info-repository参数值决定。—master-info-repository=file时 会生成master.info 和 relay-log.info2个文件,若是—master-info-repository=table,信息就会存在mysql.master_slave_info表中。无论是设置的哪一种值,都不要移动或者编辑相关的文件和表。想要更改配置经过再次执行change master to …语句,变动会自动保存到相关的文件和表。这个配置对应的表或者文件里的内容会覆盖某些命令行或者my.cnf中的配置
relay_log_info_repository=table # 建议将其修改成TABLE,由于1.relay.info明文存储不安全,把relay.info中的信息记录在table中相对安全。
                                # 2.能够避免relay.info更新不及时,SLAVE 重启后致使的主从复制出错
relay_log_recovery=on # 当slave从库宕机后,假如relay-log损坏了,致使一部分中继日志没有处理,则自动放弃全部未执行的relay-log,而且从新从master上获取日志,这样就保证了relay-log的完整性。默认状况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启
relay_log_purge=on # 有时候,咱们但愿将 MySQL 的 relay log 多保留一段时间,好比用于高可用切换后的数据补齐,因而就会设置 relay_log_purge=0,禁止 SQL 线程在执行完一个 relay log 后自动将其删除,但会有风险
##### 风险
## 首先,为了让从库是 crash safe 的,必须设置 relay_log_recovery=1,这个选项的做用是,在 MySQL 崩溃或人工重启后,因为 IO 线程没法保证记录的从主库读取的 binlog 位置的正确性,所以,就无论 master_info 中记录的位置,而是根据  relay_log_info 中记录的已执行的 binlog 位置从主库下载,并让 SQL 线程也从这个位置开始执行。MySQL 启动时,至关于执行了 flush logs ,会新开一个 relay log 文件,新的 relay log 会记录在新的文件中。若是默认状况 relay_log_purge=1 时,SQL 线程就会自动将以前的 relay log 所有删除。而当 relay_log_purge=0 时,旧的 relay log 则会被保留。虽然这并不会影响从库复制自己,但仍是会有地雷:
##    因为崩溃或中止 MySQL 时,SQL 线程可能没有执行彻底部的 relay log,最后一个 relay log 中的一部分数据会被从新下载到新的文件中。也就是说,这部分数据重复了两次。
##    若是 SQL 跟得很紧,则可能在 IO 线程写入 relay log ,但尚未将同步到磁盘时,就已经读取执行了。这时,就会形成新的文件和旧的文件中少了一段数据。
##   若是咱们读取 relay log 来获取数据,必须注意这一点,不然就会形成数据不一致。而保留 relay log 的目的也在于此。所以,在处理 relay log 时必须格外当心,经过其中 binlog 头信息来确保正确性。
#####
slave_preserve_commit_order=1 # 对于多线程slaves,来保障事务在slave上执行的顺序与relay log中的顺序严格一致,只有当“slave_parallel_workers”开启时有效;此时“log_bin”、“log_slave_updates”必须开启,并且“slave_parallel_type”值必须为“LOGICAL_CLOCK”(默认值为DATABASE)。即当多线程开启时,且根据relay log中事务的逻辑顺序执行statements,是否须要严格保持顺序,默认值为0表示并发执行忽略顺序

slave_skip_errors=1032,1062 ## 若有须要再添加,指跳过从库部分错误,1032表明当delete数据是从库不存在的报错信息 1062为重复

[mysqld_safe]
log-error=/data/mysql/mysql3307/logs/mysqld.log
pid-file=/data/mysql/mysql3307/tmp/mysqld.pid

[client]
socket = /data/mysql/mysql3307/tmp/mysql.sock

[mysql]
prompt=\\u@\\d \\r:\\m:\\s>sql

 

 

################################### 华丽的分割线 ############################################数据库

下面奉上姜老师推荐的配置缓存

[client]
user=david
password=88888888

[mysqld]

########basic settings########

server-id = 11
port = 3306
user = mysql
bind_address = 10.166.224.32 #根据实际状况修改
autocommit = 0 #5.6.X安装时,须要注释掉,安装完成后再打开
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
max_connect_errors = 1000
datadir = /data/mysql_data #根据实际状况修改,建议和程序分离存放
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
join_buffer_size = 134217728
tmp_table_size = 67108864
tmpdir = /tmp
max_allowed_packet = 16777216
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
interactive_timeout = 1800
wait_timeout = 1800
read_buffer_size = 16777216
read_rnd_buffer_size = 33554432
sort_buffer_size = 33554432

########log settings########

log_error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_throttle_queries_not_using_indexes = 10
expire_logs_days = 90
long_query_time = 2
min_examined_row_limit = 100

########replication settings########

master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
sync_binlog = 1
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log = relay.log
relay_log_recovery = 1
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors

########innodb settings########

innodb_page_size = 8192
innodb_buffer_pool_size = 6G #根据实际状况修改
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_lru_scan_depth = 2000
innodb_lock_wait_timeout = 5
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_method = O_DIRECT
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_log_group_home_dir = /redolog/ #根据实际状况修改
innodb_undo_directory = /undolog/ #根据实际状况修改
innodb_undo_logs = 128
innodb_undo_tablespaces = 3
innodb_flush_neighbors = 1
innodb_log_file_size = 4G #根据实际状况修改
innodb_log_buffer_size = 16777216
innodb_purge_threads = 4
innodb_large_prefix = 1
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_strict_mode = 1
innodb_sort_buffer_size = 67108864

########semi sync replication settings########

plugin_dir=/usr/local/mysql/lib/plugin #根据实际状况修改
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000

[mysqld-5.7]
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
innodb_purge_rseg_truncate_frequency = 128
binlog_gtid_simple_recovery=1
log_timestamps=system
transaction_write_set_extraction=MURMUR32
show_compatibility_56=on

 

 

 

 

 

 

耿小厨已开通我的微信公众号,想进一步沟通或想了解其余文章的同窗能够关注我安全

相关文章
相关标签/搜索