PostgreSQL'de Sorunsuz DDL Değişiklikleri

Production veritabanlarında yüksek işlem hacmi olduğu için yani saniyede binlerce sorgu gelmesinden dolayı DDL değişikliklerini kafanıza göre yapmamalısınız. Kontrolsüzce yaptığınız değişiklikler tablolara lock koyacağı için gelen sogrular istenmeyen bir şekilde beklemek durumunda kalacaklardır. Bu da sisteminizin çalışmasında sorunlara yol açabilir.

Değişiklik yaparken nelere dikkat etmeliyiz? Nasıl yapmalıyız?

  • Yapacağınız değişiklikleri her zaman tek bir transaction içinde yapmaya özen gösterin ( BEGIN; … COMMIT; )
  • Değişiklik yapacağınız tabloya gelen sorguları takip edin Aynı şekilde yapacağınız değişiklik başka tabloları da etkiliyorsa (foreign key ekleme gibi) bu tabloları da takip etmeyi ihmal etmeyin.
    Bu sorgu ile “TABLOADI” tablosuna üzerinde lock koyan bütün sorguları görebilirsiniz. SELECT pgclass.relname, pglocks.transactionid, pglocks.mode, pglocks.granted as "g", SUBSTR(pgstatactivity.query,1,30), pgstatactivity.querystart, AGE(NOW(),pgstatactivity.querystart) as "age", pgstatactivity.pid FROM pgstatactivity, pglocks LEFT OUTER JOIN pgclass ON (pglocks.relation = pgclass.oid) WHERE pglocks.pid=pgstatactivity.pid and pgclass.relname='TABLOADI' ORDER BY query_start;
  • Baktınız, sürekli SELECT, UPDATE, vb sorgular gelip gelip gidiyolar. UPDATE sorgularını sakın öldürmeyin, bekleyin bitsinler ama SELECT sorgularında daha gözü kara olabilir, gerekenleri öldürebilirsiniz. Örn: SELECT pgterminatebackend( pid );
  • Bu arada yapacağınız değişikliklerin listesini hazırlayın(\e), son tablo kontrolu yaptıktan ve temiz olduğunu gördükten sonra değişikliklerinizi yapabilirsiniz. Ardından göreceksiniz ki sizin DDL değişiklikleriniz için koyduğu locklar orada olacaklar. Gelen sorgular ise bekleme konumuna geçtiler ama değişiklikler sorunsuz bittikten sonra commit demediyseniz arayı fazla açmayın.
  • Değişiklikleriniz uzun sürüyorsa mutlaka üzerinde çalıştığınız tabloları kontrol edin. Tam değişikliği yapacakken araya bir sorgu girmesiyle, yapamıyor ve boşa bekliyor olabilirsiniz. DEFAULT tanımı içeren tablo değişiklikleriniz büyük tablolarda sizi gereğinden fazla bekletir çünkü DEFAULT değerleri koyarken aynı zamanda tablonuzu yeniden yazar. Güzel kısmı temiz, yeniden oluşturulmuş bir tabloya sahip olmanız, olumsuz kısmı ise çok bekletmesidir.

Erkin Çakar

PostgreSQL DBA & Software developer