生产环境不是 Windows,Linux 才是 MySQL 的主战场 由于微信公共号的推送消息发生变化,点右上角的三个点,并设置为星标,随时能看到发送的消息。01 / 一句话讲清楚
在 Linux 上安装 MySQL 8.0 之前,需要做好三件事:操作系统基础配置(主机名、时间同步、防火墙)、安装必要依赖包、关闭 NUMA 和 Swap 等影响性能的特性。本文以 CentOS 7/8 和 Ubuntu 20.04/22.04 双系统覆盖。
📌 阅读时长:15 分钟 | 操作时长:20-30 分钟
02 / 操作系统版本选择
2.1 推荐版本
| | | |
|---|
| CentOS / RHEL | | | |
| Rocky Linux / AlmaLinux | | | |
| Ubuntu | | | |
| Debian | | | |
📌 建议:新项目选 Rocky Linux 9 或 Ubuntu 22.04 LTS,有长期支持且社区活跃。
2.2 查看当前系统版本
# CentOS / RHEL
cat /etc/redhat-release
rpm -q centos-release
# Ubuntu / Debian
lsb_release -a
cat /etc/os-release
# 通用(查看内核)
uname -a
03 / 基础系统配置
3.1 设置主机名
# 查看当前主机名
hostname
# 设置主机名(永久生效)
# CentOS/RHEL
hostnamectl set-hostname mysql-node1
vi /etc/hosts # 添加: 127.0.1.1 mysql-node1
# Ubuntu
hostnamectl set-hostname mysql-node1
vi /etc/hosts # 添加: 127.0.1.1 mysql-node1
# 验证
hostname
hostname -f # 查看 FQDN
3.2 时间同步(NTP)
MySQL 对时间敏感,主从复制要求各节点时间一致。
# CentOS 7 / 8
yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
chronyc sources # 查看同步源
# Ubuntu
apt update
apt install -y chrony
systemctl start chrony
systemctl enable chrony
# 验证同步状态
timedatectl status
# 应显示: System clock synchronized: yes
3.3 关闭防火墙或开放端口
# 方案一:开放 MySQL 端口(推荐)
# CentOS (firewalld)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
firewall-cmd --list-ports
# Ubuntu (ufw)
ufw allow 3306/tcp
ufw status
# 方案二:关闭防火墙(仅测试环境)
# CentOS
systemctl stop firewalld
systemctl disable firewalld
# Ubuntu
systemctl stop ufw
systemctl disable ufw
3.4 关闭 SELinux(CentOS/RHEL)
SELinux 可能导致 MySQL 文件读写权限问题。
# 查看状态
getenforce
# 临时关闭
setenforce 0
# 永久关闭(重启生效)
vi /etc/selinux/config
# 修改: SELINUX=disabled
# 验证
reboot
getenforce # 应显示 Disabled
3.5 调整文件描述符限制
MySQL 需要大量文件句柄。
# 查看当前限制
ulimit -n
# 永久修改
# CentOS: /etc/security/limits.conf
echo "mysql soft nofile 65535" >> /etc/security/limits.conf
echo "mysql hard nofile 65535" >> /etc/security/limits.conf
# Ubuntu: 同样位置
vi /etc/security/limits.conf
# 添加:
mysql soft nofile 65535
mysql hard nofile 65535
# 验证(切换到 mysql 用户后)
su - mysql
ulimit -n
04 / 关闭 NUMA 和 Swap(性能关键)
4.1 为什么要关闭 NUMA?
MySQL 在 NUMA 架构下会出现内存分配不均的问题,导致性能抖动。
# 查看 NUMA 架构
numactl --hardware
# 临时关闭 NUMA 重分配(重启失效)
echo 0 > /proc/sys/kernel/numa_balancing
# 永久关闭:修改 grub 启动参数
vi /etc/default/grub
# 在 GRUB_CMDLINE_LINUX 中添加: numa=off
# CentOS 7/8 示例
GRUB_CMDLINE_LINUX="... numa=off"
# 重新生成 grub 配置
# CentOS 7
grub2-mkconfig -o /boot/grub2/grub.cfg
# Ubuntu
update-grub
# 重启生效
reboot
4.2 关闭 Swap(或降低 Swap 倾向)
MySQL 不希望使用 Swap,会导致性能急剧下降。
# 查看 Swap 使用
free -h
# 方案一:临时关闭
swapoff -a
# 方案二:永久关闭(注释掉 swap 行)
vi /etc/fstab
# 注释掉包含 swap 的行: # /dev/mapper/xxx swap ...
# 方案三:降低 Swap 倾向(保留但减少使用)
echo 10 > /proc/sys/vm/swappiness
vi /etc/sysctl.conf
# 添加: vm.swappiness=10
sysctl -p
05 / 安装依赖包
5.1 CentOS / RHEL
# 安装 EPEL 仓库(可选,提供额外包)
yum install -y epel-release
# 安装 MySQL 依赖
yum install -y \
libaio \
numactl \
perl \
net-tools \
wget \
vim \
tar \
gcc \
make \
openssl-devel \
ncurses-devel
# 安装开发工具(源码编译需要)
yum groupinstall -y "Development Tools"
5.2 Ubuntu / Debian
# 更新软件源
apt update
# 安装 MySQL 依赖
apt install -y \
libaio1 \
numactl \
perl \
net-tools \
wget \
vim \
tar \
build-essential \
cmake \
libssl-dev \
libncurses-dev \
pkg-config
06 / 创建 MySQL 用户与目录
6.1 创建系统用户
# 创建 mysql 用户(不创建家目录,无法登录)
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# 验证
id mysql
# 输出: uid=996(mysql) gid=995(mysql) groups=995(mysql)
6.2 创建目录结构
# 创建数据目录
mkdir -p /data/mysql/data # 数据文件
mkdir -p /data/mysql/logs # 日志文件
mkdir -p /data/mysql/tmp # 临时文件
mkdir -p /data/mysql/binlog # Binlog
mkdir -p /data/mysql/relaylog # 中继日志(从库用)
# 设置权限
chown -R mysql:mysql /data/mysql
# 查看目录权限
ls -ld /data/mysql
# drwxr-xr-x 5 mysql mysql 4096 ...
07 / 系统参数调优(sysctl.conf)
# 编辑 /etc/sysctl.conf,添加以下内容
# 网络连接优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
# 内存与文件系统
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 20
fs.file-max = 1000000
# 应用配置
sysctl -p
08 / 完整环境检查清单
安装 MySQL 前,逐项确认:
| | |
|---|
| cat /etc/os-release | CentOS 7+ / Ubuntu 20.04+ |
| hostname | |
| timedatectl status | |
| firewall-cmd --list-ports | |
| getenforce | |
| ulimit -n | |
| rpm -q libaio | |
| id mysql | |
| ls -ld /data/mysql | |
写在最后
Linux 环境准备的核心要点:
📌 一句话总结:环境准备花 30 分钟,能避免未来 30 小时的踩坑。
📌 下篇预告:L02 - YUM/APT 安装 MySQL 8.0:官方仓库配置与安装