# MySQL8.0数据库安装部署-Linux系统

北京致远互联软件股份有限公司

2024年11月更新

# 前言

本手册提供MySQL8.0系列二进制包安装详细步骤,二进制方案兼容性广,不挑系统,最易于维护,是Linux下最推荐的安装方案。

本示例选择安装MySQL Community Server社区版。

# 安装前准备

# 修改Linux网络参数

1、在/etc/sysctl.conf文件末尾添加:

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0

2、然后执行命令重启网络服务:

service network restart

# 如发现服务不存在,可能是不同Linux发行版差异,尝试换一个命令重启
systemctl restart NetworkManager

3、在 /etc/rc.d/rc.local文件末尾添加:

echo "30">/proc/sys/net/ipv4/tcp_fin_timeout
echo "1800">/proc/sys/net/ipv4/tcp_keepalive_time
echo "0">/proc/sys/net/ipv4/tcp_window_scaling
echo "0">/proc/sys/net/ipv4/tcp_sack
echo "0">/proc/sys/net/ipv4/tcp_timestamps

# 修改Linux最大进程数最大文件打开数

vi /etc/security/limits.conf编辑此文件添加以下内容

# open files  (-n)
* soft nofile 65535
* hard nofile 65535
# max user processes  (-u)
* soft nproc 65535
* hard nproc 65535

# 以上配置保存后,重启下操作系统,在通过ulimit -a检查open files和max user processes是否都变成了65535
# 如果调整配置并且重启操作系统之后以上配置未生效,当前是root设置,则将*改成root即可生效
root soft nofile 65535
root hard nofile 65535
root soft nproc 65535
root hard nproc 65535

# 视频示例

如对手册不理解,可参考在线视频进行学习【MySQL二进制标准化安装 (opens new window)

# 安装包准备

# 下载MySQL二进制包

下载地址:https://dev.mysql.com/downloads/mysql/ (opens new window)

Select Version:选择8.0.x版本

Select Operating System:无论什么Linux系统都选择Linux - Generic

Select OS Version:本演示系统是x86/64位/GLIBC 2.39,于是下载最接近的glibc2.28 x86 64-bit版本

通过uname -a命令来判断当前操作系统芯片和位数;通过ldd --version命令来看glibc版本,下载的安装包glibc尽量<=操作系统的glibc

本案例下载的包名为:mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz

1732089484475.png

# 上传安装包到Linux

用ssh ftp工具将二进制包上传到Linux中,本示例是将二进制包上传到/data目录:

1732089498081.png

# 安装步骤

整个二进制包安装过程可以完全参考MySQL官方文档:https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html (opens new window)

# 安装libaio

根据MySQL官方手册要求,需要先安装libaio包,不同Linux发行版安装方法不同:

# RedHat系统(如CentOS)可以通过yum安装
yum -y install libaio perl perl-devel

# Debian系统(如Ubuntu)可通过apt安装
apt-cache search libaio # 找相关包
apt-get install libaio1 # 根据apt search的结果选一个合适的包安装

特别提醒:Ubuntu24LTS与22版本的libaio包发生了很大变化,需要参考网上的文档 (opens new window)做调整,否则执行后续MySQL安装时会报错:

# 以下适用于Ubuntu系统
apt install numactl libaio1t64 -y
cd /usr/lib/x86_64-linux-gnu/
# 设置软链接,提示文件存在则忽略
ln -s libaio.so.1t64.0.2 libaio.so.1
# 设置软链接,提示文件存在则忽略
ln -s libncurses.so.6.4 libncurses.so.6

# 卸载MariaDB

确保当前系统下没有MySQL,也没有MariaDB,如果有会影响MySQL安装。

# 可通过systemctl检查mariadb是否存在
systemctl status mariadb
# 对于Debian系统(如 Ubuntu)可用dpkg检查
dpkg -l | grep mariadb
# 对于RedHat系统(如CentOS)用rpm检查
rpm -qa | grep mariadb

# Debian系统(如 Ubuntu),卸载方法:
sudo apt-get remove --purge mariadb-server mariadb-client
sudo apt-get autoremove
sudo apt-get autoclean

# RedHat系统(如CentOS),卸载方法:
sudo yum remove mariadb-server mariadb-client

# 如果确认当前数据不需要留存,可以删除相关数据配置
sudo rm -rf /etc/mysql /var/lib/mysql

# 创建mysql用户组和目录

以下命令一句一句执行即可,唯一不同的是tar.xz二进制包和数据目录可能跟项目上有差异,项目上根据自身情况调整:

# 创建名为mysql的用户组和不允许登录的用户
groupadd mysql
# 如果创建组合用户时提示sssd异常,当前又没启用sssd相关功能,可以把sssd包卸载了
useradd -r -g mysql -s /bin/false mysql



cd /usr/local
# 解压mysql二进制包
tar xvf /data/mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz
# 做一个mysql软链接,利于维护
ln -s mysql-8.0.40-linux-glibc2.28-x86_64/ mysql
# 如果能cd到mysql则表示软链成功
cd mysql

# 创建一个数据文件目录,找目录空间大的放,本例是放/data/mysql
mkdir -p /data/mysql
# mysql相关目录授权给mysql用户组
chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /usr/local/mysql
# 新建的数据目录授权为750(不要改成别的,比如不要用777)
chmod 750 /data/mysql

1732089675921.png

# 创建my.cnf文件

在/etc下创建my.cnf文件,用于管理MySQL的配置:

vim /etc/my.cnf

将以下内容按照项目真实情况做调整后拷贝到/etc/my.cnf里并保存。其中标记有*星号的部分都需要项目上根据实际情况调整:

# For advice on how to change settings please see

# https://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[client]
# mysql默认端口3306,出于安全性建议更改一个更安全的端口
port=3306
# 字符集编码
default-character-set=utf8mb4

[mysql]
# 字符集编码
default-character-set=utf8mb4

[mysqld]
# mysql默认端口3306,出于安全性建议更改一个更安全的端口
port=3306

# *mysql程序路径
basedir=/usr/local/mysql/
# *mysql数据目录
datadir=/data/mysql

# tmpdir=/data/mysql/temp/

socket=/tmp/mysql.sock

# *进程路径
pid-file=/data/mysql/seeyon.mysql.pid

# General and Slow logging.

log-output=FILE

general-log=0
# *通用查询日志存放位置,建议放数据目录下
general_log_file=/data/mysql/seeyon-mysql-8.0-general.log

slow-query-log=1
# *慢查询日志存放位置,建议放数据目录下
slow_query_log_file=/data/mysql/seeyon-mysql-8.0-slow.log

long_query_time=10
# *错误日志存放位置,建议放数据目录下
log-error=/data/mysql/seeyon-mysql-8.0.err

# default_authentication_plugin=caching_sha2_password

default_authentication_plugin=mysql_native_password

default-storage-engine=INNODB

character-set-server=utf8mb4
# 数据库开启的最大连接数
max_connections=600
# 同一客户端连接尝试失败次数,超出次数即被冻结
max_connect_errors=100

transaction_isolation=READ-COMMITTED

max_allowed_packet=64M

default-time-zone='+8:00'

log_timestamps=system
# 大小写不敏感
lower_case_table_names=1

table_open_cache=2000

tmp_table_size=512M

key_buffer_size=512M

innodb_flush_log_at_trx_commit=1

innodb_log_buffer_size=16M

# Remove leading # and set to the amount of RAM for the most important data

# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.

# *极其重要的数据库内存参数,一般建议将服务器物理内存的 50% 到 70% 分配给 innodb_buffer_pool_size,本例8G内存适合生产环境低并发用户
innodb_buffer_pool_size=8G

innodb_log_file_size=1G

innodb_autoextend_increment=64

innodb_buffer_pool_instances=8

innodb_open_files=300

innodb_file_per_table=1

关于/etc/my.cnf配置,有几个关键信息:

1、数据引擎要求为InnoDB

2、MySQL8字符集要求为utf8mb4,早期MySQL版本可设置为utf8

3、要求不区分表/字段大小写lower_case_table_names=1

4、MySQL8系列,时区默认为美国时区,中国用户若要正常使用,需修改mysql配置文件为default-time-zone='+8:00'

5、MySQL5.7或者以上版本,需要设置数据库日志时间匹配系统时区log_timestamps=system

6、innodb_buffer_pool_size参数是非常关键的性能指标,生产库建议按照服务器内存的50%-80%配置

7、本示例开通的是默认3306端口,实际生产环境不要用默认端口,建议改成一个不常用端口,以降低被攻击的概率

# 初始化MySQL

# 命令一步步执行,不要遗漏任何一步
chown mysql:mysql /etc/my.cnf
cd /usr/local/mysql
# 初始化MySQL,命令中的路径根据项目实际路径调整
bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initialize
# 执行初始化MySQL可能遇到缺少libaio.so.1的错误,不同Linux发行版安装方式不同,请结合“安装libaio”章节检查或网上搜索资料

安装完成后,找到/etc/my.cnf中的log-error参数值,这个参数路径存放了日志,根据这个日志能找到mysql的初始化密码

# 本示例log-error=/data/mysql/seeyon-mysql-8.0.err,故执行如下命令:
cat /data/mysql/seeyon-mysql-8.0.err | grep temp

拷贝类似如下图所示的这串字符串,这个就是初始化MySQL后生成的密码,做好备份,我们需要拿着它登录MySQL:

1732089704168.png

# 启动MySQL

接下来,将 MySQL 的启动脚本复制到系统的初始化脚本目录,以便可以使用标准的服务管理命令来启动、停止和管理 MySQL 服务:

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

# 修改脚本文件
vim /etc/init.d/mysqld

# 找到配置文件中的"basedir="和"datadir="参数,分别设置成mysql程序目录和数据目录:
basedir=/usr/local/mysql/
datadir=/data/mysql/

1732089714906.png

以上完成后,执行启动MySQL服务器的命令:

service mysqld start

# 如果确认mysql启动成功,可以通过如下命令设置mysql开机自启动
chkconfig mysqld on

如果是Ubuntu系统,执行service mysqld start,可能遇到Failed to start mysqld.service: Unit mysqld.service not found的错误,此问题在“Ubuntu系统启动脚本特殊处理”章节中处理。

# Ubuntu系统启动脚本特殊处理

如果是Ubuntu系统,执行service mysqld start,可能遇到Failed to start mysqld.service: Unit mysqld.service not found的错误,这通常是因为系统使用 systemd 而不是传统的 init.d 脚本来管理服务。在 systemd 系统中,需要创建一个 .service 文件来管理 MySQL 服务。

针对Ubuntu系统,解决方案如下:

# Ubuntu系统放置到init.d目录无效,可以将配置拷贝回mysql程序原目录
mv /etc/init.d/mysqld /usr/local/mysql/support-files/mysql.server
# 确保足够可执行权限
chmod +x /usr/local/mysql/support-files/mysql.server

# 创建一个.service
vim /etc/systemd/system/mysqld.service

# 将如下信息按需调整后拷贝到mysqld.service配置文件中
# ExecStart、ExecStop、ExecReload改成MySQL脚本路径
# PIDFile务必改成/etc/my.cnf中的pid-file路径
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/mysql/support-files/mysql.server start
ExecStop=/usr/local/mysql/support-files/mysql.server stop
ExecReload=/usr/local/mysql/support-files/mysql.server restart
User=mysql
Group=mysql
PIDFile=/data/mysql/seeyon.mysql.pid

[Install]
WantedBy=multi-user.target

以上完成后,按如下方式注册启动mysql:

# 确保 `/var/run/mysqld/` 目录存在,并且 MySQL 用户有权限访问:
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld

# 随后重新加载systemd守护进程
systemctl daemon-reload
# 尝试启动MySQL
systemctl start mysqld
# 检查服务状态
systemctl status mysqld
# 如果服务OK,设置开机自启动
systemctl enable mysqld

1732089735705.png

# 登录MySQL并重设密码

执行脚本登录到本地MySQL服务器中:

cd /usr/local/mysql/bin/
# 其中小写字母p后面跟着的是“初始化MySQL”章节,mysql数据库自动生成的首次登录密码串
./mysql -uroot -P3306 -pg0.ajo1Bwshs

如果密码含有特殊字符,Bash解释器可能会误解这些特殊字符并且拒绝执行,如下图所示,此时我们只需要将密码通过单引号包裹住即可绕过:

# 错误语法
./mysql -uroot -P3306 -pV!=6pX;)0wTI
# 正确语法
./mysql -uroot -P3306 -p'V!=6pX;)0wTI'

1732206578962.png

登录成功后,修改root密码,并新建帐号用于后续OA的连接管理:

# 在MySQL数据库中执行密码修改,newpwd654321是新密码,项目上根据实际情况调整
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpwd654321';
flush privileges;

# 随后,创建一个seeyon用户并自定义密码,后续用来做OA连接使用
create user 'seeyon'@'%' identified by 'oapwd654321';
flush privileges;

# 给seeyon用户授予足够的权限
grant all privileges on *.* to 'seeyon'@'%';
flush privileges;

1732089749778.png

在MySQL数据库中,初始化一个空库,用于后续OA使用:

CREATE DATABASE V8X DEFAULT CHARACTER SET UTF8MB4;

以上完成后,可以通过exit命令退出MySQL,尝试使用自定义的密码登录MySQL,如果成功则说明一切OK。

./mysql -uroot -P3306 -pnewpwd654321
./mysql -useeyon -P3306 -poapwd654321

# 开启防火墙

数据库服务器涉及信息安全,建议尽量只暴露数据库的端口

systemctl start firewalld
# 只暴露MySQL的端口号
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

# 客户端连接

如果开启了远程访问,并且放开了防火墙控制,通过数据库连接工具就能远程连接到MySQL服务上:

1732089822138.png

1732089831067.png

# 日常运维

# 管理主要文件

通过二进制安装的MySQL目录都由安装人员控制,做升级调整都很方便,如果按照本手册操作,我们只需要关注如下目录即可:

  • 程序目录:/usr/local/mysql/ 这里mysql是一个软链接,后续如果升级MySQL,就更换软链接地址即可
  • 日志和数据目录:/data/mysql 所有日志和后续的业务数据都放在这里
  • 核心配置文件: /etc/my.cnf 搞MySQL的都知道它的重要性

# 创建空库

以管理员身份进入MySQL执行创建库操作,或通过数据库可视化工具创建,MySQL8所用字符集设置为utf8mb4

CREATE DATABASE 数据库名 DEFAULT CHARACTER SET UTF8MB4;

# 备份数据库

如果是协同OA使用,我们可以通过S1工具设置自动备份。

也可以到MySQL服务器bin目录下执行mysqldump导出

# --routines: 包括存储过程和函数
# --triggers: 包括触发器(默认情况下是包含的,但可以显式指定)
# --single-transaction: 对于 InnoDB 表,使用这个选项可以在不锁定表的情况下进行一致性备份
mysqldump -u 数据库管理员帐号 -p 数据库名 --single-transaction --routines --triggers > /path/to/backup.sql

# 导入数据库

如果是S1工具备份,可以把备份包拷贝到测试环境,再使用测试环境的S1还原数据库,特别提醒:务必检查好S1的数据库连接配置,不要覆盖到生产库了。

如果是通过mysqldump导出的.sql脚本,或协同OA的完整all-in-one.sql文件,可以到MySQL服务器bin目录下执行导入。

导入之前,先检查字符集:通过show variables like '%character%'语句查询当前MySQL8的字符集,如果红框都是utf8mb4就OK

1732090370975.png

随后执行导入即可,导入也是按照utf8mb4写入:

mysql -u 数据库管理员帐号 -p 新数据库名 < /path/to/your/script.sql

# 示例如下
./mysql -u seeyon -p v8x < /data/v9.0sp1_linux.sql

# 迁移mysql数据目录

mysql数据目录由参数datadir指定,默认是在/var/lib/mysql 参数值可以通过 show variables like 'datadir'; 查询得到 例:假设当前需要把datadir(/var/lib/mysql)迁移至/data/Seryon/mysql/data

迁移步骤:

  • 停止mysql服务

请根据实际的启停命令操作: systemd管理的mysqld服务可以通过:systemctl stop mysqld 如果是使用的脚本模板,比如:/etc/inid.d/mysql.server stop 或者 /etc/inid.d/mysqld stop

  • 修改配置文件

linux环境下,mysql配置文件默认在/etc/my.cnf 或者 /etc/mysql/my.cnf;还有些环境可能是手动指定了配置文件,这种情况可以通过命令 ps -ef|grep mysqld 查看--defaults-file参数后跟的配置文件路径 找到配置文件中mysqld下datadir的参数,修改为/data/Seryon/mysql/data 如果在配置文件中没有找到datadir参数,而实际datadir又不在/var/lib/mysql,考虑可能是启动脚本里面有设置了 提示:修改前请先备份

  • 拷贝数据

建议通过rsync命令进行同步,例:rsync -av /var/lib/mysql/* /data/Seryon/mysql/data/* 注意新目录不要放到 /root 下,且拷贝时必须停止mysqld 拷贝完成后,可以将原datadir目录重命名(为了降低风险,禁止直接干掉原datadir,拷贝时也不要直接mv移动替换

  • 授权新数据目录

chown -R mysql:mysql /data/Seryon/mysql/data

  • 启动mysql服务

按原来的方式启动mysqld,并查询datadir的值是否已经修改 运行一段时间之后,确认没有问题,再处理原datadir目录,建议可以压缩备份,不要直接删除

创建人:zhangshuang
修改人:wangyxyf、het