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

Drupal 與大型站點 MySQL 備份策略實戰:從 svn 到自動化腳本

     編輯:MySQL 資料庫相關知識

中小型 Drupal 站點:Backup Migrate + SVN

利用 backup_migrate 模組排程備份資料庫與檔案,配合 SVN 版本控制實現異地備份。

備份腳本(放置站點根目錄,crontab 每日執行)

#!/bin/bash
date  # 開始時間
DRUSH_PHP=/bin/php
export DRUSH_PHP

# 執行 Drupal cron 觸發備份
drush cron

# 清理 SVN 中已刪除的舊備份檔
svn st sites/default/files/backup_migrate/scheduled/ | grep '^!' | awk '{print $2}' | xargs svn delete --force

# 新增最新備份檔並提交
svn add sites/default/files/backup_migrate/scheduled/*
svn ci sites/default/files/backup_migrate/scheduled/ -m 'add backup files'

date  # 結束時間

Crontab 設定

0 0 * * * cd /www/web/html/ && bash cron.sh > cron.log 2>&1

優點:簡單、版本可追蹤、備份保留數可控。缺點:SVN 不適合大檔案、資料庫超大時效能差。

大型站點:MySQL 邏輯備份 + 壓縮 + 異地傳輸

資料庫較大時需完整備份、壓縮、定期推送至備份伺服器或雲端儲存。

PHP 備份腳本範例

#!/usr/bin/php -q
<?php
$to = "admin@example.com";
$hostname = exec('/bin/hostname');
$mycnf = "/home/backup/.my.cnf";  // [client] user=xxx password=xxx
$ignore = array('information_schema', 'test', 'mysql', 'sys');

function trimw($str) {
    return str_replace(array("\n","\r","\t"," ","\0","\x0B"), '', $str);
}

if (!file_exists($mycnf)) {
    mail($to, "No .my.cnf on $hostname", "Missing credentials"); exit;
}
$myconf = file_get_contents($mycnf);
preg_match("/user=(.*)/", $myconf, $m); $user = trimw($m[1]);
preg_match("/password=(.*)/", $myconf, $m); $pass = trimw($m[1]);

$mysqli = new mysqli("localhost", $user, $pass);
if ($mysqli->connect_errno) {
    mail($to, "Connect failed on $hostname", $mysqli->connect_error); exit;
}

$bpath = "/backup/mysql";
$btime = date("Y-m-d H:i:s");
$bstamp = strtotime($btime);
$byear = date("Y", $bstamp);
$bmonth = date("m", $bstamp);
$bday = date("d", $bstamp);
$btod = date("H-i-s", $bstamp);

$res = $mysqli->query("SHOW DATABASES");
while ($row = $res->fetch_assoc()) {
    $db = $row['Database'];
    if (in_array($db, $ignore)) continue;

    $mdir = "$bpath/$byear/$bmonth/$bday/$btod/$db";
    @mkdir($mdir, 0700, true);
    $sqlFile = "$mdir/$db.sql";

    // 使用 mysqldump --single-transaction 確保一致性備份
    $cmd = "mysqldump -u$user -p$pass --single-transaction --add-drop-table -R -E --triggers --routines -c -Q $db > $sqlFile && gzip -9 $sqlFile";
    $out = shell_exec($cmd);
    echo "Backed up $db\n";
}

echo "Backups in $bpath\n";

關鍵參數說明

  • --single-transaction:InnoDB 一致性備份不鎖表
  • -R -E --triggers --routines:包含存儲過程、事件、觸發器
  • gzip -9:最高壓縮比
  • 目錄結構:/backup/mysql/YYYY/MM/DD/HH-MM-SS/dbname.sql.gz 便於保留策略

Crontab 設定

0 1 * * * /home/backup/bin/mysql_backup.php

異地備份:必做的最後一哩路

  • rsync + SSH:rsync -avz /backup/mysql/ user@backup-server:/remote/backup/
  • 雲端儲存:AWS S3 aws s3 sync、GCS gsutil rsync、阿里云 OSS ossutil
  • 備份驗證:定期隨機恢複測試,確保備份可用
  • 保留策略:本地保留 7 天、異地保留 30-90 天,按合規要求調整

進階方案提示

  • Percona XtraBackup:InnoDB 物理熱備份、支援增量、恢複快
  • MySQL Shell / MySQL Enterprise Backup:官方工具
  • GTID + Replication:備庫即備份,延遲備庫防誤操作

小結

備份無小事:小站用 Backup Migrate + SVN 輕量上手;大站必須 mysqldump --single-transaction + 壓縮 + 異地同步 + 定期演練。核心原則:自動化、異地化、可驗證、有保留策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved