强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

MySQL 完全指南 / 第 2 章:安装与部署

第 2 章:安装与部署

工欲善其事,必先利其器。本章覆盖所有主流平台的 MySQL 安装方式,以及 Docker 快速部署。


2.1 安装方式总览

方式适用场景优点缺点
包管理器安装开发/测试环境简单快速版本可能较旧
官方 APT/YUM 仓库生产 Linux 环境可控版本,自动依赖配置稍复杂
二进制包生产环境(精细控制)不依赖系统包管理手动操作多
Docker开发/测试/容器化生产隔离、可重复、快速数据持久化需规划
源码编译特殊定制需求完全可控耗时、复杂
HomebrewmacOS 开发环境简单不适合生产

2.2 Linux 安装

2.2.1 Ubuntu / Debian(APT)

# === 第 1 步:添加 MySQL 官方 APT 仓库 ===
# 下载仓库配置包(以 MySQL 8.4 为例)
wget https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.32-1_all.deb
# 弹出界面选择 MySQL 8.4 LTS

# 更新包索引
sudo apt update

# === 第 2 步:安装 MySQL Server ===
sudo apt install -y mysql-server
# 安装过程中会提示设置 root 密码

# === 第 3 步:启动并设置开机自启 ===
sudo systemctl start mysql
sudo systemctl enable mysql

# === 第 4 步:安全初始化 ===
sudo mysql_secure_installation

2.2.2 CentOS / RHEL(YUM / DNF)

# === 第 1 步:添加 MySQL 官方 YUM 仓库 ===
sudo rpm -Uvh https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm

# === 第 2 步:安装 MySQL Server ===
# CentOS 8+ / RHEL 8+ 使用 dnf
sudo dnf install -y mysql-community-server

# === 第 3 步:启动并设置开机自启 ===
sudo systemctl start mysqld
sudo systemctl enable mysqld

# === 第 4 步:获取临时密码并修改 ===
sudo grep 'temporary password' /var/log/mysqld.log
# 输出类似:A temporary password is generated for root@localhost: xK3#mR9p!

# 使用临时密码登录并修改
mysql -uroot -p'xK3#mR9p!'
-- 登录后立即修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewP@ssw0rd!2026';
FLUSH PRIVILEGES;

2.2.3 二进制包安装(通用 Linux)

# === 第 1 步:下载二进制包 ===
cd /tmp
wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.4-linux-glibc2.28-x86_64.tar.xz

# === 第 2 步:解压到 /usr/local ===
sudo tar -xf mysql-8.4.4-linux-glibc2.28-x86_64.tar.xz -C /usr/local/
sudo ln -s /usr/local/mysql-8.4.4-linux-glibc2.28-x86_64 /usr/local/mysql

# === 第 3 步:创建用户和目录 ===
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
sudo mkdir -p /var/lib/mysql /var/run/mysqld /var/log/mysql
sudo chown -R mysql:mysql /var/lib/mysql /var/run/mysqld /var/log/mysql

# === 第 4 步:初始化数据库 ===
cd /usr/local/mysql
sudo bin/mysqld --initialize --user=mysql
# 记录输出的临时密码

# === 第 5 步:配置 my.cnf ===
sudo tee /etc/my.cnf << 'EOF'
[mysqld]
basedir = /usr/local/mysql
datadir = /var/lib/mysql
socket  = /var/run/mysqld/mysqld.sock
port    = 3306
pid-file = /var/run/mysqld/mysqld.pid
log-error = /var/log/mysql/error.log

# 基础调优
innodb_buffer_pool_size = 1G
max_connections = 200
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci

[client]
socket = /var/run/mysqld/mysqld.sock
EOF

# === 第 6 步:启动 MySQL ===
sudo bin/mysqld_safe --user=mysql &
# 或使用 systemd(创建 service 文件)

2.3 macOS 安装(Homebrew)

# 安装 MySQL 8.4
brew install [email protected]

# 启动 MySQL 服务
brew services start [email protected]

# 验证版本
mysql --version

# 安全初始化
mysql_secure_installation

💡 提示:如果之前安装过其他版本,先卸载再安装:

brew uninstall mysql
brew cleanup
brew install [email protected]

2.4 Windows 安装

方式 1:官方安装包(MSI)

  1. 下载:https://dev.mysql.com/downloads/installer/
  2. 选择 mysql-installer-community-8.4.x.msi
  3. 安装类型选择 Server onlyCustom
  4. 配置 root 密码
  5. 端口默认 3306
  6. 服务名默认 MySQL84

方式 2:ZIP 免安装包

# 解压到 C:\mysql-8.4
# 创建 my.ini 配置文件
[mysqld]
basedir = C:/mysql-8.4
datadir = C:/mysql-8.4/data
port = 3306
# 初始化数据库
cd C:\mysql-8.4\bin
mysqld --initialize --console
# 记录临时密码

# 安装为 Windows 服务
mysqld --install MySQL84

# 启动服务
net start MySQL84

2.5 Docker 快速部署

2.5.1 基础 Docker 启动

# 最简单的启动方式
docker run -d \
  --name mysql8 \
  -e MYSQL_ROOT_PASSWORD=MyStr0ng!Pass \
  -p 3306:3306 \
  mysql:8.4

# 查看日志
docker logs -f mysql8

# 进入容器执行 SQL
docker exec -it mysql8 mysql -uroot -p'MyStr0ng!Pass'

2.5.2 带数据持久化的完整启动

docker run -d \
  --name mysql8 \
  -e MYSQL_ROOT_PASSWORD=MyStr0ng!Pass \
  -e MYSQL_DATABASE=myapp \
  -e MYSQL_USER=appuser \
  -e MYSQL_PASSWORD=AppUser!Pass \
  -p 3306:3306 \
  -v /data/mysql/data:/var/lib/mysql \
  -v /data/mysql/conf:/etc/mysql/conf.d \
  -v /data/mysql/log:/var/log/mysql \
  --restart=unless-stopped \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_0900_ai_ci \
  mysql:8.4

2.5.3 Docker Compose 部署

创建 docker-compose.yml

version: '3.8'

services:
  mysql:
    image: mysql:8.4
    container_name: mysql8
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-MyStr0ng!Pass}
      MYSQL_DATABASE: myapp
      MYSQL_USER: appuser
      MYSQL_PASSWORD: ${MYSQL_PASSWORD:-AppUser!Pass}
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro
      - ./init:/docker-entrypoint-initdb.d:ro  # 初始化脚本目录
      - mysql_log:/var/log/mysql
    command: >
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_0900_ai_ci
      --innodb-buffer-pool-size=512M
      --max-connections=200
      --slow-query-log=ON
      --long-query-time=1
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-MyStr0ng!Pass}"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  mysql_data:
  mysql_log:

启动:

# 创建配置目录
mkdir -p conf init

# 启动
docker compose up -d

# 查看状态
docker compose ps

# 查看日志
docker compose logs -f mysql

2.5.4 用自定义配置文件

创建 conf/my.cnf

[mysqld]
# 基础设置
default-time-zone = '+08:00'
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci

# InnoDB 调优
innodb_buffer_pool_size = 512M
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1

# 连接设置
max_connections = 200
wait_timeout = 600
interactive_timeout = 600

# 日志
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log-bin = mysql-bin
binlog-format = ROW
server-id = 1

2.5.5 Docker 初始化脚本

.sql.sh 文件放入 init/ 目录,首次启动自动执行:

init/01-create-tables.sql:

USE myapp;

CREATE TABLE IF NOT EXISTS users (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    status TINYINT DEFAULT 1 COMMENT '1=active, 0=disabled',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_email (email),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.6 初始化安全配置

安装完成后,无论哪种方式,都应执行安全初始化:

mysql_secure_installation

该命令会引导你完成以下操作:

步骤操作建议
1设置 root 密码使用强密码(12位+,含大小写、数字、特殊字符)
2删除匿名用户✅ 是
3禁止 root 远程登录✅ 是
4删除 test 数据库✅ 是
5刷新权限表✅ 是

2.7 核心配置参数(my.cnf)

安装后最重要的配置文件:

参数默认值生产建议说明
innodb_buffer_pool_size128M物理内存的 60-70%InnoDB 最关键的参数
max_connections151200-500根据并发量调整
character-set-serverutf8mb4utf8mb4支持 emoji 和所有 Unicode
collation-serverutf8mb4_0900_ai_ciutf8mb4_0900_ai_ci8.0 默认排序规则
innodb_flush_log_at_trx_commit11(安全优先)0/2 可提升性能但有丢失风险
sync_binlog11(安全优先)0 可提升性能但有丢失风险
slow_query_logOFFON记录慢查询
long_query_time101慢查询阈值(秒)
innodb_file_per_tableONON每个表独立表空间
default-time-zoneSYSTEM+08:00时区设置

⚠️ 关键参数配置示例(4核8G 服务器):

[mysqld]
# 内存:Buffer Pool 占 60%
innodb_buffer_pool_size = 5G
innodb_buffer_pool_instances = 4

# 连接
max_connections = 300
wait_timeout = 600

# 日志
slow_query_log = ON
long_query_time = 1
log-bin = mysql-bin
binlog-format = ROW

# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci

# 安全
default-authentication-plugin = caching_sha2_password
local_infile = OFF

2.8 安装后验证

# 检查 MySQL 服务状态
sudo systemctl status mysql

# 检查版本
mysql --version

# 登录并验证
mysql -uroot -p -e "SELECT VERSION(); SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
-- 验证基本功能
SELECT VERSION();                              -- 查看版本
SHOW VARIABLES LIKE '%character_set%';         -- 查看字符集
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; -- 查看 Buffer Pool
SHOW DATABASES;                                -- 查看数据库列表
SELECT * FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Threads_connected';

业务场景

场景 1:开发团队快速搭建环境

10 人开发团队需要统一的 MySQL 开发环境。

方案:使用 Docker Compose 部署,将 docker-compose.ymlconf/my.cnf 纳入 Git 仓库,每人一条命令启动:

git clone <repo>
cd <repo>
docker compose up -d

场景 2:生产环境服务器选型

某 SaaS 系统日活 10 万,数据量约 50GB。

方案

  • 服务器:4 核 16G 或 8 核 32G
  • 存储:SSD,至少 200GB
  • 安装方式:官方 YUM/APT 仓库
  • Buffer Pool:10-20G
  • 主从架构(一主两从)

扩展阅读