以下是使用 PHP PDO 导出 MySQL 数据库中指定表的结构和数据的完整代码

<?php
// 数据库配置
$db_host = 'localhost';
$db_user = 'username';
$db_pass = 'password';
$db_name = 'database_name';
$tables_to_export = ['table1', 'table2']; // 要导出的表名数组
$output_file = 'export_' . date('Ymd_His') . '.sql';

try {
    // 创建 PDO 连接
    $conn = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // 设置 UTF-8 编码
    $conn->exec("SET NAMES utf8");
    
    // SQL 文件头部信息
    $sql_content = "-- MySQL dump\n";
    $sql_content .= "-- Host: $db_host\n";
    $sql_content .= "-- Generation Time: " . date('Y-m-d H:i:s') . "\n";
    $sql_content .= "-- PHP Version: " . phpversion() . "\n\n";
    $sql_content .= "SET FOREIGN_KEY_CHECKS = 0;\n\n";
    
    // 循环处理每个表
    foreach ($tables_to_export as $table_name) {
        // 1. 导出表结构
        $sql_content .= "--\n-- Table structure for table `$table_name`\n--\n\n";
        $sql_content .= "DROP TABLE IF EXISTS `$table_name`;\n";
        
        $stmt = $conn->query("SHOW CREATE TABLE `$table_name`");
        $create_table = $stmt->fetch(PDO::FETCH_ASSOC);
        $sql_content .= $create_table['Create Table'] . ";\n\n";
        
        // 2. 导出表数据
        $sql_content .= "--\n-- Dumping data for table `$table_name`\n--\n\n";
        
        // 获取所有数据
        $stmt = $conn->query("SELECT * FROM `$table_name`");
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        
        // 获取列名
        $column_count = $stmt->columnCount();
        $columns = [];
        for ($i = 0; $i < $column_count; $i++) {
            $meta = $stmt->getColumnMeta($i);
            $columns[] = $meta['name'];
        }
        
        // 生成 INSERT 语句
        while ($row = $stmt->fetch()) {
            $values = [];
            foreach ($row as $value) {
                if (is_null($value)) {
                    $values[] = 'NULL';
                } else {
                    $values[] = $conn->quote($value);
                }
            }
            
            $sql_content .= "INSERT INTO `$table_name` (`" . implode('`,`', $columns) . "`) VALUES (" . implode(',', $values) . ");\n";
        }
        
        $sql_content .= "\n";
    }
    
    $sql_content .= "SET FOREIGN_KEY_CHECKS = 1;\n";
    
    // 写入文件
    file_put_contents($output_file, $sql_content);
	
	/* gzip压缩
	$gzip_file = 'data_export_' . date('Ymd_His') . '.sql.gz';
	$data = $sql_content;
	// 使用 gzencode 压缩
	$compressed = gzencode($data, 9); // 9 是最高压缩级别
	file_put_contents('./data/'.$gzip_file, $compressed);
	*/    
    
	echo "导出成功!文件已保存为: " . $output_file;

} catch(PDOException $e) {
    echo "导出失败: " . $e->getMessage();
}
?>

功能说明

  1. 导出表结构

    • 包含 DROP TABLE IF EXISTS 语句

    • 使用 SHOW CREATE TABLE 获取完整的建表语句

    • 保留所有索引、约束和表选项

  2. 导出表数据

    • 生成标准的 INSERT 语句

    • 自动处理 NULL 值

    • 使用 PDO::quote() 方法正确转义特殊字符

    • 保持原始数据类型

  3. 其他特性

    • 文件头部包含导出元信息

    • 自动设置/恢复外键检查

    • 支持同时导出多个表

    • 文件名包含时间戳防止覆盖

使用说明

  1. 修改数据库连接参数(dbhost,dbh​ost,db_user, dbpass,dbp​ass,db_name)

  2. 在 $tables_to_export 数组中指定要导出的表名

  3. 运行脚本后会在当前目录生成 SQL 导出文件

注意事项

  1. 对于大型表,此方法可能会消耗较多内存,建议分批处理

  2. 确保 PHP 有写入文件的权限

  3. 导出的 SQL 文件可以直接用 MySQL 客户端导入

  4. 如需压缩导出文件,可以添加 gzip 压缩功能