LINUX.ORG.RU

остановить postgresql сервер

 


1

1

есть postgresql сервер, есть куча коннектов к нему от приложений с insert в одну таблицу в какой-то момент мы сообщаем приложениям что insert больше делать не нужно, но это сообщение может запоздать и кто-то все же может сделать insert. можно заставить приложения перед insert проходить через некий глобальный mutex но это не вариант. я сейчас делаю lock table после чего никакой insert не пройдет и дальше нужно либо дергать какой-то скрипт с iptables закрывающий порт либо стопать сервер (боюсь что при стопе lock отпустится раньше чем возможный залоченный insert и insert успеет отработать) либо скажем менять на лету порт или какое-то свойство в сервере. как бы это сделали вы?

★★

боюсь что при стопе lock отпустится раньше чем возможный залоченный insert и insert успеет отработать

SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query ILIKE 'INSERT%';
deadNightTiger ★★★★★
()
Ответ на: комментарий от anonymous

А если переименовать таблицу?

да спасибо, я то-же думал об этом может есть еще какой-то более красивый вариант средствами postgresql?

quester ★★
() автор топика
Ответ на: комментарий от quester

Тогда после лока сделай pg_ctl stop -m smart

И вместо pg_cancel_backend делай pg_terminate_backend

deadNightTiger ★★★★★
()
Последнее исправление: deadNightTiger (всего исправлений: 1)

остановить postgresql сервер

Первым делом вырвать сетевой кабель.

Потом вытащить шнур питания. Будь предельно осторожен, ибо электричество!

Потом поднять сервер на полтора-два метра ввысь и опустить, чтоб он рухнул на пол.

Всё, postgresql сервер остановлен, угроза миновала, можно возвращаться к мене важным делам.

anonymous
()

1. create trigger before insert ...

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

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

что должен делать триггер?

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

переименование таблицы работает с lock, висящий параллельно insert обламывается.

может есть еще более красивые идеи?

quester ★★
() автор топика
Ответ на: комментарий от anonymous

Первым делом вырвать сетевой кабель.

выше я говорил о том чтобы вызвать скрипт в котором iptables закрыть порт

quester ★★
() автор топика

Я бы избегал всяких косвенных методов, типа iptables и старался держаться поближе к логике sql. Вариант 1:

REVOKE INSERT ON TABLE tablitsa FROM vstavlalshik;

Вариант 2:

ALTER TABLE tablitsa
	DROP CONSTRAINT IF EXISTS  stop_right_now,
	ADD CONSTRAINT stop_right_now NOT VALID
		CHECK ( date < "30.05.2017 21:44:19" );

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Вау! Спасибо за идею именно вашего ответа я ждал (про средства самого postgres)! Спасибо!

quester ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.