MySQL 8.0.36 安装

453 阅读6分钟

适用环境:
CentOS v7.2 ~ v7.9 ,Redhat v7.2 ~v9.0 ,Rocky v8、麒麟V10、UOS20、欧拉20、Ubuntu 20\22\23

1. 系统准备

1.1 安装依赖

# CentOS\Redhat\麒麟V10]
rpm -qa|grep libaio
yum install -y libaio
# Ubuntu 
apt install libnuma1 libtinfo5

1.2 新增MySQL用户

# 创建mysql服务管理用户,设定为不可登陆系统
useradd -M  -s /bin/false mysql 

1.3 关闭SELinux

# 永久关闭【重启服务器生效,MySQL服务启动前需完成重启】
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
# 临时关闭
setenforce 0

1.4 内核参数

# 追加
cat >> /etc/sysctl.conf << EOF
fs.aio-max-nr= 1048576
fs.file-max= 6815744
kernel.shmall= 2097152
kernel.shmmax= 4294967295
kernel.shmmni= 4096
kernel.sem= 250 32000 100 128
net.ipv4.ip_local_port_range= 9000 65500
net.ipv4.ip_nonlocal_bind=1
net.ipv4.ip_forward=1
net.core.rmem_default= 262144
net.core.rmem_max= 4194304
net.core.wmem_default= 262144
net.core.wmem_max= 1048576
EOF

# 刷新
/sbin/sysctl -p

1.5 资源限制配置文件

cat >> /etc/security/limits.conf << EOF
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65535
* hard stack 32768
* soft stack 16384
* seft memlock unlimited
* hard memlock unlimitedd
EOF

2. 安装

2.1 程序下载

# 查看操作系统 glibc 版本 【CentOS7 GLIBC版本2.17,麒麟V10 GLIBC版本2.28】
ldd --version

# 在服务器下载mysql最新版本二进制安装包,或FTP工具上传本地已下载的安装包文件。
# MySQL官网下载地址:https://dev.mysql.com/downloads/mysql/
# 在服务器执行下载8.0 安装包 [可通过官网查询当前最新版本][根据glibc版本选择MySQL程序包]
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.17-x86_64-minimal.tar.xz
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz

# 解压mysql二进制安装包,移动至指定位置并重命名。data、log_bin等目录建议存放于较大容积的磁盘或分区。
# 8.0 tar.xz格式解压
tar xf  mysql-8.0.36-linux-glibc2.28-x86_64.tar.gz
mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql

# 新建数据与日志目录
mkdir -p /usr/local/mysql/{data,Uploads,log_sys,log_bin,log_redo}

2.2 配置文件

# 为便于管理,建议将配置文件存放在MySQL程序目录下,重命名或删除操作系统自带的my.cnf文件。
# 备份系统预置的my.cnf文件 [如果文件存在]
mv /etc/my.cnf /etc/my.cnf.0

# 复制以下内容在ssh客户端内粘贴执行即可[适用于 8.0.34及以上版本]
# 注意修改其中的路径
cat > /usr/local/mysql/my.cnf << EOF
[client]
default-character-set=utf8mb4
socket=/tmp/mysql.sock
[mysqld]
server_id=131
port=3306
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO'
lower_case_table_names=1
transaction-isolation=READ-COMMITTED
default-time_zone='+8:00'
log_timestamps=SYSTEM
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
pid-file=/usr/local/mysql/log_sys/mysqld.pid
secure_file_priv=/usr/local/mysql/Uploads
log_output=file
log-error=/usr/local/mysql/log_sys/mysqld.log
general_log=0
general_log_file=/usr/local/mysql/log_sys/general.log
slow_query_log=1
long_query_time=10
slow_query_log_file=/usr/local/mysql/log_sys/slow.log

# binlog
log_bin=/usr/local/mysql/log_bin/mysql-bin
binlog_expire_logs_seconds=604800
binlog_row_event_max_size=8K
log_bin_trust_function_creators=1

# innodb_buffer_pool_size建议按照服务器50%-70% 内存大小设置。如MySQL与应用服务器共用,应根据实际情况填写。
innodb_buffer_pool_size=4G
innodb_log_group_home_dir=/usr/local/mysql/log_redo
innodb_redo_log_capacity=209715200
innodb_log_buffer_size=16M
innodb_autoextend_increment=64
innodb_buffer_pool_instances=8
innodb_open_files=300
innodb_file_per_table=1
innodb_thread_concurrency=9
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_stats_on_metadata=0
innodb_checksum_algorithm=0
thread_cache_size=10
autocommit=1
skip_name_resolve=1
innodb_flush_log_at_trx_commit=1
open_files_limit=102400
table_open_cache=4000
table_definition_cache=2000
tmp_table_size=512M
key_buffer_size=512M
max_connections=600
max_connect_errors=100
max_allowed_packet=64M
back_log=80
flush_time=0
join_buffer_size=256K
sort_buffer_size=256K
sync_source_info=10000
sync_relay_log=10000
mysqlx=0
EOF

注意,MySQL版本更新时,部分参数会废弃或替换,可关注实例初始化过程中的提醒,并按当前版本更新相应参数设置。

2.3 添加环境变量

# 添加当前用户root环境变量
echo 'PATH=/usr/local/mysql/bin:$PATH' >> /root/.bashrc

# 刷新生效
source /root/.bashrc
# 或者选择添加全局环境变量,对所有用户生效
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile 
# 刷新生效 
source /etc/profile

2.4 实例初始化

# 调整mysql目录属主权限
chown -R mysql:mysql /usr/local/mysql/
chmod -R 600 /usr/local/mysql/Uploads

# 实例初始化
cd /usr/local/mysql
bin/mysqld --defaults-file=my.cnf --initialize --user=mysql 

# 获取root用户临时密码并记录,当前演示环境密码【%vfkfKTop0,f】
grep 'A temporary password'  log_sys/mysqld.log

# 初始化失败后,再次初始化之前,需清空data,log_bin,log_sys等目录内容。
rm -rf /usr/local/mysql/mysql.sock
rm -rf /usr/local/mysql/data/*
rm -rf /usr/local/mysql/log_bin/*
# 检查日志文件错误原因,之后删除
rm -rf /usr/local/mysql/log_sys/mysqld.log

2.5 服务管理

操作系统开机、重启后,保持MySQL服务运行。

2.5.1 服务控制文件

# 复制以下内容在ssh客户端内粘贴执行即可
cat > /usr/lib/systemd/system/mysqld.service << EOF
[Unit]
Description=MySQL Server 
Documentation=https://dev.mysql.com/doc/
After=network.target
After=syslog.target
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/usr/local/mysql/log_sys/mysqld.pid
TimeoutSec=0
PermissionsStartOnly=true
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/my.cnf --daemonize
LimitNOFILE=102400
PrivateTmp=false
Restart=on-failure
RestartPreventExitStatus=1
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF

2.5.2 服务启动与状态查询

# 设置为开机启动 并立即启动服务
systemctl enable --now mysqld.service
 
# 查询 服务状态
systemctl status mysqld 

2.6 防火墙策略

2.6.1 firewall

# 放行3306端口,允许所有IP访问
firewall-cmd --permanent --zone=public --add-port=3306/tcp
# 生效规则
firewall-cmd --reload 
# 或者仅允许指定IP访问MySQL数据库服务端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.159.101" port protocol="tcp" port="3306" accept"
# 生效规则
firewall-cmd --reload 

2.6.2 ufw

ufw allow 3306/tcp

3. 数据库管理

3.1 设置root密码

# 登陆MySQL
# 使用实例初始化时生成到 log_sys/mysqld.log文件中的root初始化临时密码[上文] 
# 首次登陆后务必修改临时密码,否则无法进行后续操作
mysql -uroot -p   

# 重设root@localhost本地登陆密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123';

3.2 用户管理

3.2.1 新增用户

(1) root用户远程访问[不推荐]

# 新建用户'root'@'%' [不建议开启root用户的远程访问]
# 注意'root'@'%'和'root'@'localhost' 不是同一用户
# 可在任意客户端%访问MySQL实例的root用户,密码可与本地localhost密码不同 
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'pp8Ej80U4pZCGmxc';
# 赋予对所有数据库及表的所有权限
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

(2) 普通用户

# 新建appuser用户可在客户端192.168.159.101远程访问MySQL实例,其中IP地址可替换为网段,例如192.168.159.%
mysql> CREATE USER 'appuser'@'192.168.159.101' IDENTIFIED BY 'fdbIldqBq63vqCBi';

# 赋予对应用系统数据库app及所属表的所有权限
mysql> GRANT ALL PRIVILEGES ON app.* TO 'appuser'@'192.168.159.101' WITH GRANT OPTION;

3.2.2 修改用户密码

mysql> ALTER USER 'appuser'@'192.168.159.101' IDENTIFIED BY 'L18hObnU8Pl6cpV5';

3.2.3 删除用户

mysql> drop user 'appuser'@'192.168.159.101';

3.3 数据库维护

3.3.1 新建数据库

mysql> CREATE DATABASE app DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

3.3.2 删除数据库

mysql> drop database g6n;

4. 问题处理

4.1 执行mysql命令提示:/usr/local/mysql/bin/mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory.

# libtinfo.so具体版版本以服务器实际文件为准
# CentOS 8
ln -sf /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5
# Redhat 9
ln -sf  /usr/lib64/libtinfo.so.6.2 /usr/lib64/libtinfo.so.5

4.2 JDBC客户端访问时提示Public Key Retrieval is not allowed。

# 方法1
在 JDBC 地址串添加 &allowPublicKeyRetrieval=true
# 方法2
# 修改身份验证插件 
mysql> ALTER USER `appuser`@`192.168.159.101` IDENTIFIED WITH mysql_native_password BY 'y2bhm4YrSXXtUW';