手动部署二进制MySQL
刚拜入宗门修仙的各位,对于刚拿到的秘籍(官方文档)尚处于晦涩状态,下篇旨在将修炼入门功法的一些注意事项罗列而出,可实际直接照着修炼,少走弯路。
安装准备
关闭防火墙及selinux
数据库服务器通常运行在内部网络,因此可以视情况关闭防火墙及selinux设置。
1.关闭防火墙服务
systemctl stop firewalld
systemctl disable firewalld
2.关闭selinux
setenforce 0
sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config
设置 swap
建议配置足够的物理内存。如果内存不足,不建议使用 swap 作为缓冲,因为这会降低性能。这边设置了一个低值没有直接禁掉,也可设置直接为 0.
echo "vm.swappiness = 1">> /etc/sysctl.conf
swapoff -a && swapon -a
sysctl -p
操作系统优化
1.设置磁盘调度策略
# 查看当前设置,其中 nvme0n1 是磁盘对应的设备文件名称
lsblk -l
cat /sys/block/nvme0n1/queue/scheduler
# 如果不是 noop 或 deadline,则修改,改后立即生效,无需重启:
echo 'noop' > /sys/block/nvme0n1/queue/scheduler
2.确认CPU性能模式
# 检查当前模式
$ cpupower frequency-info --policy
analyzing CPU 0:
Unable to determine current policy
注意:
如果输出内容不是 The governor "performance" 而是 The governor "powersave" 的话,则要注意了。
The governor "powersave" 表示 cpufreq 的节能策略使用 powersave,需要调整为 performance 策略。
如果是虚拟机或者云主机,则不需要调整,命令输出通常为 Unable to determine current policy。
3.关闭透明大页
建议关闭透明大页(Transparent Huge Pages / THP)。OLTP型数据库内存访问模式通常是稀疏的而非连续的。当高阶内存碎片化比较严重时,分配 THP 页面会出现较高的延迟,反而影响性能。
# 查看当前设置
cat /sys/kernel/mm/transparent_hugepage/enabled
# 如果输出结果不是 never 的话,则需要执行下面的命令关闭:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
4.优化内核参数
echo "fs.file-max = 1000000" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 10" >> /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_time = 600" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_tw_buckets = 55000" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 65535" >> /etc/sysctl.conf
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
echo "net.core.netdev_max_backlog = 200000" >> /etc/sysctl.conf
# 调整 TCP/UDP 套接字的接收和发送缓冲区大小
echo "net.core.rmem_default = 262144" >> /etc/sysctl.conf
echo "net.core.wmem_default = 262144" >> /etc/sysctl.conf
echo "net.core.rmem_max = 2097152" >> /etc/sysctl.conf
echo "net.core.wmem_max = 2097152" >> /etc/sysctl.conf
echo "net.ipv4.tcp_synack_retries = 2" >> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf
sysctl -p
5.修改使用资源上限
# 修改 /etc/security/limits.conf 系统文件
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
* soft nproc 65535
* hard nproc 65535
配置时间同步
需要配置好时间同步,时间同步一般采用 ntp 或 chrony,这边以chrony为例
yum install -y chrony
配置同步源,这边以配置阿里源为例,vim /etc/chrony.conf
pool ntp.aliyun.com iburst
pool ntp1.aliyun.com iburst
pool ntp2.aliyun.com iburst
配置完成后启动
systemctl start chronyd
部署安装
1. 下载二进制文件
下载地址:https://dev.mysql.com/downloads/mysql/注意看下系统glibc版本 getconf -a | grep glibc,可以向下兼容,不要选择高于当前版本
或者直接使用wget下载:
wget -c https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.3-linux-glibc2.17-x86_64.tar.xz
2.创建对应的存储路径
mkdir -p /data/mysql3306/data
3.创建组与用户
# 创建用户组与用户
groupadd mysql
useradd -g mysql -s /bin/nologin mysql
# 给mysql数据文件路径授权
chown -R mysql:mysql /data/mysql3306
4.解压
tar xvf mysql-8.4.3-linux-glibc2.17-x86_64.tar.xz -C /usr/local/
cd /usr/local
5.创建软链
ln -s mysql-8.4.3-linux-glibc2.28-x86_64/ mysql
ln -s /usr/lib64/libncurses.so.6.1 /usr/lib64/libncurses.so.5
ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5
如果so.5软件不创建的话登录时候会报错
mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
6.设置环境变量
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
7.设置my.cnf
简单设置下配置信息
[client]
port = 3308
socket = /data/mysql3308/data/mysql.sock
[mysql]
prompt = "[\u@\p][\d]> "
no-auto-rehash
[mysqld]
# basic settings #
user = mysql
#主从复制或MGR集群中,server_id记得要不同
server_id = 217
basedir=/usr/local/mysql
datadir=/data/mysql3308/data
socket = /data/mysql3308/data/mysql.sock
pid_file=/data/mysql3308/data/mysqld.pid
default_storage_engine = innodb
#default_authentication_plugin=mysql_native_password
#local_infile=1
mysqlx_port = 33080
mysqlx_socket=/data/mysql3309/data/mysqlx.sock
port = 3308
lower_case_table_names = 1
default_time_zone = "+8:00"
character_set_server=utf8mb4
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
open_files_limit = 65535
back_log = 1024
max_allowed_packet = 64M
event_scheduler = 0
#sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
#secure_file_priv = ''
admin_address = '127.0.0.1'
admin_port = 33082
# connection #
interactive_timeout = 1800
wait_timeout = 1800
lock_wait_timeout = 3600
skip_name_resolve = 1
max_connections = 1024
max_connect_errors = 1000000
# table cache performance settings
#table_open_cache = 4096
#table_definition_cache = 4096
#table_open_cache_instances = 16
# session memory settings #
read_buffer_size = 2M
read_rnd_buffer_size = 1M
sort_buffer_size = 2M
join_buffer_size = 2M
bulk_insert_buffer_size = 16M
tmp_table_size = 32M
max_heap_table_size = 32M
thread_cache_size = 768
thread_stack = 512K
# log settings #
# 8.0参数
binlog_expire_logs_seconds = 604800
log_timestamps = SYSTEM
log_error = error.log
log_error_verbosity = 3
general_log_file = general.log
slow_query_log = 1
log_slow_extra = 1
slow_query_log_file = slow.log
long_query_time = 1
# log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
# log_slow_slave_statements = 1
# log_slow_replica_statements = 1
# log_throttle_queries_not_using_indexes = 10
# min_examined_row_limit = 100
log_bin = mysql-bin
binlog_cache_size = 2M
max_binlog_cache_size = 2G
max_binlog_size = 1G
binlog_rows_query_log_events = 1
log_bin_trust_function_creators = 1
# innodb settings #
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 8
innodb_data_file_path = ibdata1:100M:autoextend
#5.7默认16M,8.0默认128M
#innodb_log_buffer_size = 32M
# MySQL 8.0.30或更高版本推荐使用innodb_redo_log_capacity参数,innodb_log_files_in_group* innodb_log_file_size= innodb_redo_log_capacity
# 而 innodb_log_file_size 和 innodb_log_files_in_group 参数后续会被废弃
innodb_redo_log_capacity = 4G
innodb_max_undo_log_size = 4G
innodb_undo_log_truncate = 1
# 根据您的服务器IOPS能力适当调整
# 一般配普通SSD盘的话,可以调整到 10000 - 20000
# 配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_lru_scan_depth = 4096
innodb_lock_wait_timeout = 10
innodb_open_files = 65535
innodb_flush_method = O_DIRECT
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_online_alter_log_max_size = 1G
innodb_sort_buffer_size = 64M
innodb_autoinc_lock_mode = 2
innodb_print_ddl_logs = 1
# innodb_flush_neighbors参数,SSD 禁用,非SSD请启用
innodb_flush_neighbors = 0
#禁用AHI
innodb_adaptive_hash_index = 0
gtid_mode = on
enforce_gtid_consistency = 1
log_replica_updates = 1
# 8.0默认为 row ,从MySQL 8.0.34 起已弃用,并且可能会在 MySQL 的未来版本中删除
#binlog_format = ROW
relay_log = relay.log
# perforamnce_schema settings
performance_schema=ON
[mysqldump]
quick
8.初始化
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql3306/my.cnf --initialize --user=mysql
9.设置/etc/init.d启动
cp mysql/support-files/mysql.server /etc/init.d/mysqld
10.启动MySQL
注意:如果不配置名称为 pid-file 的参数,则强依赖 hostname,也就是启动后不能更改hostname,否则不能正常关闭。
启动方式1-service
# 启动
service mysqld start
# 关闭
service mysqld stop
# 查看状态
service mysqld status
- 在不更改/etc/init.d/mysqld的情况下,my.cnf 文件必须在 basedir 下或 /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 下,且名称必须为 my.cnf
- 修改 /etc/init.d/mysqld ,把它改为适配的脚本
启动方式2-mysql_safe
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql3306/my.cnf --user=mysql &
或
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql3306/my.cnf --user=mysql &
启动方式3-systemd
也可配置使用 systemctl 进行启动 官方文档 systemd
- 多个可以起名为 mysqld3306.service、mysqld3307.service
/usr/lib/systemd/system/mysqld3306.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
# 多用户模式
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
# Have mysqld write its state to the systemd notify socket,启动类型 8.0 推荐使用notify
Type=notify
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Start main service,服务启动命令,mysqld必须是绝对路径
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql3306/my.cnf $MYSQLD_OPTS
# Use this to switch malloc implementation,设置环境变量,可用于更改内存管理库 tcmalloc/jemalloc
EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 10000
# 在什么情况下需要重启服务,on-failure 表示只有在服务失败时才会重启
Restart=on-failure
# 指定哪些退出状态码不应该触发重启。这里是 1,表示如果服务以状态码 1 退出,则不会重启。
RestartPreventExitStatus=1
# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1
# 指定是否为服务创建一个独立的临时目录。false 表示不创建独立的临时目录。
PrivateTmp=false
11.修改初始密码
# 查看初始密码,在初始化完成后会自动生成一个初始登陆密码,放在错误日志中,假设当前错误日志未指定路径
grep 'temporary password' /data/mysql3306/data/error.log
# 登陆,密码为上面查询出的密码
mysql -uroot -p
# 修改密码为指定密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
my.cnf 配置生产参考:5.7(https://github.com/jdaaaaaavid/mysql_best_configuration/blob/master/my.cnf)8.0(https://imysql.cn/my_cnf_generator)
拓展-修改mysql.server 源码适配启动
1.修改参数变量
basedir=/usr/local/mysql
datadir=/data/mysql3306/data
mycnfdir=/data/mysql3306/my.cnf
basedir、datadir 可以不配置,因为在 my.cnf 中已配置了,能读取到
2.修改$print_defaults传入参数,指定配置文件
parse_server_arguments `$print_defaults --defaults-file="$mycnfdir" mysqld server mysql_server mysql.server`
3.修改parse_server_arguments
修改 parse_server_arguments 中的 --pid-file=,添加 --pid_file=,使得可以获取到配置文件中配置为 pid_file的内容
4.mysql_safe启动时候指定配置文件
$bindir/mysqld_safe --defaults-file="$mycnfdir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &