PHP скрипты для реставрации данных 1С-Битрикс

Раздел: 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, иначе выбросит исключение.]

Восстановление данных в Битрикс на PHP - comments

En
Bitrix restore php (php)