2014-07-14 13 views
5

szukam upuścić aktualnie w spuście produkcji, bo to nie jest już potrzebna, ale problemem jest to, że gdy próbuję najprostszy sposób, który jest czymś w rodzajuJak upuść wyzwalacz w sprężysty sposób w PostgreSQL

drop trigger <triggername> on <tablename> 

To spowodowało ogromną blokadę stołu i wszystko zamarło!

Co wyzwalacz jest:

Podczas wstawiania wiersza lub aktualizacji, należy sprawdzić zawartość w polu, podzielić ją i wypełnić innej tabeli.

W jaki sposób należy natychmiast wyłączyć (i upuścić) nie powodując problemów w naszym środowisku produkcyjnym?

Z góry dziękuję i przepraszam za mój angielski;)

Odpowiedz

7

można spróbować ALTER TABLE ... DISABLE TRIGGER - ale to wymaga takiej samej wytrzymałości zamka, więc nie sądzę, żeby to zrobić ci wiele dobrego.

W PostgreSQL 9.4 jest praca, która powoduje, że ALTER TABLE pobiera słabsze blokady dla niektórych operacji. To może pomóc w tym.

W międzyczasie musiałbym CREATE OR REPLACE FUNCTION zastąpić wyzwalacz prostą funkcją "no-op".

Następnie, aby faktycznie spaść spust, to bym pewnie napisać skrypt, który wykonuje:

BEGIN; 
LOCK TABLE the_table IN ACCESS EXCLUSIVE MODE NOWAIT; 
DROP TRIGGER ...; 
COMMIT; 

Jeśli ktoś używa tabeli skrypt przerwie na LOCK TABLE.

Następnie uruchomiłbym go w pętli, aż do skutku.

Jeśli to nie działa (jeśli stół jest zawsze zajęty), ale jeśli większość transakcji były bardzo krótkie, mogę próba LOCK TABLE bez NOWAIT, ale ustawić krótki statement_timeout. Tak więc skrypt będzie wyglądał mniej więcej tak:

BEGIN; 
SET LOCAL statement_timeout = '5s'; 
LOCK TABLE the_table IN ACCESS EXCLUSIVE MODE NOWAIT; 
DROP TRIGGER ...; 
COMMIT; 

Zapewnia to dość krótkie zakłócenie przez niepowodzenie, jeśli nie jest w stanie ukończyć pracy na czas. Znowu bym go uruchamiał okresowo, aż to się uda.

Jeśli żadne z tych podejść nie przyniosło skutku - powiedzmy, z powodu wielu długotrwałych transakcji - prawdopodobnie po prostu zaakceptowałbym potrzebę zablokowania go na chwilę. Uruchomiłbym drop trigger, a następnie wszystkie transakcje równoległe, które utrzymywały blokady w tabeli, aby ich połączenia spadły, a ich transakcje zakończone. To pozwoliłoby, aby drop trigger postępowało szybko, kosztem większych zakłóceń. Możesz rozważyć takie podejście tylko wtedy, gdy twoje aplikacje są dobrze napisane, więc będą po prostu ponawiać próby transakcji na przejściowych błędach, takich jak spadki połączeń.

Innym możliwym podejściem jest wyłączenie (nie upuszczenie) wyzwalacza poprzez bezpośrednią modyfikację katalogów systemowych.

+3

Myślę, że 'NOWAIT' w twoim drugim zapytaniu SQL jest błędem. –

+0

Miło, wielkie dzięki za odpowiedź! Spróbuję tego krótko, ale dostarczone informacje są świetne i zawierają sposoby na osiągnięcie tego, czego potrzebuję! Niesamowite! – Krynble

+0

Po prostu dodając notatkę, uruchomiłem zapytanie i zadziałało jak czar! Spust natychmiastowy całkowicie odporny!Wielkie dzięki! – Krynble

Powiązane problemy