Featured image of post MySQL 安装部署实战:Linux 二进制与 Windows Installer 双路

MySQL 安装部署实战:Linux 二进制与 Windows Installer 双路

本文整理 MySQL 5.x/8.x 在 Linux(glibc 通用二进制包)与 Windows(MSI Installer)两套环境下的安装流程,包括用户创建、初始化、密码设置、远程连接与 my.cnf/my.ini 关键参数。

为什么写这篇:MySQL 的安装步骤看似简单,但glibc 版本依赖、socket 文件路径、字符集配置、远程 root 授权这四件事踩过坑的人不在少数。本文把"Linux 通用二进制 + Windows MSI Installer"两条路整理成可复制的 SOP,每一步都说明"为什么这么做"。

适用读者:需要在本地或服务器上从零搭建 MySQL 的开发者、运维、DBA。

前置知识:会用 tar/systemctl、懂得基础 SQL。

目录

  1. 安装前必看:版本与发行版选型
  2. Linux 二进制安装:glibc 通用包
  3. Windows MSI Installer 安装
  4. my.cnf / my.ini 关键参数
  5. 常见安装问题与排错

1. 安装前必看:版本与发行版选型

MySQL 的安装方式有很多种,按"可控性"从高到低排列:

方式适用场景关键特点
glibc 通用二进制包生产服务器自包含、可控、不依赖系统包管理器
源码编译极致定制自由选编译参数,但维护成本高
apt/yum 仓库包个人开发机一行命令搞定,但版本可能偏旧
MSI Installer(Windows)Windows 服务器 / 开发机图形化向导 + Windows 服务集成
Docker 镜像容器化部署隔离性好、启动最快(参考 0.5.4 批次的 MySQL Docker 实战)

选型建议:生产环境首选 glibc 通用二进制或 yum/apt 仓库包;开发机用 MSI Installer 最省事;K8s 集群用 Docker 镜像。

版本号含义(以 8.0.40 为例):

  • 第一个数字 8主版本。从 8.0 起,MySQL 引入窗口函数、CTE、JSON 增强
  • 第二个数字 0次版本。8.0 时代的偶数版本(8.0.23、8.0.34、8.0.40)是 LTS 候选
  • 第三个数字 40补丁版本。bugfix 累计,越大越新

glibc 版本核查

1
2
3
4
ldd --version
# 输出:ldd (GNU libc) 2.17
# MySQL 8.0.40+ 要求 glibc 2.28+
# CentOS 7 自带 glibc 2.17 → 装 8.0.40 会失败,要选 8.0.23 之前的版本

重要提示:MySQL 8.x 的二进制包对 glibc 有最低版本要求。CentOS 7 / RHEL 7 自带 glibc 2.17,最多支持到 MySQL 8.0.36;想要 8.0.40+ 需要升 glibc 或换 OS。


2. Linux 二进制安装:glibc 通用包

2.1 卸载旧版本

很多系统预装了 MariaDB 或老版本 MySQL,必须先卸载:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 查看
rpm -qa | grep -i mariadb
rpm -qa | grep -i mysql

# 卸载(-e --nodeps 强制卸载,可能破坏依赖,但生产库就是要干净)
rpm -e --nodeps mariadb-libs-5.5.44-2.el7.centos.x86_64
rpm -e --nodeps mysql-libs-5.1.73-5.el6_6.x86_64

# 删除残留配置
rm -f /etc/my.cnf

2.2 下载与解压

官方归档地址:https://downloads.mysql.com/archives/community/

1
2
3
4
5
6
7
8
cd /usr/local/

# 下载(以 MySQL 8.1.0 为例,根据 glibc 兼容性挑版本)
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.1.0-linux-glibc2.28-x86_64.tar.xz

# 解压并改名
tar -xvf mysql-8.1.0-linux-glibc2.28-x86_64.tar.xz
mv mysql-8.1.0-linux-glibc2.28-x86_64 mysql

2.3 创建 mysql 用户与目录

1
2
3
4
5
6
mkdir -p /usr/local/mysql/data

groupadd mysql
useradd -g mysql mysql

chown -R mysql:mysql /usr/local/mysql

2.4 编辑 /etc/my.cnf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[mysql]
# 设置 mysql 客户端默认字符集
default-character-set=utf8

[mysqld]
# 设置 3306 端口
port = 3306
# 设置 mysql 的安装目录
basedir=/usr/local/mysql
# 设置 mysql 数据库的数据存放目录
datadir=/usr/local/mysql/data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为 8 比特编码的 latin1 字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 表名是否区分大小写:1=不区分(推荐),0=区分
lower_case_table_names=1
# 单条 SQL 允许的最大包大小(导入大文件时需要调大)
max_allowed_packet=16M
# socket 文件位置
socket=/usr/local/mysql/mysql.sock
# 关闭符号链接(安全)
symbolic-links=0

[client]
port=3306
socket=/usr/local/mysql/mysql.sock

!includedir /etc/my.cnf.d

2.5 初始化数据库

1
2
3
4
5
6
7
cd /usr/local/mysql/bin/
./mysqld \
  --defaults-file=/etc/my.cnf \
  --basedir=/usr/local/mysql/ \
  --datadir=/usr/local/mysql/data/ \
  --user=mysql \
  --initialize

initialize注意是两个横线)会生成一个临时 root 密码,请从控制台输出中抄下来,类似:

1
A temporary password is generated for root@localhost: w+,S,s+jp6to

如果报 libaio.so.1 缺失

1
2
3
yum install -y libaio.so.1
# 如果上面解决不了,再装:
yum install -y libaio

2.6 注册系统服务

1
2
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chkconfig --add mysql

2.7 启动与重置密码

1
2
3
4
5
6
7
service mysql start

# 软链接 socket(解决 /tmp/mysql.sock 找不到的问题)
ln -s /usr/local/mysql/mysql.sock /tmp/mysql.sock

# 用临时密码登录
./mysql -h 127.0.0.1 -u root -p

登录后第一件事:把密码改成空,然后再设一个新的,避免密码策略拒绝你设的新密码。

1
2
3
use mysql;
update user set authentication_string='' where user='root';
quit;

退出后去掉 /etc/my.cnf 里的 skip-grant-tables(如果加了),重启服务,再空密码登录正式改密:

1
ALTER USER 'root'@'localhost' IDENTIFIED BY '{{REDACTED}}';

2.8 开启远程访问

1
2
3
use mysql;
update user set host='%' where user='root';
flush privileges;

现在 Navicat 就可以连了。


3. Windows MSI Installer 安装

Windows 上推荐用 MSI Installer(mysql-installer-community-8.0.40.0.msi),下载:https://dev.mysql.com/downloads/windows/installer/8.0.html

3.1 安装类型选择

MSI Installer 提供 5 种安装类型,新手最常选的是:

  • Server only:只装 MySQL Server(推荐生产用)
  • Custom:自定义勾选组件
  • Developer Default:开发环境全套(带 Workbench、Connector/NET、Examples)

坑点:不要选 “Full”——它会带一堆用不到的 Connector、Excel 插件、Visual Studio Integration。

3.2 关键步骤截图导航

以下步骤与 MSI Installer 8.0.40 的引导顺序一一对应:

  1. Choosing a Setup Type → 选 Server only
  2. Check Requirements → 一路 Next,缺啥装啥
  3. Installation → 点 Execute,等待 30s~2min
  4. Product Configuration → 端口、密码类型、root 密码、Windows 服务名
  5. Apply Configuration → 点 Execute,最后 Finish

端口配置:默认 3306,生产库强烈建议改成非常规端口(如 33060、33306),减少被自动扫描爆破的概率。

密码类型:建议选 Strong Password(8 位以上 + 大小写 + 数字 + 符号)。

Windows 服务名:默认是 MySQL80不要改成 MySQL——避免与系统中可能存在的 MariaDB 冲突。

配置文件位置(关键!很多人找不到):

1
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

C:\ProgramData 是隐藏目录,需要在文件资源管理器开启"显示隐藏的项目"

3.3 用 Navicat 连本机 MySQL

  • 主机:localhost127.0.0.1
  • 端口:3306(或你改的端口)
  • 用户名:root
  • 密码:刚才设置的那个

4. my.cnf / my.ini 关键参数

下面是一份生产环境推荐的精简配置(以 8G 内存 / 4 核服务器为例):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
# 基础
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /usr/local/mysql/mysql.sock
pid-file = /usr/local/mysql/mysqld.pid

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

# 引擎
default-storage-engine = InnoDB
lower_case_table_names = 1

# 连接数
max_connections = 500
max_allowed_packet = 64M
wait_timeout = 28800

# InnoDB 缓冲池(核心:物理内存的 50%~80%)
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT

# 慢查询
slow_query_log = on
long_query_time = 2
log-queries-not-using-indexes = on

进阶建议:生产库不要用默认的 latin1 字符集——中文乱码就是从这里来的。统一 utf8mb4 解决 emoji 表情和部分生僻字。


5. 常见安装问题与排错

5.1 启动报 Unable to lock ./undo_001

1
2
mv undo_001 undo_001.bak
cp -a undo_001.bak undo_001

这是 InnoDB undo 表空间被锁/损坏的经典症状,多发于断电/异常关机后。处理思路是替换文件、强制恢复:

1
2
# /etc/my.cnf
innodb_force_recovery=6

6 个等级的 innodb_force_recovery 含义(数字越大越激进):

含义
1 (SRV_FORCE_IGNORE_CORRUPT)忽略检查到的 corrupt 页
2 (SRV_FORCE_NO_BACKGROUND)阻止主线程的 full purge 操作
3 (SRV_FORCE_NO_TRX_UNDO)不执行事务回滚
4 (SRV_FORCE_NO_IBUF_MERGE)不执行插入缓冲的合并
5 (SRV_FORCE_NO_UNDO_LOG_SCAN)不查看重做日志
6 (SRV_FORCE_NO_LOG_REDO)不执行前滚

从 1 开始试,能起来就行。6 是最后一招——6 能起来意味着数据可能丢失,先 mysqldump 出来再重建。

5.2 ERROR 1130 (HY000): Host 'xxx' is not allowed to connect to this MySQL server

root 默认只能 localhost 登录,远程连不上。两种修法:

1
2
3
4
5
6
7
8
9
-- 修法 1:把 root 改成允许任意 IP(仅测试用)
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED WITH mysql_native_password BY '{{REDACTED}}';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

-- 修法 2(推荐生产):创建一个专门的远程账号
CREATE USER 'app_user'@'10.0.0.%' IDENTIFIED WITH mysql_native_password BY '{{REDACTED}}';
GRANT SELECT, INSERT, UPDATE, DELETE ON your_db.* TO 'app_user'@'10.0.0.%';
FLUSH PRIVILEGES;

5.3 忘了 root 密码

按这个 SOP 找回(前提:你能物理访问服务器):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1. 在 [mysqld] 段加 skip-grant-tables
vim /etc/my.cnf
# 加入:
# [mysqld]
# skip-grant-tables

# 2. 重启服务
systemctl restart mysqld

# 3. 空密码登录
mysql -uroot

# 4. 清空 root 密码
use mysql;
flush privileges;
update user set authentication_string='' where user='root';

# 5. 退出,注释掉 skip-grant-tables,重启
# 6. 重新登录,设置新密码
mysql -uroot
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
ALTER USER 'root'@'%' IDENTIFIED BY '新密码';
FLUSH PRIVILEGES;

5.4 mysql_native_password vs caching_sha2_password

MySQL 8.0 默认认证插件是 caching_sha2_password,但很多老客户端(Navicat 11/12、JDBC 5.x)不支持。连接时报:

1
Authentication plugin 'caching_sha2_password' cannot be loaded

修法:把密码插件降级为 mysql_native_password

1
2
3
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{{REDACTED}}';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '{{REDACTED}}';
FLUSH PRIVILEGES;

这只是兼容性回退方案。新应用应该用 caching_sha2_password——它支持密码轮换、不在网络中明文传密码。


下一步

  • SQL 速查 + EXPLAIN 解读:见《MySQL 实战速查:EXPLAIN 全字段解读 + 经典 SQL 题解》
  • 索引调优案例:见《MySQL 索引优化实战:700 万行表从 3 秒到 50 毫秒》
  • 慢查询与性能调优:见《MySQL 慢查询与性能调优:sysbench + buffer pool》
  • 备份恢复:见《MySQL 备份恢复实战:mysqldump + ibd2sql + binlog2sql》

2024+ 视角:MySQL 8.4 LTS 与 9.x 时代

MySQL 版本节奏的"3+1"变化

从 2023 年起 Oracle 把 MySQL 改为 LTS + Innovation 双轨

轨道节奏适用
LTS(Long Term Support)8.0 → 8.4 → 9.7(每 2 年)生产首选
Innovation8.1 / 8.2 / 8.3 / 8.4 / 9.0…新特性尝鲜,不推荐生产

生产推荐 8.4 LTS(2024-04 GA)—— 至少支持到 2032 年。

MySQL 8.4 LTS 关键变化

  • 默认认证插件仍是 caching_sha2_password——但配套的 mysql_native_password 已完全标记 deprecated
  • information_schema 性能:元数据查询加速 30%
  • JSON 函数增强JSON_TABLE()JSON_VALUE() 标准化
  • 复制改进:基于 WRITESET 的并行回放,多线程复制更稳
  • 资源组(Resource Group) 完善:可按线程绑定 CPU 核

MySQL 9.0(2024-07 GA)核心新特性

  • JavaScript 存储程序:支持在存储过程里写 JS(基于 V8 引擎的 mle 组件)
  • 向量数据类型 内部预览——VECTOR(N) + 距离函数,对标 pgvector
  • Performance Schema 优化:默认启用更多事件监控
  • 隐式 cast 收紧:字符串 ↔ 数字 转换告警更严格——历史项目升级可能踩坑
1
2
3
4
5
6
7
8
9
-- MySQL 9.0 向量(实验)
CREATE TABLE docs (
    id BIGINT PRIMARY KEY,
    content TEXT,
    embedding VECTOR(1536)
);
SELECT id FROM docs
ORDER BY VECTOR_DISTANCE(embedding, VECTOR('[0.1, 0.2, ...]'))
LIMIT 5;

2024+ 安装新选项

  • MySQL Shell (mysqlsh) 取代 mysql 客户端成为官方推荐
    • 支持多语言(Python / JS / SQL)
    • 内置 util.loadDump() / util.dumpInstance() 处理大库备份
  • MySQL Operator for Kubernetes GA——K8s 上生产级 MySQL 部署
  • MySQL InnoDB ClusterSet——多数据中心灾备"开箱可用"

2024+ 配置基线

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# /etc/my.cnf(2024+ 推荐)
[mysqld]
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci    # 8.0+ 默认

# InnoDB(核心)
innodb_buffer_pool_size = 物理内存 * 0.6
innodb_buffer_pool_instances = 8         # 8.0 起允许更多
innodb_redo_log_capacity = 8G            # 8.0.30+ 新参数(替代 innodb_log_file_size)

# 复制
binlog_transaction_dependency_tracking = WRITESET
binlog_transaction_dependency_history_size = 10000

# 安全
default_authentication_plugin = caching_sha2_password

2024+ 的"坑"演进

  • caching_sha2_password 不再是坑:8.4 起所有官方驱动、ORM(Hibernate 6+ / MyBatis 3.5+)原生支持,老客户端升级即可
  • 8.0 → 8.4 升级:字典结构变了,必须 mysql_upgrade + 两次重启
  • 8.4 → 9.0 升级:引入 JavaScript 存储程序的库需重新编译;隐式 cast 收紧可能让旧 SQL 抛 warning

2024+ 选型决策

1
2
3
4
5
6
7
8
9
新项目选 MySQL 什么版本?
├── 保守(金融、政府)     → 8.4 LTS(至少 2032 支持)
├── 互联网(云原生)       → 8.4 LTS + MySQL Operator
├── 想用向量 / JS 存储程序 → 9.0(实验心态)
└── 已有 5.7 / 8.0 项目    → 升 8.4 LTS(路径清晰)

数据库国产化替代?
├── MySQL 业务系统         → TiDB / OceanBase / KES (DB_MODE=mysql)
└── 重点考虑兼容度 + 性能   → TiDB 8.x 兼容度最高(95%+)
使用 Hugo 构建
主题 StackJimmy 设计