Skip to content
返回

MySQL 8 在 Linux 下的安装与配置指南

发布日期:

Table of contents

Open Table of contents

环境准备

在开始安装之前,确保服务器满足以下基本要求:

操作系统:Ubuntu 20.04/22.04/24.04、CentOS 7/8/9、Debian 11/12 或其他主流 Linux 发行版。

硬件要求:最低 1GB 内存(建议 4GB 以上),至少 10GB 可用磁盘空间。如果用于生产环境,建议使用 SSD 以获得更好的 I/O 性能。

网络:确保服务器可以访问外网以下载软件包,或者已经配置好本地软件源。

Ubuntu/Debian 系统安装

添加 MySQL APT 源

Ubuntu 官方仓库自带的 MySQL 版本可能不是最新的 8.x 版本,建议添加 MySQL 官方 APT 源以获取最新版本。

# 下载 MySQL APT 配置包
wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb

# 安装配置包(会弹出选择界面,选择 MySQL 8.0)
sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb

# 更新软件包列表
sudo apt update

如果不想使用交互式配置,也可以手动添加源:

# 下载并添加 MySQL GPG 密钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29

# 手动添加源
echo "deb http://repo.mysql.com/apt/ubuntu $(lsb_release -cs) mysql-8.0" | sudo tee /etc/apt/sources.list.d/mysql.list

sudo apt update

安装 MySQL Server

# 安装 MySQL 8 服务端
sudo apt install mysql-server

# 安装过程中可以设置 root 密码,如果跳过了后续通过 mysql_secure_installation 设置

安装完成后,MySQL 服务会自动启动。可以通过以下命令确认状态:

# 查看服务状态
sudo systemctl status mysql

# 确认版本
mysql --version

设置开机自启

sudo systemctl enable mysql

CentOS/RHEL 系统安装

添加 MySQL YUM 源

# 下载 MySQL YUM 源配置包
sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm

# 安装配置包
sudo rpm -Uvh mysql80-community-release-el7-11.noarch.rpm

# 确认源已启用
yum repolist enabled | grep "mysql.*-community.*"

如果是 CentOS 8 或 RHEL 8+,使用对应的包:

sudo wget https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm
sudo rpm -Uvh mysql80-community-release-el8-9.noarch.rpm

安装 MySQL Server

# 安装 MySQL 8
sudo yum install mysql-community-server

# CentOS 8+ 使用 dnf
sudo dnf install mysql-community-server

启动并设置开机自启

# 启动 MySQL 服务
sudo systemctl start mysqld

# 设置开机自启
sudo systemctl enable mysqld

# 查看服务状态
sudo systemctl status mysqld

获取初始临时密码

CentOS/RHEL 安装后会自动生成一个临时密码,需要先获取才能登录:

sudo grep 'temporary password' /var/log/mysqld.log

记下输出的临时密码,后续登录时需要使用。

安装后安全配置

MySQL 8 安装流程与配置项

无论使用哪种发行版,安装完成后都需要进行安全配置。MySQL 提供了 mysql_secure_installation 工具来简化这一过程。

运行安全配置向导

sudo mysql_secure_installation

该向导会引导完成以下配置:

设置 root 密码。输入当前的临时密码(如果有),然后设置新的 root 密码。建议密码长度至少 12 位,包含大小写字母、数字和特殊字符。

移除匿名用户。选择 Y 移除匿名用户,这是基本的安全措施。

禁止 root 远程登录。建议选 Y,root 用户只允许本地登录,远程管理使用普通用户提权。

移除 test 数据库。选择 Y 移除测试数据库,生产环境不需要。

重新加载权限表。选择 Y 使上述更改立即生效。

手动登录并验证

# 使用 root 登录
sudo mysql -u root -p

# 验证版本
mysql> SELECT VERSION();
mysql> SHOW DATABASES;

关键配置项详解

安装完成后,需要编辑 MySQL 的主配置文件来优化性能和安全性。配置文件的位置因发行版而异:

编辑完成后,需要重启 MySQL 服务使配置生效:

# Ubuntu/Debian
sudo systemctl restart mysql

# CentOS/RHEL
sudo systemctl restart mysqld

基础配置

[mysqld]
# 监听端口
port = 3306

# 监听地址:0.0.0.0 表示监听所有网卡,如需限制只允许本机访问可设为 127.0.0.1
bind-address = 0.0.0.0

# 数据目录
datadir = /var/lib/mysql

# Socket 文件路径
socket = /var/run/mysqld/mysqld.sock

# PID 文件
pid-file = /var/run/mysqld/mysqld.pid

字符集配置

MySQL 8 默认使用 utf8mb4 字符集,但建议显式配置以确保一致性:

[mysqld]
# 服务端字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 客户端默认字符集
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

utf8mb4utf8 的超集,完整支持 Unicode,包括 emoji 表情符号。在 MySQL 8 中这已经是默认值,但显式声明可以避免被其他配置覆盖。

认证插件配置

MySQL 8 默认使用 caching_sha2_password 认证插件,相比旧版的 mysql_native_password 更加安全。但如果需要兼容旧客户端或驱动,可能需要切换回旧插件:

[mysqld]
# MySQL 8 默认认证插件(推荐保持默认)
default_authentication_plugin = caching_sha2_password

# 如果需要兼容旧客户端,可改为:
# default_authentication_plugin = mysql_native_password

也可以在创建用户时单独指定认证方式:

-- 使用新的认证方式
CREATE USER 'user1'@'%' IDENTIFIED BY 'password';

-- 使用旧的认证方式(兼容旧客户端)
CREATE USER 'user2'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

连接与内存配置

这是性能调优的核心部分,需要根据服务器实际内存和使用场景来调整:

[mysqld]
# 最大连接数,根据业务并发量调整
max_connections = 500

# 单个用户最大连接数
max_connect_errors = 100000

# InnoDB 缓冲池大小,建议设为物理内存的 60%-75%
# 例如服务器有 8GB 内存,可设为 5G
innodb_buffer_pool_size = 5G

# InnoDB 缓冲池实例数,大内存建议设为 4-8
innodb_buffer_pool_instances = 4

# InnoDB 日志文件大小,影响崩溃恢复时间
innodb_log_file_size = 256M

# InnoDB 日志缓冲区大小
innodb_log_buffer_size = 64M

# 表打开缓存数量
table_open_cache = 4000

# 排序缓冲区大小
sort_buffer_size = 4M

# 连接缓冲区大小
join_buffer_size = 4M

# 临时表大小
tmp_table_size = 64M
max_heap_table_size = 64M

innodb_buffer_pool_size 是最重要的性能参数。InnoDB 使用这个区域来缓存数据和索引,减少磁盘 I/O。一般建议设为物理内存的 60%-75%,但不要超过 80%,否则可能影响系统其他进程的内存需求。

日志配置

合理配置日志有助于排查问题和性能分析:

[mysqld]
# 错误日志
log_error = /var/log/mysql/error.log

# 慢查询日志(超过指定时间的查询会被记录)
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

# 通用查询日志(生产环境谨慎开启,会占用较多磁盘空间)
# general_log = OFF

# Binlog 配置(用于数据恢复和主从复制)
log_bin = ON
binlog_format = ROW
binlog_expire_logs_seconds = 604800
max_binlog_size = 512M
server-id = 1

慢查询日志是性能优化的重要工具。long_query_time 设为 2 表示执行时间超过 2 秒的查询会被记录。生产环境建议设为 1-2 秒,开发环境可以设为 0 记录所有查询。

安全配置

[mysqld]
# 禁止通过 LOAD DATA LOCAL 导入文件(防止恶意文件读取)
local_infile = 0

# 密码过期策略(0 表示永不过期)
default_password_lifetime = 0

# 密码最小长度(需要安装 validate_password 插件)
# validate_password.length = 12

# SQL 模式:严格模式,防止数据丢失
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

# 符号链接限制
symbolic-links = 0

用户管理

创建用户并授权

MySQL 8 中创建用户和授权需要分开执行:

-- 创建用户(% 表示允许从任意主机连接,建议限定具体 IP)
CREATE USER 'appuser'@'%' IDENTIFIED BY 'YourStrongPassword123!';

-- 授权(授予特定数据库的所有权限)
GRANT ALL PRIVILEGES ON mydb.* TO 'appuser'@'%';

-- 也可以只授予部分权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'appuser'@'%';

-- 刷新权限
FLUSH PRIVILEGES;

查看和撤销权限

-- 查看用户权限
SHOW GRANTS FOR 'appuser'@'%';

-- 撤销权限
REVOKE ALL PRIVILEGES ON mydb.* FROM 'appuser'@'%';

-- 删除用户
DROP USER 'appuser'@'%';

修改用户密码

-- MySQL 8 修改密码语法
ALTER USER 'appuser'@'%' IDENTIFIED BY 'NewPassword456!';

-- 修改 root 密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewRootPassword789!';

防火墙配置

如果需要从其他机器连接 MySQL,需要开放 3306 端口:

# Ubuntu/Debian (ufw)
sudo ufw allow 3306/tcp
sudo ufw reload

# CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload

# 或者只允许特定 IP 访问(更安全)
sudo ufw allow from 192.168.1.100 to any port 3306

生产环境强烈建议不要将 3306 端口开放给所有 IP,而是限定只允许应用服务器的 IP 访问。

MySQL 8 架构概览

MySQL 8 架构概览

了解 MySQL 的内部架构有助于更好地进行配置和优化。MySQL 采用分层架构设计,主要分为三层:

客户端层负责处理连接管理、认证和权限验证。所有客户端(命令行、应用程序驱动、图形化工具)都通过这一层与 MySQL 交互。

服务器层是 MySQL 的核心,包含 SQL 解析器(解析和优化 SQL 语句)、查询缓存、执行引擎、存储过程/触发器处理、InnoDB 缓冲池以及日志管理器等组件。

存储引擎层负责数据的实际存储和检索。InnoDB 是 MySQL 8 的默认存储引擎,支持事务(ACID)、行级锁和 MVCC,适合大多数 OLTP 场景。

常见问题排查

服务无法启动。检查错误日志 /var/log/mysql/error.log/var/log/mysqld.log,常见原因包括端口被占用、配置文件语法错误、数据目录权限不正确等。

# 查看错误日志
sudo tail -50 /var/log/mysql/error.log

# 检查端口占用
sudo netstat -tlnp | grep 3306

# 检查数据目录权限
sudo ls -la /var/lib/mysql/

忘记 root 密码。可以通过以下步骤重置:

# 停止 MySQL 服务
sudo systemctl stop mysql

# 以安全模式启动(跳过权限验证)
sudo mysqld_safe --skip-grant-tables &

# 登录后修改密码
mysql -u root
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
mysql> EXIT;

# 重启 MySQL 恢复正常模式
sudo systemctl restart mysql

远程连接被拒绝。检查 bind-address 是否设置为 0.0.0.0,防火墙是否开放 3306 端口,以及用户是否被授权从远程主机连接。

-- 查看用户允许的连接主机
SELECT host, user FROM mysql.user;

总结

MySQL 8 的安装和配置并不复杂,但安装后的配置调优直接影响数据库的性能和安全性。关键要点包括:使用 mysql_secure_installation 完成基础安全设置,合理配置 innodb_buffer_pool_size 以充分利用内存,开启慢查询日志便于后续优化,以及严格管理用户权限和远程访问策略。

生产环境还建议定期备份数据、监控数据库性能指标,并根据实际负载情况持续调整配置参数。


分享此文章:

上一篇
家庭网络配置设想
下一篇
夏日游 | 方特宏村漂流两日游