一、前言
MySQL 8.0 是目前应用最广泛的开源关系型数据库之一,它在 JSON 支持、窗口函数、CTE 递归查询、事务数据字典、字符集默认值和性能优化方面相比 5.x 版本都有显著提升。对于 Linux 环境下的运维人员和开发人员来说,掌握 MySQL 8.0 的多种安装与部署方式,是搭建稳定数据库服务的基础技能。
本文将围绕三种主流安装方式展开:YUM 仓库在线安装、通用二进制 TAR 包安装以及源码编译安装。这三种方式各有适用场景:YUM 安装适合快速交付和标准化环境;二进制包安装适合离线部署和版本精细管控;源码编译安装适合需要定制模块、裁剪或深度调优的场景。文章会逐一讲解环境准备、安装步骤、初始化配置、服务管理、参数调优、安全加固、高可用部署和故障排查,并提供可复制运行的命令示例,帮助读者完整走通 Linux 下 MySQL 8.0 的部署流程。
二、安装前的系统准备
无论采用哪一种安装方式,安装前的系统检查都是必要的。系统环境是否干净、依赖是否齐全、端口是否被占用、用户和目录权限是否规范,都会直接影响后续安装的成败。下面按照通用准备流程逐一说明。
2.1 系统要求与版本确认
MySQL 8.0 官方支持主流的 Linux 发行版,包括 CentOS 7/8、Rocky Linux、AlmaLinux、Ubuntu、Debian、Red Hat Enterprise Linux 等。不同发行版对应的包管理工具不同,本文以 CentOS/RHEL 系列为主进行演示,Ubuntu/Debian 用户只需把 yum 命令替换为 apt 即可,核心思路一致。
cat /etc/os-release uname -m cat /etc/redhat-release 2>/dev/null执行上述命令确认操作系统版本和架构。MySQL 8.0 官方提供的二进制包通常针对 x86_64 和 ARM64 平台,下载前需要确认架构与包名匹配。内存方面,生产环境建议至少 4GB 以上,测试环境也不要低于 1GB,否则初始化或运行时容易触发内存相关的 OOM 错误。
free -h df -h hostname hostnamectl set-hostname mysql-node-01查看内存和磁盘空间,并设置一个规范的主机名。MySQL 在复制和组复制场景中会使用主机名进行节点标识,因此部署前统一主机名是好习惯。
2.2 基础依赖安装
对于 YUM 和二进制包安装,需要的系统依赖较少,通常安装 libaio、numactl 和 ncurses-libs 即可。如果是源码编译安装,则还需要安装编译器、CMake、OpenSSL 开发包等大量构建工具,这部分会在第五章详细说明。
yum install -y libaio numactl-libs ncurses-libs yum install -y wget vim net-tools tar gziplibaio 是 MySQL 异步 I/O 的依赖库,缺少时虽然可能不会阻止安装,但是运行过程中会报 AIO 相关警告或错误。numactl 用于 NUMA 架构下的内存访问优化,建议一并安装。
2.3 检查并卸载旧版本 MySQL
如果系统中已经安装了 MariaDB、Percona 或旧版 MySQL,直接安装新版本会导致包冲突、目录冲突和数据文件混用。安装前应彻底检查并卸载残留。
rpm -qa | grep -iE "mysql|mariadb|percona" yum list installed | grep -iE "mysql|mariadb" ps aux | grep -iE "mysqld|mariadb" | grep -v grep ss -lntp | grep 3306确认没有正在运行的数据库进程后,执行卸载和残留清理。
systemctl stop mysqld 2>/dev/null || true systemctl stop mariadb 2>/dev/null || true rpm -e --nodeps mysql mysql-server mariadb mariadb-server 2>/dev/null || true yum remove -y mysql mysql-server mariadb mariadb-server rm -rf /var/lib/mysql rm -rf /etc/my.cnf* rm -rf /var/log/mysqld.log清理时特别要注意/etc/my.cnf及其备份文件。旧版本的配置参数可能与 8.0 不兼容,例如query_cache_size这种 8.0 已经移除的参数,如果残留旧配置,启动时会出现 unknown variable 错误。
2.4 防火墙与 SELinux 配置
CentOS 7 及以上版本默认启用 firewalld 和 SELinux。部署 MySQL 时,两种方式都会遇到端口访问被拦或数据目录读写权限被拒的问题。以下给出两种处理策略,生产环境建议保留 SELinux 并正确配置上下文,而不是直接关闭。
systemctl status firewalld firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload firewall-cmd --list-ports执行上述命令为防火墙放行 3306 端口。若数据库需要对外网只开放给特定来源 IP,建议使用 rich rule 或直接通过安全组控制。
getenforce sestatus setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config将 SELinux 设置为 permissive 可以快速排除上下文问题。若使用自定义数据目录,正确的做法是为该目录设置mysqld_db_t上下文,而不是关闭 SELinux。相关配置在二进制安装章节会详细说明。
2.5 系统内核参数预调优
为了给 MySQL 提供充足的资源,预先调整文件描述符限制和内存相关参数是必要的。以下参数写入系统配置后,重启服务即可生效。
cat > /etc/security/limits.d/mysql.conf <<'EOF' mysql soft nofile 65535 mysql hard nofile 65535 mysql soft nproc 65535 mysql hard nproc 65535 EOF cat > /etc/sysctl.d/99-mysql.conf <<'EOF' net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.ip_local_port_range = 1024 65000 vm.swappiness = 1 vm.dirty_ratio = 15 vm.dirty_background_ratio = 5 EOF sysctl -p /etc/sysctl.d/99-mysql.conf其中swappiness=1可以降低 Linux 将数据页换出到交换分区的概率,对数据库稳定性有帮助。文件描述符限制生效依赖于登录方式和服务管理方式,使用 systemd 管理的 MySQL 服务,还需要在 unit 文件中配置LimitNOFILE,后续章节会说明。
三、方式一:YUM 仓库安装 MySQL 8.0
YUM 仓库安装是最简单、最适合快速部署的方式。它通过 MySQL 官方提供的 rpm 仓库自动解决依赖,安装完成后自带 systemd 服务单元和默认配置文件,能够大幅降低部署门槛。
3.1 添加 MySQL 官方 YUM 仓库
首先从 Oracle 官方站点下载对应系统的仓库配置 rpm 包。以 CentOS 7 为例,使用 mysql80-community-release-el7 系列包,CentOS 8 或 Rocky Linux 8 则使用 el8 包。
cd /tmp wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm rpm -ivh mysql80-community-release-el7-11.noarch.rpm yum repolist enabled | grep mysql yum clean all yum makecache安装仓库包后,系统会生成/etc/yum.repos.d/mysql-community.repo文件。需要特别注意的是,该仓库文件中默认启用的是 8.0 源,同时文件里还包含 5.7、5.6、innovation 等多个版本的仓库配置,安装前最好确认启用状态。
3.2 检查并选择安装版本
yum repolist all | grep mysql yum list available | grep mysql-community-server上述命令可以查看可用的 MySQL 版本和对应仓库状态。通常 mysql80-community 默认已经 enabled。如果误启用了其他版本,可以使用 yum-config-manager 切换。
yum install -y yum-utils yum-config-manager --enable mysql80-community yum-config-manager --disable mysql57-community yum repolist enabled | grep mysql确认只有 mysql80-community 处于 enabled 状态后,再执行安装命令,避免意外安装到 5.7 或其他版本。
3.3 安装 MySQL 8.0 服务端
yum install -y mysql-community-server mysql-community-client mysql-community-devel rpm -qa | grep mysql mysqld --version安装完成后可以在/var/lib/mysql看到数据目录,在/etc/目录下看到生成的my.cnf配置文件。8.0 通过/etc/my.cnf.d目录中的多个片段文件管理配置,主配置文件默认会 include 这些片段。
ls -l /etc/my.cnf ls -l /etc/my.cnf.d/ cat /etc/my.cnf.d/mysql-server.cnf3.4 启动服务与查看状态
8.0 安装完成后,第一次启动会自动执行数据库初始化,生成 root 临时密码、系统表空间和默认库。
systemctl start mysqld systemctl enable mysqld systemctl status mysqld ss -lntp | grep 3306 ps aux | grep mysqld | grep -v grep启动成功后,检查服务监听状态和进程信息。MySQL 默认监听 3306 端口,绑定地址默认可能是127.0.0.1或*,需要结合配置文件确认。若需要远程访问,后续需要修改 bind-address 参数。
3.5 获取临时密码并完成安全初始化
grep 'temporary password' /var/log/mysqld.log mysql -uroot -p首次登录需要使用日志中的临时密码。登录成功后 MySQL 会强制要求修改密码,密码必须满足默认的密码策略,包含大小写字母、数字和特殊字符,长度至少 8 位。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@2026'; FLUSH PRIVILEGES;也可以直接使用 MySQL 提供的安全脚本完成密码修改、移除匿名用户、禁止 root 远程登录等操作。
mysql_secure_installation该脚本会以交互方式引导完成安全配置。如果对密码复杂度策略不满意,可以在修改密码前临时降低策略,生产环境不建议长期降低。
SHOW VARIABLES LIKE 'validate_password%'; SET GLOBAL validate_password.policy = 'MEDIUM'; SET GLOBAL validate_password.length = 8;3.6 配置远程访问与编码校验
默认情况下 root 用户只允许 localhost 登录。如果需要从其他主机连接,应单独创建具权限的用户,不建议直接开放 root 远程登录。
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppPass@2026'; GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'%'; FLUSH PRIVILEGES; SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';MySQL 8.0 默认字符集已经升级为 utf8mb4,排序规则为 utf8mb4_0900_ai_ci,对中文和 emoji 的支持比 5.x 默认的 latin1 好很多。生产环境建议确认后保持默认即可,不需要再手动设置 character-set-server 为 latin1。
3.7 日常管理命令汇总
systemctl start mysqld systemctl stop mysqld systemctl restart mysqld systemctl reload mysqld systemctl status mysqld systemctl enable mysqld journalctl -u mysqld -f mysqladmin -uroot -p status mysqladmin -uroot -p ping上述命令覆盖了服务的启动、停止、重启、重载配置和状态查看。日常排障时最常用的是journalctl -u mysqld -f持续跟踪服务日志,以及mysqladmin ping快速判断实例是否存活。
四、方式二:通用二进制 TAR 包安装 MySQL 8.0
通用二进制包安装是生产环境中非常常用的方式。它不依赖系统包管理器,可以精确控制版本、支持离线环境,并且能够自由规划安装目录和数据目录。它的核心思路是下载官方编译好的 tar.gz 包,解压、创建专用用户、初始化数据目录、手工编写 systemd 服务单元,最后启动服务。
4.1 下载并校验通用二进制包
官方下载地址中的 tar 包名通常带有 glibc 版本和架构信息,例如mysql-8.0.x-linux-glibc2.28-x86_64.tar.xz。下载后强烈建议校验 MD5 或 SHA256,确保包完整无损。
cd /opt wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz md5sum mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz sha256sum mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz将计算结果与官网提供的 checksum 进行比对,避免下载到损坏或被篡改的包。国内网络无法直接访问时,可以通过镜像源下载,但应确保镜像完整性。
4.2 创建 MySQL 运行用户与目录规划
groupadd mysql useradd -r -g mysql -s /sbin/nologin mysql id mysql mkdir -p /data/mysql/data mkdir -p /data/mysql/logs mkdir -p /data/mysql/tmp mkdir -p /usr/local/mysql这里规划将安装程序放在/usr/local/mysql,数据文件放在/data/mysql/data。将数据目录和程序目录分离,便于后续升级和磁盘扩展。数据目录所在的挂载点要预留足够空间,并根据业务预估设置合理的存储类型。
4.3 解压并建立目录结构
cd /opt tar -xf mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz -C /usr/local/ cd /usr/local ln -s mysql-8.0.40-linux-glibc2.28-x86_64 mysql chown -R mysql:mysql /usr/local/mysql* chown -R mysql:mysql /data/mysql使用符号链接的好处是后续升级时只需替换软链接指向新版本目录,旧版本仍然保留,方便快速回滚。解压后的目录包含 bin、lib、include、share 等标准结构。
ls -l /usr/local/mysql ls -l /usr/local/mysql/bin | head -20 ls -l /usr/local/mysql/lib | head -204.4 编写 my.cnf 配置文件
二进制安装不会自动生成配置文件,需要手工创建。下面给出一个适合通用场景的基础配置,数据目录、日志目录和 socket 路径必须与目录规划保持一致。
cat > /etc/my.cnf <<'EOF' [mysqld] user=mysql basedir=/usr/local/mysql datadir=/data/mysql/data port=3306 bind-address=0.0.0.0 socket=/data/mysql/data/mysql.sock pid-file=/data/mysql/data/mysql.pid character-set-server=utf8mb4 collation-server=utf8mb4_0900_ai_ci log-error=/data/mysql/logs/error.log slow-query-log=1 slow-query-log-file=/data/mysql/logs/slow.log long_query_time=2 log-bin=/data/mysql/logs/mysql-bin binlog_format=ROW binlog_expire_logs_days=7 innodb_buffer_pool_size=2G innodb_flush_log_at_trx_commit=2 sync_binlog=1 innodb_flush_method=O_DIRECT max_connections=500 tmpdir=/data/mysql/tmp [client] socket=/data/mysql/data/mysql.sock default-character-set=utf8mb4 EOF chown mysql:mysql /etc/my.cnf mkdir -p /data/mysql/logs chown -R mysql:mysql /data/mysql配置要点如下:basedir指向安装目录,datadir指向数据目录,socket文件必须放在 mysql 用户可写的目录。开启二进制日志是后续做复制和恢复的基础,innodb_buffer_pool_size建议设置为物理内存的 50% 到 70%。
4.5 初始化数据库实例
初始化指令使用--initialize生成临时密码,或使用--initialize-insecure生成无密码 root。生产环境请使用前者。初始化前确保数据目录为空且属主正确。
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql grep 'temporary password' /data/mysql/logs/error.log初始化完成后,数据目录会出现 mysql、sys、performance_schema 等系统库文件和 ibdata1、undo 表空间等文件。日志中会输出 root 临时密码,请保存好,首次登录后立即修改。
ls -l /data/mysql/data | head -404.6 配置 systemd 服务单元
手工编写 systemd unit 文件,使 MySQL 可以通过 systemctl 统一管理,开机自启。
cat > /usr/lib/systemd/system/mysqld.service <<'EOF' [Unit] Description=MySQL Server After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql Type=notify TimeoutSec=0 PermissionsStartOnly=true ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE=65535 LimitNPROC=65535 Restart=on-failure RestartSec=5 StandardOutput=journal StandardError=journal SyslogIdentifier=mysqld EOF systemctl daemon-reload systemctl enable mysqld systemctl start mysqld systemctl status mysqldType 使用 notify 是 MySQL 8.0 推荐的模式,服务启动成功后 systemd 能及时感知。若启动无响应或被判定超时,可临时改为 Type=forking 并配合--daemonize参数排查。LimitNOFILE 与前面的 limits 文件对应,确保在 systemd 托管下文件描述符限制生效。
4.7 登录、修改密码与远程配置
/usr/local/mysql/bin/mysql -uroot -p ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@2026'; CREATE USER 'root'@'%' IDENTIFIED BY 'NewPass@2026'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; SELECT user,host,plugin FROM mysql.user;可以看到 8.0 默认使用 caching_sha2_password 认证插件,比 5.x 的 mysql_native_password 更安全。但部分较旧的客户端工具不支持 caching_sha2_password,会导致连接报 Authentication plugin 错误,可以通过将用户插件改为 mysql_native_password 解决,不过生产环境更建议升级客户端驱动。
ALTER USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'AppPass@2026';4.8 配置环境变量与库路径
cat > /etc/profile.d/mysql.sh <<'EOF' export PATH=/usr/local/mysql/bin:$PATH export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH export MANPATH=/usr/local/mysql/man:$MANPATH EOF source /etc/profile.d/mysql.sh mysql --version which mysql添加环境变量后,可以直接在任意目录调用 mysql、mysqldump 等命令。动态链接库路径配置后,依赖 MySQL 共享库的第三方程序才能正确加载。若使用 systemd 管理 MHA 或 ProxySQL 等代理工具,可能需要单独配置其 unit 文件中的 Environment 变量。
五、方式三:源码编译安装 MySQL 8.0
源码编译安装的成本最高,但它允许在编译阶段关闭不需要的存储引擎、裁剪不用的功能模块、开启静态编译选项,甚至针对特定 CPU 架构做编译优化。适合对数据库做定制化交付、需要在旧内核系统上部署、或追求极致性能的场景。
5.1 下载源码包
MySQL 官方提供带 boost 的源码包,8.0 的构建过程强依赖 Boost 库,因此直接下载带 boost 的版本可以省去单独准备 boost 的麻烦。
cd /opt wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.40.tar.gz tar -zxf mysql-boost-8.0.40.tar.gz -C /usr/local/src/ cd /usr/local/src/mysql-8.0.40 ls -l du -sh boost5.2 安装编译工具链与依赖包
源码编译需要完整的编译环境和大量开发库。不同发行版的包名略有差异,下面以 CentOS 7/8 为例。
yum groupinstall -y "Development Tools" yum install -y cmake make gcc gcc-c++ bison perl perl-JSON ncurses-devel \ openssl-devel libaio-devel libtirpc-devel rpcgen pkgconfig \ numactl-devel readline-devel zlib-devel openldap-devel \ cyrus-sasl-devel systemd-devel boost-devel cmake --version gcc --version | head -1其中 bison 是语法解析器生成工具,版本过低会直接报错;openssl-devel 提供加密支持;ncurses-devel 提供客户端命令行交互支持。若使用系统自带 Boost 而不是源码包中的 Boost,需要注意 boost 版本要求,8.0 对 boost 版本有严格范围。
5.3 使用 CMake 配置构建参数
在源码目录下创建独立构建目录,保持源码树干净。以下是一个常用的配置示例,可以根据需求增减参数。
cd /usr/local/src/mysql-8.0.40 mkdir build cd build cmake .. \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/data/mysql/data \ -DSYSCONFDIR=/etc \ -DWITH_BOOST=/usr/local/src/mysql-8.0.40/boost \ -DWITH_INNODB_MEMCACHED=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=0 \ -DENABLED_LOCAL_INFILE=1 \ -DENABLE_DTRACE=0 \ -DWITH_SSL=system \ -DWITH_ZLIB=bundled \ -DWITH_LZ4=bundled \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci \ -DBUILD_CONFIG=mysql_release \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DFORCE_INSOURCE_BUILD=0参数说明:CMAKE_INSTALL_PREFIX决定安装目录;MYSQL_DATADIR指定默认数据目录;WITH_BOOST指向 boost 源码目录;WITH_SSL=system使用系统 OpenSSL;各存储引擎开关决定是否需要编译对应模块。关闭不必要的存储引擎可以减小二进制体积。
配置完成后检查输出末尾是否出现Configuration done和Generate done,如果出现 Not found 或 ERROR,则需要针对性补充依赖。
5.4 编译与安装
编译阶段是最耗时的一步,建议使用多核心并行编译加速,可根据 CPU 核数设置-j参数。
nproc make -j$(nproc) make install ls -l /usr/local/mysql ls -l /usr/local/mysql/bin | head -20编译过程可能需要较长时间,取决于硬件性能。编译完成后安装到/usr/local/mysql目录。安装后的二进制文件位置与官方二进制包一致,后续初始化、配置和 systemd 服务管理可以完全复用第四章的步骤。
5.5 初始化、配置与启动
groupadd mysql useradd -r -g mysql -s /sbin/nologin mysql mkdir -p /data/mysql/data /data/mysql/logs /data/mysql/tmp chown -R mysql:mysql /data/mysql /usr/local/mysql/bin/mysqld --initialize --user=mysql \ --basedir=/usr/local/mysql --datadir=/data/mysql/data grep 'temporary password' /data/mysql/logs/error.log 2>/dev/null || \ grep 'temporary password' /var/log/mysqld.log 2>/dev/null源码安装后如果还没有配置文件,临时密码会输出到默认的错误日志路径。建议先按照第四章的 my.cnf 示例补齐配置文件,再启动服务,避免参数散落在命令行。
cat > /usr/lib/systemd/system/mysqld.service <<'EOF' [Unit] Description=MySQL Server After=network.target [Service] User=mysql Group=mysql Type=notify ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE=65535 Restart=on-failure [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl start mysqld systemctl enable mysqld mysql -uroot -p5.6 源码编译安装的优缺点
优点包括:可以精细裁剪模块和存储引擎、支持自定义编译选项、能针对特定硬件优化、便于魔改源码加入企业定制功能。缺点同样明显:编译耗时较长、依赖环境复杂、升级和补丁维护成本高、构建产物需要自行验证稳定性。对于绝大多数业务,官方二进制包已经足够,只有确有定制需求时才选择源码编译。
六、部署后的通用配置与优化
无论采用哪种安装方式,部署完成后都需要进行统一的参数检查、性能调优、日志配置和安全加固,才能让 MySQL 稳定运行。本章汇总三种安装方式通用且高频的配置项。
6.1 核心参数优化
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW VARIABLES LIKE 'innodb_log_file_size'; SHOW VARIABLES LIKE 'max_connections'; SHOW VARIABLES LIKE 'thread_cache_size'; SHOW VARIABLES LIKE 'table_open_cache'; SHOW VARIABLES LIKE 'tmp_table_size'; SHOW VARIABLES LIKE 'sort_buffer_size'; SHOW VARIABLES LIKE 'join_buffer_size';建议在 my.cnf 中显式配置以下常见参数,避免使用过小的默认值。
[mysqld] innodb_buffer_pool_size=8G innodb_buffer_pool_instances=8 innodb_log_file_size=1G innodb_log_files_in_group=2 innodb_flush_log_at_trx_commit=2 sync_binlog=1 max_connections=1000 thread_cache_size=128 table_open_cache=4096 tmp_table_size=64M max_heap_table_size=64M sort_buffer_size=4M join_buffer_size=4M read_buffer_size=4M read_rnd_buffer_size=8M innodb_io_capacity=2000 innodb_io_capacity_max=4000 open_files_limit=65535参数调整要结合服务器硬件和业务读写模型。例如innodb_flush_log_at_trx_commit=2可以在一定程度提高写性能,但极端断电场景可能丢失最近一秒的事务,金融类业务应保持为 1。所有参数修改后需要重启服务或使用 SET GLOBAL 动态调整。
6.2 字符集与排序规则确认
SHOW GLOBAL VARIABLES LIKE 'character_set_server'; SHOW GLOBAL VARIABLES LIKE 'collation_server'; SELECT @@character_set_database, @@collation_database;MySQL 8.0 默认使用 utf8mb4 字符集,排序规则为utf8mb4_0900_ai_ci,该排序规则基于 Unicode 9.0,对多语言排序支持更好。需要兼容老业务时,可以统一调整为utf8mb4_general_ci,但会损失部分排序精度。
6.3 慢查询日志与错误日志管理
SHOW VARIABLES LIKE 'slow_query_log%'; SHOW VARIABLES LIKE 'long_query_time'; SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; SET GLOBAL log_queries_not_using_indexes = 'ON';慢查询日志是定位 SQL 性能问题的重要手段。8.0 支持将慢查询日志记录到文件或表中,生产环境建议记录到文件并配合定时分析工具。错误日志路径可通过log_error参数查看和修改。
SHOW VARIABLES LIKE 'log_error'; tail -100 /data/mysql/logs/error.log6.4 备份与恢复策略
MySQL 8.0 常用备份方式包括逻辑备份 mysqldump、物理备份 mysqlbackup、xtrabackup 以及基于二进制日志的增量恢复。下面给出 mysqldump 常用参数示例。
mysqldump -uroot -p --single-transaction --master-data=2 \ --set-gtid-purged=OFF --triggers --routines --events \ --databases appdb > /data/backup/appdb_$(date +%F).sql mysql -uroot -p appdb < /data/backup/appdb_2026-09-05.sql生产环境应制定完整的备份计划:每日全量备份、增量 binlog 备份、定期恢复演练。逻辑备份适合中小数据量,大数据量场景推荐使用物理备份工具 xtrabackup,可显著缩短备份时间。
yum install -y percona-xtrabackup-80 xtrabackup --backup --target-dir=/data/backup/full-$(date +%F) \ --user=root --password=NewPass@2026 --parallel=46.5 用户权限与安全加固
SELECT user,host,plugin,account_locked FROM mysql.user; SHOW GRANTS FOR 'appuser'@'%'; DROP USER 'appuser'@'%'; CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'AppPass@2026'; GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'appuser'@'192.168.1.%'; REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'appuser'@'192.168.1.%';安全加固的核心是遵循最小权限原则:业务账号只授予业务库的必要权限,拒绝使用 ALL PRIVILEGES 大而全授权;限制可登录来源网段;定期审计用户列表和权限;移除匿名用户和测试库;对外访问尽量通过跳板机或 VPN,而不是直接暴露 3306 端口。
SHOW GLOBAL VARIABLES LIKE 'require_secure_transport'; SHOW GLOBAL VARIABLES LIKE 'have_ssl';如果环境允许,建议开启 SSL/TLS 加密连接,并将require_secure_transport设为 ON,强制所有远程连接走加密通道。
七、高可用与进阶部署
单机部署完成后,生产环境往往需要进一步搭建高可用架构。MySQL 8.0 提供了多种方案,包括经典的主从复制、半同步复制和 InnoDB 集群。本章简要介绍主从复制和组复制的搭建思路。
7.1 主从复制搭建
主从复制是数据库高可用的基础。基于 GTID 的复制便于主从切换和故障恢复,是 8.0 推荐的配置方式。以下为主库需要开启的基本参数。
[mysqld] server-id=1 log-bin=mysql-bin binlog_format=ROW gtid_mode=ON enforce_gtid_consistency=ON log_slave_updates=ON从库配置与主库类似,但 server-id 必须不同。
[mysqld] server-id=2 relay-log=mysql-relay-bin log-bin=mysql-bin binlog_format=ROW gtid_mode=ON enforce_gtid_consistency=ON read_only=ON super_read_only=ON配置完成后主库创建复制账号,从库执行 CHANGE REPLICATION SOURCE 建立连接。
-- 主库 CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass@2026'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; -- 从库 CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.10', SOURCE_PORT=3306, SOURCE_USER='repl', SOURCE_PASSWORD='ReplPass@2026', SOURCE_AUTO_POSITION=1; START REPLICA; SHOW REPLICA STATUS\G注意 8.0 已使用CHANGE REPLICATION SOURCE TO替代 5.x 的CHANGE MASTER TO,SHOW REPLICA STATUS替代SHOW SLAVE STATUS。检查Replica_IO_Running和Replica_SQL_Running都为 Yes,说明复制链路正常。
7.2 MySQL Group Replication 简介
MySQL Group Replication(组复制)基于 Paxos 协议实现多主或多主单写的高可用集群,支持自动故障检测和成员管理。要启用 MGR,需要服务器开启 GTID、二进制日志,并配置组复制相关插件参数。
[mysqld] server-id=1 gtid_mode=ON enforce_gtid_consistency=ON binlog_format=ROW log_slave_updates=ON plugin_load_add='group_replication.so' group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" group_replication_start_on_boot=OFF group_replication_local_address="192.168.1.10:33061" group_replication_group_seeds="192.168.1.10:33061,192.168.1.11:33061,192.168.1.12:33061" group_replication_bootstrap_group=OFF第一个节点需要使用SET GLOBAL group_replication_bootstrap_group=ON引导,单主模式下其余成员通过START GROUP_REPLICATION加入集群。组复制对网络质量和节点时钟有较高要求,部署前需充分测试,生产环境通常直接使用 MySQL InnoDB Cluster 或 MySQL Shell 简化管理。
7.3 高可用方案选型建议
选择高可用方案要结合数据重要性、恢复时间目标 RTO、恢复点目标 RPO 以及运维能力。中小业务采用主从复制加自动切换工具即可;要求跨机房容灾时可采用半同步复制;需要多主写入和自动选主可考虑 MGR 或 InnoDB Cluster;分布式扩展则进一步引入 MySQL Router、ProxySQL 或分库分表中间件。切忌脱离业务需求盲目追求复杂架构。
八、常见问题排查
部署和运行 MySQL 的过程中,最常见的问题集中在启动失败、认证失败、权限问题、端口占用和数据目录损坏。本章给出排查思路和常用命令。
8.1 启动失败与日志分析
systemctl status mysqld journalctl -u mysqld -n 100 --no-pager tail -100 /data/mysql/logs/error.log启动失败的经典原因包括:配置文件参数错误、数据目录权限不对、磁盘空间不足、端口被占用、上次异常退出导致需要恢复。日志是定位问题的最直接依据,遇到 unknown variable 报错通常是参数拼写错误或参数在 8.0 中已移除;遇到 Permission denied 则检查数据目录和日志目录属主是否为 mysql。
8.2 密码与认证插件问题
ERROR 1045 (28000): Access denied for user 'root'@'localhost' ERROR 2059 (HY000): Authentication plugin caching_sha2_password cannot be loadedAccess denied 优先确认密码和来源主机是否正确,必要时查看 mysql.user 表。2059 错误说明客户端驱动过旧,不支持 caching_sha2_password。解决方式有两种:升级客户端驱动,或将该用户插件改为兼容模式。
ALTER USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'AppPass@2026';如果忘记 root 密码,可以通过--skip-grant-tables跳过授权表启动后重置,操作时务必限制本机访问并尽快恢复。
systemctl stop mysqld /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking & mysql -uroot FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@2026'; SHUTDOWN;8.3 Socket 文件与权限问题
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'Socket 连接失败通常是因为客户端和服务端的 socket 路径不一致,或者服务未启动。检查 my.cnf 中 [mysqld] 和 [client] 两段是否配置了相同 socket 路径,确认 socket 文件已生成且目录权限允许 mysql 用户读写。
ls -l /data/mysql/data/mysql.sock mysql -uroot -p -S /data/mysql/data/mysql.sock8.4 端口占用与防火墙排查
ss -lntp | grep 3306 lsof -i:3306 firewall-cmd --list-all telnet 192.168.1.10 3306端口占用的常见原因是系统中同时运行了新旧两个 MySQL 实例,或配置了多个实例未区分端口。远程无法连接时,依次排查服务监听地址是否为 0.0.0.0、防火墙是否放行、安全组是否放通、MySQL 用户是否允许外部主机登录。
九、三种安装方式对比
为了帮助读者快速选择适合自己的部署方式,下表从安装速度、依赖管理、版本控制、定制能力、离线部署、运维复杂度等维度对三种方式进行比较。
| 对比维度 | YUM 仓库安装 | 二进制 TAR 包安装 | 源码编译安装 |
|---|---|---|---|
| 安装速度 | 最快,几分钟完成 | 较快,下载解压即可 | 较慢,编译耗时长 |
| 依赖处理 | 自动解决依赖 | 需手动确认少量依赖 | 需要完整编译工具链 |
| 版本控制 | 受仓库版本限制 | 可精确选择任意版本 | 可精确选择并定制版本 |
| 定制能力 | 低,标准编译产物 | 低,官方预编译产物 | 高,可裁剪模块和优化 |
| 离线部署 | 需要本地镜像仓库 | 非常适合,拷贝包即可 | 需提前准备源码和依赖 |
| 运维复杂度 | 低,官方仓库持续更新 | 中,手动升级和配置 | 高,升级和补丁成本大 |
| 适用场景 | 快速交付、标准化环境 | 生产离线部署、多版本管理 | 深度定制、特殊架构需求 |
十、总结
本文系统梳理了 Linux 环境下 MySQL 8.0 的三种安装与部署方式。YUM 仓库安装胜在快捷和自动化,适合先跑通流程和标准交付;通用二进制包安装兼具灵活与稳定,是生产环境使用最广的方案;源码编译安装则面向有定制化需求的进阶场景。无论选择哪种方式,安装后的参数调优、安全加固、备份策略和高可用规划都不可忽视。
实际操作中建议先确定业务规模、可用性要求和运维能力,再决定安装路径。对于大多数场景,推荐使用通用二进制包进行部署,并通过规范的配置文件和 systemd 服务完成标准化管理。后续可以在单机稳定运行的基础上,逐步引入主从复制、监控告警和自动备份,构建可持续演进的数据基础设施。