博客 / 詳情

返回

藍易雲cdn:服務器Linux系統配置mysql數據庫主從自動備份

下面給你一套在服務器 <span style="color:red;">Linux</span> 上落地 <span style="color:red;">MySQL 主從</span> + <span style="color:red;">自動備份</span> 的“可上線”方案(以 <span style="color:red;">MySQL 8.0/8.4</span> 常見語法為準),兼顧穩定性與可維護性。🔧


1)整體目標與落地架構(先定方向)

  • 業務寫入落在 <span style="color:red;">主庫(Source)</span>
  • <span style="color:red;">從庫(Replica)</span> 做讀擴展與容災緩衝
  • 備份優先在 <span style="color:red;">從庫</span> 執行,減少主庫壓力 🗄️
flowchart LR
A[業務/應用] -->|寫入| M[主庫 Source]
M -->|binlog 複製| R[從庫 Replica]
R -->|定時全量備份| B[備份目錄/歸檔]
R -->|保留binlog用於時間點恢復| L[binlog歸檔]

解釋:主從複製依賴主庫 <span style="color:red;">binlog</span>;全量備份解決“能恢復到某一時刻之前”,binlog 歸檔解決“精確恢復到某一秒”。這套組合才叫“可控恢復”。✅


2)原理解釋表(關鍵點一眼看懂)🧩

模塊 你在做什麼 關鍵配置/動作 常見坑 務實建議
複製鏈路 主庫把變更寫入 <span style="color:red;">binlog</span>,從庫拉取並重放 log_binserver-idgtid_mode 主從時間差、server-id 衝突 主從分別設置不同 server-id,開啓 GTID
一致性 保證跨事務複製可靠 binlog_format=ROW STATEMENT 在複雜函數/觸發器下可能不穩 優先 ROW
安全 複製賬號最小權限 REPLICATION SLAVE/CLIENT 給了過大權限 只給複製必需權限
備份 全量 + binlog 歸檔 mysqldump --single-transaction + flush-logs 鎖表、備份不完整 InnoDB 用 single-transaction
恢復 先還原全量,再追 binlog mysqlbinlog 重放 binlog 丟失就“斷片” binlog 做保留與輪轉

3)主庫配置(Source)

假設:

  • 主庫 IP:10.0.0.10
  • 從庫 IP:10.0.0.11
  • 複製用户:repl
  • 密碼:自行替換為強密碼(不要用弱口令)🛡️

3.1 修改主庫 MySQL 配置

編輯(路徑因發行版不同,常見為其一):/etc/mysql/mysql.conf.d/mysqld.cnf/etc/my.cnf

[mysqld]
server-id=10
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON

解釋:

  • server-id:主從唯一標識,<span style="color:red;">不可重複</span>。
  • log_bin:開啓 <span style="color:red;">binlog</span>,否則無複製可談。
  • binlog_format=ROW:以行變更記錄,複製更穩。
  • gtid_mode=ON:啓用 <span style="color:red;">GTID</span>,減少“找位點”的人為事故。

重啓 MySQL:

systemctl restart mysql

解釋:讓新配置生效。重啓前建議在低峯操作,避免連接抖動。

3.2 創建複製賬號(主庫執行)

CREATE USER 'repl'@'10.0.0.%' IDENTIFIED BY '替換為強密碼';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'10.0.0.%';
FLUSH PRIVILEGES;

解釋:

  • 只授予複製必需權限,符合“最小權限原則”。
  • 10.0.0.% 僅示例,生產更建議鎖定到從庫固定 IP。

4)準備主庫全量數據(給從庫一個一致起點)

在主庫導出(建議 InnoDB):

mysqldump --single-transaction --routines --events --triggers --set-gtid-purged=ON \
  -uroot -p --all-databases > /tmp/full.sql

解釋:

  • --single-transaction:不鎖表地拿到一致快照(對 InnoDB 很關鍵)。
  • --routines --events --triggers:把存儲過程/事件/觸發器一併備走,避免“恢復後功能缺件”。
  • --set-gtid-purged=ON:配合 GTID,後續複製更順滑。

/tmp/full.sql 傳到從庫後,在從庫導入:

mysql -uroot -p < /tmp/full.sql

解釋:從庫先擁有與主庫一致的數據基線,複製才不會“從空氣開始”。


5)從庫配置(Replica)

5.1 修改從庫 MySQL 配置

[mysqld]
server-id=11
read_only=ON
super_read_only=ON
gtid_mode=ON
enforce_gtid_consistency=ON
log_replica_updates=ON

解釋:

  • read_only/super_read_only:把從庫定位為“只讀承接者”,減少誤寫事故。
  • log_replica_updates=ON:從庫也記錄複製過來的變更,利於級聯與恢復排障。

重啓:

systemctl restart mysql

解釋:同樣是讓參數生效。

5.2 建立複製關係(從庫執行,MySQL 8.0+ 推薦語法)

STOP REPLICA;
RESET REPLICA ALL;

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='10.0.0.10',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='替換為強密碼',
  SOURCE_PORT=3306,
  SOURCE_AUTO_POSITION=1,
  GET_SOURCE_PUBLIC_KEY=1;

START REPLICA;

解釋:

  • SOURCE_AUTO_POSITION=1:啓用 <span style="color:red;">GTID 自動定位</span>,不用手工填 file/pos。
  • GET_SOURCE_PUBLIC_KEY=1:在默認認證插件場景下,允許獲取公鑰完成認證(不想用它則改用複製 SSL)。
  • 如果你用的是舊版本(比如 5.7 或某些分支),命令可能是 START SLAVE/CHANGE MASTER TO,但思路一致。

查看狀態:

SHOW REPLICA STATUS\G

解釋:重點看:

  • Replica_IO_Running: Yes
  • Replica_SQL_Running: Yes
  • Seconds_Behind_Source(延遲指標,越小越好)

6)自動備份(建議在從庫執行)🗄️

6.1 備份腳本(從庫)

創建:/usr/local/bin/mysql_auto_backup.sh

#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/data/backup/mysql"
TS="$(date +%F_%H%M%S)"
FULL_FILE="${BACKUP_DIR}/full_${TS}.sql.gz"
BINLOG_DIR="/var/lib/mysql"
BINLOG_ARCH="${BACKUP_DIR}/binlog_${TS}"

mkdir -p "${BACKUP_DIR}" "${BINLOG_ARCH}"

# 1) 全量備份(邏輯)
mysqldump --single-transaction --routines --events --triggers --all-databases \
  -uroot -p'替換為root密碼或改成讀取安全憑據' | gzip -c > "${FULL_FILE}"

# 2) 輪轉 binlog,便於歸檔
mysqladmin -uroot -p'替換為root密碼或改成讀取安全憑據' flush-logs

# 3) 歸檔 binlog(用於時間點恢復)
cp -a ${BINLOG_DIR}/mysql-bin.* "${BINLOG_ARCH}/" || true

# 4) 清理超過 7 天的備份
find "${BACKUP_DIR}" -type f -mtime +7 -name "*.gz" -delete
find "${BACKUP_DIR}" -type d -mtime +7 -name "binlog_*" -exec rm -rf {} \; 2>/dev/null || true

echo "OK: ${TS}"

解釋:

  • 這份腳本做了兩件事:<span style="color:red;">全量備份</span> + <span style="color:red;">binlog 歸檔</span>,滿足“可精確回滾”。
  • flush-logs 會切一個新的 binlog 文件,讓你歸檔時邊界更清晰。
  • 清理策略按 7 天示例,你可按合規與成本調優。
  • 密碼直接寫在腳本里不夠優雅,生產建議用 MySQL 客户端安全憑據文件或專用備份賬號(這裏先給你能跑通的版本,先交付結果,再做治理)。

6.2 定時任務(cron)

crontab -e

加入每天 03:30 執行:

30 3 * * * /usr/local/bin/mysql_auto_backup.sh >> /var/log/mysql_backup.log 2>&1

解釋:

  • 把輸出打到日誌,出問題能追責定位。
  • 備份跑在從庫,主庫更專注交易鏈路,整體更穩。🙂

7)你應該做的最後一次“上線自檢”

  • <span style="color:red;">主從版本</span>儘量保持同一大版本(避免複製協議與函數差異)。
  • 確認主庫 3306 對從庫網絡可達(安全組/防火牆放行)。
  • SHOW REPLICA STATUS\G 兩個 Running 都為 Yes。
  • 隨機挑一張表寫入一條數據,驗證從庫是否實時出現(別隻看狀態,要看結果)。✅

如果你把“主庫/從庫 IP、MySQL 版本、數據量級(例如 100GB/1TB)、是否需要跨機房”告訴我,我可以把上面腳本升級成更企業級的:分庫備份、備份校驗(restore-test)、告警、加密、異地歸檔與 RPO/RTO 指標口徑。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.