利用 backup_migrate 模組排程備份資料庫與檔案,配合 SVN 版本控制實現異地備份。
#!/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 # 結束時間
0 0 * * * cd /www/web/html/ && bash cron.sh > cron.log 2>&1
優點:簡單、版本可追蹤、備份保留數可控。缺點:SVN 不適合大檔案、資料庫超大時效能差。
資料庫較大時需完整備份、壓縮、定期推送至備份伺服器或雲端儲存。
#!/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 便於保留策略0 1 * * * /home/backup/bin/mysql_backup.php
rsync -avz /backup/mysql/ user@backup-server:/remote/backup/aws s3 sync、GCS gsutil rsync、阿里云 OSS ossutil備份無小事:小站用 Backup Migrate + SVN 輕量上手;大站必須 mysqldump --single-transaction + 壓縮 + 異地同步 + 定期演練。核心原則:自動化、異地化、可驗證、有保留策略。