PHP скрипты для реставрации данных 1С-Битрикс
Варианты восстановления данных в 1С-Битрикс на PHP
Как восстановить данные из резервной копии с помощью встроенного класса CBitrixRestore?
Этот метод подходит, если у вас есть файл резервной копии, созданный модулем "Резервное копирование". Цель: полное восстановление базы данных и файлов сайта. Случаи использования: после сбоя, переезда на другой сервер, отката ошибочных изменений.
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Main\Backup\Restore;
$arParams = [
"BACKUP_FILE" => "/path/to/backup.tar.gz",
"RESTORE_TYPE" => "FULL", // или "DB", "FILES"
"EXCLUDE_TABLES" => ["b_event", "b_search_content"], // опционально
];
$restore = new Restore();
if ($restore->restore($arParams)) {
echo "Восстановление выполнено успешно.";
} else {
$errors = $restore->getErrors();
print_r($errors);
}
?>
Bitrix restore php (восстановление данных в битрикс на php)
Пояснение: класс Bitrix\Main\Backup\Restore позволяет указать путь к архиву, тип восстановления и таблицы для исключения. Метод restore возвращает true при успехе.
Типичные проблемы:
- Файл резервной копии не найден или повреждён. Решение: проверить путь и целостность архива.
- Недостаточно прав на запись в папки сайта. Решение: выставить права 755/644.
- Превышение времени выполнения скрипта. Решение: увеличить max_execution_time в php.ini или set_time_limit(0).
- Версия резервной копии не совпадает с версией ядра. Решение: обновить систему до соответствующей версии.
Как восстановить данные с помощью скрипта restore.php из штатной поставки?
В дистрибутиве 1С-Битрикс есть файл /bitrix/modules/main/admin/restore.php, который можно скопировать в корень сайта. Цель: быстрое восстановление без написания дополнительного кода. Случаи использования: когда нет доступа к админ-панели, но есть файлы.
# Скопировать restore.php в корень сайта
cp /path/to/bitrix/modules/main/admin/restore.php /var/www/html/restore.php
# Вызвать в браузере: http://yoursite.com/restore.php
# Далее следовать мастеру.
Restore php (восстановление данных в php)
Пояснение: скрипт запрашивает путь к архиву и параметры восстановления. После выполнения рекомендуется удалить restore.php.
Типичные проблемы:
- Скрипт не запускается из-за несоответствия версии. Решение: обновить restore.php из актуальной версии модуля.
- Ошибка из-за недостатка памяти. Решение: увеличить memory_limit в php.ini.
Как выполнить восстановление только базы данных через прямой SQL-запрос?
Если резервная копия базы представлена в виде SQL-дампа, можно восстановить её через PHP-скрипт, используя mysql или mysqli. Цель: восстановление структуры и данных без файлов. Случаи использования: при наличии только дампа базы, когда файлы не повреждены.
<?php
$host = 'localhost';
$user = 'bitrix';
$password = 'bitrix_pass';
$dbname = 'sitemanager';
// Подключение к MySQL без выбора БД для создания/восстановления
$conn = new mysqli($host, $user, $password);
if ($conn->connect_error) {
die("Ошибка подключения: " . $conn->connect_error);
}
// Чтение файла дампа
$sql = file_get_contents('/path/to/dump.sql');
if ($sql === false) {
die("Не удалось прочитать файл дампа.");
}
// Выбор базы данных
$conn->select_db($dbname);
// Выполнение SQL (разбиваем на запросы, чтобы избежать ошибок памяти)
$queries = explode(";\n", $sql);
foreach ($queries as $query) {
$query = trim($query);
if (!empty($query)) {
if ($conn->query($query) === false) {
echo "Ошибка в запросе: " . $conn->error . "
";
}
}
}
echo "Восстановление базы завершено.";
$conn->close();
?>
Пояснение: дамп выполняется по частям, чтобы не превысить лимит памяти. Желательно отключить проверку внешних ключей (SET FOREIGN_KEY_CHECKS=0).
Типичные проблемы:
- Большой дамп вызывает ошибку разрыва соединения. Решение: увеличить wait_timeout в MySQL.
- В дампе есть ссылки на таблицы, которые не существуют. Решение: убедиться, что дамп полный.
- Разные версии MySQL: может не совпадать синтаксис. Решение: использовать mysqldump с совместимыми опциями.
Как выполнить восстановление с помощью консольной утилиты BitrixEnv (bitrix restore)?
Если сервер использует BitrixEnv, доступна команда bitrix restore. Цель: автоматизированное восстановление всего сайта. Случаи использования: на выделенных серверах с BitrixEnv.
# Восстановление из последней резервной копии (созданной BitrixEnv)
sudo bitrix restore --full /var/backups/latest.tar.gz
# Только база данных
sudo bitrix restore --db /var/backups/db.sql
# Только файлы
sudo bitrix restore --files /var/backups/files.tar.gz
Пояснение: утилита автоматически обрабатывает конфигурацию веб-сервера и настройки БД. После восстановления требуется проверить работу сайта.
Типичные проблемы:
- Команда не найдена. Решение: утилита доступна только в BitrixEnv. Для обычного сервера использовать другие методы.
- Недостаточно прав (требуется root). Решение: выполнять через sudo.
Как выполнить восстановление модулей и конфигурации через API миграций?
Модуль "Миграции данных" (highloadblock) позволяет создавать скрипты восстановления структуры. Цель: точечное восстановление только изменённых сущностей. Случаи использования: при разработке и переносе изменений между окружениями.
<?php
use Bitrix\Highloadblock\HighloadBlockTable;
// Пример восстановления HL-блока по ID
$hlblockId = 1;
$hlblockData = HighloadBlockTable::getById($hlblockId)->fetch();
if ($hlblockData) {
$entity = HighloadBlockTable::compileEntity($hlblockData);
$entityClass = $entity->getDataClass();
// Вставка данных из резервного массива
$fields = ['UF_NAME' => 'Пример', 'UF_VALUE' => 100];
$result = $entityClass::add($fields);
if ($result->isSuccess()) {
echo "Добавлена запись с ID: " . $result->getId();
} else {
print_r($result->getErrorMessages());
}
}
?>
Пояснение: такой подход подходит для восстановления отдельных справочников или настроек, не затрагивая основную базу.
Типичные проблемы:
- Миграции не учитывают зависимости между таблицами. Решение: порядок выполнения важен.
- Ошибки из-за отсутствия обязательных полей. Решение: предоставить все необходимые данные.
// Пример с прогрессом восстановления
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Main\Backup\Restore;
$restore = new Restore();
$restore->setEventHandlers([
'onBeforeRestore' => function($params) {
echo "Начало восстановления...\n";
},
'onAfterRestoreTable' => function($tableName) {
echo "Восстановлена таблица: $tableName\n";
}
]);
$result = $restore->restore([
'BACKUP_FILE' => '/home/backups/backup_20250315.tar.gz',
'RESTORE_TYPE' => 'FULL',
]);
if (!$result) {
$errors = $restore->getErrors();
echo "Ошибки:\n" . implode("\n", $errors);
}
[Вывод:] Начало восстановления... Восстановлена таблица: b_user Восстановлена таблица: b_user_group ... Восстановление выполнено успешно.
// Восстановление базы из сжатого дампа с разбивкой на чанки
$file = '/path/to/dump.sql.gz';
$handle = gzopen($file, 'r');
$conn = new mysqli('localhost', 'bitrix', 'pass', 'db');
$sql = '';
while (!gzeof($handle)) {
$sql .= gzread($handle, 8192);
// Разделяем по ';' и выполняем каждую команду
while (($pos = strpos($sql, ';')) !== false) {
$query = substr($sql, 0, $pos+1);
$sql = substr($sql, $pos+1);
if ($conn->query($query) === false) {
echo "Error: " . $conn->error . " in query: " . substr($query,0,100) . "\n";
} else {
echo "OK\n";
}
}
}
gzclose($handle);
echo "Done.";
OK OK Error: Table 'b_event' already exists in query: CREATE TABLE b_event... ... Done.
// Восстановление через restore.php с передачей параметров через POST (если нужно автоматизировать)
// Сначала скопировать restore.php в корень, затем выполнить POST запрос:
$url = 'http://yoursite.com/restore.php';
$data = [
'path_to_backup' => '/var/backups/backup.tar.gz',
'type' => 'full',
'submit' => 'ok'
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
[Ответ от restore.php: страница с результатом процесса восстановления.]
// Комбинированное восстановление: сначала база, потом файлы из разных архивов
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Main\Backup\Restore;
$restoreDB = new Restore();
$restoreDB->restore(['BACKUP_FILE' => '/path/db.tar.gz', 'RESTORE_TYPE' => 'DB']);
$restoreFiles = new Restore();
$restoreFiles->restore(['BACKUP_FILE' => '/path/files.tar.gz', 'RESTORE_TYPE' => 'FILES']);
echo "Оба этапа завершены. Требуется очистка кеша.";
[Результат - выполнение без вывода ошибок.]
// Восстановление из архива, содержащего несколько точек (snapshots)
// Архив должен быть создан с поддержкой мульти-дампов.
$archiveFile = '/path/multipoint.tar.gz';
$restore = new Restore();
// Получение списка точек (гипотетически)
$points = $restore->getAvailablePoints($archiveFile);
// Выбор первой точки
$restore->setPoint($points[0]);
$restore->restore(['BACKUP_FILE' => $archiveFile]);
[При условии поддержки в классе Restore, иначе выбросит исключение.]