Thursday, October 14, 2010

MySQL Remove Definer

Pada database MySQL Bila melakukan dump/backup database menyertakan view, store procedure, function dan triger menggunakan perintah mysqldump secara otomatis selalu menyertakan string DEFINER dari hasil backup nya.




DEFINER adalah sebuah penanda yang menjelaskan USER dan IP yang dapat me-create view, store procedure, function dan triger ketika akan di lakukan restore pada sebuah database.

Bila USER dan IP yang tertera pada DEFINER tidak sama dengan USER dan IP anda dalam mengakses database Mysql maka yang terjadi saat RESTORE view, store procedure, function dan triger tersebut akan mendapatkan ERROR alias GAGAL. Agar RESTORE view, store procedure, function dan triger berhasil string DEFINER harus dihilangkan terlebih dahulu.

Berikut ini adalah cara menghilangkan string DEFINER menggunakan PERL sedangkan Operation System yang digunakan pada Posting ini adalah LINUX UBUNTU LUCID LYNX yang secara default telah terinstal PERL, di Linux Ubuntu untuk install PERL dapat menggunakan sudo apt-get install perl

Berikut ini adalah sebuah contoh dump yang menyertakan view, store procedure, function dan triger
mysqldump -uroot -p123 --routines databasesaya > databasesaya.sql

Setelah file backup bernama databasesaya.sql terbuat selanjutnya adalah menghilangkan string DEFINER, pada console linux tuliskan perintah seperti dibawah ini
perl -p -i.bak -e "s/DEFINER=\`root\`@\`localhost\`//g" databasesaya.sql
Pada contoh di atas adalah menghapus string DEFINER=`root`@`localhost` menjadi spasi kosong dari file yang bernama databasesaya.sql

Berikut ini penjelasan dari setiap option perl diatas
  • perl adalah perintah menjalan perl
  • -p adalah akan membaca isi file sampai baris terakhir
  • -i.bak adalah untuk membuat backup file dari original file databasesaya.sql menjadi databasesaya.sql.bak
  • -e adalah untuk mengeksekusi menganti tulisan DEFINER=`root`@`localhost` menjadi spasi kosong

4 comments:

  1. Makasih Dendie. DEFINER= ini memang menyebalkan. Kenapa ya mysqldump nggak ngasih option buat ngilangin ini !!! :(

    ReplyDelete
  2. Kalo mo yang rada universal pake sed :

    mysqldump ... | sed -e 's/DEFINER=[^*]*\*/\*/' > dump.sql

    ReplyDelete
  3. @hendy iya heran juga mysql ngak bikin option itu, thanks bwt script tambahan universal nya.

    ReplyDelete
  4. Kalo mau replace gimana caranya ya? Trims.

    ReplyDelete