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

PHP 實作 MySQL 備份與恢復兩種方案

     編輯:MySQL 資料庫相關知識

方案一:自訂格式文字檔備份/還原

核心邏輯:逐表匯出 SELECT * 結果至暫存文字檔,再合併為單一 .sql 檔,格式為 `表名`{{資料內容}}。還原時解析該格式,先 TRUNCATE TABLE 再 LOAD DATA INFILE 導入。

關鍵程式碼片段

// 備份階段
$sql = "SELECT * FROM `$table`";
$result = $db->query($sql);
// 寫入暫存檔,最後合併為 Y-m-d.sql

// 還原階段
preg_match_all("/`(.*)`\{\{(.*)\}\}/isU", $fileContent, $matches);
foreach ($matches[1] as $k => $table) {
    $data = $matches[2][$k];
    file_put_contents("$table.txt", $data);
    $db->query("TRUNCATE TABLE `$table`");
    $db->query("LOAD DATA LOW_PRIORITY INFILE '$table.txt' INTO TABLE `$table`");
}

優點:純 PHP 實作,無需外部工具;缺點:需處理欄位分隔符、跳脫字元,大量資料效能較差。

方案二:參考 Discuz! 產生標準 SQL 備份

利用 SHOW CREATE TABLE 取得建表語句,搭配 INSERT INTO ... VALUES 產生標準 SQL,支援「僅結構」與「結構+資料」兩種模式。

核心函數

function table2sql($table) { // 僅結構
    $create = $db->fetch_row($db->query("SHOW CREATE TABLE $table"));
    return "DROP TABLE IF EXISTS $table;\n{$create[1]};\n\n";
}

function data2sql($table) { // 結構+資料
    $dump = table2sql($table);
    $rows = $db->query("SELECT * FROM $table");
    while ($row = $db->fetch_row($rows)) {
        $dump .= "INSERT INTO $table VALUES(";
        $dump .= implode(",", array_map(function($v) use($db) {
            return "'".$db->escape_string($v)."'";
        }, $row));
        $dump .= ");\n";
    }
    return $dump . "\n";
}

實作流程

  1. 定義需備份的表名陣列、檔名前綴、儲存路徑、備份模式(all/table)。
  2. 迭代各表呼叫對應函數產生 SQL 字串。
  3. 寫入檔案頭資訊(主機、資料庫、備份時間、編號等)。
  4. 儲存至伺服器或提供下載。

此法產出標準 SQL,相容性高,還原只需 mysql < 備份檔.sql 即可。

權限與安全提醒

  • PHP 執行身份(如 Apache 的 nobody)通常無權讀取 MySQL 資料目錄,故無法直接複製實體檔。
  • 備份腳本應受後台權限控管,避免洩露資料庫結構與資料。
  • 大型資料庫建議分批次處理,避免記憶體耗盡或逾時。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved