Я пытаюсь выполнить большой запрос с использованием 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 была изменена во время выполнения запроса к реплике.Однако эта таблица не обновлялась месяцами.
Все это работает, когда я запускаю ее для основной базы данных (что я не могу сделать в рабочей среде) и когда я запускаю ее для небольших таблиц напрочитайте реплику.
Я в полном недоумении и буду признателен за любую помощь.