硬碟 1 (系統盤) 硬碟 2 (資料盤)
/ /data/app_1/
|-- /usr |-- /data/app_2/
|-- /home/mysql --> /home/mysql-3.23.54/ # 軟連結指向最新版
|-- /home/mysql-3.23.54/ # 當前版本
|-- /home/mysql-old/ # 舊版回滾備份
核心原則: MySQL 程式碼、配置、日誌在系統盤;資料目錄、socket、pid、備份腳本在資料盤。硬碟故障時,只需將資料盤掛載到新伺服器,啟動腳本加入 rc.local 即可秒級恢復服務。
./configure \
--prefix=/home/mysql \
--without-innodb \ # 不需要事務時關閉,效能提升數量級
--with-charset=utf8mb4 \ # 避免 latin1 遷移亂碼坑
--enable-thread-safe-client
make && make install
#!/bin/bash
# /data/app_1/start_mysql.sh
rundir=$(dirname "$0")
/home/mysql/bin/mysqld_safe \
--user=mysql \
--pid-file="$rundir/mysql.pid" \
--socket="$rundir/mysql.sock" \
--datadir="$rundir/var" \
--port=3402 \
-O max_connections=500 \
-O wait_timeout=600 \
-O key_buffer=32M \
&
# rc.local 多實例啟動
/data/app_1/start_mysql.sh
/data/app_2/start_mysql.sh
/data/app_3/start_mysql.sh
優勢: 每實例獨立 port、socket、pid、datadir,互不干擾;單實例 CPU > 10% 即考慮拆分到新 port。
#!/bin/bash
# /data/app_1/stop_mysql.sh
rundir=$(dirname "$0")
/home/mysql/bin/mysqladmin -u mysql -S"$rundir/mysql.sock" shutdown
# /usr/local/mysql/bin/mysqldump -S /data/app_1/mysql.sock -u backup_user db_name | gzip -c > /backup/db_name.$(date +\%w).dump.gz
date +\%w:0~6 代表週日~週六,自動輪循 7 份。crontab:15 4 * * * /backup/script.sh(凌晨 4:15,負載最低)。-S socket 改為 -h remote_ip 即可。| 場景 | 操作 |
|---|---|
| 系統盤壞、資料盤完好 | 新裝 OS + MySQL 同版本,掛載資料盤,加入啟動腳本 → 服務恢復 |
| 資料損壞(誤刪/誤更新) | 確定時間點 → 最近備份還原 → Binlog 重放(PITR) |
| MySQL 版本升級 | 新版本安裝到 /home/mysql-new,修改軟連結 /home/mysql -> 新版,重啟實例 |