【筑基篇】部署二进制MySQL

手动部署二进制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 &
原文链接:,转发请注明来源!