MySQL8.0单实例部署

 

 

一、服务器初始化

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. 其他参数

 

 

一、服务器初始化

1. 配置时区

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

2. 安装基础软件包

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

3. 关闭防火墙 iptables

建议关闭 iptables,否则可能会对数据库服务造成影响

shell> systemctl stop firewalld.service

shell> systemctl disable firewalld.service

检查selinux是否关闭

shell> getenforce

如果未关闭,配置关闭selinux

shell> setenforce 0

shell> vi /etc/selinux/config

 

SELINUX=disabled

SELINUXTYPE=targeted

4. 配置历史命令格式

使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

5. 优化系统参数配置

shell> vi /etc/sysctl.conf

 

vm.overcommit_memory = 1

vm.swappiness=1

fs.file-max = 1024000

## 生效

shell> sysctl -p

6. 关闭透明大页

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

7. 关闭NUMA

使用 MySQL5.7.9 之后的版本,不用关闭服务器的 numa

8. 配置MySQL用户limits资源限制

shell> vi /etc/security/limits.d/mysql.conf

mysql soft nofile 65535

mysql hard nofile 65535

mysql soft nproc 65535

mysql hard nproc 65535

 

9. 卸载系统自带版本MySQL相关RPM

某些服务系预装了 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`

 

二、手动部署单实例

1. 创建MySQL用户和组

shell> groupadd mysql

shell> useradd -r -g mysql -s /bin/false mysql

2. 创建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

 

3. 解压MySQL软件包

解压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

 

4. 配置文件模板

shell> vi /data/mysql/etc/3306/my.cnf

注意其中有些参数根据实际情况修改

 

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

 

# 物理内存大于32Gbuffer pool配置到50-70%左右,物理内存小于32Gbuffer 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

 

5. 设置MySQL软件及数据目录权限

shell> chown -R mysql:mysql /data/mysql

6. 初始化MySQL数据库文件

#根据数据库版本,指定路径

shell> /data/mysql/base/8.0.44/bin/mysqld --defaults-file=/data/mysql/etc/3306/my.cnf --initialize-insecure --user=mysql

7. 创建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

 

8. 创建用户

登录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;

 

三、MySQL参数优化建议

1. 查询缓存

参数

参数建议

说明

query_cache_type

0

表结构或数据结构发生改变时,会导致查询缓存失效。

经常做cache失效操作,开销大

5.7建议关闭,8.0已经弃用。

query_cache_size

\

2. InnoDB buffer pool缓冲池优化

参数

参数建议

说明

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

\

每秒可以读写磁盘的次数,会直接决定MySQLTPS。(对读无效,对写有决定意义)

一般是innodb_io_capacity_max的一半。

根据服务器IOPS能力适当调整:

SATA盘,15000 rpms200 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默认值758.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缓冲池通过加载之前的缓存页数据来启动预热,默认启用。

3. 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使用操作系统缓存,避免InnodbOS的双重缓冲。

4. 其他参数

参数

参数建议

说明

sync_binlog

1

binlog刷盘策略

生产主库没有特殊情况,一定配置为1

设置写了多少个binlog events之后把binlog日志刷新到磁盘。

默认为0,表示二进制日志的落盘操作由操作系统刷新,性能最好,但是也最不安全,发生意外崩溃时没有落盘的binlog日志将丢失。

为了确保binlog日志的安全,建议设置为1,这样在每次事务提交时就会调用fdatasync()实时把binlog日志刷新到磁盘。

innodb_read_io_threads

核数*2

默认是4,范围1-645.7

MySQL性能调优-参数配置建议:

配置MySQLIO线程与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缓存,安全性和性能介于10之间。

只要事务提交成功,redo log buffer只写入文件系统缓存(page cache)。MySQL挂了不会有数据丢失,但是宕机可能会有一秒的数据损失。

tmp_table_size

\

规定了内存临时表的最大值

实际起限制作用的是tmp_table_sizemax_heap_table_size的最小值。

当内存临时表超出限制时,MySQL会自动将内存中的数据写入到磁盘临时表中,写的位置由tmpdir变量决定。如果大量存在使用磁盘临时表的情况,会影响MySQL的性能。

16G内存建议设置为64M大小。

max_heap_table_size

\

定义了用户可以创建的内存表(memory table)的大小这个值用来计算内存表的最大行数值

tmp_table_size设置一致即可。

 

 

 

posted @ 2026-01-27 14:00  py哥  阅读(7)  评论(0)    收藏  举报