在 Windows Server 2003 + Apache + PHP + MySQL 環境下,利用 PHP 腳本呼叫 mysqldump 與 WinRAR 實現:每日全庫備份 → 壓縮加密 → 自動刪除 5 天前舊檔。零成本、無第三方排程軟體,純原生任務排程器即可跑滿。
D:\phpD:\mysqlD:\database_backup (需手動建立)root (需具備所有資料庫 SELECT、LOCK TABLES、FILE 權限)D:\php 下建立 WinRAR 資料夾WinRAR.exe 與 RARReg.KEY (註冊金鑰) 到此資料夾檔案:D:\php\mysql_backup.php
<?php
/**
* MySQL 每日備份腳本
* 需 CLI 模式執行:php.exe mysql_backup.php
*/
$store_folder = 'D:\\database_backup'; // 雙反斜線或單正斜線皆可
$db_user = 'root';
$db_pass = ''; // 有密碼請填入
$time = time();
$nowdir = $store_folder . '\\' . date('Ymd', $time);
$rarFile = $nowdir . '.rar';
// 避免重複執行
if (file_exists($rarFile)) {
die("Backup file {$rarFile} already exists.\n");
}
// 建立當日資料夾
@mkdir($nowdir, 0755, true);
// 連線 MySQL 列舉所有資料庫
$link = mysql_connect('localhost', $db_user, $db_pass);
if (!$link) die('MySQL connect failed: ' . mysql_error());
$dbs = mysql_list_dbs($link);
while ($row = mysql_fetch_array($dbs)) {
$dbName = $row['Database'];
$dumpFile = "{$nowdir}\\{$dbName}.sql";
// 組裝 mysqldump 指令
$cmd = sprintf(
'"%s\..\mysql\bin\mysqldump.exe" --opt %s -u%s %s > "%s"',
__FILE__,
$dbName,
$db_user,
$db_pass ? "-p{$db_pass}" : '',
$dumpFile
);
echo "Dumping database `{$dbName}`...\n";
system($cmd, $ret);
if ($ret !== 0) {
echo "Warning: mysqldump returned code {$ret} for {$dbName}\n";
}
}
mysql_close($link);
// 壓縮加密 (AES-256,需 WinRAR 4.0+)
echo "\nCompressing with WinRAR...\n";
$rarCmd = sprintf(
'"%s\WinRAR\WinRAR.exe" a -ep1 -r -o+ -m5 -hpYourStrongPassword "%s" "%s"',
__FILE__,
$rarFile,
$nowdir
);
system($rarCmd, $ret);
if ($ret !== 0) die("WinRAR compression failed with code {$ret}\n");
// 刪除 5 天前舊備份
$oldFile = $store_folder . '\\' . date('Ymd', $time - 5 * 86400) . '.rar';
if (file_exists($oldFile)) {
@unlink($oldFile);
echo "Deleted old backup: {$oldFile}\n";
}
echo "\nBackup completed successfully!\n";
?>
檔案:D:\php\mysql_backup.bat
@echo off
D:
cd \php
php.exe mysql_backup.php
control schedtasks →「新增排程工作」D:\php\mysql_backup.batAdministrator 或專用服務帳號)mysql_backup.bat 觀察 Console 輸出,確認無錯誤D:\database_backup 檢查 YYYYMMDD.rar 存在且可解壓mysql -u root -p dbname < dbname.sql--single-transaction --quick 參數並分庫壓縮robocopy 或 rclone 推送至 NAS/FTP/S3-hpYourStrongPassword 移至環境變數或保管庫,避免明文寫在腳本blat.exe 或 PowerShell Send-MailMessage 發送失敗通知mysqli/PDO,mysql_* 函式庫已移除⚠️ 本腳本使用已棄用的
mysql_*擴展,僅適用於 PHP 5.x 存量環境。新專案請改用mysqli或PDO_MySQL並啟用預處理語句。