二進制安裝 MySQL 8.0
在生產或測試環境中,我們常常希望避免包管理器帶來的依賴和交互問題,尤其是當系統自帶版本過舊或安裝過程頻繁彈窗時。此時,使用 MySQL 官方提供的二進制壓縮包(Generic Linux Binary) 進行安裝,是一種高度可控、跨平臺兼容、無交互、可定制化強的解決方案。
本文將詳細介紹如何在任意主流 Linux 系統(如 Ubuntu、CentOS、Debian、Red Hat 等)上,通過 二進制方式靜默安裝 MySQL 8.0,并將數據目錄指定為 /data/mysql
,適用于需要高性能、獨立部署或自動化腳本集成的場景。
一、為什么選擇二進制安裝?
優勢 | 說明 |
---|---|
完全可控,避免包管理副作用 | 繞過 apt/yum/dnf 的依賴解析與自動配置,避免因系統庫版本沖突導致安裝失敗或配置被覆蓋。 |
高度可移植,跨 Linux 發行版運行 | 使用官方預編譯的 x86_64 通用二進制包,可在 CentOS、Ubuntu、Debian、Red Hat 等任意主流發行版上一致部署,環境一致性更強。 |
目錄結構完全自定義 | 安裝路徑(basedir )、數據目錄(datadir )、日志、socket 文件等均可自由指定,滿足企業級部署規范(如 /data/mysql 存放數據)。 |
實例獨立,便于遷移與災備 | MySQL 實例完全獨立于系統包管理器,可整體打包遷移至其他服務器,適合容器化、離線部署或快速恢復場景。 |
適合自動化與標準化交付 | 無需處理交互式配置,可通過 Shell 腳本、Ansible、Packer 等工具實現無人值守部署,適用于 CI/CD 流水線和規模化運維。 |
二、 環境準備
-
操作系統:任意 Linux 發行版(Ubuntu 18.04+/CentOS 7+/Debian 10+ 等)
-
- 架構:x86_64
指常見的 64 位服務器 CPU 架構,無論是 Intel 還是 AMD 生產的現代服務器都支持。 ? 不支持 ARM 架構(如華為鯤鵬、AWS Graviton、Mac M1/M2)。 驗證方法:運行
uname -m
,如果顯示x86_64
則符合要求。 -
內存:建議 ≥ 2GB
-
磁盤:確保
/data
分區有足夠空間 -
用戶權限:具備
root
或sudo
權限
三、安裝步驟
1. 下載 MySQL 8.0 二進制包
前往 MySQL 官方下載頁 或使用以下命令下載通用二進制包:
cd /tmp
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz
🔗 包名說明:
mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz
這是官方為 Linux 系統編譯的通用二進制版本,適用于大多數現代發行版。
2. 創建安裝目錄并解壓
我們將 MySQL 安裝到 /usr/local/mysql
,數據目錄設為 /data/mysql
。
# 創建安裝目錄
sudo mkdir -p /usr/local/mysql# 解壓到臨時目錄并移動
sudo tar -xJf mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz -C /tmp/
sudo mv /tmp/mysql-8.0.36-linux-glibc2.12-x86_64/* /usr/local/mysql/
3. 創建 MySQL 用戶和組
為安全起見,MySQL 應以專用用戶運行:
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql# 設置安裝目錄權限
sudo chown -R mysql:mysql /usr/local/mysql
4. 創建數據目錄(關鍵:使用 /data/mysql
)
sudo mkdir -p /data/mysql
sudo chown -R mysql:mysql /data/mysql
💡 將數據目錄放在
/data
下,便于獨立掛載大容量磁盤,提升 I/O 性能。
5. 初始化數據庫
執行初始化命令,生成系統數據庫和臨時 root 密碼:
cd /usr/local/mysqlsudo bin/mysqld --initialize \--user=mysql \--basedir=/usr/local/mysql \--datadir=/data/mysql
? 成功后會輸出:
[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: jj?-kM:A6xLw
?? 請務必記錄此臨時密碼! 后續首次登錄需要使用。
6. 生成 SSL/RSA 證書(推薦)
sudo bin/mysql_ssl_rsa_setup \--basedir=/usr/local/mysql \--datadir=/data/mysql
7. 創建配置文件 /etc/my.cnf
sudo tee /etc/my.cnf > /dev/null << 'EOF'
[mysqld]
# 基本路徑
basedir = /usr/local/mysql
datadir = /data/mysql
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
log-error = /var/log/mysql/error.log# 網絡配置
port = 3306
bind-address = 0.0.0.0# InnoDB 設置(可選優化)
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M[client]
socket = /var/run/mysqld/mysqld.sock[mysql]
socket = /var/run/mysqld/mysqld.sock
EOF
創建日志目錄:
sudo mkdir -p /var/log/mysql
sudo chown -R mysql:mysql /var/log/mysql
# 創建目錄
sudo mkdir -p /var/run/mysqld
創建 socket 目錄并設置權限
# 創建目錄
sudo mkdir -p /var/run/mysqld# 設置屬主為 mysql 用戶
sudo chown mysql:mysql /var/run/mysqld# 設置權限(關鍵)
sudo chmod 755 /var/run/mysqld
8. 創建 systemd 服務文件
sudo tee /etc/systemd/system/mysql.service > /dev/null << 'EOF'
[Unit]
Description=MySQL Server
After=network.target[Service]
RuntimeDirectory=mysqld
RuntimeDirectoryMode=0755
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
Restart=on-failure
LimitNOFILE=65535[Install]
WantedBy=multi-user.target
EOF
9. 啟動 MySQL 服務
# 重載 systemd 配置
sudo systemctl daemon-reexec
sudo systemctl daemon-reload# 啟動并設置開機自啟
sudo systemctl start mysql
sudo systemctl enable mysql# 查看狀態
sudo systemctl status mysql --no-pager
10. 獲取臨時密碼并登錄修改 root 密碼
[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: jj?-kM:A6xLw
登錄 MySQL:
/usr/local/mysql/bin/mysql -u root -p
修改 root 密碼:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password123!';
FLUSH PRIVILEGES;
EXIT;
在 MySQL 中創建內網 root 訪問權限
-- 創建 root 用戶,僅允許從內網段 192.168.0.0/16 登錄
CREATE USER 'root'@'192.168.0.%' IDENTIFIED BY 'Password123!';-- 授予所有權限(與本地 root 一致)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0.%' WITH GRANT OPTION;-- 刷新權限
FLUSH PRIVILEGES;
EXIT;
11. 創建專用遠程管理員用戶(不推薦直接開放 root 遠程)
? 原始做法風險:
CREATE USER 'root'@'%' ...
即使設置了強密碼,也極易成為暴力破解和 SQL 注入攻擊的目標。
-- 創建專用遠程管理員(僅限指定IP登錄)
CREATE USER 'admin'@'公司出口IP' IDENTIFIED BY 'StrongPass!2025';-- 授予全局管理權限(等同于 root 權限)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'公司出口IP' WITH GRANT OPTION;-- 刷新權限
FLUSH PRIVILEGES;
EXIT;
📌 說明:
- 用戶名改為
admin
或dba
更安全,避免暴露root
- 登錄來源限定為
公司出口IP
,防止其他 IP 嘗試連接- 密碼需包含大小寫+數字+特殊字符,長度 ≥ 12
確保 /etc/my.cnf
中 bind-address = 0.0.0.0
,然后重啟:
systemctl restart mysql
(可選)進一步最小化權限(更安全)
如果不需要完全 ALL PRIVILEGES
,可以按需授權:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, PROCESS, RELOAD, SHUTDOWN,SHOW DATABASES, SUPER, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT
ON *.* TO 'admin'@'公司出口IP';
12. 配置 iptables 實現精細網絡訪問控制
目標:
- ? 允許
公司出口IP
訪問 3306(外網特定IP)- ? 允許
192.168.0.0/16
內網所有機器訪問 3306- ? 拒絕其他所有外部主機訪問 3306
方法一:直接使用 iptables
命令(臨時生效)
# 允許特定公網IP訪問MySQL
sudo iptables -A INPUT -p tcp --dport 3306 -s 公司出口IP -j ACCEPT# 允許內網段訪問MySQL
sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.0.0/16 -j ACCEPT# 拒絕其他所有對3306的訪問(必須放在最后)
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
?? 重要:iptables 規則是按順序匹配的,
-j DROP
必須在所有ACCEPT
規則之后,否則會被提前攔截!
方法二:持久化保存 iptables 規則(重啟不失效)
不同系統保存方式略有差異:
Ubuntu / Debian
# 安裝持久化工具
sudo apt-get install -y iptables-persistent# 保存當前規則
sudo netfilter-persistent save
CentOS / RHEL / Rocky Linux
# 安裝服務
sudo yum install -y iptables-services || sudo dnf install -y iptables-service# 啟用并保存
sudo systemctl enable iptables
sudo service iptables save
13. 驗證安裝
/usr/local/mysql/bin/mysql --version
# 輸出:/usr/local/mysql/bin/mysql Ver 8.0.36 for Linux on x86_64 (MySQL Community Server - GPL)/usr/local/mysql/bin/mysql -u root -p -e "SELECT VERSION();"
# 應返回 MySQL 版本號
+-----------+
| VERSION() |
+-----------+
| 8.0.36 |
+-----------+
14. 添加 MySQL 到環境變量(可選)
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
之后可直接使用 mysql
、mysqldump
等命令。
四、如何卸載?
sudo systemctl stop mysql
sudo systemctl disable mysql
sudo rm /etc/systemd/system/mysql.service
sudo rm /etc/my.cnf
sudo rm -rf /usr/local/mysql
sudo rm -rf /data/mysql
sudo rm -rf /var/log/mysql
sudo userdel mysql 2>/dev/null || true
sudo groupdel mysql 2>/dev/null || true
五、最佳實踐建議
-
定期備份
/data/mysql
數據目錄集中,便于使用xtrabackup
或mysqldump
備份。 -
監控磁盤空間
/data
分區應有足夠的擴展能力。 -
使用專用備份用戶
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'BackupPass!789'; GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
-
定期更新 MySQL 版本
二進制包方式便于快速升級:只需替換/usr/local/mysql
并保留/data/mysql
。