Odoo Backup dan Restore Database Besar Lebih Dari 3 Giga

Odoo memiliki fungsi Backup dan Restore database yang cukup mudah digunakan. Sebelumnya saya tidak memiliki masalah dengan pekerjaan backup dan restore database ini. Sebelum ini datang. Sebuah project dengan database berukuran sangat besar lebih dari 3 GB.

Saya bermaksud untuk mem-backup database dari server A yang besar itu, dan di restore ke server B. Entah apa penyebabnya apakah karena internet saya yang lambat atau settingan server yang kurang pas. Proses backup seringkali gagal ditengah jalan. Atau berhasil tapi hasil backup-nya tidak bisa direstore di server B.

Akhirnya saya harus memodifikasi sedikit fungsi backup dan restore odoo dan alhamdulillah berhasil. Berikut ini apa yang saya lakukan.

Proses Backup

Sebelumnya silakan lihat route / controller / method backup bawaan odoo di module /web/controllers/main.py ini

@http.route('/web/database/backup', type='http', auth="none", methods=['POST'], csrf=False)
def backup(self, master_pwd, name, backup_format = 'zip'):
    try:
        odoo.service.db.check_super(master_pwd)
        ts = datetime.datetime.utcnow().strftime("%Y-%m-%d_%H-%M-%S")
        filename = "%s_%s.%s" % (name, ts, backup_format)
        headers = [
            ('Content-Type', 'application/octet-stream; charset=binary'),
            ('Content-Disposition', content_disposition(filename)),
        ]
        dump_stream = odoo.service.db.dump_db(name, None, backup_format)
        response = werkzeug.wrappers.Response(dump_stream, headers=headers, direct_passthrough=True)
        return response
    except Exception as e:
        _logger.exception('Database.backup')
        error = "Database backup error: %s" % (str(e) or repr(e))
        return self._render_template(error=error)

Dari route / controller diatas saya menyalinnya dan mengubah agar method yang diterima adalah method GET yang awalnnya adalah POST. Harapannya agar saya bisa menggunakan perintah wget dari server B untuk proses backup database. Berikut ini adalah route / controller yang saya tambahkan :

@http.route('/web/database/backup-custom', type='http', auth="none", methods=['GET'], csrf=False)
def backup_custom(self, master_pwd, name, backup_format = 'zip'):
    try:
        odoo.service.db.check_super(master_pwd)
        ts = datetime.datetime.utcnow().strftime("%Y-%m-%d_%H-%M-%S")
        filename = "%s_%s.%s" % (name, ts, backup_format)
        headers = [
            ('Content-Type', 'application/octet-stream; charset=binary'),
            ('Content-Disposition', content_disposition(filename)),
        ]
        dump_stream = odoo.service.db.dump_db(name, None, backup_format)
        response = werkzeug.wrappers.Response(dump_stream, headers=headers, direct_passthrough=True)
        return response
    except Exception as e:
        _logger.exception('Database.backup')
        error = "Database backup error: %s" % (str(e) or repr(e))
        return self._render_template(error=error)

Setelah saya tambahkan kode diatas di server A kemudian restart odoo. Kemudian pada server B lewat ssh saya masuk directory /home/ubuntu/backup yang saya maksudkan untuk menyimpan file hasi backup dari server A. Anda bisa memilih direcotory lain sesuai keinginan anda. Kemudian menjalankan perintah ini di server B.

wget -O test.zip "http://33.33.33.33:8069/web/database/backup-custom?master_pwd=admin&name=test&backup_format=zip"

Maksud kode diatas adalah backup database dengan nama “test” di server A (IP 33.33.33.33) dan simpan sebagai file test.zip. Dengan asumsi master password odoo di server A adalah admin dan dengan format backup zip. Setelah proses selesai file backup akan disimpan di /home/ubuntu/bakcup/test.zip di server B.

Atau jika database-nya agak lebih besar sehingga waktu yang dibutuhkan lebih lama dan membuat wget timeout, saya biasanya menambahkan opsi timeout di perintah wget dan menyimpannya secara lokal di server A dengan perintah ini.

wget -T 10800 -O test.zip "http://127.0.0.1:8069/web/database/backup-custom?master_pwd=admin&name=test&backup_format=zip"

Dari opsi -T 10800 diatas wget baru akan timeout / putus setelah 3 jam. Anda bisa mengubah nilainya dengan satuan detik.

Setelah proses backup selesai baru saya pindah file zip-nya ke server B dengan FTP.

Proses Restore

Silakan lihat route / controller / method restore bawaan odoo berikut ini

@http.route('/web/database/restore', type='http', auth="none", methods=['POST'], csrf=False)
def restore(self, master_pwd, backup_file, name, copy=False):
    try:
        data_file = None
        db.check_super(master_pwd)
        with tempfile.NamedTemporaryFile(delete=False) as data_file:
            backup_file.save(data_file)
        db.restore_db(name, data_file.name, str2bool(copy))
        return http.local_redirect('/web/database/manager')
    except Exception as e:
        error = "Database restore error: %s" % (str(e) or repr(e))
        return self._render_template(error=error)
    finally:
        if data_file:
            os.unlink(data_file.name)

Dari kode diatas bisa kita lihat bahwa method yang diterima oleh fungsi restore adalah POST. Dan backup_file yang kita kirim lewat user interface akan disimpan sebagai file temporary dan akan di hapus jika proses restore selesai. Selanjutnya saya tambahkan route / controller baru sebagai berikut di server B.

@http.route('/web/database/restore-custom', type='http', auth="none", methods=['GET'], csrf=False)
def restore_custom(self, master_pwd, backup_file, name, copy=False):
    try:
        data_file = None
        
        db.restore_db(name, backup_file, str2bool(copy))
        return http.local_redirect('/web/database/manager')
    except Exception as e:
        error = "Database restore error: %s" % (str(e) or repr(e))
        return self._render_template(error=error)
    finally:
        if data_file:
            os.unlink(data_file.name)

Dari fungsi restore tambahan diatas kita tidak perlu mengirim file hasil backup ke server B dan juga tidak perlu menyimpannya sebagai file temporary karena file sudah ada di server B. Ingat kita sudah membackup database dari server A dan menyimpannya di directory /home/ubuntu/backup. Parameter backup_file cukup kita isi full path dari file backup yang ada di server B, misal /home/ubuntu/backup/test.zip. Selanjutnya setelah restart odoo di server B saya jalankan perintah berikut.

wget "http://44.44.44.44:8069/web/database/restore-custom?master_pwd=admin&backup_file=%2Fhome%2Fubuntu%2Fbackup%2Ftest.zip&name=test_restore& copy=true"

Maksud kode diatas adalah restore file /home/ubuntu/backup/test.zip di server B (IP 44.44.44.44) menjadi database baru dengan nama test_restore.

Setelah proses selesai database baru dengan nama test_restore akan ditambahkan di odoo server B.

Seperti inilah cara saya melakukan prose backup dan restore database berukuran besar sekitar 3.5 GB. Jika anda memiliki cara lain tolong beritahu saya bagaimana anda melakukannya di kolom komentar. Terima kasih.

Tulisan Serupa

Leave a Reply

Your email address will not be published. Required fields are marked *