三大安裝方式核心差異總覽
| 維度 | RPM/YUM/DNF | 官方二進位 Tarball | 源碼編譯 (CMake) |
| 安裝難度 | ⭐ 極簡 (一鍵) | ⭐⭐ 簡單 (解壓+初始化) | ⭐⭐⭐⭐ 複雜 (依賴、編譯、參數調優) |
| 部署速度 | 秒級 | 分鐘級 | 10-60 分鐘 (視 CPU 核心數) |
| 版本靈活性 | 受限於發行源 (通常舊版) | 官網所有 GA 版本可選 | 任意版本、任意提交、自訂 Patch |
| 安裝路徑 | 固定 (/usr、/var、/etc) | 可自訂 (解壓目錄即安裝根) | 完全可控 (CMAKE_INSTALL_PREFIX) |
| 多實例支援 | 困難 (需手動構建實例目錄) | 原生支援 (不同目錄、不同 my.cnf、不同 port) | 原生支援 |
| 效能優化 | 通用編譯 (保守優化) | 官方優化 (x86-64、SSE4.2、PGO) | 極致優化 (CPU 微架構、LTO、PGO、精簡模組) |
| 安全合規 | 簽名驗證、CVE 修補回滾 | 官方 GPG 簽名、SHA256 校驗 | 需自行管理編譯環境供應鏈安全 |
| 升級維護 | dnf update 一鍵 | 替換二進位、重啟、mysql_upgrade | 重新編譯、替換、重啟、mysql_upgrade |
| 除錯/開發 | 無除錯符號、難以剖析 | 可下載 debug 套件 | 完整除錯符號、Sanitizer、自訂斷言 |
| 適用場景 | 標準化運維、合規要求、快速交付 | 生產標準、多版本並行、容器基礎鏡像 | 極致效能、特殊硬體、內核/儲存引擎研發 |
方式一:RPM/YUM/DNF (企業級標準化首選)
官方 YUM 源配置 (MySQL 8.0)
# 1. 安裝官方源 RPM
rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-5.noarch.rpm # EL7
rpm -Uvh https://repo.mysql.com/mysql80-community-release-el8-5.noarch.rpm # EL8
rpm -Uvh https://repo.mysql.com/mysql80-community-release-el9-5.noarch.rpm # EL9
# 2. 查看可用版本
dnf module list mysql
# 或
yum --showduplicates list mysql-community-server
# 3. 安裝指定版本 (如 8.0.36)
dnf install -y mysql-community-server-8.0.36-1.el9
# 4. 啟動與安全初始化
systemctl enable --now mysqld
# 臨時密碼在 /var/log/mysqld.log
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation
MariaDB 替代 (RHEL 內建、完全相容)
# RHEL 9 預設模組
dnf module install -y mariadb:10.5/server
# 或官方源 (更新更快)
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash
dnf install -y MariaDB-server MariaDB-client
RPM 多實例部署技巧
# 1. 建立實例目錄結構
mkdir -p /data/mysql_{3306,3307}/{data,logs,tmp,run}
chown -R mysql:mysql /data/mysql_*
# 2. 產生獨立 my.cnf
cat > /etc/my_3306.cnf <<'EOF'
[mysqld]
basedir=/usr
datadir=/data/mysql_3306/data
socket=/data/mysql_3306/run/mysql.sock
port=3306
pid-file=/data/mysql_3306/run/mysqld.pid
log-error=/data/mysql_3306/logs/error.log
tmpdir=/data/mysql_3306/tmp
# ... 其他參數
EOF
# 3. 初始化各實例
mysqld --defaults-file=/etc/my_3306.cnf --initialize-insecure --user=mysql
mysqld --defaults-file=/etc/my_3307.cnf --initialize-insecure --user=mysql
# 4. Systemd 服務模板化 (/etc/systemd/system/mysqld@.service)
[Unit]
Description=MySQL Server %i
After=network.target
[Service]
Type=notify
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/my_%i.cnf
LimitNOFILE=65535
Restart=on-failure
[Install]
WantedBy=multi-user.target
# 5. 啟動
systemctl enable --now mysqld@3306 mysqld@3307
方式二:官方二進位 Tarball (生產標準、容器化首選)
標準化部署流程
# 1. 下載並校驗
VERSION=8.0.36
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-${VERSION}-linux-glibc2.28-x86_64.tar.xz
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-${VERSION}-linux-glibc2.28-x86_64.tar.xz.asc
gpg --verify mysql-${VERSION}-linux-glibc2.28-x86_64.tar.xz.asc
# 2. 解壓至標準路徑
tar -Jxf mysql-${VERSION}-linux-glibc2.28-x86_64.tar.xz -C /opt/
ln -sf /opt/mysql-${VERSION}-linux-glibc2.28-x86_64 /opt/mysql
# 3. 建立 mysql 使用者 (無登入殼層)
groupadd -r mysql
useradd -r -g mysql -s /sbin/nologin -d /opt/mysql -M mysql
# 4. 目錄結構與權限
mkdir -p /data/mysql/{data,logs,tmp,run}
chown -R mysql:mysql /data/mysql /opt/mysql-${VERSION}*
# 5. 初始化資料目錄
/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql
# 6. Systemd 服務 (/etc/systemd/system/mysqld.service)
[Unit]
Description=MySQL Community Server
After=network.target
[Service]
Type=notify
User=mysql
Group=mysql
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65535
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
# 7. 啟動
systemctl daemon-reload
systemctl enable --now mysqld
Docker 基礎鏡像構建 (多階段構建)
# Dockerfile
FROM oraclelinux:8 AS builder
ARG MYSQL_VERSION=8.0.36
RUN dnf install -y xz gnupg2 && \
curl -fSL "https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-${MYSQL_VERSION}-linux-glibc2.28-x86_64.tar.xz" -o /tmp/mysql.tar.xz && \
curl -fSL "https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-${MYSQL_VERSION}-linux-glibc2.28-x86_64.tar.xz.asc" -o /tmp/mysql.tar.xz.asc && \
gpg --verify /tmp/mysql.tar.xz.asc /tmp/mysql.tar.xz && \
tar -Jxf /tmp/mysql.tar.xz -C /opt/ && \
ln -sf /opt/mysql-${MYSQL_VERSION}-linux-glibc2.28-x86_64 /opt/mysql
FROM oraclelinux:8
COPY --from=builder /opt/mysql /opt/mysql
RUN groupadd -r mysql && useradd -r -g mysql -s /sbin/nologin mysql && \
mkdir -p /data/mysql/{data,logs,tmp,run} && chown -R mysql:mysql /data/mysql /opt/mysql
VOLUME /data/mysql
EXPOSE 3306 33060
USER mysql
ENTRYPOINT ["/opt/mysql/bin/mysqld"]
方式三:源碼編譯 (極致效能、特殊需求)
編譯前置依賴 (RHEL 9 / Ubuntu 22.04)
# RHEL/Rocky/Alma
dnf install -y cmake gcc gcc-c++ make ncurses-devel libaio-devel \
openssl-devel libtirpc-devel rpcgen bison flex \
zlib-devel zstd-devel lz4-devel snappy-devel \
jemalloc-devel numactl-devel hwloc-devel \
boost-devel protobuf-devel rapidjson-devel
# Ubuntu/Debian
apt install -y cmake g++ make libncurses5-dev libaio-dev \
libssl-dev libtirpc-dev rpcbind bison flex \
zlib1g-dev libzstd-dev liblz4-dev libsnappy-dev \
libjemalloc-dev libnuma-dev libhwloc-dev \
libboost-all-dev libprotobuf-dev rapidjson-dev
核心 CMake 參數解析
| 參數 | 推薦值 | 說明 |
| CMAKE_INSTALL_PREFIX | /opt/mysql-8.0.36 | 安裝根目錄 |
| MYSQL_DATADIR | /data/mysql/data | 資料目錄 (可被 my.cnf 覆蓋) |
| SYSCONFDIR | /etc | my.cnf 搜尋目錄 |
| MYSQL_TCP_PORT | 3306 | 預設埠 |
| MYSQL_UNIX_ADDR | /data/mysql/run/mysql.sock | Socket 路徑 |
| DEFAULT_CHARSET | utf8mb4 | 預設字符集 |
| DEFAULT_COLLATION | utf8mb4_unicode_ci | 預設校對規則 |
| WITH_SSL | system | 使用系統 OpenSSL (FIPS 合規) |
| WITH_ZLIB | system | 系統 zlib |
| WITH_ZSTD | system | 系統 zstd (壓縮更快) |
| WITH_LZ4 | system | 系統 lz4 |
| WITH_JEMALLOC | system | jemalloc 記憶體分配器 (減少碎片) |
| WITH_NUMA | ON | NUMA 感知分配 (多插槽伺服器必開) |
| ENABLED_LOCAL_INFILE | OFF | 安全:禁用 LOAD DATA LOCAL |
| ENABLE_DOWNLOADS | OFF | 離線編譯、供應鏈安全 |
| CMAKE_BUILD_TYPE | RelWithDebInfo | Release 優化 + 除錯符號 |
| CMAKE_C_FLAGS_RELWITHDEBINFO | -O3 -march=native -mtune=native -flto | CPU 原生優化 + LTO (鏈接時優化) |
| CMAKE_CXX_FLAGS_RELWITHDEBINFO | -O3 -march=native -mtune=native -flto | 同上 |
| COMPILATION_COMMENT | Custom Build for Production | 版本註釋 (SHOW VARIABLES LIKE 'version_comment') |
| DWITH_DEBUG | OFF | 生產環境關閉 |
| DWITH_ASAN | OFF | AddressSanitizer (僅測試環境) |
| WITH_UNIT_TESTS | OFF | 關閉單元測試編譯 |
編譯與安裝流程
cd /usr/src
git clone --branch 8.0.36 --depth 1 https://github.com/mysql/mysql-server.git
cd mysql-server
mkdir build && cd build
cmake .. $(cat ../cmake_options.txt) # 將上表參數存檔
make -j$(nproc) # 並行編譯
make install
# 安裝後處理
strip /opt/mysql-8.0.36/bin/* /opt/mysql-8.0.36/lib/plugin/*.so # 去除除錯符號減小體積
/opt/mysql-8.0.36/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql
Profile-Guided Optimization (PGO) 兩階段編譯 (效能再提升 3-8%)
# 階段 1: 儀器化編譯
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-fprofile-generate" -DCMAKE_CXX_FLAGS="-fprofile-generate"
make -j$(nproc)
# 執行代表性負載 (sysbench 運行 10 分鐘)
/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql
sysbench oltp_read_write --mysql-db=test --threads=64 --time=600 run
# 階段 2: 使用分析數據優化編譯
make clean
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-fprofile-use" -DCMAKE_CXX_FLAGS="-fprofile-use"
make -j$(nproc)
make install
選型決策流程圖
是否有專業編譯/運維團隊?
├─ 否 → 直接用官方 RPM/YUM 或二進位 Tarball (推薦 RPM 便於合規審計)
└─ 是 → 是否追求極致效能 (Top 1% 量級、特殊硬體)?
├─ 否 → 二進位 Tarball (標準化、可控、容器友善)
└─ 是 → 源碼編譯 + PGO + CPU 原生優化 + 精簡模組
└─ 是否需 FIPS/國產化合規?
├─ 是 → 指定 WITH_SSL=system (OpenSSL 3 FIPS)、國產編譯器 (龍芯/麒麟)
└─ 否 → 標準 GCC/Clang 工具鏈即可
遷移與共存策略
- RPM → Tarball:`rpm -e --nodeps mysql-community-server` 移除套件,保留 `/var/lib/mysql` 資料,部署 Tarball 指向同一 `datadir`
- 多版本並行:不同目錄 `/opt/mysql-5.7`、`/opt/mysql-8.0`,不同 `datadir`、不同 `port`、不同 `systemd` 服務名
- 資料目錄共享:嚴禁**不同大版本共用同一 `datadir` (5.7 ↔ 8.0 不相容),需 `mysql_upgrade` 或邏輯遷移