首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

MySQL 自動備份腳本大全:PHP 版、Windows BAT、Linux Shell 多平台方案

     編輯:PHP 相關知識

跨平台 MySQL 備份自動化完整方案

方案一:PHP 版備份腳本(mysqlbackup.php)

<?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);
}

方案二:Windows 計劃任務

REM mysqlbackup.bat
D:\xampp\php\php.exe -q D:\wamp\www\php_lib\basic\mysqlbackup.php
pause

配合 Windows 任務計劃程式設置每日自動執行。

方案三:Linux Shell 腳本

#!/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 做增量恢復
  • rsync 同步:遠程備份節點增量同步
  • Percona XtraBackup:物理熱備份,不鎖表,大數據量首選

生產環境建議:全量+增量結合、異地多副本、定期演練恢復流程、監控備份成功率與耗時。

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