Kesalahan MySQL / Amazon RDS: "Anda tidak memiliki hak SUPER…"

98

Saya mencoba menyalin database mysql saya dari Amazon EC2 ke RDS:

Saya berhasil melakukan mysqldumpdatabase saya ke folder root saya menggunakan ini:

root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql

Kemudian saya mencoba mentransfer file .sql ini ke database RDS baru saya:

root@ip-xx-xx-xx-xx:~# mysql my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

Sayangnya, saya mendapatkan pesan kesalahan berikut:

You do not have the SUPER privilege and binary logging is enabled 
(you *might* want to use  the less safe log_bin_trust_function_creators variable)

Saya mencoba dengan GRANT SUPER..berbagai cara tetapi saya mendapatkan kesalahan ketika saya mencoba melakukannya juga. Mengetik mysql > FLUSH privileges;juga tidak berhasil.

Saya seorang pemula mysql jadi maaf untuk pertanyaan yang begitu mudah. Pikiran?

tim peterson
sumber
9
Anda tidak bisa GRANT SUPERdi RDS. RDS tidak menawarkan cara untuk mendapatkan hak istimewa SUPER.
ceejayoz
Gunakan nama pengguna MySQL yang sama untuk membuat dump dan memulihkannya (Untuk koneksi dan kata kunci DEFINER di dump). Mengubah log_bin_trust_function_creators bukanlah solusi yang diinginkan. Hal terburuk adalah menggunakan parameter -f dalam kasus ini
ad4s
dalam kasus saya sqlfile saya memiliki CREATE FUNCTIONpernyataan yang membutuhkan pengguna yang memiliki hak istimewa. lihat ini
Akuntan م

Jawaban:

63

Sesuai http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ , Anda perlu menyetel log_bin_trust_function_creatorske 1 di konsol AWS , untuk memuat file dump Anda tanpa kesalahan.

Jika Anda ingin mengabaikan kesalahan ini, dan memuat berkas dump lainnya, Anda dapat menggunakan -fopsi:

mysql -f my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

The -fakan melaporkan kesalahan, tetapi akan terus memproses sisa file dump.

Ross Smith II
sumber
hai @ Ross, terima kasih untuk ini. Sayangnya, penggunaan -ftidak membantu. Saya mendapat kesalahan yang sama. Menggunakan tautan Anda, saya mengalami masalah dengan sintaks alat RDS Cli. Artinya, ketika saya pergi untuk mengubah hak istimewa saya mendapatkan kesalahan berikut:rds-modify-db-parameter-group: Malformed input-Unrecognized option: -–parameters=name=log_bin_trust_function_creators, Usage: rds-modify-db-parameter-group DBParameterGroupName --parameters "name=value, value=value, method=value" [ --parameters "name=value, value=value, method=value" ...] [General Options]
tim peterson
inilah perintah saya yang memberi saya kesalahan di atas: ./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"Saya tahu itu harus menjadi masalah kutipan atau tanda hubung ganda saya tetapi tidak ada dari jenis perubahan itu yang berfungsi sejauh ini, ugh!
tim peterson
4
The -fpilihan tidak akan membuat kesalahan pergi, itu hanya akan memungkinkan pernyataan SQL non-menyinggung dalam file yang akan diproses. Dari apa yang saya baca, RDS tersedak prosedur yang tersimpan di file dump. Coba buat file dump tanpa prosedur penyimpanan dan lihat apakah itu memuat OK:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
Ross Smith II
2
- @ Ross, luar biasa berhasil, database saya ada di sana, wow itu masalah yang mengganggu, sepertinya AWS harus melakukan sesuatu tentang itu.
tim peterson
Setidaknya saya bisa memuat semua data dengan -fopsi. Fase kedua mungkin untuk membuang hanya rutinitas / proses stred, dll secara terpisah
Kaymaz
134
  1. Buka konsol web RDS.
  2. Buka tab "Grup Parameter".
  3. Buat Grup Parameter baru. Pada dialog, pilih keluarga MySQL yang kompatibel dengan versi database MySQL Anda, beri nama dan konfirmasi. Pilih Grup Parameter yang baru saja dibuat dan keluarkan "Edit Parameter".
  4. Cari parameter 'log_bin_trust_function_creators' dan setel nilainya menjadi '1 ′.
  5. Simpan perubahannya.
  6. Buka tab "Instance". Perluas instance MySQL Anda dan keluarkan "Instance Action" bernama "Modify".
  7. Pilih Grup Parameter yang baru saja dibuat dan aktifkan "Terapkan Segera".
  8. Klik "Lanjutkan" dan konfirmasikan perubahannya.
  9. Tunggu hingga operasi "Mengubah" selesai.
  10. Sekali lagi, buka tab "Instance". Perluas instance MySQL Anda dan perluas tab "Instance Action" dan pilih "Reboot".
arun-r
sumber
> apa yang dilakukan poin 9 ... Anda menyesuaikan instance Anda untuk menggunakan grup parameter yang ditentukan sebelumnya. Untuk detail lebih lanjut lihat posting blog asli ini oleh Daniel Ferbers: techtavern.wordpress.com/2013/06/17/…
AndrewL
Apakah ini akan menghentikan replikasi RDS Mysql?
Ramratan Gupta
hai @ arun-r, saya melalui langkah-langkah yang Anda jelaskan, tetapi parameter 'log_bin_trust_function_creators' tidak tersedia dalam kasus ini. Saya rasa ada sesuatu yang berubah di AWS RDS terbaru. Bisakah Anda membantu saya bagaimana saya bisa melakukan ini sekarang? terima kasih,
Pengembang Pawan
@RamratanGupta Itu tidak akan berhenti
arun-r
1
@ arun-r terima kasih atas tanggapan Anda. Saya memecahkan masalah saya. Sebenarnya saya menemukan log_bin_trust_function_creators dalam daftar. namun masalah saya diselesaikan dengan menghubungi dukungan AWS
Pengembang Pawan
33

Masalah dengan pemicu dan prosedur tersimpan di berkas dump adalah bahwa definisi ini menyertakan pengguna yang harus dibuat oleh prosedur tersimpan, DEFINER. Pengguna kemungkinan besar tidak ada di RDS sehingga kesalahan kemudian dimunculkan. Untuk dapat memuat file dump, Anda dapat menghapus DEFINER menggunakan sed atau Perl dan membuat prosedur / pemicu yang tersimpan dengan pengguna yang melakukan impor.

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql

Sekarang Anda harus dapat memuat file dump tetap

mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql

Seperti yang dikatakan dalam jawaban sebelumnya, Anda harus mengatur Parameter DB:

log_bin_trust_function_creators = 1
anders
sumber
1
Membersihkan definisi juga dapat dilakukan dengan sed: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
siliconrockstar
16

Bagi saya, hanya ada 2 perintah di file dump saya yang membutuhkan hak SUPER:

  • SET @@GLOBAL.gtid_purged
  • SET @@SESSION.SQL_LOG_BIN

Menurut dokumen mysqldump Anda dapat menonaktifkannya dengan --set-gtid-purged=OFF.

Kemudian melihat man mysqldump :

Gunakan AKTIF jika tujuannya adalah untuk menyebarkan budak replikasi baru hanya menggunakan beberapa data dari server yang dibuang. Gunakan NONAKTIF jika tujuannya adalah untuk memperbaiki tabel dengan menyalinnya di dalam topologi. Gunakan NONAKTIF jika tujuannya adalah untuk menyalin tabel di antara topologi replikasi yang terputus-putus dan akan tetap demikian.

Jadi saya memutuskan untuk menambahkan --set-gtid-purged=OFFke mysqldumpperintah saya dan kemudian saya berhasil mengimpor file dump yang dihasilkan.

Yap_It's_Me
sumber
1
Ya, ini dia. File dump saya relatif kecil, jadi saya menghapus semua kemunculan 2 perintah ini darinya.
Zolbayar
6

Seperti yang ditentukan dalam dokumentasi AWS, pemicu, prosedur, dan fungsi dinonaktifkan secara default karena logging biner diaktifkan secara default. Menonaktifkan pada dasarnya membuat db Anda lebih aman, tetapi jika Anda telah mengamankannya dengan benar melalui jaringan itu tidak masalah.

Ikuti langkah-langkah ini dan masalah Anda akan diperbaiki https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

Anda juga tidak boleh menggunakan definisi saat membuat prosedur. Perintah sed sederhana dapat menghapusnya.

Josh Woodcock
sumber
1

Setelah menggunakan jawaban arun-r, jika masalah tidak terpecahkan Anda perlu memodifikasi file dump Anda. Itu sederhana.

Di file dump Anda akan menemukan baris seperti:

DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN

Anda harus mengganti:

  • username_from_dumped_database dengan nama pengguna Anda di database rds.
  • host_from_dumped_databse oleh %

Saya tidak tahu mengapa tetapi trik ini berhasil untuk saya. Editor teks sederhana sudah cukup untuk melakukan ini.

Damien Frances
sumber