Postgresql вставляет остановку на случайном количестве записей - PullRequest
1 голос
/ 23 марта 2012

Я разрабатываю тестовое приложение, которое требует, чтобы я вставил 1 миллион записей в базу данных Postgresql, но в случайные моменты вставка останавливается, и если я пытаюсь перезапустить процесс вставки, приложение отказывается заполнять таблицу большим количеством записей. Я читал, что размер базы данных ограничен размером около 4 Гб, но я уверен, что моя база данных даже не приблизилась к этому значению.

Итак, какие еще причины могут быть вызваны тем, почему вставка остановлена?

Это происходило несколько раз, один раз с 170872 записями, в другой раз с 25730 записями.

Я знаю, что вопрос может показаться глупым, но я не могу найти других причин, по которым он перестает вставлять.

Заранее спасибо!

ПРОСТО БЫСТРОЕ ОБНОВЛЕНИЕ:

Действительно, проблема не в ограничении базы данных, вот официальные данные для PostgreSQL:

- Maximum Database Size                 Unlimited
- Maximum Table Size                    32 TB
- Maximum Row Size                      1.6 TB
- Maximum Field Size                    1 GB
- Maximum Rows per Table                Unlimited
- Maximum Columns per Table             250 - 1600 depending on column types
- Maximum Indexes per Table             Unlimited

Обновление:

Ошибка в файле журнала:

2012-03-26 12:30:12 ПРЕДУПРЕЖДЕНИЕ EEST: транзакция не выполняется

Так что я ищу ответ, который подходит к этой проблеме. Если вы можете дать какие-либо советы, я был бы очень признателен.

Ответы [ 4 ]

4 голосов
/ 23 марта 2012

Я читал, что размер базы данных ограничен 4 Гб

.

Я скорее сомневаюсь в этом. Это, конечно, не относится к PostgreSQL.

[...] в случайных точках вставка останавливается, и если я пытаюсь перезапустить процесс вставки, приложение отказывается заполнять таблицу большим количеством записей

Опять же, я боюсь, что сомневаюсь в этом. Если ваше приложение не осознает себя, оно отказывается ничего не делать. Это может быть сбой, или блокировка, или ожидание чего-то, что произойдет.

Я знаю, что вопрос может показаться глупым, но я не могу найти других причин, по которым он перестает вставлять.

Не думаю, что вы выглядели достаточно усердно. Очевидные вещи для проверки:

  1. Получаете ли вы какие-либо ошибки в журналах PostgreSQL?
  2. Если нет, вы уверены, что регистрируете ошибки? Выполните неверный запрос для проверки.
  3. Получаете ли вы какие-либо ошибки в приложении?
  4. Если нет, то. ты уверен, что проверяешь? Опять проверь
  5. Что такое компьютер (ы) до? Сколько ЦП / ОЗУ / дискового ввода-вывода используется? Любая необычная деятельность?
  6. Начинаются любые необычные блокировки (см. pg_locks представление).

Если вы задали вопрос, проверив вышеизложенное, то есть кто-то, кто сможет помочь. Возможно, вы сами все поймете, как только увидите факты.

1 голос
/ 26 марта 2012

ОК - если вы получаете «транзакция не выполняется», это означает, что вы выполняете фиксацию / откат, но за пределами явной транзакции.Если вы не введете «BEGIN», то каждый оператор получит свою собственную транзакцию.

Это вряд ли является причиной проблемы.

Что-то заставляет вставки останавливаться, иты еще не сказал нам что.Ранее вы говорили, что внутри приложения не было ошибок.Это не должно быть возможно, если PostgreSQL возвращает ошибку, которую вы должны обнаружить в приложении.

Трудно быть более полезным без более точной информации.Каждое утверждение, которое вы отправляете в PostgreSQL, возвращает код состояния.Если вы получили ошибку внутри транзакции с несколькими операторами, то все операторы в этой транзакции будут откатаны.У вас либо запутанный контроль транзакций в приложении, либо он падает по какой-то другой причине.

0 голосов
/ 28 марта 2012

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

Мое приложение разработано в Django и содержит команду, которая просто вызывает файл, который выполняет операции вставки в таблицы.

т.е. в терминале командной строки просто пишу:

time python manage.py populate_sql

Причина, по которой я использую команду time, заключается в том, что я хочу узнать, сколько времени занимает вставка. Ну, проблема была здесь. Эта команда time выдала ошибку, ошибку Out of memory, которая остановила вставку в базу данных. Я нашел этот маленький код во время выполнения команды с параметром - verbose , который позволяет увидеть все детали команды.

Я хотел бы поблагодарить вас всех за ваши ответы, за то, что я узнал от них, и за то время, которое вы использовали, пытаясь помочь мне.

EDIT:

Если у вас есть приложение Django, в котором вы выполняете много операций с базой данных, то я советую вам установить для переменной 'DEBUG' в settings.py значение 'FALSE. ', потому что он съедает много вашей памяти во времени.

Итак,

DEBUG = False

И, наконец, еще раз спасибо за поддержку Ричарда Хэкстона!

0 голосов
/ 26 марта 2012

Одна из возможностей заключается в том, что OP использует ssl, и достигается ssl_renegotiation_limit. В любом случае: установите для log_connections / log_disconnections значение «On» и проверьте файл журнала.

...