Upaya pertama untuk memigrasi EC2 MySQL ke Amazon RDS tidak berjalan dengan baik - hak istimewa SUPER

11

Saya telah mencoba untuk memindahkan db yang ada dari MySQL yang berjalan pada EC2 ke instance Amazon RDS baru (percobaan untuk melihat apakah kita dapat bergerak melintasi). Sejauh ini, ini tidak berjalan baik. Saya terjebak pada impor awal sebelum menyiapkan replikasi (instruksi di sini ).

Saya sudah menyiapkan instance RDS seperti yang dijelaskan dan dapat menyambungkannya dari instance EC2 menggunakan mysql. Saya menjalankan perintah mysqldump sebagai:

mysqldump --master-data --databases db1 db2 > dump.sql

Kemudian mencoba mengunggahnya ke RDS dengan:

mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql

Masalah pertama adalah pada baris 22 tempat pembuangan:

GANTI MASTER KE MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106;

Baris ini menyebabkan kesalahan ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. Tidak masalah, cukup komentari baris itu dan berharap untuk memperbaikinya nanti melalui mysql.rds_set_external_master (). Dicoba upload, dan punya kesalahan sangat mirip: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. Bagian di sekitar baris 7844 terlihat seperti ini:

/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`dev`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `jos_contributor_ids_view` AS select `jos_resource_contributors_view`.`uidNumber` AS `uidNumber` from `jos_resource_contributors_view` union select `jos_wiki_contributors_view`.`uidNumber` AS `uidNumber` from `jos_wiki_contributors_view` */;

Dengan mengomentari 2 baris pertama dan menambahkan 'BUAT' ke baris ketiga, saya bisa melewati yang ini. Tetapi ada banyak bagian seperti ini. Apakah ada jalan keluarnya tanpa semua pengeditan? Suka opsi untuk mysqldumptidak menghasilkan apa pun yang membutuhkan hak SUPER?

Sepertinya banyak orang memiliki masalah yang sama, seperti harus menjalankan sedterhadap keluaran mysqldump / mysqlbinlog! Saya akan memposting di forum AWS juga - sungguh saya pikir RDS harus memiliki cara yang lebih toleran untuk mengimpor dari mysqldump, atau alat khusus yang dapat dijalankan terhadap db yang ada untuk membuat dump yang merupakan keluhan dengan keamanan RDS. Hanya ingin tahu apakah ada yang punya resep atau trik lain yang mungkin bisa membantu di sini.

Terima kasih,

Dave

dsl101
sumber
Maaf - lupa mengatakan bahwa saya sudah mencoba mengubah log_bin_trust_function_creatorsparameter ke 1, tetapi masih mendapatkan kesalahan yang sama pada baris 7844.
dsl101
Posting lama, tetapi kesalahan pertama yang dapat Anda hindari dengan mengatakan --masterdata=2. Baris kemudian akan dikomentari di tempat sampah.
Halfgaar

Jawaban:

26

Anda mungkin perlu log_bin_trust_function_creators= 1 pada RDS tetapi bukan itu masalahnya, di sini.

Anda dapat menentukan  DEFINER nilai selain akun Anda sendiri hanya jika Anda memiliki  SUPER hak istimewa.

- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html

Ketika program tersimpan (proc, fungsi, acara, atau pemicu) sedang berjalan, semua yang dilakukannya memiliki izin dari pengguna yang mendefinisikannya, atau dari pengguna yang secara eksplisit dinyatakan dengan DEFINERdeklarasi. Hal ini memungkinkan, antara lain, untuk program yang disimpan untuk mengizinkan pengguna lain untuk melakukan hal-hal ke data mereka tidak secara langsung memiliki izin untuk memanipulasi, selama mereka memiliki izin untuk menggunakan program yang tersimpan itu sendiri.

Maka akan menjadi kerentanan serius, jika non- SUPERpengguna dapat membuat prosedur dengan definisi yang sewenang-wenang, karena pengguna dapat meningkatkan haknya sesuka hati.

Ini juga berlaku untuk pandangan, tentu saja, ketika konteks keamanan definer digunakan, seperti dalam contoh yang Anda posting.

Salah satu keluhan terbesar yang saya miliki dengan RDS adalah bahwa Anda tidak dapat memiliki SUPER... dan sekarang bisa menjadi salah satu dari Anda juga :) karena fakta itulah yang menjadi penyebab masalah yang Anda hadapi.

Tentu saja, jika saya menjalankan layanan MySQL yang dikelola, saya tidak akan memberikan siapa pun SUPERjuga, sehingga model keamanan mereka masuk akal, bahkan jika kadang-kadang sulit.

Jika semua objek Anda memiliki definisi yang sama, solusinya adalah mengembalikan dump menggunakan akun itu daripada yang Anda gunakan sekarang, tapi itu sepertinya tidak mungkin.

Menghapus hanya baris dengan DEFINERdeklarasi harus membuat dumpfile berfungsi dalam kasus-kasus di mana ia muncul pada sebuah baris dengan sendirinya, atau Anda dapat menggunakan sed atau perl untuk memodifikasi file ... sebuah ide yang saya tahu Anda tidak suka, tapi itu benar-benar hal yang baik tentang MySQL bahwa peretasan seperti itu cukup sah, dan tidak terlalu jauh dari hal-hal yang harus saya lakukan sebagai DBA bahkan dalam envirnoment non-RDS.

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

... mungkin bukan jawaban yang Anda harapkan, tetapi Anda bisa menjalankannya terhadap dumpfile Anda dan akan berakhir dengan file yang sedikit lebih bermanfaat.

Michael - sqlbot
sumber
Banyak terima kasih atas jawaban yang komprehensif, dan untuk mengkonfirmasi apa yang saya pikirkan tentang sed / perl menjadi satu-satunya solusi. Aplikasi yang saya gunakan adalah Joomla yang sangat dikustomisasi, dan sementara open-source saya tidak punya waktu untuk menganalisa untuk bekerja jika itu akan pindah ke RDS dengan baik. Pikiran saya adalah 'coba dan lihat' - tetapi sepertinya langkah pertama adalah yang paling sulit - tidak sedikit karena alat migrasi Amazon yang tidak memadai (dalam pandangan saya). Saya setuju dengan model keamanan, tetapi jika output default mysqldump menciptakan begitu banyak masalah, mengapa mereka tidak memiliki solusi yang lebih baik? Saya akan menanyakan ini pada mereka juga.
dsl101
1
LUAR BIASA. terima kasih banyak untuk skrip perl itu. cadangan saya adalah 4+ GB dan hanya membuka itu adalah tantangan. ini menyelamatkan hari saya.
Emile Baizel
1
Penjelasan hebat, jawaban bagus, dan solusi hebat! Definisi bodoh
rkaregaran
4
Terima kasih banyak untuk perl Anda satu liner. Ini satu-satunya yang saya temukan yang benar-benar berfungsi. Banyak orang lain di papan ini tidak punya. Saya akan memilih lagi jika saya bisa.
lucian303
1

Dalam kasus saya adalah baris "UBAH MASTER KE MASTER_LOG_FILE = ..." di dump yang memberi saya kesalahan. Baris ini ditambahkan oleh opsi "--master-data" dari mysqldump. Di Amazon AWS Anda perlu memulai replikasi dengan mengatur detail utama dengan prosedur "mysql.rds_set_external_master" sebagai gantinya baca di sini

Jadi saya hanya memberi catatan pada baris itu "head 22 backup.dump" di mana baris 22 melaporkan kesalahan. Kemudian hapus sebelum mengimpor, untuk file besar saya, saya menggunakan: "sed '22d' backup.dump> backup_clean.dump"

Igor Toma
sumber