M

maintenance

Vacuum dan backup database PostgreSQL

Maintenance

Script ini untuk vacuum dan backup database PostgreSQL. Berikut cara memasangnya:

$ python3 -m venv env
$ env/bin/pip install --upgrade pip
$ env/bin/pip install git+https://git.opensipkd.com/sugiana/maintenance.git

Buat file konfigurasi maintenance.ini:

[main]
# Perintah yang dijalankan sebelum pg_dump
before =
    /usr/sbin/ntpdate -u ntp.ubuntu.com
    systemctl stop cron.service
    systemctl stop nginx.service

# Perintah yang dijalankan setelah pg_dump
after =
    systemctl start nginx.service
    systemctl start cron.service

pg_lib_dir = /usr/lib/postgresql
pg_conf_dir = /etc/postgresql

# Daftar database yang akan di-vacuum dan di-pg_dump
database =
    pbb
    bphtb
    pad

# Lokasi direktori hasil pg_dump
database_backup_dir = /var/backups/pg

# Jumlah masing-masing database yang tersimpan
database_rotate = 5

[formatter_generic]
format = %(asctime)s %(levelname)s %(message)s

[handler_console]
class = StreamHandler
stream = sys.stdout
formatter = generic

[handler_file]
class = FileHandler
filename = /var/log/maintenance.log
formatter = generic

[logger_root]
handlers = console, file
level = DEBUG

Sesuaikan baris database yang berisi nama database yang akan di-backup. Baris before biasanya diisi dengan perintah untuk menghentikan daemon yang menggunakan database, sedangkan baris after untuk menghidupkannya kembali setelah proses backup selesai.

Selanjutnya jalankan sebagai root:

$ sudo env/bin/maintenance maintenance.ini

Daftarkan di cron pada jam 1:45 saat dimana kegiatan transaksi jarang dilakukan. Contohnya di /etc/cron.d/maintenance berikut ini:

MAILTO=""
45 1 * * * root cd /home/sugiana/2020/08 && env/bin/maintenance maintenance.ini >/dev/null 2>&1

Log Table

Ini merupakan bagian dari skenario backup dimana setiap perubahan record akan dicatat di tabel log_table baik saat INSERT, UPDATE, maupun DELETE. Bekerja menggunakan trigger di setiap tabel yang akan dicatat.

Buatlah file konfigurasi live.ini:

[main]
db_url = postgresql://user:pass@localhost/db

Buat tabel beserta fungsi trigger:

$ ~/env/bin/log_table_init_db live.ini

Tetapkanlah tabel yang akan dicatat perubahannya. Utamanya tabel terkait transaksi dan user profile:

$ ~/env/bin/log_table_trigger live.ini --schema=pbb --table=pembayaran_sppt

Log File to Database

Script ini digunakan untuk menyimpan baris-baris pada log file menjadi sebuah record pada tabel log_file. Jika pada log file terdapat beberapa baris yang sebenarnya sebuah satu-kesatuan seperti pada Python exception maka akan disimpan ke dalam sebuah record saja.

Buatlah databasenya terlebih dahulu, lalu buat file konfigurasi log2db.ini:

[main]
db_url = postgresql://user:pass@localhost:5432/db
abaikan_error =
    nilai kunci ganda
    duplicate key

Buat tabelnya:

$ ~/env/bin/log2db_init log2db.ini

Buat init script-nya di /etc/systemd/system/log2db.service:

[Unit]
Description=Log file to database
After=postgresql.service

[Service]
Type=simple
User=webr
ExecStart=/home/webr/env/bin/log2db /home/webr/log2db.ini --log-file=/home/webr/log/pserve.log
Restart=on-abort

[Install]
WantedBy=multi-user.target

Aktifkan:

$ sudo systemctl enable log2db.service
$ sudo systemctl start log2db.service

Tabel log_file akan terisi jika ada penambahan baris setelah daemon dihidupkan. Kalau ingin menyimpan baris-baris sebelumnya maka jalankan ini, biarkan daemon itu tetap berjalan:

$ ~/env/bin/log2db /home/webr/log2db.ini --log-file=/home/webr/log/pserve.log --run-and-stop

Jangan khawatir untuk menjalankannya berkali-kali karena setiap barisnya dianggap unik di tabel log_file.

Semoga berhasil.