在 PHP 開發中,數據庫備份是維護工作的核心環節。本文提供一套完整的 PHP 腳本,能將 MySQL 數據庫整庫導出為標準 SQL 文件,包含表結構、索引、引擎屬性及數據內容,適合定時備份或遷移場景使用。
<?php
ini_set("max_execution_time", "180"); // 避免數據量過大導出不全
/**
* 程序功能:MySQL 數據庫備份
* 原作者:唐小剛
* 修改者:何錦盛 (2009/11/7)
* 修改內容:新增 get_table_structure 函數,獲取更豐富的建表細節
*/
// 數據庫連接配置
$host = ""; // 數據庫地址
$dbname = ""; // 數據庫名
$username = ""; // 用戶名
$passw = ""; // 密碼
// 生成文件名:日期-數據庫名.sql
$filename = date("Y-m-d_H-i-s") . "-" . $dbname . ".sql";
// 設置下載 Header
header("Content-disposition: filename=" . $filename);
header("Content-type: application/octet-stream");
header("Pragma: no-cache");
header("Expires: 0");
// 連接數據庫
$dbconn = mysql_connect($host, $username, $passw);
mysql_select_db($dbname, $dbconn);
mysql_query("SET NAMES 'utf8'");
// 獲取所有表
$tables = mysql_list_tables($dbname, $dbconn);
$num_tables = @mysql_num_rows($tables);
$crlf = "\r\n";
print "-- filename=" . $filename . $crlf;
// 遍歷每張表導出結構與數據
for ($i = 0; $i < $num_tables; $i++) {
$table = mysql_tablename($tables, $i);
print $crlf;
// 導出表結構(包含引擎、字符集、自增值等完整信息)
echo get_table_structure($dbname, $table, $crlf) . ";" . $crlf . $crlf;
// 導出表數據
echo get_table_content($dbname, $table, $crlf);
}
/**
* 獲取完整表結構(SHOW CREATE TABLE)
*/
function get_table_structure($db, $table, $crlf) {
global $drop;
$schema_create = "";
if (!empty($drop)) {
$schema_create .= "DROP TABLE IF EXISTS `$table`;" . $crlf;
}
$result = mysql_db_query($db, "SHOW CREATE TABLE $table");
$row = mysql_fetch_array($result);
$schema_create .= $crlf . "-- " . $row[0] . $crlf;
$schema_create .= $row[1] . $crlf;
return $schema_create;
}
/**
* 獲取表數據(INSERT 語句)
*/
function get_table_content($db, $table, $crlf) {
$schema_create = "";
$result = mysql_db_query($db, "SELECT * FROM $table");
while ($row = mysql_fetch_row($result)) {
$schema_insert = "INSERT INTO `$table` VALUES (";
for ($j = 0; $j < mysql_num_fields($result); $j++) {
if (!isset($row[$j])) {
$schema_insert .= " NULL,";
} elseif ($row[$j] != "") {
$schema_insert .= " '" . addslashes($row[$j]) . "',";
} else {
$schema_insert .= " '',";
}
}
$schema_insert = preg_replace("/,$/", "", $schema_insert);
$schema_insert .= ");" . $crlf;
$schema_create .= $schema_insert;
}
return $schema_create;
}
?>
echo get_table_structure(...)echo get_table_content(...)SET NAMES 'utf8',確保中文數據正確導出ini_set("max_execution_time", "180") 可根據實際情況調大若在現代 PHP 版本(7.0+)運行,建議將 mysql_* 替換為 mysqli 預處理語句,並增加異常處理、日誌記錄、壓縮輸出(gzencode)等功能,構建更健壯的備份工具。