MySQL 什么意思:是什么软件、能做什么、版本怎么选
MySQL 是一款开源的关系型数据库管理系统:数据按表的行和列存放,应用程序用 SQL 语句增删改查。网站的文章和用户、IDC 财务系统的订单和账单、管理平台的配置,大多存在 MySQL 或与它兼容的 MariaDB 里。新部署选 8.4 LTS;5.7 和 8.0 都已结束官方支持。
MySQL 什么意思?MySQL 是一款开源的关系型数据库管理系统(RDBMS),1995 年由瑞典的 MySQL AB 公司发布,2008 年 MySQL AB 被 Sun 收购,2010 年随 Sun 一起归入 Oracle。名字里的 My 是创始人之一 Monty Widenius 女儿的名字,SQL 是它使用的查询语言。在服务器上,它是一个常驻后台的服务程序(mysqld),网站程序、财务系统、管理平台通过 3306 端口连上来,用 SQL 语句把用户、订单、配置这些结构化数据存进去、查出来。和它同源的 MariaDB、Percona Server 可以看作它的“兄弟版本”,用法基本一致。
MySQL 是什么软件:服务端、客户端和数据文件
装好 MySQL 之后,服务器上会多出这些东西:
| 组成部分 | 是什么 | 在哪里、怎么用 |
|---|---|---|
| mysqld | 服务端进程,常驻后台,负责存数据和执行 SQL | 服务名:RHEL、Rocky 系是 mysqld,Debian、Ubuntu 是 mysql |
| mysql | 命令行客户端 | mysql -u root -p 登录后输入 SQL |
| mysqldump、mysqladmin | 逻辑备份工具、管理工具 | 导出 SQL 文件、查看状态、修改密码 |
| 配置文件 | 内存、连接数、字符集、日志等参数 | RHEL 系 /etc/my.cnf;Ubuntu /etc/mysql/mysql.conf.d/mysqld.cnf |
| 数据目录 | 表数据、索引、事务日志、二进制日志 | 默认 /var/lib/mysql |
| 存储引擎 | 决定数据在磁盘上怎么组织 | 5.5 起默认 InnoDB,支持事务、行级锁和崩溃恢复;老的 MyISAM 不支持事务 |
| 端口 | 应用连接数据库的入口 | TCP 3306;8.0 起 X 协议 33060 |
在 Ubuntu 上装一个看看:
sudo apt install -y mysql-server
mysql --version # 客户端版本
sudo systemctl status mysql --no-pager
sudo mysql # Ubuntu 上 root 默认用 auth_socket 认证,系统 root 身份即可登录
SELECT VERSION(); -- 服务端版本
SHOW DATABASES; -- 有哪些库
SHOW ENGINES; -- 支持的存储引擎,InnoDB 一行的 Support 为 DEFAULT
RHEL、Rocky、AlmaLinux 上用 dnf install mysql-server 安装,再 systemctl enable --now mysqld 启动。发行版软件源给的是哪个大版本取决于系统版本,例如 Ubuntu 24.04 软件源里是 8.0;要装指定的 LTS 版本,用 MySQL 官方的 APT 或 Yum 仓库。用 Oracle 官方仓库装的社区版,初始 root 密码写在日志里:grep 'temporary password' /var/log/mysqld.log。
MySQL 和 SQL 的区别:一个是软件,一个是语言
“关系型”指数据存放在一张张二维表里,表与表之间用键关联。以 IDC 业务为例:客户表存客户,服务器表存服务器,服务器表里用 customer_id 指向它属于哪个客户。查“每个客户租了几台服务器”,就是把两张表按这个键连起来统计。
CREATE DATABASE idc DEFAULT CHARACTER SET utf8mb4;
USE idc;
CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL
);
CREATE TABLE servers (
id INT PRIMARY KEY AUTO_INCREMENT,
hostname VARCHAR(64) NOT NULL,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
INSERT INTO customers (name) VALUES ('客户甲'), ('客户乙');
INSERT INTO servers (hostname, customer_id) VALUES ('hk-01', 1), ('hk-02', 1), ('us-01', 2);
-- 每个客户租了几台服务器
SELECT c.name, COUNT(s.id) AS servers
FROM customers c LEFT JOIN servers s ON s.customer_id = c.id
GROUP BY c.id;
这里的 CREATE TABLE、INSERT、SELECT … JOIN … GROUP BY 就是 SQL(Structured Query Language,结构化查询语言)。SQL 是一门语言,有 ISO/IEC 9075 国际标准;MySQL 是执行这门语言的软件。说“MySQL 和 SQL 的区别”,相当于问“浏览器和 HTML 的区别”。
| 名称 | 是什么 | 说明 |
|---|---|---|
| SQL | 查询语言 | 各家数据库都支持,核心语法相同 |
| MySQL | Oracle 公司的开源数据库软件 | 有自己的扩展语法,如 AUTO_INCREMENT、LIMIT、反引号包裹的表名 |
| SQL Server | 微软的数据库软件 | 名字里带 SQL,但和 MySQL 是两款产品;自增写 IDENTITY,取前几行写 TOP |
| PostgreSQL、Oracle Database、SQLite | 其他关系型数据库 | 同样用 SQL,方言各有差异 |
所以一条 SQL 在 MySQL 上能跑,搬到 SQL Server 上不一定能跑,迁移数据库时要逐条核对方言差异。
关系型数据库适合财务、订单这类数据,还因为它支持事务:一组操作要么全部成功,要么全部撤销。例如客户用余额支付一张账单,扣余额和把账单标为已付必须同时完成:
START TRANSACTION;
UPDATE accounts SET balance = balance - 300 WHERE customer_id = 1;
UPDATE invoices SET status = 'paid' WHERE id = 1024;
COMMIT; -- 中途出错就执行 ROLLBACK,两条修改都不生效
MySQL 有什么用:典型使用场景
| 场景 | MySQL 里存什么 | 常见例子 |
|---|---|---|
| 网站与内容管理 | 文章、用户、评论、站点设置 | WordPress 等 PHP 程序,LNMP、LAMP 里的 M 就是 MySQL |
| 电商与业务系统 | 商品、订单、库存、支付流水 | 下单扣库存要用事务保证一致 |
| IDC 财务与业务系统 | 客户、产品、订单、账单、工单 | WHMCS 使用 MySQL(支持的版本以其系统要求为准),魔方财务等国内系统同样跑在 MySQL 上 |
| 管理与监控平台 | 配置、资产台账、告警记录、历史数据 | Zabbix 支持 MySQL 作为后端数据库 |
| 应用程序后台 | 账号、权限、业务数据 | Java、PHP、Python、Go 的主流框架都直接支持 |
它不擅长的事情也要知道:对上亿行数据做多维统计分析,交给 ClickHouse 这类分析型数据库更合适;全文检索用 Elasticsearch;高频读取的热点数据放 Redis 缓存;图片、附件这类文件放磁盘或对象存储,数据库里只存路径。
MySQL、MariaDB、Percona 有什么区别
| 对比项 | MySQL | MariaDB | Percona Server for MySQL |
|---|---|---|---|
| 维护方 | Oracle | MariaDB 基金会与 MariaDB 公司 | Percona 公司 |
| 来历 | 1995 年 MySQL AB 发布 | 2009 年 MySQL 创始人 Monty 在 Oracle 收购 Sun 前后从 MySQL 分叉 | 基于 MySQL 源码的增强版 |
| 版本号 | 5.7、8.0、8.4、9.x | 10.x、11.x 等,和 MySQL 的版本号没有对应关系 | 跟随 MySQL,如 8.0、8.4 |
| 许可证 | 社区版 GPLv2,另有商业企业版 | GPLv2 | GPLv2 |
| 兼容性 | — | 5.5、5.6 时代几乎可以直接替换;MySQL 8.0 以后逐渐分化 | 可以直接替换同版本的 MySQL |
| 常见在哪 | Ubuntu 软件源、Oracle 官方仓库、各云数据库 | Debian 的默认 MySQL 实现,CentOS 7 自带 MariaDB 5.5 | 自建数据库、需要更多监控和诊断信息的环境 |
MariaDB 和 MySQL 分化后,迁移时最常碰到这几处差异:
- 排序规则:MySQL 8.0 默认的
utf8mb4_0900_ai_ci在较老的 MariaDB 里不存在,把 MySQL 8 导出的 SQL 导入这类 MariaDB 时报Unknown collation,需要先把排序规则替换成utf8mb4_unicode_ci等双方都支持的。 - 认证插件:MySQL 8 默认的
caching_sha2_password在 MariaDB 服务端没有对应插件,账号迁过去要改用 MariaDB 支持的认证方式重新设置密码。 - JSON 和复制:MariaDB 的 JSON 类型实际按 LONGTEXT 存储,GTID 格式也和 MySQL 不同,两者之间做主从复制限制很多。
Percona Server 的定位是“增强版 MySQL”:在社区版基础上加入线程池、审计日志和更多诊断信息,同一家公司的 XtraBackup 可以对运行中的 MySQL 做物理热备份。另外,国内的 TiDB、OceanBase 等分布式数据库也兼容 MySQL 协议,应用程序通常可以用 MySQL 驱动直接连接。
MySQL 版本怎么选:5.7、8.0、8.4 LTS 对照
从 2023 年起,Oracle 把 MySQL 的版本分成两条线:**LTS(长期支持版)**只修复缺陷和安全问题,适合生产;**创新版(Innovation)**大约每季度发布一个,带来新特性,只支持到下一个创新版发布为止。8.4 是第一个 LTS,之后的 9.x 以创新版为主,下一个 LTS 的版本号和发布时间以 Oracle 公告为准。
| 版本 | 发布时间 | 支持状态 | 主要特点 | 建议 |
|---|---|---|---|---|
| 5.7 | 2015 年 10 月正式发布 | 2023 年 10 月结束支持 | 老 PHP 程序常要求的版本 | 不新装,存量逐步升级 |
| 8.0 | 2018 年 4 月正式发布 | 2026 年 4 月结束支持 | 默认 utf8mb4 字符集、caching_sha2_password 认证、窗口函数与 CTE,移除查询缓存 |
不新装,存量规划升到 8.4 |
| 8.4 LTS | 2024 年 4 月 | 长期支持,按 Oracle 公布的政策为 5 年标准支持加 3 年延长支持 | 默认不加载 mysql_native_password;移除 CHANGE MASTER TO、START SLAVE 等旧式复制语句,改用 CHANGE REPLICATION SOURCE TO、START REPLICA |
新部署选它 |
| 9.x 中的创新版 | 2024 年 7 月起陆续发布 | 只支持到下一个创新版 | 新特性先在这里出现 | 用于测试,不建议放生产 |
各版本的确切支持日期以 Oracle 的生命周期文档为准。选版本时还有一个硬约束:应用程序支持哪个版本。例如魔方财务的安装要求写的是 MySQL 5.6,这类只支持老版本的系统,应单独放一台服务器、数据库端口只对本机开放,而不是让整台服务器跟着停在老版本上。
从老版本升级要按顺序走,不能跳过:5.7 → 8.0 → 8.4。8.4 不支持直接从 5.7 原地升级,而且升级后都不能原地降级,升级前务必做完整备份。几个高频的坑:
# 升级前用 MySQL Shell 的检查工具扫一遍,列出不兼容的对象和配置
mysqlsh -- util checkForServerUpgrade root@localhost:3306 --target-version=8.4.0
- 8.0 升 8.4 后旧账号登录失败,报
Plugin 'mysql_native_password' is not loaded:这些账号还在用旧认证插件。逐个改成新插件ALTER USER 'app'@'10.0.0.%' IDENTIFIED WITH caching_sha2_password BY '新密码';,过渡期也可以在配置文件的[mysqld]段加mysql_native_password=ON临时启用。 - 老程序连 8.0 报
The server requested authentication method unknown to the client:客户端驱动太老,不认识caching_sha2_password,升级驱动或 PHP 版本。 - 报
this is incompatible with sql_mode=only_full_group_by:5.7 起默认开启的 ONLY_FULL_GROUP_BY 不允许 SELECT 里出现既没分组、也没聚合的列,修改 SQL,或按程序文档调整sql_mode。
服务器上的 MySQL 需要多少资源
MySQL 吃得最多的是内存和磁盘 IO。内存里最大的一块是 InnoDB 缓冲池(innodb_buffer_pool_size),热数据和索引都缓存在这里,默认只有 128 MB。专用的数据库服务器一般设为内存的 50%–75%;8.0 打开 innodb_dedicated_server=ON 后会自动设置:内存不足 1 GB 时 128 MB,1–4 GB 时取一半,超过 4 GB 时取 75%。
| 场景 | CPU | 内存 | innodb_buffer_pool_size | 磁盘 |
|---|---|---|---|---|
| 个人网站、测试环境 | 1–2 核 | 1–2 GB(与网站程序共用) | 256–512 MB | SSD |
| 中小网站、IDC 财务系统 | 2–4 核 | 4–8 GB | 2–4 GB | SSD,备份放另一块盘或另一台机器 |
| 独立数据库服务器 | 8 核以上 | 32 GB 以上 | 内存的 60%–75% | NVMe SSD,RAID 1 或 RAID 10 |
上表是经验起点,按实际数据量和并发调整。几个估算依据:
- 连接数:
max_connections默认 151。每个连接在执行排序、连接查询时会额外分配缓冲区,高峰时按每连接几 MB 估算,例如 300 个连接按 4 MB 算约 1.2 GB,要和缓冲池一起算进总内存。 - 小内存机器:1 GB 内存的 VPS 同时跑网站和 MySQL 8 容易内存紧张,可以把缓冲池调小,并在配置里加
performance_schema=OFF省下一部分内存,代价是少了性能诊断数据。 - 磁盘:除了数据本身,8.0 起二进制日志默认开启、默认保留 30 天,写入频繁的库,二进制日志可能比数据还大;备份文件也要留空间。
装好之后用这几条 SQL 看实际情况:
-- 每个库占用多少空间(MB)
SELECT table_schema, ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) AS size_mb
FROM information_schema.tables GROUP BY table_schema ORDER BY size_mb DESC;
-- 运行以来的最大并发连接数,对照 max_connections
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
-- 缓冲池未命中:Innodb_buffer_pool_reads 占 read_requests 的比例越低越好,持续偏高说明缓冲池不够
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
对应的基础配置示例(数据库和网站在同一台 8 GB 内存的服务器上):
[mysqld]
innodb_buffer_pool_size = 4G
max_connections = 300
binlog_expire_logs_seconds = 604800 # 二进制日志保留 7 天
bind-address = 127.0.0.1 # 只允许本机连接
IDC 业务系统里的 MySQL:账本要备份、端口不外露
对 IDC 服务商来说,最重要的那个 MySQL 往往是财务和业务系统的数据库:客户、订单、账单、续费记录都在里面,丢了就等于丢了应收账款。WHMCS、魔方财务这类系统跑在 MySQL 上,日常至少做到三点:
- 每天备份,并复制到另一台机器。 InnoDB 表用
--single-transaction可以在不锁表的情况下导出一致的快照,放进 crontab 每天凌晨执行:
mysqldump --single-transaction --routines --triggers --databases whmcs \
| gzip > /backup/whmcs-$(date +%F).sql.gz
- 定期演练恢复。 每季度挑一份备份导入测试库,确认能完整恢复、程序能正常打开。
- 3306 不对公网开放。 数据库账号的来源限定为应用服务器的 IP,管理时走 SSH 隧道。
财务系统怎么选型、和机房管理系统怎么分工,可以参考 IDC 财务系统 一文。已经用 WHMCS 销售服务器的,Toplink DCIM 提供 WHMCS 对接模块:账单和客户数据继续留在 WHMCS 的数据库里,付款后的分配服务器、装系统、回填 IP 由 DCIM 自动完成。
常见问题
MySQL 免费吗?可以商用吗?
社区版以 GPLv2 许可证发布,免费下载使用,用在自己的网站和内部系统里不需要付费。Oracle 另外销售企业版,附带企业级备份、审计等组件和官方支持。如果要把 MySQL 打包进自己的闭源软件一起分发给客户,GPL 的义务更复杂,需要评估是否购买商业许可。
MySQL 默认端口是多少?要不要对外开放?
默认 TCP 3306,8.0 起 X 协议另用 33060。数据库一般只给本机或内网的应用服务器访问,不要对公网开放 3306;确实需要远程管理时走 SSH 隧道或 VPN,账号的允许来源写具体 IP,不要写成 %。
MySQL 和 Redis、MongoDB 是什么关系?
它们是不同类型的数据库,经常搭配使用。MySQL 是关系型数据库,保存订单、账户这类要求事务和一致性的核心数据;Redis 是内存键值数据库,多用来做缓存、会话和计数器;MongoDB 是文档数据库,适合字段经常变化的数据。