Memperbaiki registry.db MacPorts Yang Rusak

4 minutes 220 1

Saya pengguna MacPorts, salah satu package manager di sistem operasi Mac OSX. Saya memilih menggunakan MacPorts salah satunya adalah kelengkapan paket-paket aplikasinya, juga ketersediaan repositorinya di Indonesia, terutama di UGM Jogja.

MacPorts

Namun salah satu hal yang sering dilakukan MacPorts adalah dia harus diperbaharui repositorinya secara berkala. Biasanya akan muncul permintaan saat kita menggunakan perintah port. Perintah pembaruan ini adalah port selfupdate.

Nah, ketika saya melakukan port selfupdate, saat di tengah proses tiba-tiba Macbook Pro saya hang — Mac juga bisa hang! — sehingga terpaksa saya melakukan shut-down. Akibatnya, file /opt/local/var/macports/registry/registry.db menjadi rusak.

Saat melakukan perintah port, muncul pesan kesalahan seperti berikut:

sqlite error: database disk image is malformed (11) while executing query: ATTACH DATABASE '/opt/local/var/macports/registry/registry.db' AS registry
    while executing
"registry::open $db_path"
    (procedure "mportinit" line 592)
    invoked from within
"mportinit ui_options global_options global_variations"
Error: /opt/local/bin/port: Failed to initialize MacPorts, sqlite error: database disk image is malformed (11) while executing query: ATTACH DATABASE '/opt/local/var/macports/registry/registry.db' AS registry

Saya pun googling dan mencoba mencari cara memperbaiki hal ini. Salah satu cara saya peroleh dari sini, yaitu dengan “masuk” ke file registry.db yang merupakan file database SQLite3. Namun cara ini tidak berhasil.

Saya kemudian menemukan cara bagaimana memperbaiki integritas file SQLite3 yang rusak dari blog Niklass Ottosson. Saya memodifikasi perintah di blog tersebut menjadi kira-kira seperti berikut:

$ sudo sqlite3 /opt/local/var/macports/registry/registry.db
sqlite>.output /opt/local/var/macports/registry/registry-dumped.db
sqlite>.dump
sqlite>.quit
$ sudo mv /opt/local/var/macports/registry/registry.db /opt/local/var/macports/registry/registry-damaged.db
$ sudo sqlite3 /opt/local/var/macports/registry/registry.db
sqlite>.read /opt/local/var/macports/registry/registry-dumped.db
sqlite>.quit

Kemudian cek integritas data dengan perintah:

$ sudo sqlite3 /opt/local/var/macports/registry/registry.db "pragma integrity_check"

Jika hasilnya OK maka bisa melanjutkan ke langkah berikutnya, yaitu memeriksa menggunakan perintah port update. Periksa juga semua paket yang terinstal apakah ada yang tidak terdeteksi atau tidak, dengan perintah port installed.

Namun sayangnya, saya mendapatkan pesan kesalahan seperti ini saat melakukan port installed:

Error: port installed failed: sqlite error: no such table: ports (1) while executing query: SELECT id FROM ports WHERE (state='imaged' OR state='installed')
No ports are installed.

Dugaan saya, pesan kesalahan ini terjadi karena tabel ports rusak atau hilang, sehingga paket aplikasi yang terinstal tidak terdaftar, meski aplikasi tersebut berjalan normal.

Hingga saat ini, saya belum berhasil menemukan cara mengembalikan entry paket aplikasi yang terinstal tersebut ke dalam registry MacPorts.

Hmm.. Sepertinya sudah saatnya saya berpindah ke Homebrew.

1 response
  1. Gravatar of Brennan
    Brennan

    yang sayang banget kalo macportsnya ga bisa dibenerin 🙁