# 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
# 上传安装包到Linux
用ssh ftp工具将二进制包上传到Linux中,本示例是将二进制包上传到/data目录:
# 安装步骤
整个二进制包安装过程可以完全参考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
# 创建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:
# 启动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/
以上完成后,执行启动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
# 登录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'
登录成功后,修改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;
在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服务上:
# 日常运维
# 管理主要文件
通过二进制安装的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
随后执行导入即可,导入也是按照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目录,建议可以压缩备份,不要直接删除