一支獨立的 PHP 腳本,讀取 Joomla 設定檔取得資料庫連線資訊,自動備份所有資料表結構與資料,輸出單一 .sql 檔案。稍微調整設定檔載入方式即可套用至其他框架或原生專案。
<?php
// 載入 Joomla 設定
require_once('configuration.php');
$jconfig = new JConfig();
// 建立連線
$conn = mysql_connect($jconfig->host, $jconfig->user, $jconfig->password);
if (!$conn) die('DB 連線失敗: ' . mysql_error());
// 取得所有資料表
$result = mysql_list_tables($jconfig->db);
$tables = [];
while ($row = mysql_fetch_row($result)) {
$tables[] = $row[0];
}
mysql_select_db($jconfig->db, $conn);
$sql = '';
foreach ($tables as $table) {
$sql .= backupTable($table, $conn);
}
// 輸出檔案
$filename = 'tmp/backup_' . date('Y-m-d-H-i-s') . '.sql';
$written = file_put_contents($filename, $sql);
if ($written !== false) {
die('success: ' . $filename);
} else {
die('寫入檔案失敗,請檢查 tmp 目錄權限');
}
mysql_close($conn);
/**
* 備份單一資料表:結構 + 資料
*/
function backupTable($table, $conn) {
$sql = '';
// 1. DROP + CREATE TABLE
$res = mysql_query("SHOW CREATE TABLE `$table`", $conn);
$row = mysql_fetch_assoc($res);
$sql .= "DROP TABLE IF EXISTS `$table`;\n";
$sql .= $row['Create Table'] . ";\n\n";
// 2. INSERT 資料
$res = mysql_query("SELECT * FROM `$table`", $conn);
$rows = [];
while ($row = mysql_fetch_assoc($res)) {
$fields = [];
foreach ($row as $val) {
$fields[] = "'" . mysql_escape_string($val) . "'";
}
$rows[] = '(' . implode(',', $fields) . ')';
}
if (!empty($rows)) {
$sql .= "INSERT INTO `$table` VALUES\n" . implode(",\n", $rows) . ";\n\n";
}
return $sql;
}
?>
configuration.php 並實例化 JConfig,非 Joomla 專案請改為直接定義 $host、$user、$pass、$db。--ignore-table、--single-transaction、壓縮輸出(gzencode)、上傳至雲端儲存等功能。tmp/ 目錄請設定 .htaccess Deny from all 或置於網站根目錄外,避免備份檔被直接下載。LIMIT 讀取、或改用 mysqldump 呼叫系統指令(exec())更高效。mysql_* 函數已棄用(PHP 7.0+ 移除),新專案請改用 mysqli 或 PDO 重寫。# crontab -e
# 每天凌晨 3 點備份
0 3 * * * /usr/bin/php /path/to/backup.php >> /var/log/db_backup.log 2>&1
配合 logrotate 管理日誌,定期清理舊備份檔(find tmp/ -mtime +7 -delete)。