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'?


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';

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

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';


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.


Ini adalah jawaban terbersih
— Wolfe
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.