mysql 参数和部署规范 没有整理 仅供参考
参数
innodb_flush_log_at_trx_commit =0/1
ACID的强一致性与commit之间性能的妥协
0.每秒刷出一次log 避免性能问题
1.在提交事务的时候 强制必须刷新所有log才算提交成功 每个事务提交和日志文件刷新到磁盘
2. 在0和1之间自动调整
innodb_flush_log_at_timeout可以控制刷出间隔多于1s
sync_binlog=1
0 二进制日志不会同步到磁盘
1.所有事务都是同步的,二进制日志之前提交。
innodb_file_per_table
#独立表空间
on/off
innodb_data_file_path
innodb数据文件和他们的大小。每个数据文件的完整目录路径是由链接innodb_data_home_dir指定路径
long_query_time
慢查询日志 慢查询时间
slow_query_log
开启慢查询日志
slow_query_log_file
慢查询日志位置
lower_case_table_names
大小写敏感
0.区分大小写
1.不分区大小写
2.创建的表和DB依据语句上格式存放,凡是查找都是转换为小写进行
log_queries_not_using_indexes
记录没有使用索引的sql语句
general_log on或者off
开启查询日志
general_log_file
查询日志路径
query_cache_size
查询缓存大小
query_cache_type
0查询缓存禁用
1.开启
max_connection(最大连接数)、 最大不要超过800
max_connection_error(最大错误数,建议设置为10万以上,
open_files_limit、 最大打开文件数
innodb_open_files、 innodb 打开最大文件数
table_open_cache、
table_definition_cache这几个参数则可设为约10倍于max_connection的大小
max_user_connections 每个用户最大链接
binlog_format
GTID相关(全局事物标识:global transaction identifieds)
gtid_mode=on
开启gtid
enforce_gtid_consistency
OFF:都是允许违反GTID一致性。
ON:不允许违反GTID事务一致性。
推荐
gtid_mode=on
enforce_gtid_consistency=on
master_info_repository
# 记录到表中 master信息
table mysql.slave_master_info
FILE 记录到 master.info
relay_log_info_repository
FILE 记录到relay-log.info
table 记录到mysql.slave_relay_log_info
skip_slave_start=1
#当服务停止 从的状态是关闭的
auto_increment_increment
没次增长的步长
auto_increment_offset
起始位置
binlog_row_image
较少DML操作产生的binlog体积
binlog_rows_query_log_events
on 或者off
记录用户的query
tx_isolation 查看当前事务隔离级别
binlog_rows_query_log_events
#查看用户输入参数
log_bin_use_v1_row_events
binlog版本
log_slave_updates
innodb_autoinc_lock_mode
1.默认设置 可预判行数时使用新方式 不可预判时仍旧使用表锁 会造成autoinc列自增空间 不过影响很小
0 即沿用旧的表级锁模式 每次请求都会等待锁 不过也非常快 不会影响整个事务 只影响当前的insert语句
2.直接全部使用新方式 不安全 不适合replication环境
log_timestamps 坑爹参数 UTC(系统默认)和SYSTEM(本地系统时区)
该参数主要是控制 error log、genera log,等等记录日志的显示时间参数
time_zone
系统的时区参数
lock_wait_timeout 锁超时阀值定义 默认是1年 记得调小
5.7 error log使用系统时间
log_timestamps =0时 日志中是UTC时区
log_timestamps=1时 日志中是SYSTEM时区
默认是log_timestamps=0
set global log_timestamps = 1;
innodb_spin_wait_delay 控制轮训间隔 默认6秒
innodb_read_io_threads
读io进程数 默认是4 改成8
innodb_write_io_threads
写io进程数 默认是4 改成8
innodb_io_capacity
磁盘IO吞吐,具体为缓冲区落地的时候,可以刷脏页的数量,默认200,由于使用了SSD硬盘,所以推荐设置到3000-5000。
innodb_max_dirty_pages_pct
争议比较大,一般来说都是在75-90之间,主要控制BP中的脏数据刷盘的时机,如果太小会频繁刷盘造成IO上升,如果太大会导致MySQL正常关闭的时候需要很长的时间才能normal shutdown,具体需要看实际场景,个人推荐90。
innodb_force_recovery 1-6 启用故障恢复模式
1.即便发现损坏的页 实例也正常运行
2.避免innodb master 已经purge线程的运行
3.不回滚事务
4.避免 insert buffer 的合并
5.不扫描undo日志
6.不做redo前滚 会导致部分数据丢失
(主库崩溃 从库没有
这时候 从库比主库的可信度要高)
show engine innodb status\G
innodb_undo_tablespaces=3 #设置undo个数
innodb_undo_logs 设置undo表空间个数
当undo超过innodb_max_undo_log_size时 会出发truncate工作
purge执行innodb_purge_rseg-truncate_frequency次后
也会触发truncate工作
建议使用独立undo表空间
innodb_page_size
<5.6版本 不可调整
5.6版本时 8kb 4kb 但不能调大
5.7以上 32KB 64KB
全局选项 无法在运行过程中动态修改
innodb_buffer_pool_instances
管理innodb buffer pool
一个instances 管理8到16g内存
instances*buffer pool
innodb_buffer_pool_load_at_startup
mysql启动 自动加载之前保存的buffer pool
innodb_buffer_pool_dump_at_shutdown
是否在关闭实例的时候保存 buffer pool的内容
innodb_flush_method=O_DIRECT
innodb flush 操作文件方法
innodb_old_blocks_pct
设置老数据块占用 buffer pool的比例
relay_log_recovery
当slave从库宕机 relay-log损坏
自动放弃未执行的relay-log 并且重新从master 获取日志
保证了relay-log的完整
innodb_fill_factor
innodb_flush_log_at_trx_commit
0 事务提交时不将redo log buffer写入磁盘
1事务提交时将redo log buffer写入磁盘
2 事务提交时 仅将redo log buffer写入操作系统缓存
通常设置为1 并且设置sync_binlog=1 以保证数据可靠性
innodb_log_buffer
通常8-32M 足够了
innodb_log_file_size
一般设置为512M-4G
innodb_log_fles_in_group
至少2个文件
比较暴力 只有在需要干净重启时才需要
innodb_fast_shutdown=0,1,2
扫描列表 并找到邻居页面(innodb_flush_neighbors=1 机械硬盘适用 ssd盘可关闭)一起刷新
重点参数
innodb_buffer_pool_size
最大内存块 建议为物理内存的50%-80%
innodb_max_dirty_pages_pct
buufer pool中dirty page 最大占比 建议不超过50%
innodb_old_blocks_pct
buffer pool 中old block sublist 最大占比 默认3/8
innodb_change_buffering
change buffer 类型 all或其他
innodb_log_buffer_size
redo log buffer 能缓存5秒左右产生的redo log 能够
32MB基本管够
innodb_sort_buffer_size
innodb 表新创建索引时 批量加载更新索引 以及online ddl时
将当前发生dml记录到临时log中
innodb_data_file_path
共享表空间初始大小 至少1G以上
innodb_log_file_size
redo log 大小 加大有助于减少checkpoint 频率 高tps
innodb_flush_log_at_trx_commit
redo log 刷新机制 1最安全 0性能最高
innodb_io_capacity
innodb 后台线程最大iops上限
innodb_flush_method
刷新innodb date file和log file使用的方式
推荐O_DIRECT
innodb_stats_on_metadata=0
执行 show table status show index时是否更新统计信息
innodb_autoinc_lock_mode=1
auto-inc锁模式 推荐是1
innodb_file_per_table=1
是否独立表空间
innodb_fast_shutdown=0/1
是否快速关闭 推荐1 需要版本升级或者机器重启 设置为0
innodb_force_recovery =0
恢复级别 可选0-6 从最小开始尝试起
关闭CPU节能,设定为最大性能模式
关闭NUMA C-states C1E
bios和os 都要关闭
os里面关闭numa
CENTOE7
GRUB_CMDLINE_LINUX="rhgb quiet numa=off"
grub2-mkconfig -o /boot/grub2/grub.cfg #重新生成
CENTOS6
/etc/grub.conf的kernel行最后添加numa=off,如下所示:
阵列卡策略 机械盘好用wb sshd 用wt模式 根据实际情况自己做测试
wbwrite back 先写缓冲在写硬盘 机器盘 wb
wt write through 直接写硬盘 ssd用wt
(ssd 从wb改成wt后 iops没什么变化 但是 io的%util上升了很多 )
正常 wb模式至少比wt时iops高一倍以上
测试工具
机械盘时,所有盘所组成RAID10陈列
SSD盘可以只有二块组成RAID1 或三块做RAID5 最好不用同一个批次的ssd
XFS +deadine/noop
/sys/block/sda/queue/scheduler
anticipatory:猜想时间(适合大文件,如果数据连续猜想时间小为好,如果数据不太连续,时间大较好)
deadline:最终期限(对小数据优)
cfq:完全公平
noop:不调整,在iosched里面没有任何调优参数(适合ssd硬盘和单独的存储)
[root@localhost queue]# sysctl -a | grep swap
vm.swappiness = 30 #系统优先使用swap和内存
[root@localhost queue]# sysctl -a | grep ratio
vm.dirty_ratio = 30 #脏页占整个内存的比例,开始刷新
vm.dirty_background_ratio = 10 #脏页占程序的百分比 ,开始刷新
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
#设置为1 减少TIME_WAIT 提高TCP效率
建议值
vm.swappiness <=10
vm.dirty_ratio <=5
vm.dirty_background_ratio <= 10
#mysql 服务器要不要swap 取决于 你希望mysql半死不活,还是快速重启
mount 选项 noatime nodiratime nobarrier选项
mysql安装规范
basedir datadir backupdir binlogdir
mysql参数
innodb_flush_log_at_trx_commit & sync_binlog =1 #数据的安全性
每次事务提交mysql都会把log buffer 的数据写入log file ,并且flush(刷新到磁盘)中
#0 每秒钟刷出一次log,避免性能问题
#1在事务提交的时候 强制必须刷出所有的log才算提交成功
sync_binlog =1
二进制日志同步到磁盘的频率。 binary log 每次写入sync_binlog 1次后 刷写到磁盘
innodb_file_per_table =1/on
innodb 独立表空间
innodb_data_file_path 至少是1G
#innodb 表空间l
long_query_time <=0.5
#开启慢查询日志
lower_case_table_names
#表的大小写是否敏感
0区分大小写
1不区分大小写
max_connection(最大连接数)、
max_connection_error(最大错误数,建议设置为10万以上,
open_files_limit、innodb_open_files、table_open_cache、table_definition_cache这几个参数则可设为约10倍于max_connection的大小
# 不使用 qc
query_cache_size =0
query_cache_type =0
qc是查询缓存用于缓存select查询语句,并在下次使用的时候不去查询直接走返回的结果。
如果一张表里面有 update insert delect语音 他就重新计算hash值 然后在计算缓存值
qc的使用场景 一张表里面 99.999%都是读业务
redis
vm.overcommit_memory = 1
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
学习方法
手册
基础知识 事务 锁 b+树
/sys/block/sda/queue/scheduler
anticipatory:猜想时间(适合大文件,如果数据连续猜想时间小为好,如果数据不太连续,时间大较好)
deadline:最终期限(对小数据优)
cfq:完全公平
noop:不调整,在iosched里面没有任何调优参数(适合ssd硬盘和单独的存储)
[root@localhost queue]# sysctl -a | grep swap
vm.swappiness = 30 #系统优先使用swap和内存
[root@localhost queue]# sysctl -a | grep ratio
vm.dirty_ratio = 30 #脏页占整个内存的比例,开始刷新
vm.dirty_background_ratio = 10 #脏页占程序的百分比 ,开始刷新
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
#设置为1 减少TIME_WAIT 提高TCP效率
建议值
vm.swappiness <=10
vm.dirty_ratio <=5
vm.dirty_background_ratio <= 10
#mysql 服务器要不要swap 取决于 你希望mysql半死不活,还是快速重启
mount 选项 noatime nodiratime nobarrier选项
在mount的时候加上 noatime属性