Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1WiPCN-0006us-46 for pgsql-admin@arkaria.postgresql.org; Thu, 08 May 2014 14:21:23 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1WiPCM-0002sb-F8 for pgsql-admin@arkaria.postgresql.org; Thu, 08 May 2014 14:21:22 +0000 Received: from makus.postgresql.org ([2001:4800:7903:4::125]) by malur.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1WiPCJ-0002oL-TM for pgsql-admin@postgresql.org; Thu, 08 May 2014 14:21:20 +0000 Received: from dime159.dizinc.com ([66.7.216.77]) by makus.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1WiPCG-0003eZ-U3 for pgsql-admin@postgresql.org; Thu, 08 May 2014 14:21:19 +0000 Received: from [200.32.232.86] (port=11654 helo=[10.12.0.131]) by dime159.dizinc.com with esmtpsa (TLSv1:DHE-RSA-AES128-SHA:128) (Exim 4.80) (envelope-from ) id 1WiPCF-0007rJ-SZ; Thu, 08 May 2014 10:21:16 -0400 Message-ID: <536B92D8.3020204@turnkey.bz> Date: Thu, 08 May 2014 08:21:12 -0600 From: "M. D." User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Stephen Frost CC: "pgsql-admin@postgresql.org" Subject: Re: table locking on creating FK References: <536AA329.9030908@turnkey.bz> <20140508005417.GG2556@tamriel.snowman.net> In-Reply-To: <20140508005417.GG2556@tamriel.snowman.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - dime159.dizinc.com X-AntiAbuse: Original Domain - postgresql.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - turnkey.bz X-Source: X-Source-Args: X-Source-Dir: X-Pg-Spam-Score: -0.0 (/) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-admin Precedence: bulk Sender: pgsql-admin-owner@postgresql.org On 05/07/2014 06:54 PM, Stephen Frost wrote: > Mark, > > * M. D. (lists@turnkey.bz) wrote: >> Why does a table lock up if I want to create a FK to it? e.g. I >> have a separate schema for my own mods to the database but if I want >> to reference anything in the public schema on a customer table, that >> table will be locked up. > That's correct, creating a foreign key to a table requires an > AccessExclusiveLock on the referred-to table. > >> Why does a table lockup when disabling a trigger on it? > For both of these, the issue is that we have to make sure every backend > has the same view of the table and all triggers, etc, which exist on the > table. There is ongoing work to reduce lock levels where possible, now > that PG accesses the catalogs using MVCC semantics (which was not true > previously), but I wouldn't get your hopes up on these changing. > >> I just tried this on a live database, and ended up restarting the >> postgres service because the whole table was locked and no users >> were able to do anything. > You would need to simply kill the transaction which held the locks, > using pg_terminate_backend(). > >> I guess I'm dumb (or stupid) to try it in production, but I wanted >> to create an index on an audit table, so I knew enough that I would >> have to disable the audit trigger before I could create an index on >> a 1.8 million row table. Then the main gltx table locked up on >> disabling the trigger. I found the pid of the process by doing >> this: > You might want to investigate the 'CONCURRENTLY' option of CREATE INDEX. > >> select * from pg_stat_activity where query ilike '%trigger%'; >> >> Then tried to cancel the query using this: >> >> select pg_cancel_backend(17069); > pg_cancel_backend() will cancel a running *query* but it does not > terminate the transaction. Locks are held until the end of a > transaction. You likely wanted 'pg_terminate_backend()', as mentioned > above, which would have both rolled back the transaction and termianted > the database connection. > >> But that did not happen within 1 min, and with 90 sales people all >> waiting on this server, I did a kill -9 on that pid to get everyone >> back as soon as possible. This caused a bunch of "terminating >> connection because of crash of another server process" errors in >> pg_log, but I don't see anything serious after that. > Doing a -9 against a PG server is a very bad idea- don't do it. Use > pg_terminate_backend(). > >> Is there any way to recover from a locked situation like this? > In general, I'd suggest you avoid trying to do DDL without a proper > outage window or at least only during non-peak times and only once you > have a good understanding of what locks will be taken out, and for how > long, during your DDL work. > > Note also that the way locking is done in PG, once someone wants a > higher lock on a table, everyone else wanting locks on the table have to > wait (even if the table is only currently locked at the lower level). > This avoids the higher-level lock process being stalled forever but does > mean those locks have a high impact on the running system. > > Thanks, > > Stephen Thank you --- I'm very grateful for such a clear description and help. The FK creation was something I had tried before and knew not to do again, but I did not think that disabling the trigger would do the same. Thanks again. I'll tag this for myself as reference. -- Sent via pgsql-admin mailing list (pgsql-admin@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-admin