Sobes.tech
Middle — Middle+

Hoe kan je een grote hoeveelheid gegevens in de database bijwerken of corrigeren met een script, zonder het risico te lopen deze te verliezen of ontoegankelijk te maken?

sobes.tech AI

Antwoord van AI

Для обновления большого объема данных в базе через скрипт без риска потери данных или недоступности стоит использовать подходы, минимизирующие нагрузку и обеспечивающие атомарность:

  • Транзакции: Оборачивайте обновления в транзакции, чтобы изменения были либо полностью применены, либо не применены вовсе.
  • Пакетная обработка: Делите обновления на небольшие батчи (например, по 1000 записей), чтобы не блокировать таблицы долгое время.
  • Использование индексов: Перед обновлением убедитесь, что условия WHERE используют индексы, чтобы ускорить выборку.
  • Резервное копирование: Перед запуском скрипта сделайте бэкап базы.
  • Режимы блокировок: Используйте уровни изоляции транзакций, подходящие для вашей СУБД, чтобы избежать блокировок.
  • Логирование и откат: В случае ошибки скрипт должен корректно откатывать изменения.

Пример на PHP с PDO и пакетной обработкой:

$pdo->beginTransaction();
try {
    $batchSize = 1000;
    $offset = 0;
    do {
        $stmt = $pdo->prepare('SELECT id FROM table LIMIT :limit OFFSET :offset');
        $stmt->bindValue(':limit', $batchSize, PDO::PARAM_INT);
        $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
        $stmt->execute();
        $ids = $stmt->fetchAll(PDO::FETCH_COLUMN);

        if (!$ids) break;

        $updateStmt = $pdo->prepare('UPDATE table SET column = :value WHERE id = :id');
        foreach ($ids as $id) {
            $updateStmt->execute([':value' => 'new_value', ':id' => $id]);
        }

        $offset += $batchSize;
    } while (count($ids) === $batchSize);
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    throw $e;
}

Такой подход позволяет контролировать нагрузку и гарантирует целостность данных.