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 提供了 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 的主配置文件来优化性能和安全性。配置文件的位置因发行版而异:
- Ubuntu/Debian:
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/mysql/my.cnf - CentOS/RHEL:
/etc/my.cnf
编辑完成后,需要重启 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
utf8mb4 是 utf8 的超集,完整支持 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 的内部架构有助于更好地进行配置和优化。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 以充分利用内存,开启慢查询日志便于后续优化,以及严格管理用户权限和远程访问策略。
生产环境还建议定期备份数据、监控数据库性能指标,并根据实际负载情况持续调整配置参数。