以下是使用 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();
}
?>
导出表结构:
包含 DROP TABLE IF EXISTS 语句
使用 SHOW CREATE TABLE 获取完整的建表语句
保留所有索引、约束和表选项
导出表数据:
生成标准的 INSERT 语句
自动处理 NULL 值
使用 PDO::quote() 方法正确转义特殊字符
保持原始数据类型
其他特性:
文件头部包含导出元信息
自动设置/恢复外键检查
支持同时导出多个表
文件名包含时间戳防止覆盖
修改数据库连接参数(dbhost,dbhost,db_user, dbpass,dbpass,db_name)
在 $tables_to_export 数组中指定要导出的表名
运行脚本后会在当前目录生成 SQL 导出文件
对于大型表,此方法可能会消耗较多内存,建议分批处理
确保 PHP 有写入文件的权限
导出的 SQL 文件可以直接用 MySQL 客户端导入
如需压缩导出文件,可以添加 gzip 压缩功能