Ответ
Для синхронизации БД при переносе данных можно использовать несколько подходов:
- Транзакции - выполнять операции в транзакции, чтобы обеспечить атомарность:
tx, err := sourceDB.Begin()
if err != nil {
return err
}
defer tx.Rollback()
// Чтение из source
rows, err := tx.Query("SELECT * FROM table")
if err != nil {
return err
}
// Запись в target
for rows.Next() {
// ... обработка данных
_, err = targetDB.Exec("INSERT INTO table VALUES(...)")
if err != nil {
return err
}
}
return tx.Commit()
- Batch-обработка - разбивать данные на пачки для уменьшения нагрузки:
const batchSize = 1000
offset := 0
for {
rows, err := sourceDB.Query("SELECT * FROM table LIMIT ? OFFSET ?", batchSize, offset)
if err != nil {
return err
}
if !rows.Next() {
break
}
// Обработка батча
offset += batchSize
}
- Использование инструментов - pg_dump/mysqldump для SQL, или специализированных ETL-решений.
Для минимизации downtime можно:
- Сначала синхронизировать исторические данные
- Затем заблокировать запись в source на короткое время
- Перенести дельту изменений
- Разблокировать source и переключить приложение на target