Saya memiliki dump MySQL dari salah satu database saya. Di dalamnya terdapat klausul DEFINER yang terlihat seperti,
"DEFINER=`root`@`localhost`"
Yakni, klausul DEFINER ini ada di pernyataan CREATE VIEW dan CREATE PROCEDURE saya. Apakah ada cara untuk menghapus klausa DEFINER ini dari file dump saya?
Jawaban:
Saya rasa tidak ada cara untuk mengabaikan penambahan
DEFINER
s ke dump. Tetapi ada cara untuk menghapusnya setelah file dump dibuat.Buka file dump di editor teks dan ganti semua kemunculan
DEFINER=root@localhost
dengan string kosong ""Edit dump (atau pipa output) menggunakan
perl
:Pipa keluaran melalui
sed
:sumber
sed -E 's/DEFINER=
[^]+
@[^
] +/DEFINER=CURRENT_USER/g' dump.sql > new_dump.sql
Ini memiliki keuntungan menjaga pembatasan / kontrol akses.sed
perintah tidak menghapus Definer klausul dari prosedur dan fungsi. Berikut adalah versi yang disempurnakan yang menangani tampilan, pemicu, prosedur, dan fungsi:sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*PROCEDURE/PROCEDURE/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*FUNCTION/FUNCTION/'
Anda dapat menghapus menggunakan SED
Di MacOS:
sumber
-i extension
"Edit file di tempat, simpan cadangan dengan ekstensi yang ditentukan. Jika ekstensi panjang-nol diberikan, tidak ada cadangan yang akan disimpan. Tidak disarankan untuk memberikan ekstensi panjang-nol ketika file pengeditan di tempat, karena Anda berisiko mengalami kerusakan atau sebagian konten dalam situasi di mana ruang disk habis, dll. "Sejak mysql versi 5.7.8 Anda dapat menggunakan
--skip-definer
opsi dengan mysqlpump, misalnya:Lihat manual mysql yang diperbarui di http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer
sumber
mysqldump
danmysqlpump
- ini pertanyaan terkait: dba.stackexchange.com/questions/118846/mysqldump-vs-mysqlpumpinformation_schema.user
, dan ini tidak selalu dapat dibaca untuk semua penggunaSaya menggunakan ide-ide ini untuk menghapus klausa DEFINER dari keluaran mysqldump saya sendiri, tetapi saya mengambil pendekatan yang lebih sederhana:
Hapus saja
!
sebelum kode dan DEFINER, dan sisa komentar menjadi komentar biasa.Contoh:
menjadi tidak berdaya, hanya dengan melakukan ini ..
Namun, regexp termudah adalah dengan menghapus! dan nomornya
Itu menghapus
!#### DEFINER
dan mengganti dengan DEFINER ... Anda juga dapat menghapus DEFINER, itu tidak terlalu penting - setelah "!" hilangsumber
Sesuai rekomendasi pihak lain, berikut adalah contoh cara menghapus DEFINER dari dump, setelah dump selesai:
sumber
user
@localhost
* / / *! 50003 trigger my_triggername SEBELUM MASUKKAN DI my_table UNTUK SETIAP BARIS .... * / ;; dangrep -v
akan menghapus garis itu seluruhnya. (meskipun 50017! = 50013)Seperti yang disebutkan orang lain, menghapus definer dengan jenis ekspresi reguler apa pun tidaklah terlalu rumit. Tetapi contoh lain melucuti definisi tampilan bagi saya.
Ini adalah ekspresi reguler yang berhasil untuk saya:
sumber
*/
. MySQL 5.6.31.Untuk solusi otomatis, Anda dapat melihat
mysqlmigrate
. Ini adalah pembungkus Bashmysqldump
yang memungkinkan Anda untuk memigrasi database dan mengabaikan pernyataan DEFINER. Contoh:http://thesimplesynthesis.com/post/mysqlmigrate (atau GitHub )
Jika tidak, ya, perintah seperti yang ditunjukkan Abhay diperlukan:
sumber
Opsi lain di OSX untuk menghapus definisi dalam file:
sumber
Anda harus melihat jawabannya di sini: /dba/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079
Cara terbaik menurut saya untuk mengatasi masalah ini, tidak menambahkan parse string ekstra dengan sed atau grep atau lainnya, sebaliknya mysqldump dapat menghasilkan dump yang baik dengan menambahkan --single-transaction
sumber
Cara cepat untuk melakukan ini adalah dengan menyalurkan output dari mysqldump melalui sed untuk menghapus
DEFINER
pernyataan yang dibungkus dengan komentar bersyarat. Saya menggunakan ini untuk menghapusDEFINER
dariCREATE TRIGGER
pernyataan, tetapi Anda dapat mengubah nomor versi komentar kondisi di regex agar sesuai dengan tujuan Anda.sumber
Tidak yakin apakah itu membantu tetapi saya menggunakan SQLyog Community Edition, tersedia di: -
https://code.google.com/p/sqlyog/wiki/Downloads
Saat membuang sql atau menyalin ke database lain, ini memungkinkan Anda untuk 'Abaikan DEFINER'
Ini gratis dan menyediakan fungsionalitas dasar yang dibutuhkan banyak orang
Ada juga versi berbayar yang tersedia dari: -
https://www.webyog.com/product/sqlyog
Bersulang
sumber
Bagi saya, ini bekerja:
perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp
. Ini menghapus DEFINER = root @ localhost dari dump saya, pada setiap pernyataan prosedur pembuatansumber
Berikut adalah solusi kerja lengkap untuk menghapus informasi DEFINER untuk
MySQL 5.6.x
dan Linux. (Diuji padaCentOS 6.5
).Biasanya kita harus mengganti entri berikut dari Mysql dump (jika diambil bersama dengan data dan pemicu / rutinitas / fungsi).
Dump diambil dengan perintah di bawah mysqldump.
File dump yang diperlukan tanpa informasi DEFINER dapat diperoleh dengan tiga perintah di bawah ini.
Jika file dump ada di folder Anda saat ini, abaikan [PATH /].
Jika data dalam tabel sangat besar maka ambil dump dalam dua file, di satu file dump ambil dump dengan data dan di file dump lainnya hanya mengambil dump dari skrip (Pemicu / Functions / Prosedur.) Dan menjalankan tiga di atas perintah pada file dump (skrip) ke-2.
sumber
Gantikan semua pengguna definer Anda dengan CURRENT_USER. Dalam skrip gradle saya yang membuat cadangan, skrip ganti saya terlihat seperti:
yang sebenarnya hanya memanggil ANT. Maka Anda tidak perlu khawatir tentang itu.
sumber
Di mesin Linux, Anda dapat menggunakan satu baris ini:
Anda hanya perlu mengganti string yang dicetak tebal dengan kredensial pengguna DB Anda dan nama database / pola suka.
Info lebih lanjut di sini: http://blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/
sumber
Satu-satunya cara saya bisa membuatnya bekerja di bawah Windows:
Instal http://gnuwin32.sourceforge.net/ agar sed di baris perintah dan tambahkan ke PATH Windows : D: \ program \ GetGnuWin32 \ bin;
sumber
Terima kasih atas petunjuknya. Karena malas, saya menulis skrip bernama: "MYsqldump":
sumber
Untuk sesuatu seperti:
Coba ini:
sumber
buka database Anda dengan editor apa pun, saya gunakan dengan notepad ++,
temukan semua uji itu
DEFINER=root@localhost
dan ganti dengan nothing (""
) IE. Hapus.Kemudian Anda dapat mengimpornya ke host mana pun yang Anda inginkan.
sumber
Regex paling sederhana yang berfungsi untuk saya dengan semua objek adalah:
Perhatikan bahwa
quote-names
harusTRUE
(yang secara default).Berharap bahwa di versi yang lebih baru, sakelar yang
--skip-definer
diperkenalkan di mysqlpump di versi 5.7 juga datang ke mysqldump.sumber
Saya telah menggunakan skrip PowerShell untuk menghapus semua baris
DEFINER
:dapatkan-konten $ file_in_full_path | pilih-string-pola $ line_string_delete -notmatch | Out-File -width 1000000000 -Encoding Default $ file_out_full_path
sumber
Tidak ada yang berhasil untuk saya, jadi saya perlu menulis regex saya sendiri.
Cobalah untuk membuang database Anda ke dalam file,
cat
seluruh file dangrep
hanya pernyataan definer Anda yang dapat melihatnya.cat file.sql | grep -o -E '. {, 60} DEFINER. {, 60}'
Tulis regex Anda
Masukkan dump Anda ke sed dengan regex ini. Misalnya pernyataan saya adalah:
mysqldump | sed -E // *! 500 [0-9] [0-9] DEFINER =. +? * /// '| sed -E 's / DEFINER =
?[^ ]+?
? @?[^ ]+?
? //'Keuntungan!
sumber
remove_definers.bat:
sumber