























目 录
一、服务器初始化
1. 配置时区
2. 安装基础软件包
3. 关闭防火墙 iptables
4. 配置历史命令格式
5. 优化系统参数配置
6. 关闭透明大页
7. 关闭NUMA
8. 配置MySQL用户limits资源限制
9. 卸载系统自带日版本MySQL相关RPM包
二、手动部署单实例
1. 创建MySQL用户和组
2. 创建MySQL运行需要的目录
3. 解压MySQL软件包
4. 配置文件模板
5. 设置MySQL软件及数据目录权限
6. 初始化MySQL数据库文件
7. 创建MySQL启停脚本
8. 创建用户
三、MySQL参数优化建议
1. 查询缓存
2. InnoDB buffer pool缓冲池优化
3. InnoDB存储引擎相关优化
4. 其他参数
一、服务器初始化
l 检查时区
shell> date -R
shell> timedatectl set-timezone Asia/Shanghai
l 如果不是东八区,设置软链调整正确的时区
shell> ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
shell> ll /etc|grep localtime
## 调整后重启crontab
shell> systemctl restart crond
shell> yum install --quiet -y screen sudo vi vim less sshpass which wget net-tools net-snmp fontconfig libaio libaio-devel lvm2 hwloc logrotate crontabs libpciaccess lsof perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL perl-Digest-MD5 perl-TermReadKey libev perl-Data-Dumper perl lz4 libunwind gdb sysstat expect lrzsz unzip dstat glances > /dev/null
l 建议关闭 iptables,否则可能会对数据库服务造成影响
shell> systemctl stop firewalld.service
shell> systemctl disable firewalld.service
l 检查selinux是否关闭
l 如果未关闭,配置关闭selinux
shell> setenforce 0
shell> vi /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
l 使history记录更多历史操作记录,并记录时间戳和执行用户
shell> vi /etc/bashrc
export HISTFILESIZE=500000000
export HISTSIZE=1000000
export PROMPT_COMMAND="history -a"
export HISTTIMEFORMAT='%F %T '
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S `whoami` "
l 使配置的环境变量生效
shell> source /etc/bashrc
|
shell> vi /etc/sysctl.conf vm.overcommit_memory = 1 vm.swappiness=1 fs.file-max = 1024000 |
|
## 生效 shell> sysctl -p |
l 查看透明大页是否开启
shell> cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never ## always表示开启了
shell> cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never ## always表示开启了
l 永久关闭
|
## 将关闭THP的内容写入rc.local shell> vi /etc/rc.d/rc.local echo never >> /sys/kernel/mm/transparent_hugepage/enabled echo never >> /sys/kernel/mm/transparent_hugepage/defrag |
|
## 给rc.local加上x权限 shell> chmod +x /etc/rc.d/rc.local |
l 使用 MySQL5.7.9 之后的版本,不用关闭服务器的 numa
shell> vi /etc/security/limits.d/mysql.conf
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft nproc 65535
mysql hard nproc 65535
l 某些服务系预装了 MySQL,但是版本是5.1,避免客户端版本差异带来的影响,应该卸载这类rpm包
shell> rpm -qa|grep mysql -i
shell> rpm -e --nodeps mysql-xxx-5.1..x86_64
shell> mv /etc/my.cnf /etc/my.cnf.`date +%Y%m%d`
二、手动部署单实例
shell> groupadd mysql
shell> useradd -r -g mysql -s /bin/false mysql
shell> mkdir -p /data/mysql/base
shell> mkdir -p /data/mysql/data/3306
shell> mkdir -p /data/mysql/log/binlog/3306
shell> mkdir -p /data/mysql/log/relaylog/3306
shell> mkdir -p /data/mysql/log/redolog/3306
shell> mkdir -p /data/mysql/tmp/3306
shell> mdkir -p /data/mysql/etc/3306
shell> chmod -R 750 /data/mysql
l 解压8.0.x版本MySQL到指定目录
shell> wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.44-linux-glibc2.28-x86_64.tar.xz
shell> tar xzf mysql-8.0.44-linux-glibc2.28-x86_64.tar.xz
shell> mv mysql-8.0.44-linux-glibc2.28-x86_64 /data/mysql/base/8.0.44
shell> vi /data/mysql/etc/3306/my.cnf
l 注意其中有些参数根据实际情况修改
l 8.0.x
[mysqld]
create_admin_listener_thread = ON
admin_address = 127.0.0.1
# 管理员登录端口,自定义
admin_port = 6306
# 数据库端口,自定义
port = 3306
# server_id建议配置成ip+数据库端口
server_id = 628569637
# MySQL二进制包的路径
basedir = /data/mysql/base/8.0.44
datadir = /data/mysql/data/3306
log_bin = /data/mysql/log/binlog/3306/mysql-bin
relay_log = /data/mysql/log/relaylog/3306/mysql-relay
innodb_log_group_home_dir = /data/mysql/log/redolog/3306
tmpdir = /data/mysql/tmp/3306
log_error = /data/mysql/data/3306/mysql-error.log
# 数据库实例ip
report_host = 10.186.61.16
default_authentication_plugin=mysql_native_password
mysqlx=0
# admin_address=127.0.0.1
# admin_port=33062
# create_admin_listener_thread=ON
# BINLOG
binlog_error_action = ABORT_SERVER
binlog_format = row
binlog_checksum = NONE
binlog_rows_query_log_events = 1
log_replica_updates = 1
max_binlog_size = 250M
relay_log_info_repository = TABLE
relay_log_recovery = 1
sync_binlog = 1
log_bin_trust_function_creators = 1
binlog_encryption = OFF # can not set the variable to ON, because we can not handle encrypted binlog so far.
# GTID #
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_gtid_simple_recovery = 1
# ENGINE
default_storage_engine = InnoDB
# 物理内存大于32G时buffer pool配置到50-70%左右,物理内存小于32G时buffer pool配置60%左右即可。
innodb_buffer_pool_size = 1G
innodb_data_file_path = ibdata1:1G:autoextend
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit=1
innodb_flush_method = O_DIRECT
innodb_log_buffer_size = 64M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_max_dirty_pages_pct = 75
innodb_print_all_deadlocks=1
innodb_stats_on_metadata = 0
innodb_strict_mode = 1
innodb_io_capacity_max=6000
innodb_io_capacity = 3000
innodb_write_io_threads=8
innodb_read_io_threads=8
innodb_buffer_pool_instances=8
innodb_max_undo_log_size=4G
innodb_undo_log_truncate=1
innodb_purge_threads = 4
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_buffer_pool_dump_pct=25
innodb_sort_buffer_size = 8M
innodb_page_cleaners = 8
innodb_lock_wait_timeout = 10
innodb_flush_neighbors = 1
innodb_thread_concurrency = 8
innodb_stats_persistent_sample_pages = 64
innodb_autoinc_lock_mode = 2
innodb_online_alter_log_max_size = 1G
innodb_open_files = 4096
innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:50G
innodb_rollback_segments = 128
innodb_numa_interleave = 1
innodb_monitor_enable = log_lsn_checkpoint_age,log_max_modified_age_async,log_max_modified_age_sync
# CACHE
key_buffer_size = 16M
tmp_table_size = 64M
max_heap_table_size = 64M
# 数据库连接数,自定义
max_connections = 10000
max_connect_errors = 1000
thread_cache_size = 200
open_files_limit = 65535
binlog_cache_size = 1M
join_buffer_size = 8M
sort_buffer_size = 2M
read_buffer_size = 8M
read_rnd_buffer_size = 8M
table_definition_cache = 2000
table_open_cache_instances = 8
table_open_cache = 2000
# SLOW LOG
slow_query_log = 1
slow_query_log_file = /data/mysql/data/3306/mysql-slow.log
log_slow_admin_statements = 1
log_slow_replica_statements = 1
long_query_time = 1
# PLUGINS
plugin_load = "rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so"
# SEMISYNC #
loose_rpl_semi_sync_source_enabled = 1
loose_rpl_semi_sync_replica_enabled = 0
loose_rpl_semi_sync_source_wait_for_replica_count = 1
loose_rpl_semi_sync_source_wait_no_replica = 0
loose_rpl_semi_sync_source_timeout = 30000 # 30s
# CLIENT_DEPRECATE_EOF
session_track_schema = 1
session_track_state_change = 1
session_track_system_variables = '*'
# MISC
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci
log_timestamps=SYSTEM
lower_case_table_names = 1
max_allowed_packet = 64M
read_only = 0
super_read_only = 0
skip_external_locking = 1
skip_name_resolve = 1
skip_replica_start = 1
socket = /data/mysql/data/3306/mysqld.sock
pid_file = /data/mysql/data/3306/mysqld.pid
disabled_storage_engines = ARCHIVE,BLACKHOLE,EXAMPLE,FEDERATED,MEMORY,MERGE,NDB
log-output = FILE
binlog_expire_logs_seconds = 2592000
#
transaction_isolation=READ-COMMITTED
replica_parallel_type = LOGICAL_CLOCK
replica_parallel_workers=8
replica_preserve_commit_order=on # replica bear read flow
replica_max_allowed_packet = 1073741824
log_error_verbosity = 3
binlog_transaction_dependency_tracking = WRITESET
transaction_write_set_extraction = XXHASH64
secure_file_priv = ""
interactive_timeout = 1800
wait_timeout = 1800
explicit_defaults_for_timestamp = 1
performance-schema-instrument ='wait/lock/metadata/sql/mdl=ON'
performance-schema-instrument = 'memory/% = COUNTED'
performance-schema-instrument = 'stage/innodb/alter%=ON'
performance-schema-consumer-events-stages-current=ON
performance-schema-consumer-events-stages-history=ON
performance-schema-consumer-events-stages-history-long=ON
shell> chown -R mysql:mysql /data/mysql
#根据数据库版本,指定路径
shell> /data/mysql/base/8.0.44/bin/mysqld --defaults-file=/data/mysql/etc/3306/my.cnf --initialize-insecure --user=mysql
|
shell> vi /etc/systemd/system/mysql_3306.service |
|
[Unit] Description=MySQL Server Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target Before=uagent.service [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql # 启动结束后会发出通知信号,systemd 接下来可以启动其他服务,在容器中可能需要设置为forking(启动一个子进程,并且启动后父进程会退出) #Type=notify Type=forking PIDFile=/data/mysql/data/3306/mysqld.pid # Disable service start and stop timeout logic of systemd for mysqld service. TimeoutSec=0 # 根据数据库版本,指定路径 ExecStart=/data/mysql/base/8.0.44/bin/mysqld --defaults-file=/data/mysql/etc/3306/my.cnf --daemonize $MYSQLD_OPTS # Use this to switch malloc implementation EnvironmentFile=-/etc/sysconfig/mysql # Sets open_files_limit LimitNOFILE = 65535 # 守护,意外的停止会被重启 Restart=on-failure #设置安全退出码,不会被自动重启 RestartPreventExitStatus=1 # Set environment variable MYSQLD_PARENT_PID. This is required for restart. Environment=MYSQLD_PARENT_PID=1 # 设置私有的 tmpdir,建议设置为 false 关闭默认 PrivateTmp=false |
|
## 重载进程服务文件 shell> systemctl daemon-reload ## 启动MySQL数据库 shell> systemctl start mysql_3306 shell> systemctl enabled mysql_3306 |
l 登录MySQL数据库
shell> /data/mysql/base/8.0.44/bin/mysql -S /data/mysql/data/3306/mysqld.sock
l 创建用户
mysql> CREATE USER 'develop'@'%' IDENTIFIED WITH mysql_native_password BY 'Password_123';GRANT ALL ON *.* TO 'develop'@'%';
mysql> create user repl@'%' identified by 'repl';
mysql> grant replication slave on *.* to repl@'%';
mysql> flush privileges;
|
参数 |
参数建议 |
说明 |
|
query_cache_type |
0 |
表结构或数据结构发生改变时,会导致查询缓存失效。 经常做cache失效操作,开销大。 5.7建议关闭,8.0已经弃用。 |
|
query_cache_size |
\ |
|
参数 |
参数建议 |
说明 |
|
innodb_buffer_pool_size |
物理内存的50%~70% |
InnoDB引擎的缓冲池大小 大于32G时配置到50-75%左右,小于32G配置60%左右即可。 调整方式:按照innodb_buffer_pool_instances * innodb_buffer_pool_chunk_size 的整数倍调整大小,可以在线修改。 |
|
innodb_buffer_pool_instances |
8 |
InnoDB缓冲池被分成的实例数量,多个缓冲池可以减少内部对缓冲池数据结构的争用。 可以提高MySQL的并发性,减少不同线程读写页面的竞争。 设置太小锁冲突集中,设置太大,维护成本高。 默认值是8,采用默认值即可。 |
|
innodb_io_capacity |
\ |
每秒可以读写磁盘的次数,会直接决定MySQL的TPS。(对读无效,对写有决定意义) 一般是innodb_io_capacity_max的一半。 根据服务器IOPS能力适当调整: SATA盘,15000 rpms,200 iops能力。 Sas raid10:2000 iops。 一般配普通SSD盘,可以调整到 8000 - 20000。 配置高端PCIe SSD卡,则可以调整的更高,比如 50000 - 80000。 Fusion-io(闪存卡):25000 - 50000。 可以用户sysbench或其他工具来测试MySQL的磁盘吞吐量。 |
|
innodb_flush_neighbors |
\ |
机械盘推荐设置为1 ,固态盘设置为0。 作用:1表示将临近数据脏页一块刷新,针对机械盘增加磁盘IO刷写性能。 此参数控制刷脏时,对旁边数据页“连坐”(一起刷掉)的行为。 1是开启一同刷脏,0是不开启。再机械硬盘中,“连坐”的行为可以减少随机IO。机械硬盘的IOPS容易成为瓶颈,而固态硬盘的IOPS有了很大提升,取消临近数据页一同刷脏的行为将可以提高查询语句的响应时间。 |
|
innodb_max_dirty_pages_pct |
60 |
InnoDB刷新脏页的比例(也是最大脏页比例,innodb会尝试刷新刷脏,以使得buffer pool中的脏页不高于这个比例),基数是缓冲池。 如果业务并发量比较高,可以根据内存空间使用情况,将参数调低,保证有足够的内存空间写入新的数据。 5.7默认值75,8.0默认值90,建议设置为60。 |
|
innodb_buffer_pool_dump_pct |
25 |
记录buffer pool中缓存页的比例。 例如,如果有4个缓冲池,每个缓冲池有100个页面,并且innodb_buffer_pool_dump_pct设置为25,那么每个缓冲池中最近使用的25个页面将被转储 范围是1-100,默认值是25,建议采用默认值即可。 |
|
innodb_buffer_pool_dump_at_shutdown |
启用 |
指定在MySQL服务器关闭时,是否记录InnoDB缓存池中的缓存页,以缩短下次重启时的预热过程,默认启用。 |
|
innodb_buffer_pool_load_at_startup |
启用 |
指定MySQL服务在启动时,InnoDB缓冲池通过加载之前的缓存页数据来启动预热,默认启用。 |
|
参数 |
参数建议 |
说明 |
|
innodb_file_per_table |
1 |
启用独立表空间,每张表数据独立存放在单独的文件中,提高数据库读写性能。 |
|
innodb_log_file_size |
2-4G |
redo log重做日志文件大小 重做日志文件不能太大或太小,太大数据库crash safe时,启动恢复会很慢,太小容易频繁刷脏页。 一般建议将其设置为2-4GB大小。 |
|
innodb_log_files_in_group |
2 |
重做日志个数 InnoDB以循环方式写入文件,默认值为2。 |
|
innodb_log_buffer_size |
\ |
redo log缓冲区大小(以字节为单位) 主要用于在InnoDB执行事务期间,保存数据页的变化。 16G内存建议设置为64M |
|
innodb_flush_method |
O_DIRECT |
InnoDB数据刷盘策略 建议设置为O_DIRECT模式,在此模式下,数据文件的写入操作直接从buffer pool中刷新到磁盘上,而redo log使用操作系统缓存,避免Innodb和OS的双重缓冲。 |
|
参数 |
参数建议 |
说明 |
|
sync_binlog |
1 |
binlog刷盘策略 生产主库没有特殊情况,一定配置为1。 设置写了多少个binlog events之后把binlog日志刷新到磁盘。 默认为0,表示二进制日志的落盘操作由操作系统刷新,性能最好,但是也最不安全,发生意外崩溃时没有落盘的binlog日志将丢失。 为了确保binlog日志的安全,建议设置为1,这样在每次事务提交时就会调用fdatasync()实时把binlog日志刷新到磁盘。 |
|
innodb_read_io_threads |
核数*2 |
默认是4,范围1-64(5.7) MySQL性能调优-参数配置建议: 配置MySQL的IO线程与CPU核数一致。 |
|
innodb_write_io_threads |
核数*2 |
|
|
innodb_flush_log_at_trx_commit |
1 |
redo log刷写日志策略:控制redo buffer何时刷新到磁盘日志文件的参数。 0:在事务提交时,不会立即触发将缓存日志写入到磁盘日志文件中,而是大约每秒一次由主线程刷新到磁盘文件的操作,并调用操作系统的fsync刷新IO缓存。最不安全,但是性能最好。 在数据库挂了或者宕机的时候可能会有一秒数据的丢失。 |
|
1:在事务提交时,innodb立即触发将缓存中的redo日志写回到磁盘日志文件中,并调用系统fsync刷新IO缓存,最安全,但是性能最差。 只要事务提交就不会有数据丢失。MySQL挂了或者宕机时,因为事务没有提交,所以日志丢了也不会有损失。 生产主库没有特殊情况,一定配置为1。 |
||
|
2:在事务提交时,innodb立即将缓存中的redo日志写回到日志文件,但是并不会马上调用fsync来刷新IO缓存,而是大约每秒一次磁盘IO缓存刷新操作或者交由操作系统来决定合适刷新磁盘IO缓存,安全性和性能介于1和0之间。 只要事务提交成功,redo log buffer只写入文件系统缓存(page cache)。MySQL挂了不会有数据丢失,但是宕机可能会有一秒的数据损失。 |
||
|
tmp_table_size |
\ |
规定了内存临时表的最大值 实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。 当内存临时表超出限制时,MySQL会自动将内存中的数据写入到磁盘临时表中,写的位置由tmpdir变量决定。如果大量存在使用磁盘临时表的情况,会影响MySQL的性能。 16G内存建议设置为64M大小。 |
|
max_heap_table_size |
\ |
定义了用户可以创建的内存表(memory table)的大小,这个值用来计算内存表的最大行数值 与tmp_table_size设置一致即可。 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。