核心邏輯:逐表匯出 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 實作,無需外部工具;缺點:需處理欄位分隔符、跳脫字元,大量資料效能較差。
利用 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";
}
此法產出標準 SQL,相容性高,還原只需 mysql < 備份檔.sql 即可。
nobody)通常無權讀取 MySQL 資料目錄,故無法直接複製實體檔。