EC2 MySQL'i Amazon RDS'ye geçirmek için ilk girişim iyi değil - SUPER ayrıcalıkları


11

EC2 üzerinde çalışan MySQL'den yeni bir Amazon RDS örneğine (karşıya geçip geçemeyeceğimizi görmek için bir deneme) mevcut bir db'yi taşımaya çalışıyorum. Şimdiye kadar, iyi gitmiyor. Çoğaltmayı ayarlamadan önce ilk içe aktarmada takılı kaldım (talimatlar burada ).

Açıklandığı gibi RDS örneği hazırladım ve mysql kullanarak EC2 örneğinden bağlayabilirsiniz. Mysqldump komutunu şöyle çalıştırdım:

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

Sonra RDS'ye yüklemeyi denedi:

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

İlk sorun, çöplüğün 22. satırındaydı:

MASTER'İ MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106 DEĞİŞTİR;

Bu satır hataya neden oldu ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. Sorun değil, sadece bu satırı yorumladı ve daha sonra mysql.rds_set_external_master () ile düzeltmeyi umuyoruz. Yükleme denenir ve çok benzer bir hata var: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. 7844 çizgisinin etrafındaki bölüm şöyle:

/*!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` */;

İlk 2 satırı yorumlayarak ve üçüncüye bir 'CREATE' ekleyerek bunu geçebildim. Ama bunun gibi tonlarca bölüm var . Tüm düzenlemeler olmadan bunun bir yolu var mı? mysqldumpSÜPER ayrıcalıklara ihtiyaç duyan hiçbir şey üretmeme seçeneği gibi mi?

sedMysqldump / mysqlbinlog çıktısına karşı koşmak zorunda gibi birçok insanın benzer sorunları vardı gibi görünüyor ! Ben de AWS forumunda yayınlayacağım - gerçekten RDS mysqldump, veya RDS güvenliği ile şikayet bir dökümü oluşturmak için mevcut bir db karşı çalıştırılabilir belirli bir araç ithal daha toleranslı bir yol olması gerektiğini düşünüyorum. Sadece kimse burada yardımcı olabilecek başka tarifler veya püf noktaları olup olmadığını merak etti.

Teşekkürler,

Dave


Üzgünüz - Ben değiştirmeyi denedim söylemek unuttum log_bin_trust_function_creators1'e parametreyi, ama yine hattında 7844. aynı hatayı alıyorum
dsl101

Eski yazı, ancak ilk hata söyleyerek önleyebilirsiniz --masterdata=2. Daha sonra satır dökümde yorumlanacaktır.
Halfgaar

Yanıtlar:


26

log_bin_trust_function_creatorsRDS'de büyük olasılıkla = 1'e ihtiyacınız var, ancak sorun burada değil.

DEFINER Yalnızca SUPER ayrıcalığınız varsa, kendi hesabınızdan başka bir değer  belirleyebilirsiniz  .

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

Depolanmış bir program (proc, işlev, olay veya tetikleyici) çalışırken, yaptığı her şey, onu tanımlayan kullanıcının veya bir DEFINERbildirimle açıkça belirtilen kullanıcının izinlerine sahiptir . Bu, diğer şeylerin yanı sıra, depolanan programların diğer kullanıcıların verilere bir şeyler yapmalarına izin vermesine izin verir, depolanan programı kullanma iznine sahip oldukları sürece, doğrudan manipüle etme izinleri yoktur.

Bu durumda, eğer SUPERkullanıcı olmayan bir kişi rasgele bir tanımlayıcıyla bir prosedür oluşturabilirse , bu ciddi bir güvenlik açığı olacaktır , çünkü kullanıcı kendi iradesini kendi isteğine göre artırabilir.

Bu, elbette, tanımladığınız güvenlik bağlamı kullanıldığında, gönderdiğiniz örnekte olduğu gibi, görünümler için de geçerlidir.

RDS ile ilgili en büyük şikayetlerden biri, sahip olamayacağınız SUPER... ve şimdi sizden de olabilir :) çünkü bu gerçek, yaşadığınız sorunun sebebidir.

Tabii ki, yönetilen bir MySQL hizmeti çalıştırıyor olsaydım, kimseye de vermezdim SUPER, bu yüzden güvenlik modeli bazen hantal olsa bile mantıklı.

Tüm nesneleriniz aynı tanımlayıcıya sahipse, şu anda kullandığınız hesap yerine bu hesabı kullanarak dökümü geri yüklemek bir çözüm olacaktır, ancak bu olası görünmemektedir.

Yalnızca DEFINERbildirimle birlikte satırın silinmesi, satır satırının kendi başına bir satırda göründüğü durumlarda çalışmasını sağlamalıdır veya dosyayı değiştirmek için sed veya perl kullanabilirsiniz ... zaten sevmediğini bildiğim bir fikir, ama MySQL hakkında gerçekten böyle güzel bir şey oldukça meşru ve RDS olmayan bir ortamda bile bir DBA olarak yapmam gereken şeylerden çok uzak değil.

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

... büyük ihtimalle umduğunuz cevap değil, ancak çöplüğünüze karşı çalıştırabilirsiniz ve sonuç olarak biraz daha kullanışlı bir dosya elde edersiniz.


Kapsamlı cevap için ve sed / perl hakkında ne düşündüğümü doğrulayan tek çözüm olduğu için çok teşekkürler. Kullandığım uygulama son derece özelleştirilmiş Joomla ve açık kaynak kodluyken, RDS'ye doğru hareket edip etmediğini çözmek için analiz etmek için zamanım / yeteneğim yok. Benim düşüncem 'denemek ve görmek' idi - ama ilk adım en zor gibi görünüyor - Amazon'un yetersiz (bence) göç araçları nedeniyle küçük bir kısmı yok. Güvenlik modelini kabul ediyorum, ancak mysqldump'ın varsayılan çıktısı çok fazla sorun yaratıyorsa, neden daha iyi bir çözüme sahip değiller? Ben de onlardan isteyeceğim.
dsl101

1
HARİKA. Bu perl betiği için çok teşekkür ederim. yedeklemem 4+ GB'dı ve sadece açmak zor bir işti. bu benim günümü kurtardı.
Emile Baizel

1
Harika bir açıklama, harika bir cevap ve harika bir çözüm! Aptal tanımlayıcı.
rkaregaran

4
Perl bir astarınız için çok teşekkürler. Gerçekten işe yaradığını bulabildiğim tek kişi bu. Bu kartlardaki diğer pek çok kişi bunu yapmaz. Yapabilirsem tekrar vekil olurdum.
lucian303

1

Benim durumumda bana hata veren dökümü "MASTER_LOG_FILE = ... DEĞİŞTİRME satırı" oldu. Bu satır mysqldump'ın "--master-data" seçeneği ile eklendi. Amazon AWS'de, ana ayrıntıları "mysql.rds_set_external_master" prosedürü ile buradan ayarlayarak çoğaltmaya başlamanız gerekir.

Bu yüzden sadece satır 22 hata bildirilen o satır "kafa 22 backup.dump" notları toke. Sonra içe aktarmadan önce kaldırın, benim büyük dosya için kullanıyorum: "sed '22d' backup.dump> backup_clean.dump"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.