Merhaba,
Bu yazımızda postgreSQL veritabanı corruption(bozulma) ile ilgili bilgiler vermeye çalışacağız. Tüm veritabanlarında olduğu gibi PostgreSQL veritabanında da bazı sebeplerden dolayı bozulmalar olabilmektedir. Bu bozulmalar en aza indirebilmek için alınması gereken bazı aksiyonları açıklamaya çalışacağız. Donanım ve OS ile ilgili bileşenler yazımız konusu dışındadır, bu bileşenlerin sağlıklı olduğu varsayılmıştır.
1- Veritabanınızı daima güncel tutmaya çalışın. Özellikle minor versiyon güncellemelerini ertelememeye çalışın. Aslında minor upgrade veritabanı restart işleminden ibaret olduğu için oldukça basittir. Mutlaka yeni versiyon dökümanlarınlarını da inceleyin.
2- Veritabanı ile ilgili yüksek kaynak kullanımı olduğunda veya veritabanı cevap vermemeye başladığında hızlı aksiyon olarak kill -9 komutunu kesinlikle kullanmamaya çalışın. Onun yerine pg_terminate_backend,pg_cancel_backend ile process’leri durdurmayı çalışın.
3- Kesinlikle postmaster.pid dosyasını silmeyin. Ayrıca data dizini altından bilmediğiniz hiçbir dosyayı silmeyin. Tabiki log dizinlerinde gerekli silme işlemlerini yapabilirsiniz ama bilinçli bir şekilde silme işlemi yaptığınızdan emin olun.
4- Cluster kurarken mutlaka checksum aktif olacak şekilde aşağıdaki gibi kurmalısınız,aksi takdirde veritabanınız güvensiz çalışacaktır.
[postgres@pgforenda01 ~]$ /usr/pgsql-12/bin/initdb -D pgdata --data-checksums
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are enabled.
creating directory pgdata ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Europe/Istanbul
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
/usr/pgsql-12/bin/pg_ctl -D pgdata -l logfile start
Hali hazırda çalışan sistemlerde aşağıdaki çıktı ile de kontrol edebilirsiniz,1 olması checksum aktif durumda demektir:
[postgres@pgforenda01 ~]$ /usr/pgsql-12/bin/pg_controldata pgdata|grep checksum
Data page checksum version: 1
[postgres@pgforenda01 ~]$
5- Veritabanınızdaki işlemlerin diske yazıldığının garantisini sağlayan fsync parametresi mutlaka açık olmalıdır. Bazı durumlarda sırf performans kazancı sağlamak için kapattıysanız beklenmedik sistem crash anlarında veri kaybı yaşayabileceğinizi unutmayın. Parametre kontrolünü aşağıdaki gibi yapabilirsiniz:
postgres=# show fsync;
fsync
-------
on
(1 row)
postgres=#
6- Daha önceki wal_compression ile ilgili yazımızda full_page_writes parametresinin ne işe yaradığından biraz bahsetmiştik. Eğer bu parametre kapalı olursa sistem crash anında ilgili page’in önceki ve yeni hali arasında parçalı yazma karmaşası yaşanacak ve bu da corruption’a sebebiyet verebilecektir. Eğer bu parametre açık olursa değişikliğin yapıldığı tüm page wal dosyasında olacağından sistem açıldığında wal dosyasından recover yapılacak ve herhangi bir karmaşa olmayacaktır.
7- Mutlaka pg_dump file mantıksal yedek de almayı atlamayın, eğer corruption varsa mantıksal yedek alırken ortaya çıkacaktır,bu sayede corruption önceden tespit edilmiş olur. Yedekleme olarak checksum desteği olan bir araç kullanabilirsiniz. Mesela pgBackRest checksum özelliğini aktif ederek sağlıklı yedek aldığınızdan emin olabilirsiniz.
8- Emin olmadan kesinlikle sistem catalog tablolarına INSERT/UPDATE/DELETE işlemleri yapmayın.
9- PostgreSQL veritabanı dosyalarınızı mümkünse network file system üzerinde çalıştırmayın.
Umarız ihtiyacınız olmaz ama olurda herhangi bir corruption ile karşılaşırsanız ignore_checksum_failure,zero_damaged_pages,ignore_system_indexes gibi parametreleri, amcheck,pageinspect gibi eklentileri önceden incelemeniz faydalı olabilir, sorun anında hızlı aksiyon alabilirsiniz. Ek olarak PG11 ile pg_verify_checksums ve PG12 ile pg_checksum özelliğini de incelemenizi tavsiye ederiz.
Bir başka yazımızda pg_resetwal / pg_resetxlog işleminden bahsetmeye çalışacağız.
Faydalı olması dileğiyle.
dba@forenda.com.tr