2008-09-30 16 views
19

Belirli bir makinedeki hesaplar arasında bir veritabanını çoğaltmak için mysqldump kullanıyorum. Tanımlanmış görüşlerimize ulaştığımız durumlar hariç, her şey harika çalışıyor.Hesaplar arasında görünümleri çoğaltmak için mysqldump'ı nasıl kullanabilirim?

ERROR 1227 (42000) at line 657: Access denied; you need the SUPER privilege for this operation 

Tabii benim yok demek: dökümü aşağıdaki gibi bir satır ...

/*!50013 DEFINER=`user_a`@`localhost` SQL SECURITY DEFINER */ 

içerdiğinden USER_B üzerinde mysql içine dökümü yüklerken ... biz bir hata alırsınız Bu mysql örneğinde SUPER ayrıcalığına sahip olmak. Görünümleri kullanıcı tanımlı bir şekilde dökmek için mysqldump'u ikna etmenin bir yolu var mı? Bu noktada el kitabında hiçbir şey bulamıyorum. Kullanıcı adlarını değiştirmek için aslında dumpfile ayrıştırmak zorunda mıyım? Yoksa bir şey mi özlüyorum?

cevap

27

aynı sorun. !

mysqldump -uuser1 -ppassword1 database1 > backup.sql 

sed '/^\/\*\!50013 DEFINER/d' backup.sql > backup_without_50013.sql 

mysql -u user2 -ppassword2 -D database2 < backup_without_50013.sql 

ilginç şey, burada,/* 50013 ile başlayan tüm satırları kaldırır sed komut şöyledir: o şekilde çözüldü.

Heidy

+2

Teşekkürler, aslında aynı şeyi yapmaya başladım, grep -v yerine sed yerine, ama sonuç aynıydı. :) –

2

SQL GÜVENLİK hükümler MySQL (muhtemelen anladım gibi) görünümü için erişim yetkileri kontrol ederken hesabın kullanılacağını belirler.

Eğer, bu görünümde güvenlik için birkaç seçenek tanımlayabilirsiniz bir görünüm oluşturmak

. Daha fazla here'u okuyabilirsiniz, ancak esas olarak varsayılan erişim, görünümün 'tanımlayıcısı' ile, yani onu oluşturan kullanıcıyla sınırlıdır.

+0

Teşekkürler, Maks. Ben kontrol ettim ve bu seçenekler ile tinkering mysqldump çıktı üretme yolunu etkiler görünmüyor. DEFINER hattını basitçe çıkarırsam altın olurdum. :) –

0

Çalıştır seçeneği mysqldump"--skip-triggers"

+0

İlginç bir fikir, ancak bu dökümü çıktıdaki @DEFINER satırlarını etkileyecek bir şey yapmıyor. Oturum açmış MySQL kullanıcısından başka bir tanesini ileri sürdüğüm sürece, güvenlik hatasını alıyorum. –

12

yedekleme dosyasını işlemek ve Belirleyiciyi değiştirmeniz gerekecektir: Ben değiştirmek ister localhost

@

Belirleyiciyi = user_a için:

DEFINER = CURRENT_USE R

Daha sonra otomatik olarak yükler hesaba ilişkilendirilir.

+3

Bahşiş için teşekkürler! Kullanıyorum ('' dan kaçmalıyım): sed -ri s/DEFINER = \ '[^ \'] + \ '@ \'% \ '/ DEFINER = CURRENT_USER/g file.sql – brunoqc

+2

Bu! Ve @brunoqc gelen küçük bir 'sed' büyü ile sadece mükemmel – Matthew

İlgili konular