PHP实现MySQL数据库导出为SQL文件的实例(兼容现代环境)

Finn
Finn
发布时间:2026-10-14 | 5人浏览过
原创

利用PHP脚本自动将MySQL数据库的所有表结构和数据导出为标准的.sql文件,可实现便捷的后台数据库备份功能。核心步骤包括连接数据库、获取所有表名、提取建表语句以及读取数据并拼接插入语句。

核心逻辑与准备

要实现完整的数据库导出,需要按以下顺序处理数据:

  1. 获取表列表:查询当前数据库中包含哪些表,存入数组以便循环处理。
  2. 导出表结构:执行 SHOW CREATE TABLE 表名 语句,获取创建该表的DDL语句。
  3. 导出数据内容:执行 SELECT * FROM 表名 遍历每一行数据,将其转换为 INSERT INTO ... VALUES (...) 格式的SQL语句。

操作环境与注意事项

原文提供的代码使用了已废弃的 mysql_* 扩展函数。在现代 PHP 版本(PHP 7.x/8.x)中,这些函数已被移除。直接运行原代码会报错。下方的“现代优化版”代码使用了更安全的 PDO 扩展和预处理机制,虽然本示例主要演示逻辑,但在生产环境中务必注意 SQL 注入风险和大数据量下的内存限制。

风险提示: 导出大量数据时可能会消耗较多服务器内存或超出执行时间限制。建议对大型数据库使用专业工具(如 phpMyAdmin 或命令行 mysqldump),而非纯 PHP 脚本全量加载到内存中。

PHP导出MySQL数据的核心步骤

第一步:配置信息并建立连接

目的:指定目标数据库的连接参数,并确保连接成功。 动作:设置主机、用户名、密码及库名。若使用现代写法,应实例化 PDO 对象。

<?php
header("Content-type:text/html;charset=utf-8");

// 配置信息 - 请根据实际环境修改
$cfg_dbhost = 'localhost';
$cfg_dbname = 'ftdm';
$cfg_dbuser = 'root';
$cfg_dbpwd = 'root';
$cfg_db_language = 'utf8'; // 建议使用 utf8mb4
$to_file_name = "backup_" . date("YmdHis") . ".sql";

// 建立 MySQL 连接 (以原生 mysqli 为例,PDO类似)
$link = new mysqli($cfg_dbhost, $cfg_dbuser, $cfg_dbpwd, $cfg_dbname);
if ($link->connect_error) {
    die("连接失败: " . $link->connect_error);
}
$link->set_charset($cfg_db_language);
?>

第二步:获取所有表名并初始化文件

目的:确定需要导出的目标范围,并在本地创建输出文件。 入口:使用 SHOW TABLES 或 information_schema 查询。 动作:写入头部注释信息。

// 获取所有表名
$tablesResult = $link->query("SHOW TABLES");
$tabList = array();
while ($row = $tablesResult->fetch_row()) {
    $tabList[] = $row[0];
}

// 初始化 SQL 文件头
$info = "-- ----------------------------\r\n";
$info .= "-- 日期:" . date("Y-m-d H:i:s", time()) . "\r\n";
$info .= "-- 仅用于测试和学习,本程序不适合处理超大量数据\r\n";
$info .= "-- ----------------------------\r\n\r\n";
file_put_contents($to_file_name, $info, FILE_APPEND);

第三步:循环导出每个表的结构

目的:生成重建数据库所需的 DDL 语句。 关键参数:SHOW CREATE TABLE table_name。 完成状态:文件中包含完整的 DROP TABLE IF EXISTS 和 CREATE TABLE 语句。

foreach($tabList as $val) {
    $sql = "SHOW CREATE TABLE `".$val."`";
    $res = $link->query($sql);
    $row = $res->fetch_assoc();
    
    $info = "-- ----------------------------\r\n";
    $info .= "-- Table structure for `".$val."`\r\n";
    $info .= "-- ----------------------------\r\n";
    $info .= "DROP TABLE IF EXISTS `".$val."`;\r\n";
    
    // 拼接结构语句
    $sqlStr = $info . $row['Create Table'] . ";\r\n\r\n";
    file_put_contents($to_file_name, $sqlStr, FILE_APPEND);
}

第四步:循环导出表中的数据记录

目的:将现有数据转化为可执行的 INSERT 语句。 难点:需正确处理特殊字符(如引号、换行符),防止 SQL 语法错误。原代码简单拼接存在风险,下面展示处理逻辑框架。

foreach($tabList as $val) {
    $sql = "SELECT * FROM `".$val."`";
    $res = $link->query($sql);
    
    if(!$res || $res->num_rows < 1) continue;
    
    $info = "-- ----------------------------\r\n";
    $info .= "-- Records for `".$val."`\r\n";
    $info .= "-- ----------------------------\r\n";
    file_put_contents($to_file_name, $info, FILE_APPEND);
    
    while($row = $res->fetch_row()) {
        // 构造 INSERT 语句,需对字段值进行转义
        $cols = array_map(function($v) use($link){
            return is_null($v) ? 'NULL' : "'" . addslashes($v) . '"';
        }, $row);
        
        $colString = implode(', ', $cols);
        $sqlStr = "INSERT INTO `".$val."` VALUES (" . $colString . ");\r\n";
        file_put_contents($to_file_name, $sqlStr, FILE_APPEND);
    }
    file_put_contents($to_file_name, "\r\n", FILE_APPEND);
    $res->free_result();
}

echo "OK! 导出完成。";

结果验证

执行上述代码后,网站根目录下会生成类似 backup_yyyyMMddHHmmss.sql 的文件。可使用文本编辑器打开查看,开头应为日期注释,随后是各表的 CREATE TABLE 语句,最后是 INSERT INTO 数据语句。导入时可由 MySQL 命令行 mysql -u user -p dbname < backup.sql 或 phpMyAdmin 界面恢复。

简要总结

通过 PHP 脚本遍历数据表并拼接字符串即可实现简易的数据导出功能。关键在于准确获取表结构并使用安全的方式转义数据内容。为避免大事务导致的超时或内存溢出,建议在导出前备份数据库,并对超大表采取分批处理策略。以上就是PHP实现把MySQL数据库导出为.sql文件的详细内容,更多关于PHP数据库备份的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表