Name Last Update
log2db Loading commit data...
log_table Loading commit data...
maintenance Loading commit data...
mirror_status Loading commit data...
.gitignore Loading commit data...
CHANGES.txt Loading commit data...
MANIFEST.in Loading commit data...
README.rst Loading commit data...
log2db.ini Loading commit data...
maintenance.ini Loading commit data...
setup.py Loading commit data...

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.