Потоковая передача больших результирующих наборов из реплики RDS postgres read и sqlalchemy преждевременно завершается - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь выполнить большой запрос с использованием SQLAlchemy со следующим кодом на сервере Postgres 9.4 RDS, настроенном как реплика чтения.

    # self.sa_engine is a SQLAlchemy engine
    with self.sa_engine.connect() as conn:
        conn = conn.execution_options(stream_results=True)

        # pd = pandas
        # self.sql = "select * from mylargetable"
        for chunk in  pd.read_sql(self.sql, conn, chunksize=50000):
            # do stuff, write file, etc....

Проблема в том, что примерно через 30-60 секунд я получаю следующую ошибку.В течение этого времени файлы записываются как положено.

TransactionRollbackError: terminating connection due to conflict with recovery
DETAIL:  User query might have needed to see row versions that must be removed.

Все, что я гуглил, говорит об установке следующих параметров для реплики чтения в RDS:

hot_standby_feedback=1
max_standby_archive_delay=600000
max_standby_streaming_delay=600000

С этими параметрамиустановить, я ожидал бы получить вышеуказанную ошибку, только если запрос выполнялся дольше 10 минут, но я получаю его через 30-60 секунд.

Кроме того, мое понимание этой проблемы заключается в том, что она возникнет только в том случае, если таблица в базе данных master была изменена во время выполнения запроса к реплике.Однако эта таблица не обновлялась месяцами.

Все это работает, когда я запускаю ее для основной базы данных (что я не могу сделать в рабочей среде) и когда я запускаю ее для небольших таблиц напрочитайте реплику.

Я в полном недоумении и буду признателен за любую помощь.

1 Ответ

0 голосов
/ 27 ноября 2018

Сразу после того, как задал этот вопрос, я искал параметры, которые были установлены на 30 секунд по умолчанию, и нашел решение.Есть еще один параметр, который я должен был отрегулировать:

wal_receiver_timeout=600000

Настройка, которая добилась цели!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...