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 是文件資料庫,適合欄位經常變化的資料。