сервера на другой postgres. Прямой связи между серверами нет, и есть отсечка 30 секунд на запрос, так что не получается вытащить таблицу в один приём. Таблица источник постепенно наполняется.
Из инструментов питон и аирфлоу. Можно ли как-то вытащить таблицу по кускам, чтобы получилась точная копия источника? Заранее спасибо.
Насколько закрыт для общения тот постгрес? Может имеет смысл запросить тех учётку для выгрузки и согласовать регламент?
Можно попробовать. Просто я погуглил и не нашёл какого-то золотого стандарта, как это реализовано. Я пробовал сделать order by ctid и через цикл вытаскивать по 1к записей limit chunk_size offset i*chunk_size. Но итоговый датасет не совпадает с оригинальным по количеству строк. 🙈
Если у тебя источник проапдейтится после отправки данных на приёмник, ты что будешь делать? Это же про репликацию задача? ЗЫ Если данные на источнике апдейтятся-дилитятся, аирфлоу не поможет кмк
А что параллельно нельзя вызвать 100500 jdbc запросов? Главное их разбить сначала и все
можно ещё попробовать такое: используя контекстный менеджер открывать файл, обернуть запрос в copy-команду и лить данные потоком в этот файл (to stdout), при этом, если в таблице есть поле, похожее на id, - итерироваться по нему в цикле, создавая новые подключения каждые n-строк. В postgres скорее всего автоматом создан индекс по id, поэтому работать должно нормально
Самый нормальный и рабочий вариант - это выбирать данные по ключу или попросить на источнике сделать дату добавдения записи в таблицу (тех поле), обычно это решает множество проблем. Главное чтобы дата генерилась самой постгрей а не бэкендом подставлялась Если этого нет и таблица не прям большая можно попробовать курсоров вытаскивать данные и перекладывать их в другую постгрю. Но это уже от беысходности ctid низя использовать - это физический адрес строки, он вроде может меняться и его точно низя юзать для инкрементального забора. Данные могут в "середине" появиттся.
Обсуждают сегодня