首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Linux 下 MySQL 三種安裝方式深度對比:RPM、二進位、源碼編譯優缺點與選型指南

     編輯:MySQL 資料庫相關知識

三大安裝方式核心差異總覽

維度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/etcmy.cnf 搜尋目錄
MYSQL_TCP_PORT3306預設埠
MYSQL_UNIX_ADDR/data/mysql/run/mysql.sockSocket 路徑
DEFAULT_CHARSETutf8mb4預設字符集
DEFAULT_COLLATIONutf8mb4_unicode_ci預設校對規則
WITH_SSLsystem使用系統 OpenSSL (FIPS 合規)
WITH_ZLIBsystem系統 zlib
WITH_ZSTDsystem系統 zstd (壓縮更快)
WITH_LZ4system系統 lz4
WITH_JEMALLOCsystemjemalloc 記憶體分配器 (減少碎片)
WITH_NUMAONNUMA 感知分配 (多插槽伺服器必開)
ENABLED_LOCAL_INFILEOFF安全:禁用 LOAD DATA LOCAL
ENABLE_DOWNLOADSOFF離線編譯、供應鏈安全
CMAKE_BUILD_TYPERelWithDebInfoRelease 優化 + 除錯符號
CMAKE_C_FLAGS_RELWITHDEBINFO-O3 -march=native -mtune=native -fltoCPU 原生優化 + LTO (鏈接時優化)
CMAKE_CXX_FLAGS_RELWITHDEBINFO-O3 -march=native -mtune=native -flto同上
COMPILATION_COMMENTCustom Build for Production版本註釋 (SHOW VARIABLES LIKE 'version_comment')
DWITH_DEBUGOFF生產環境關閉
DWITH_ASANOFFAddressSanitizer (僅測試環境)
WITH_UNIT_TESTSOFF關閉單元測試編譯

編譯與安裝流程

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` 或邏輯遷移
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved