伺服器維運

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