以下代码使用 PDO 导出指定表的数据,并生成包含 TRUNCATE TABLE
语句的 SQL 文件,确保导入前清空目标表
<?php
// 数据库配置
$db_host = 'localhost';
$db_user = 'username';
$db_pass = 'password';
$db_name = 'database_name';
$tables_to_export = ['table1', 'table2']; // 要导出的表名数组
$output_file = 'data_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 数据导出\n";
$sql_content .= "-- 生成时间: " . date('Y-m-d H:i:s') . "\n";
$sql_content .= "-- 注意: 此文件包含 TRUNCATE 语句,导入前将清空目标表\n\n";
$sql_content .= "SET FOREIGN_KEY_CHECKS = 0;\n\n";
// 循环处理每个表
foreach ($tables_to_export as $table_name) {
// 1. 添加清空表语句
$sql_content .= "--\n-- 清空表 `$table_name`\n--\n";
$sql_content .= "TRUNCATE TABLE `$table_name`;\n\n";
// 2. 导出表数据
$sql_content .= "--\n-- 导出表 `$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 语句
$row_count = 0;
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";
$row_count++;
}
$sql_content .= "-- 共导出 {$row_count} 行数据\n\n";
}
$sql_content .= "SET FOREIGN_KEY_CHECKS = 1;\n";
$sql_content .= "-- 数据导出完成\n";
// 写入文件未压缩的.sql文件
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();
}
?>
清空表数据:
使用 TRUNCATE TABLE
语句(比 DELETE 更高效)
在每条 INSERT 语句前先清空目标表
数据导出:
自动处理 NULL 值
使用 PDO::quote() 正确转义特殊字符
保持原始数据类型
实用功能:
显示导出的行数统计
临时禁用外键约束确保顺利导入
文件头部包含有用的注释信息
修改数据库连接参数
在 $tables_to_export
数组中指定要导出的表
运行脚本生成 SQL 文件
导出的文件可以直接用 MySQL 客户端执行导入
TRUNCATE 会重置自增列,如果需要保留自增ID,可以改为 DELETE FROM table
对于大表,建议分批导出或添加分页处理
确保 PHP 有写入文件的权限
外键约束会在导入完成后恢复