服务器运维

MySQL 什么意思:是什么软件、能做什么、版本怎么选

MySQL 是一款开源的关系型数据库管理系统:数据按表的行和列存放,应用程序用 SQL 语句增删改查。网站的文章和用户、IDC 财务系统的订单和账单、管理平台的配置,大多存在 MySQL 或与它兼容的 MariaDB 里。新部署选 8.4 LTS;5.7 和 8.0 都已结束官方支持。

作者 顶联产品团队发布于 7 分钟阅读

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 上,日常至少做到三点:

  1. 每天备份,并复制到另一台机器。 InnoDB 表用 --single-transaction 可以在不锁表的情况下导出一致的快照,放进 crontab 每天凌晨执行:
mysqldump --single-transaction --routines --triggers --databases whmcs \
  | gzip > /backup/whmcs-$(date +%F).sql.gz
  1. 定期演练恢复。 每季度挑一份备份导入测试库,确认能完整恢复、程序能正常打开。
  2. 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 是文档数据库,适合字段经常变化的数据。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88