2016-02-28 5 views
3

В моей работе мне нужно было создать новую таблицу соединений в базе данных postgresql, которая включала бы много вычислений на две существующие таблицы. Процесс должен был занять много времени, поэтому я поставил его на работу в выходные, пока не ушел в пятницу. Теперь я хочу проверить, завершен ли запрос или нет.Postgresql Проверьте, все еще запущен запрос

Как проверить, завершена ли команда INSERT, пока она не находится на компьютере, на котором я запускал ее? (Нет, я не знаю, сколько строк было предположить, чтобы добавить.)

+1

Проверить pg_stat_activity – Dave

+0

Вот пример http://www.postgresql.org/message-id/[email protected] – quasoft

ответ

5
Select * from pg_stat_activity where state not ilike 'idle%' and query ilike 'insert%' 

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

pg_stat_activity doc

+1

Лучше использовать ILIKE (тем более, что SQL-соглашение должно использовать заглавные слова). Также обратите внимание, что не все пользователи получат разрешение на просмотр столбца запроса, связанного с другими пользователями (он будет отображаться как NULL), но OP все равно сможет распознать свой запрос с помощью remote_addr или аналогичного. – Dave

+0

@Dave, спасибо за синтаксическую коррекцию на 'ilike'. Однако очень верно для всех учетных записей, если это так, я уверен, что DBA можно попросить проверить ... – jkdba

2

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

В https://gist.github.com/rgreenjr/3637525 там является примером для копирования, каким может выглядеть такой запрос.

+0

Что касается вашей идеи подсчета для отслеживания текущего состояния: В зависимости от вашего [уровня изоляции] (http://www.postgresql.org/docs/current/static/transaction-iso.html), возможно, даже не возможно увидеть вставленные данные, прежде чем передавать их в базу данных. –

+0

Это будет ** никогда ** не возможно увидеть вставленные данные (из другой транзакции) до его совершения. Postgres не разрешает грязные чтения. –