<?php
set_time_limit(0);
date_default_timezone_set('PRC');
$configs = [
'host1' => [
'localhost', 'root', 'root', [], // 空數組 = 全庫備份
'D:/xampp/mysql/bin/mysqldump',
dirname(__FILE__) . "/localhost",
5 // 保留天數
],
];
foreach ($configs as $config) {
backup($config);
}
function backup($config) {
list($host, $user, $pass, $dbs, $tool, $dir, $keepDays) = $config;
$cmd = "$tool -u $user -h $host -p$pass %s > %s";
$sqlFile = $dir . '/' . date('Ymd') . "%s.sql";
$zipFile = $dir . '/' . date('Ymd') . "%s.zip";
$logFile = $dir . '/' . date('ymd') . '.log';
if (!is_dir($dir)) mkdir($dir, 0755, true);
// 清理舊備份
$files = glob($dir . '/*.zip');
foreach ($files as $f) {
if (filemtime($f) < strtotime("-$keepDays day")) unlink($f);
}
if (!$dbs) {
$mysqli = new Mysqli($host, $user, $pass);
$res = $mysqli->query("SHOW DATABASES");
while ($row = $res->fetch_row()) {
$db = $row[0];
if (!in_array($db, ['information_schema','mysql','performance_schema'])) $dbs[] = $db;
}
}
foreach ($dbs as $db) {
$out = sprintf($sqlFile, $db);
$exec = sprintf($cmd, $db, $out);
if (system($exec) !== false && file_exists($out)) {
$zip = new ZipArchive();
if ($zip->open(sprintf($zipFile, $db), ZipArchive::OVERWRITE) === true) {
$zip->addFile($out, basename($out));
$zip->close();
unlink($out);
logs($logFile, "$db backup ok");
}
}
}
}
function logs($file, $msg) {
file_put_contents($file, date('Y-m-d H:i:s') . " $msg\n", FILE_APPEND);
}
REM mysqlbackup.bat
D:\xampp\php\php.exe -q D:\wamp\www\php_lib\basic\mysqlbackup.php
pause
配合 Windows 任務計劃程式設置每日自動執行。
#!/bin/bash
# backup.sh
dbs=(test db2 db3)
ROOT_DIR=/home/backup/
for db in ${dbs[@]}; do
FILE=$ROOT_DIR${db}_$(date +%Y%m%d).sql
/usr/local/mysql/bin/mysqldump --opt -uroot -pPASS $db > $FILE
gzip $FILE
# 刪除 5 天前
OLD=$ROOT_DIR${db}_$(date -d "-5 day" +%Y%m%d).sql.gz
[ -f $OLD ] && rm -f $OLD
done
加入 crontab:0 2 * * * /home/taskschd/backup.sh(每天凌晨 2 點)
log-bin,配合 mysqlbinlog 做增量恢復生產環境建議:全量+增量結合、異地多副本、定期演練恢復流程、監控備份成功率與耗時。