Навигация
|
Найти и остановить выполнение проблемных запросов в PostgreSQLНайти и остановить выполнение проблемных запросов в PostgreSQL В статье приведены примеры поиска блокировок и проблемных запросов 1. Найдите pid PostgreSQL: Чтоб отменить запрос, нужно знать pid для соединения, на котором он запущен Например, попробуйте этот запрос: substr ограничивает отображаемый текст SQL до 100 символов Теперь у вас есть pid, можете остановить нужный запрос 2. Завершить или отменить процесс PostgreSQL имеет две функции остановки запросов «Жесткая» функция — pg_terminate_backend: «Мягкая» функция — pg_cancel_backend: Есть два отличия, которые делают pg_terminate_backend «жестче». Во-первых, pg_terminate_backend полностью останавливает процесс, заставляя соединение закрываться. Напротив, pg_cancel_backend прерывает только выполняющийся запрос, оставляя соединение открытым. Во-вторых, pg_terminate_backend применяется немедленно*, в то время как pg_cancel_backend может быть отложен в определенных точках жизненного цикла процесса бэкэнда. По умолчанию я использую pg_terminate_backend. Обычно, когда мне нужно остановить запрос, я хочу остановить весь процесс приложения, который его запустил, откатить все изменения данных и снять все блокировки. Обнаружение надоедливых выполняющихся запросов Если вы хотите остановить более одного запроса, может быть обременительно запускать pg_terminate_backend() для них по одному. Запросы, блокирующие определенный процесс Например, недавно я работал над приложением с несколькими длительными транзакциями, которые блокировали миграцию базы данных. Вы можете найти заблокированный pid ALTER TABLE с помощью запроса к pg_stat_activity следующим образом: При наличии заблокированного pid вы можете использовать этот запрос с pg_blocking_pids для генерации SQL-кода для завершения блокирующих процессов: Чтобы выполнить этот запрос, замените blockedpid на pid заблокированного процесса. Затем скопируйте и вставьте выходные строки и запустите их. Запросы к определенной таблице Иногда вам может понадобиться просто завершить все запросы, запущенные к определенной таблице. Этот запрос сгенерирует SQL для завершения всех запущенных запросов, которые выглядят будто они используют определенную таблицу с именем auth_user: Чтобы использовать этот запрос, измените имя сопоставленной таблицы в LIKE '%auth_user%' перед его запуском. Сопоставление запросов с LIKE немного грубовато, так как есть вероятность ложных срабатываний, но это просто. Подключения открыты дольше N секунд Отфильтровать подключения, которые открыты дольше N секунд. Это довольно тупой молоток, но вы можете попробовать его в экстренных случаях. По необходимости измените «20 seconds».
Комментарии пользователей Эту новость ещё не комментировалиНаписать комментарий Анонимам нельзя оставоять комментарии, зарегистрируйтесь! |
Контакты Группа ВК | Код обмена баннерами | Видео к IT статьям на YoutubeВидео на другие темы Смотреть | |||
Мои друзья: | © Snakeproject.ru создан в 2013 году.При копировании материала с сайта - оставьте ссылку.Весь материал на сайте носит ознакомительный характер,за его использование другими людьми, автор ответственности не несет. |
||||
Поддержать автора и проект
|