Bagaimana cara mengubah DEFINER dari VIEW di Mysql?

35

Ketika saya menjalankan mysqldump, saya mendapatkan kesalahan:

mysqldump: Got error: 1449: The user specified as a definer ('root'@'foobar') does not exist when using LOCK TABLES

Ini masuk akal karena foobarmerupakan mesin warisan yang tidak ada lagi.

Bagaimana cara mengubah definisi semua tabel saya menjadi 'root' @ 'localhost'?

kfmfe04
sumber
4
Apakah Anda memiliki Tampilan? Tabel tidak memiliki definisi saya yakin ... Juga lihat dba.stackexchange.com/q/4129/630
gbn
1
@ gbn +1 Anda benar - mereka dilihat - thx untuk tautan, tapi saya tidak bisa membuatnya berfungsi dengan benar. Namun, saya bisa memodifikasi pandangan dalam SQLyog sehingga saya bisa melakukan dump.
kfmfe04
Ini bekerja untuk saya. {{berikan semuanya . untuk 'me-root' @ '%' diidentifikasi oleh 'kata sandi' dengan opsi hibah; }}
Muhammad Azeem

Jawaban:

33

Apa yang saya pikirkan adalah bahwa database yang Anda coba buang berisi prosedur / metode yang didefinisikan oleh pengguna saat login sebagai root @ 'foobar'.

Sekarang solusinya adalah Anda harus mengganti definisi untuk prosedur / metode tersebut

maka Anda dapat menghasilkan dump tanpa kesalahan.

Anda dapat melakukan ini seperti ..

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar'

Hati-hati, karena ini akan mengubah semua definisi untuk semua database.

Cobalah....!

UPDATE pada 9 Februari 2012

Saat saya melihat tautan yang diberikan oleh @gbn yang merupakan jawaban yang diberikan oleh @Rando yang juga bisa menjadi Kasus. Silakan kunjungi tautannya

EDIT oleh @RolandoMySQLDBA 2011-12-16 11:20 EDT

Meskipun berisiko, jawaban ini bagus. Hanya untuk memperjelas: Anda dapat menentukan basis data dalam permintaan Anda seperti ini:

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';
Abdul Manaf
sumber
1
Tautan di atas menunjukkan bagaimana melakukannya dengan pernyataan ALTER yang mungkin kurang berisiko ... Juga, silakan periksa pembaruan saya untuk definisi di UPDATE Anda
gbn
UPDATEberubah meja, tapi mysqldumptidak melihatnya: mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES. Bahkan setelah restart mysql. Saya sedang berlari mysql-5.5.31.
x-yuri
Salahku. Saya juga memiliki pandangan dengan definisi yang salah. update mysql.procpendekatan memang bekerja.
x-yuri
Tidak berhasil ....
カ オ ナ シ
3
Jawaban ini berfungsi untuk mengubah definisi prosedur dan fungsi tetapi tidak mengubah definisi Tampilan .
Anthony G - keadilan untuk Monica
35

Lebih mudah menggunakan --single-transactionsakelar:

mysqldump --single-transaction -u username -p db > db.sql
tongkat
sumber
1
Maaf, bagaimana ini mengatasi masalah yang diuraikan dalam pertanyaan awal? Sepertinya Anda menjawab pertanyaan yang salah ...
dezso
6
Struktur jawabannya salah, karena --satu-transaksi harus sebelum nama database, tetapi jawabannya sebenarnya benar. Menentukan opsi ini berfungsi di sekitar masalah dengan mengubah perilaku penguncian mysqldump, sehingga kesalahan dalam pertanyaan asli tidak lagi terjadi.
Michael - sqlbot
Saya menghadapi masalah yang sama. bekerja --satu transaksi
Tidak yakin apa fungsinya, tetapi berhasil! Terima kasih
Sri Harsha Kappala
17

Solusi tercepat hanya akan membuat ulang definisi jadi itu ada, asalkan tidak membuat konflik dengan pengguna yang ada.

CREATE USER 'root'@'foobar';

Kolin
sumber
Bagaimana jika pengguna adalah 'root' @ '%'? Saya hanya menolak hal seperti itu di server yang menjadi tanggung jawab kami.
Attila Fulop
@AttilaFulop Ya, keamanan pasti harus menjadi pertimbangan, tapi saya katakan ini adalah solusi "tercepat", bukan yang sempurna. Setelah impor selesai, pengguna dapat dihapus untuk mengurangi risiko memiliki pengguna tambahan.
ColinM
Anda benar dalam hal itu. Saya hanya ingin menarik perhatian pada aspek khusus ini juga. Rekan kerja saya akan menambahkan 'root' @ '%' dan meninggalkannya di sana selama Chuck Norris masih hidup yaitu. selamanya;)
Attila Fulop
6

Ekspor semua tampilan basis data <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

atau:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

Edit views.sqldan buat kembali:

cat views.sql | mysql <DB>

Tentukan -udan -paktifkan jika perlu.

x-yuri
sumber
Ini adalah jawaban terbersih
Wolfe