Cara menggunakan mysql physical backup

diupdate 24 Oktober 2022 Inheritance atau pewarisan, dalam paradigma pemrograman berorientasi objek bisa diartikan membuat suatu class yang mirip seperti class yang lain. Ada class yang ditiru (class induk / parent / superclass) dan ada class hasil tiruan / hasil turunan (class child / subclass). Subclass akan mewarisi atribut dan method-method yang ada pada superclass. Contoh inheritance atau pewarisan dalam OOP misalnya sebagai berikut. Ada class Karyawan yang memiliki atribut NIP, nama, dan jenis kelamin serta dua buah method yaitu masukKerja() dan beriNama(String nama). Dibuat class baru yaitu Dosen. Class Karyawan akan diwariskan ke class Dosen, dalam source code untuk membuat pewarisan digunakan keyword extends ketika menuliskan deklarasi class (lihat baris ke tiga di source berikut). Class Dosen akan mewarisi atribut NIP, nama, dan jenisKelamin yang dimiliki oleh class Karyawan. Begitu pula dengan method masukKerja dan beriNama yang ada di class Karyawan akan diwarisi pula o

Read more

Contoh Penerapan Interface di Pemrograman Java

By penulis blog -December 22, 2020

Cara menggunakan mysql physical backup

Dalam pemrograman Java kita mengenal adanya Class dan Interface. Class adalah template dari suatu object. Di dalam sebuah class kita bisa mendefinisikan atribut-atribut yag mewakili data-data yang dimiliki oleh sebuah object, di dalam Class juga didefinisikan method-method / fungsi yang mewakili behaviour atau operasi yang bisa dilakukan oleh suatu object. Sedangkan Interface sendiri bisa dianalogikan sebagai template dari class. Di dalam sebuah Interface terdapat method-method abstract, ada nama method beserta parameternya namun isi / code dari method di dalam Interface tersebut belum dituliskan. Untuk menggunakan Interface kita perlu membuat Class yang mengimplementasikan Interface tersebut, Class yang dibuat nanti otomatis akan memiliki method-method yang dituliskan di dalam Interface dan kode dari method-method tersebut dituliskan dalam Class yang dibuat. Agar lebih jelas mari kita simat ilustrasi berikut : Kita akan membuat sebuah Interface dengan nama BangunDatar. Di dalam Interf

Read more

Deploy CodeIgniter 3 di Docker

By penulis blog -October 13, 2018

Cara menggunakan mysql physical backup

Artikel ini diperbarui pada 30 November 2022. Sebuah web app berbasis CodeIgniter 3 harus dideploy, masalahnya web app tersebut membutuhkan PHP versi 5.6 yang repot untuk saya install di Ubuntu 22.10. Oleh karena itu saya gunakan docker untuk deployment-nya. Source code web app terdapat pada folder myweb, berikut ini adalah hal-hal yang saya lakukan untuk melakukan deploy CI3 di Docker. Docker Image Saya gunakan dua buah docker container untuk PHP + web server dan database. Pertama saya unduh docker image mysql versi 5.7.40 melalui perintah CLI sudo docker pull mysql:5.7.40 *supaya tidak perlu pakai sudo untuk mengeksekusi docker, caranya bisa dibaca di  https://www.ardhi.web.id/2020/12/menjalankan-docker-tanpa-sudo-di-ubuntu.html Kemudian yang kedua, saya buat custom docker image untuk PHP + web servernya. Saya gunakan PHP versi 5.6.38 dan Apache Httpd untuk web servernya. Buat file dengan nama Dockerfile untuk membangun custom image yang berisi PHP, web server Apache, dan sejumlah e

Salah satu fitur yang sering dibutuhkan pada aplikasi bisnis adalah backup.  Dengan melakukan backup secara teratur, pengguna bisa menghindari resiko kehilangan data.  Pada tulisan ini, saya akan mencoba menambahkan fasilitas backup manual pada aplikasi yang saya buat.  Aplikasi ini berjalan pada sistem operasi Windows dan dikembangkan dengan menggunakan Griffon dan plugin simple-jpa 0.4.2 serta memakai database MySQL.

Saya akan mulai dengan membuat sebuah MVCGroup baru:

griffon create-mvc backup

Setelah itu, saya membuat kode program untuk BackupView.groovy seperti yang terlihat berikut ini:

import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}

Tampilan di atas membutuhkan BackupModel.groovy dengan isi seperti berikut ini:

class BackupModel {

  @Bindable String datadir
  @Bindable String basedir
  @Bindable File lokasiTujuan

}

Kemudian, pada BackupController.groovy, saya menambahkan kode program inisialisasi seperti berikut ini:

void mvcGroupInit(Map args) {
  init()
}

@SimpleJpaTransaction(newSession=true)
def init = {
  model.datadir = executeNativeQuery("SHOW VARIABLES LIKE 'datadir'")[0][1]
  model.basedir = executeNativeQuery("SHOW VARIABLES LIKE 'basedir'")[0][1]
  model.lokasiTujuan = File.listRoots().last()
}

Perhatikan bahwa saya tidak menambahkan @SimpleJpaTransaction pada deklarasi class, dan hanya menambahkannya pada closure init.  Hal ini karena hanya closure init yang perlu dijalankan dalam transaction karena ia akan melakukan query ke database.  executeNativeQuery() adalah method dari simple-jpa yang memungkinkan pengguna untuk mengerjakan SQL.  Sebagai contoh, perintah SHOW VARIABLES  di atas adalah contoh perintah yang tidak dapat dikerjakan melalui JP QL sehingga harus menggunakan executeNativeQuery().  Kembalian dari method ini adalah

import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}
1 yang berisi array yang mewakili setiap kolom yang ada.

Perintah SHOW VARIABLES sebenarnya bukanlah bagian dari SQL melainkan perintah khusus MySQL Server untuk melihat konfigurasi pada database tersebut.  Perintah

import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}
3 akan mengembalikan lokasi dimana MySQL Server menyimpan database-nya dalam bentuk file.  Perintah
import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}
4 akan mengembalikan lokasi dimana MySQL Server di-install.

Kode program

import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}
5 akan mengembalikan
import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}
1 yang berisi seluruh root directory.  Pada sistem operasi turunan UNIX, hanya satu root.  Hal ini berbeda dengan Windows, dimana terdapat banyak root, seperti
import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}
7 untuk harddisk,
import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}
8 untuk drive optik, dan sebagainya.

Sebagai contoh, pada instalasi default MySQL, bila program dijalankan, saya akan menemukan tampilan seperti berikut ini:

Cara menggunakan mysql physical backup

Tampilan Awal

Lalu, bagaimana cara backup yang baik?

Apakah dapat langsung men-copy seluruh isi datadir yang ada di database MySQL?  Pada database yang memakai engine MyISAM, hal ini dapat dilakukan.  Walaupun dapat diterapkan pada database yang memakai engine InnoDB,  hal ini tidak disarankan!  Selain itu, saya perlu memastikan bahwa server database sudah dimatikan sebelum men-copy file data.  MySQL versi enterprise (berbayar!) memiliki fasilitas hot backup sehingga proses backup dapat dilakukan saat database masih berjalan;  hot backup juga akan menyertakan perubahan pada database saat backup sedang dikerjakan.

Pada kesempatan ini, saya akan mencoba mysqldump yang lebih lambat.  Berbeda dengan cara di atas yang melakukan physical backup, mysqldump akan melakukan logical backup.  Hasil hasil dari logical backup adalah perintah SQL yang mewakili seluruh data yang ada.  Penggunaan logical backup tidak disarankan karena lebih lambat dibanding physical backup.

Sebagai contoh, saya akan membuat kode program berikut ini pada BackupController.groovy:

def mulai = {
    JTextArea output = view.output
    String userName = SimpleJpaUtil.instance.dbUsername
    String password = SimpleJpaUtil.instance.dbPassword
    String dbName = SimpleJpaUtil.instance.dbName

    String namafile = DateTime.now().toString('yyyyMMdd-hhmm')
    String lokasiTujuan = model.lokasiTujuan.absolutePath
    Path fileBackup = Paths.get(lokasiTujuan, "${namafile}-${dbName}-backup.sql")
    Path fileError = Paths.get(lokasiTujuan, "${namafile}-${dbName}-error.log")

    Files.newOutputStream(fileBackup, StandardOpenOption.CREATE_NEW).withStream { outputFile ->
        Files.newOutputStream(fileError, StandardOpenOption.CREATE_NEW).withStream { errorFile ->

            String mySqlDump = Paths.get(model.basedir, "bin", "mysqldump").toString()
            execInsideUISync { output.append("Mulai mengerjakan $mySqlDump ...\n") }
            Process process = [mySqlDump, "-u${userName}", "-p${password}", "${dbName}"].execute()
            execInsideUISync { output.append("Backup sedang diproses. Harap sabar menunggu...\n")}

            process.consumeProcessOutput(outputFile, errorFile)
            process.waitFor()

            execInsideUISync {
                output.append("Proses backup selesai!\n")
                output.append("Hasil backup dapat ditemukan di ${fileBackup}\n")
                output.append("Pesan kesalahan selama backup dapat ditemukan di ${fileError}\n")
            }

        }
    }

    execInsideUISync { output.append("Selesai.\n\n") }
}

Pada kode program di atas, saya menggunakan

import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}
9 dari Java NIO untuk menghasilkan lokasi path berdasarkan beberapa
class BackupModel {

  @Bindable String datadir
  @Bindable String basedir
  @Bindable File lokasiTujuan

}
0 yang terpisah.  Hal ini jauh lebih mudah bila dibandingkan untuk merangkai path secara manual karena pemisah path bisa berbeda tergantung platform (misalnya pada Windows berupa karakter ‘\’ sementara pada Unix berupa karakter ‘/’).  Selain itu,
import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}
9 juga tetap dapat menghasilkan path yang benar walaupun beberapa
class BackupModel {

  @Bindable String datadir
  @Bindable String basedir
  @Bindable File lokasiTujuan

}
0 diakhiri karakter pemisah path dan beberapa lagi tidak.  Nama file yang dihasilkan akan mengikuti format tahun, bulan, tanggal lalu diikuti dengan jam menit selanjutnya nama database.

Untuk memanggil mysqladmin, saya memakai method

class BackupModel {

  @Bindable String datadir
  @Bindable String basedir
  @Bindable File lokasiTujuan

}
3 yang ditambahkan oleh Groovy untuk
import net.miginfocom.swing.MigLayout
import javax.swing.BorderFactory
import javax.swing.JFileChooser

def fileChooser = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY)

application(title: 'latihan',
  preferredSize: [320, 240],
  pack: true,
  locationByPlatform: true) {

    panel(id: 'mainPanel', border: BorderFactory.createEmptyBorder(5,5,5,5)) {
        borderLayout()
        panel(layout: new MigLayout('', '[left][left]', ''), constraints: PAGE_START) {
            label('Lokasi MySQL: ')
            label(text: bind('basedir', source: model), constraints: 'wrap')

            label('Lokasi Data: ')
            label(text: bind('datadir', source: model), constraints: 'wrap')

            label('Lokasi Tujuan: ')
            label(text: bind('lokasiTujuan', source: model), constraints: 'split 2')
            button('Pilih Lokasi', constraints: 'gapleft 10px, wrap', actionPerformed: {
                if (fileChooser.showOpenDialog(view.mainPanel)==JFileChooser.APPROVE_OPTION) {
                    model.lokasiTujuan = fileChooser.selectedFile
                }
            })

            button('Mulai Backup', actionPerformed: controller.mulai, constraints: 'gaptop 10px, wrap')
        }

        scrollPane(constraints: CENTER) {
            textArea(id: 'output', editable: false)
        }

    }
}
1.  Argumen untuk pemanggilan mysqladmin saya peroleh dari class
class BackupModel {

  @Bindable String datadir
  @Bindable String basedir
  @Bindable File lokasiTujuan

}
5 milik simple-jpa yang menyediakan informasi seperti nama user, password, dan nama database yang dipakai.

Karena output dari eksekusi mysqladmin berupa SQL yang hendak di-backup, maka saya memakai

class BackupModel {

  @Bindable String datadir
  @Bindable String basedir
  @Bindable File lokasiTujuan

}
6 untuk segera menuliskan output ke file yang telah ditentukan.

Berikut ini adalah contoh tampilan setelah tombol Mulai di-klik:

Cara menggunakan mysql physical backup

Contoh Tampilan Setelah Tombol Mulai Backup Di-klik

Program di atas adalah contoh pemanggilan mysqldump secara manual.  Penerapan lain yang lebih user friendly adalah dengan men-schedule pemanggilan mysqldump ke Windows Scheduler atau cron Linux sehingga proses backup dapat berlangsung secara periodik dan otomatis.

Bagaimana Cara kapan digunakan dari backup dan recovery database?

Proses backup dilakukan sebelum terjadi kerusakan atau kehilangan data karena kesalahan manusia atau terjadi bencana. Sementara proses recovery atau pemulihan data dapat dilakukan apabila data terhapus, bahkan untuk data yang sudah tidak ada di recycle bin.

Apa yang dimaksud restore database?

Restore Database berfungsi untuk mengembalikan data pada program sesuai pada file backup yang diinginkan. PENTING : Buatlah database baru sebelum melakukan restore database, karena jika sudah telanjur restore maka database tidak bisa dikembalikan lagi pada posisi sebelumnya.

Bagaimana cara import data pada phpMyAdmin?

Impor file SQL ke database MySQL.
Masuk ke phpMyAdmin..
Di phpMyAdmin, di menu sebelah kiri, pilih nama database yang ingin Anda gunakan. ... .
Di menu bagian atas, pilih Impor..
Gunakan Pilih file..
Temukan dan pilih file yang ingin Anda impor, lalu pilih Buka..
Di bagian bawah halaman, pilih Mulai..