Erişim reddedildi; bu işlem için SÜPER ayrıcalıklara (en az birine) ihtiyacınız var


99

Bu yüzden sql dosyasını rds'ye (1G MEM, 1 CPU) aktarmaya çalışıyorum. Sql dosyası 1.4G gibidir

mysql -h xxxx.rds.amazonaws.com -u kullanıcı -ppass --max-izin verilen paket = 33554432 db <db.sql

Şuraya takıldı:

ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

Gerçek sql içeriği:

/*!50003 CREATE*/ /*!50017 DEFINER=`another_user`@`1.2.3.4`*/ /*!50003 TRIGGER `change_log_BINS` BEFORE INSERT ON `change_log` FOR EACH ROW
IF (NEW.created_at IS NULL OR NEW.created_at = '00-00-00 00:00:00' OR NEW.created_at = '') THEN
        SET NEW.created_at = NOW();
END IF */;;

another_user rds'de mevcut değil, bu yüzden var:

GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';

Hala şans yok.

Yanıtlar:


180

DEFINER=..İfadeyi sqldump dosyanızdan kaldırın veya kullanıcı değerlerini ile değiştirin CURRENT_USER.

RDS tarafından sağlanan MySQL sunucusu DEFINERbaşka bir kullanıcı için sözdizimine izin vermiyor (benim deneyimime göre).

Bunları seddosyadan kaldırmak için bir komut dosyası kullanabilirsiniz :

sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i oldfile.sql

3
Haklısın. Çalışmamasının nedeni DEFINER, oturum açmış kullanıcının SUPERayrıcalığa sahip olmadığı (RDS'de kendisine izin verilmeyen) başka bir kullanıcının belirtilmesinin keyfi ayrıcalık artırmaya izin vermesidir - depolanan programlar, kendi kimlik bilgileri ve ayrıcalıklarıyla çalışır. DEFINER(arayan kullanıcının aksine - onların INVOKER), varsayılan olarak. Ayrıca Sunucu Hatasında .
Michael - sqlbot

Adamım sen bir hayat kurtarıcısın. Hosting şirketim dışa aktarıldığında veritabanı bozuk olduğunu ve geri yüklemek için yapılabilecek hiçbir şey olmadığını söylemişti. Mükemmel çözüm.
Woody

5
Nedense + yerine * kullanmak zorunda kaldım:sed 's/\sDEFINER=`[^`]*`@`[^`]*`//' -i oldfile.sql
Berend de Boer

Teşekkürler @BerenddeBoer
Awolad Hossain

1
@WonderLand Hangisinin awkdaha hızlı olduğunu deneyebilirsinizsed
hjpotter92

50

Döküm dosyanız yoksa DEFINER, aşağıdaki satırların da varsa kaldırıldığından veya şununla yorum yapıldığından emin olun --:

Başlangıçta:

-- SET @@SESSION.SQL_LOG_BIN= 0;
-- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';

Sonunda:

-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

13
Sen ekleyerek bu önleyebilir --set-gtid-purged=OFFsizin için mysqldumpkomuta. Burada bulundu: stackoverflow.com/a/56251925
Illya Moskvin

17

Diğer bir kullanışlı numara, mysqldump'ı --set-gtid-purged = OFF seçeneğiyle çağırmaktır; bu, aşağıdaki satırları çıktı dosyasına yazmaz:

SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

DEFINER biri hakkında emin değilim.


1
Teşekkürler! RDS durumunda bana yardımcı oldu
Victor

Teşekkür ederim. Benim durumumda SET @@GLOBAL.GTID_MODE = OFF;, kaynak veritabanından dışa aktarım tarafında MySql Workbench'te koştum
Byron Wong,

8

Hjpotter92 cevabı için sadece bir MacOS ekstra güncelleme.

Yapmak için sedMacOS modeli anlamış, daha önce bir ters eğik çizgi eklemek gerekecek =böyle, sign:

sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' file.sql

macOS Catalina'da MariaDB 10.4 kullanıyor
Wayne

4

Sorun : Verileri (mysqldump dosyasını kullanarak) mysql veritabanınıza aktarmaya çalışıyorsunuz, ancak bu işlemi gerçekleştirmek için izniniz yok gibi görünüyor.

Çözüm : Verilerinizin mysql veritabanınızda taşındığını, tohumlandığını ve güncellendiğini varsayarak, mysqldump kullanarak anlık görüntü alın ve dosyaya aktarın

mysqldump -u [username] -p [databaseName] --set-gtid-purged=OFF > [filename].sql

Mysql belgelerinden:

GTID - Küresel işlem tanımlayıcı (GTID), kaynak sunucuda (ana) gerçekleştirilen her işlemle oluşturulan ve ilişkilendirilen benzersiz bir tanımlayıcıdır. Bu tanımlayıcı, yalnızca kaynaklandığı sunucu için değil, belirli bir çoğaltma kurulumundaki tüm sunucularda benzersizdir. Tüm işlemler ve tüm GTID'ler arasında 1'e 1 eşleme vardır.

--set-gtid-purged = OFF SET @@ GLOBAL.gtid_purged çıktıya eklenmez ve SET @@ SESSION.sql_log_bin = 0 çıktıya eklenmez. GTID'lerin kullanımda olmadığı bir sunucu için bu seçeneği veya AUTO'yu kullanın. Bu seçeneği yalnızca GTID'lerin kullanımda olduğu bir sunucu için, gerekli GTID kümesinin hedef sunucuda gtid_purged içinde zaten bulunduğundan ve değiştirilmemesi gerektiğinden eminseniz veya eksik GTID'leri manuel olarak belirleyip eklemeyi planlıyorsanız kullanın.

Daha sonra mysql'nize kullanıcı köküyle bağlanın, izinler verin, temizleyin ve kullanıcı ayrıcalıklarınızın doğru şekilde güncellendiğini doğrulayın.

mysql -u root -p
UPDATE mysql.user SET Super_Priv='Y' WHERE user='johnDoe' AND host='%';
FLUSH PRIVILEGES;
mysql> SHOW GRANTS FOR 'johnDoe';
+------------------------------------------------------------------+
| Grants for johnDoe                                               |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `johnDoe`                                  |
| GRANT ALL PRIVILEGES ON `db1`.* TO `johnDoe`                     |
+------------------------------------------------------------------+

şimdi verileri yeniden yükleyin ve işleme izin verilmelidir .

mysql -h [host] -u [user] -p[pass] [db_name] < [mysql_dump_name].sql

3

Veritabanı dosyasını .sql.gzformatta içe aktarmak için, tanımlayıcıyı kaldırın ve aşağıdaki komutu kullanarak içe aktarın

zcat path_to_db_to_import.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db_name
  1. Daha önce, aşağıdaki komutu kullanarak veritabanını .sql.gz biçiminde dışa aktarın.

    mysqldump -u user -p old_db | gzip -9 > path_to_db_exported.sql.gz;

  2. Dışa aktarılan veritabanını içe aktarın ve aşağıdaki komutu kullanarak tanımlayıcıyı kaldırın,

    zcat path_to_db_exported.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db


2

Yedeklemeyi geri yüklediğinizde, eski ve yenisi için aynı kullanıcı adıyla denediğinizden emin olun.


2

Tam Çözüm

Yukarıdaki tüm çözümler iyidir. Ve burada tüm çözümleri birleştireceğim, böylece tüm durumlar için çalışması gerekir.

  1. DEFINER düzeltildi

Linux ve Mac için

sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' file.sql

Windows için
atom veya notepad ++ indirin, döküm sql dosyanızı atom veya notepad ++ ile açın, Ctrl + F tuşlarına basın DEFINER
kelimesini arayın ve DEFINER = admin@% (veya sizin için biraz farklı olabilir) satırını her yerden kaldırın ve dosyayı kaydedin.
Örneğin
bu satırı kaldırmadan önce: CREATE DEFINER = admin@ %PROCEDUREMyProcedure
Bu satırı kaldırdıktan sonra: CREATE PROCEDUREMyProcedure

  1. 3 satırı kaldırın Döküm dosyasından tüm bu 3 satırı kaldırın. Sed komutunu kullanabilir veya dosyayı Atom düzenleyicide açıp her satırı arayabilir ve ardından satırı kaldırabilirsiniz.
    Örnek: Atom'da Dump2020.sql'yi açın, ctrl + F tuşlarına basın, SET @@ SESSION.SQL_LOG_BIN = 0 arayın , bu satırı kaldırın.
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
  1. Oluşturulan dosyanızla ilgili bir sorun var Oluşturulan dump.sql dosyanız uygun değilse bazı sorunlarla karşılaşabilirsiniz. Ancak burada, bir döküm dosyasının nasıl oluşturulacağını açıklamayacağım. Ama bana sorabilirsin ( _ )

1

Bütün çizgiler ile başlamak yorumladı SETiçinde *.sqldosyanın ve işe yaradı.


0

* Cevap yalnızca MacOS için geçerli olabilir *

Bir .sql dosyasını bir docker konteynerine aktarmaya çalışırken, hata mesajıyla karşılaştım:

Erişim reddedildi; bu işlem için SÜPER ayrıcalıklara (en az birine) ihtiyacınız var

Sonra diğer önerilerden bazılarını denerken, MacOS'umda (osx) aşağıdaki hatayı aldım

sed: RE hatası: geçersiz bayt dizisi

Son olarak, bu kaynaktan gelen aşağıdaki komut "Erişim Engellendi" sorunumu çözdü.

LC_ALL=C sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' fileName.sql

Böylece docker veritabanına şu şekilde aktarabilirim:

docker exec -i dockerContainerName mysql -uuser -ppassword table < importFile.sql

Bu yardımcı olur umarım! :)


0

Sunucu tarafında "log_bin_trust_function_creators" sunucu parametresini "on" ayarlamanız gerekir. Bu, gök mavisi maria db ise sol taraftaki bıçakta kolayca bulabilirsiniz.


-1

Beyan

TANIMLAYICI = username@%

yedekleme dökümünüzdeki bir sorundur.

Çözebileceğiniz çözüm, sql döküm dosyasındaki tüm girişleri kaldırmak ve verileri GCP konsolundan içe aktarmaktır.

kedi DUMP_FILE_NAME.sql | sed -e 's / DEFINER = <username>@ %// g'> YENİ-TEMİZLENMİŞ DUMP.sql

Yeni dosya (NEW-CLEANED-DUMP.sql) almayı deneyin.

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.