Найти в Дзене

PHP скрипт для создания дампов таблиц PostgreSQL с архивацией

Вот полный скрипт, который создает дампы всех таблиц указанной базы данных PostgreSQL в формате SQL (с INSERT-запросами), затем архивирует каждый дамп и удаляет исходный файл: <?php // Параметры подключения к PostgreSQL $db_host = 'localhost'; $db_port = '5432'; $db_name = 'ваша_база_данных'; $db_user = 'ваш_пользователь'; $db_pass = 'ваш_пароль'; // Директория для сохранения дампов $backup_dir = __DIR__ . '/pg_backups/'; if (!file_exists($backup_dir)) { mkdir($backup_dir, 0755, true); } // Подключение к БД try { $conn = pg_connect("host=$db_host port=$db_port dbname=$db_name user=$db_user password=$db_pass"); if (!$conn) { throw new Exception("Не удалось подключиться к PostgreSQL: " . pg_last_error()); } // Получаем список всех таблиц $result = pg_query($conn, "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"); if (!$result) { throw new Exception("Ошибка при получении списка таблиц: " . pg_last_error($conn)); } $tables = pg_fetch_all($result); if (!$tab

Вот полный скрипт, который создает дампы всех таблиц указанной базы данных PostgreSQL в формате SQL (с INSERT-запросами), затем архивирует каждый дамп и удаляет исходный файл:

<?php
// Параметры подключения к PostgreSQL
$db_host = 'localhost';
$db_port = '5432';
$db_name = 'ваша_база_данных';
$db_user = 'ваш_пользователь';
$db_pass = 'ваш_пароль';
// Директория для сохранения дампов
$backup_dir = __DIR__ . '/pg_backups/';
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
// Подключение к БД
try {
$conn = pg_connect("host=$db_host port=$db_port dbname=$db_name user=$db_user password=$db_pass");
if (!$conn) {
throw new Exception("Не удалось подключиться к PostgreSQL: " . pg_last_error());
}
// Получаем список всех таблиц
$result = pg_query($conn, "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'");
if (!$result) {
throw new Exception("Ошибка при получении списка таблиц: " . pg_last_error($conn));
}
$tables = pg_fetch_all($result);
if (!$tables) {
throw new Exception("В базе данных нет таблиц или не удалось получить список таблиц");
}
foreach ($tables as $table) {
$table_name = $table['table_name'];
$dump_file = $backup_dir . $table_name . '.sql';
$zip_file = $backup_dir . $table_name . '.zip';
echo "Обрабатываю таблицу: $table_name\n";
// Создаем дамп таблицы
$result = pg_query($conn, "SELECT * FROM $table_name");
if (!$result) {
echo "Ошибка при выборке данных из таблицы $table_name: " . pg_last_error($conn) . "\n";
continue;
}
// Получаем имена полей
$fields = [];
$num_fields = pg_num_fields($result);
for ($i = 0; $i < $num_fields; $i++) {
$fields[] = pg_field_name($result, $i);
}
// Открываем файл для записи
$file = fopen($dump_file, 'w');
if (!$file) {
echo "Не удалось создать файл $dump_file\n";
continue;
}
// Пишем SQL-запросы в файл
fwrite($file, "-- Дамп таблицы $table_name\n");
fwrite($file, "INSERT INTO $table_name (" . implode(', ', $fields) . ") VALUES\n");
$first_row = true;
while ($row = pg_fetch_assoc($result)) {
if (!$first_row) {
fwrite($file, ",\n");
}
$first_row = false;
// Экранируем значения
$values = array_map(function($value) use ($conn) {
return $value === null ? 'NULL' : "'" . pg_escape_string($conn, $value) . "'";
}, $row);
fwrite($file, "(" . implode(', ', $values) . ")");
}
fwrite($file, ";\n");
fclose($file);
// Архивируем файл
$zip = new ZipArchive();
if ($zip->open($zip_file, ZipArchive::CREATE) === TRUE) {
$zip->addFile($dump_file, basename($dump_file));
$zip->close();
// Удаляем исходный файл после архивации
if (file_exists($zip_file)) {
unlink($dump_file);
echo "Таблица $table_name успешно заархивирована: $zip_file\n";
} else {
echo "Ошибка при создании архива для $table_name\n";
}
} else {
echo "Не удалось создать ZIP-архив для $table_name\n";
}
}
echo "Дамп всех таблиц успешно создан и заархивирован!\n";
} catch (Exception $e) {
echo "Ошибка: " . $e->getMessage() . "\n";
} finally {
if (isset($conn)) {
pg_close($conn);
}
}
?>

Как использовать скрипт:

Замените параметры подключения к БД на свои:

$db_host, $db_port, $db_name, $db_user, $db_pass

Убедитесь, что:

  • У вас есть права на чтение всех таблиц в БД
  • PHP имеет права на запись в указанную директорию ($backup_dir)
  • Установлено расширение ZipArchive (обычно входит в стандартную поставку PHP)

Запустите скрипт через командную строку или браузер

Особенности скрипта:

  • Создает SQL-дамп каждой таблицы с INSERT-запросами
  • Правильно экранирует специальные символы в данных
  • Архивирует каждый дамп в отдельный ZIP-файл
  • Удаляет исходные SQL-файлы после успешной архивации
  • Обрабатывает NULL-значения корректным образом

Для больших таблиц можно добавить пакетную обработку (разбивку на несколько INSERT-запросов), чтобы избежать проблем с памятью.