Toegang geweigerd; je hebt (ten minste één van) de SUPER-rechten nodig voor deze bewerking

Dus ik probeer het sql-bestand te importeren in rds (1G MEM, 1 CPU). Het sql-bestand is als 1.4G

mysql -h xxxx.rds.amazonaws.com -u gebruiker -ppass –max-allowed-packet=33554432 db < db.sql

Het is vastgelopen op:

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

De werkelijke sql-inhoud is:

/*!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_userbestaat niet in rds, dus ik wel:

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

Nog steeds geen geluk.


Antwoord 1, autoriteit 100%

Verwijder de instructie DEFINER=..uit uw sqldump-bestand, of vervang de gebruikerswaarden door CURRENT_USER.

De MySQL-server die door RDS wordt geleverd, staat (naar mijn ervaring) geen DEFINER-syntaxis toe voor een andere gebruiker.

Je kunt een sed-script gebruiken om ze uit het bestand te verwijderen:

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

Antwoord 2, autoriteit 45%

Als uw dumpbestand geen DEFINERheeft, zorg er dan voor dat deze regels hieronder ook worden verwijderd als ze er zijn, of als commentaar worden verwijderd met --:

Aan het begin:

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

Aan het einde:

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

Antwoord 3, autoriteit 15%

Een andere handige truc is om mysqldump aan te roepen met de optie –set-gtid-purged=OFF die de volgende regels niet naar het uitvoerbestand schrijft:

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

niet zeker van de DEFINER.


Antwoord 4, autoriteit 5%

Gewoon een extra MacOS-update voor hjpotter92-antwoord.

Om sedhet patroon in MacOS te laten herkennen, moet je een backslash toevoegen voor het =-teken, zoals dit:

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

Antwoord 5, autoriteit 3%

Als we een nieuwe RDS DB-instantie maken, is de standaardhoofdgebruiker niet de rootgebruiker. Maar krijgt alleen bepaalde privileges voor dat DB-exemplaar. Deze machtiging omvat geen SET-machtiging. Als uw standaard hoofdgebruiker nu mysql SET-opdrachten probeert uit te voeren, krijgt u deze foutmelding: Toegang geweigerd; je hebt (ten minste één van) de SUPER- of SYSTEM_VARIABLES_ADMIN-rechten nodig voor deze bewerking

Oplossing 1

Reageer op deze regels of verwijder ze

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

Oplossing 2

Je kunt de fouten ook negeren door de -f optie te gebruiken om de rest van het dumpbestand te laden.

mysql -f <REPLACE_DB_NAME> -u <REPLACE_DB_USER> -h <DB_HOST_HERE> -p < dumpfile.sql

Antwoord 6, autoriteit 3%

Probleem: u probeert gegevens te importeren (met behulp van het mysqldump-bestand) naar uw mysql-database, maar het lijkt erop dat u geen toestemming hebt om die bewerking uit te voeren.

Oplossing: ervan uitgaande dat uw gegevens zijn gemigreerd, geplaatst en bijgewerkt in uw mysql-database, maak dan een momentopname met mysqldump en exporteer deze naar een bestand

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

Van mysql-documentatie:

GTID– Een globale transactie-ID (GTID) is een unieke identificatie die is gemaakt
en gekoppeld aan elke transactie die is gepleegd op de server van oorsprong
(meester). Deze identifier is niet alleen uniek voor de server waarop hij
is ontstaan, maar is uniek voor alle servers in een bepaalde replicatie
opstelling. Er is een 1-op-1 mapping tussen alle transacties en alle
GTID’s.

–set-gtid-purged=OFFSET @@GLOBAL.gtid_purged wordt niet toegevoegd aan de uitvoer en SET
@@SESSION.sql_log_bin=0 wordt niet toegevoegd aan de uitvoer. Voor een server waar
GTID’s zijn niet in gebruik, gebruik deze optie of AUTO. Gebruik alleen deze optie
voor een server waarop GTID’s in gebruik zijn als u zeker weet dat de vereiste
GTID-set is al aanwezig in gtid_purged op de doelserver en
niet mogen worden gewijzigd, of als u van plan bent ontbrekende te identificeren en toe te voegen
GTID’s handmatig.

Verbind daarna met uw mysql met root van de gebruiker, geef machtigingen, spoel ze door en controleer of uw gebruikersrechten correct zijn bijgewerkt.

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`                     |
+------------------------------------------------------------------+

laad nu de gegevens opnieuw en de bewerking zou moeten worden toegestaan.

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

Antwoord 7

Voor het importeren van een databasebestand in de indeling .sql.gz, verwijdert u de definitie en importeert u met onderstaande opdracht

zcat path_to_db_to_import.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db_name
  1. Eerder, exporteer de database in .sql.gz-indeling met behulp van onderstaande opdracht.

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

  2. Importeer die geëxporteerde database en verwijder de definitie met het onderstaande commando,

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


Antwoord 8

Volledige oplossing

Alle bovenstaande oplossingen zijn prima. En hier ga ik alle oplossingen combineren zodat het voor alle situaties zou moeten werken.

  1. Vaste DEFINER

Voor Linux en Mac

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

Voor Windows
download atom of notepad++, open je dump sql-bestand met atom of notepad++, druk op Ctrl+F
zoek het woord DEFINERen verwijder de regel DEFINER=admin@%(of misschien iets anders voor jou ) overal vandaan en sla het bestand op.
Zoals bijvoorbeeld
voordat u die regel verwijdert: CREATE DEFINER=admin@%PROCEDURE MyProcedure
Na het verwijderen van die regel: CREATE PROCEDURE MyProcedure

  1. Verwijder de 3 regels
    Verwijder al deze 3 regels uit het dumpbestand. U kunt de opdracht sedgebruiken of het bestand openen in de Atom-editor en naar elke regel zoeken en vervolgens de regel verwijderen.
    Voorbeeld: Open Dump2020.sql in Atom, druk op ctrl+F, zoek SET @@SESSION.SQL_LOG_BIN= 0, verwijder die regel.
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
  1. Er is een probleem met je gegenereerde bestand
    U kunt een probleem tegenkomen als uw gegenereerde dump.sql-bestand niet correct is. Maar hier ga ik niet uitleggen hoe je een dumpbestand genereert. Maar je kunt het mij vragen (_)

Antwoord 9

Ik merkte op dat alle regels beginnen met SETin het bestand *.sqlen dat het werkte.


Antwoord 10

Als je de back-up terugzet, probeer dan met dezelfde gebruikersnaam voor de oude en de nieuwe.


Antwoord 11

Geen van de bovenstaande oplossingen werkte voor mij. Ik moest het volgende doen:

  • Gebruik de volgende vlaggen met mysqldump:

    mysqldump --databases <db1> <db2> --master-data=1 --single-transaction --order- 
    by-primary --foce -r all.sql -h<host> -u<user> -p<password>
    
  • Verwijder de regel die eruitziet als:

    CHANGE MASTER TO MASTER_LOG_FILE='binlog.....
    
    • In mijn bestand was dat regel #22, dus ik typte: sed -i '22d' all.sql
  • Importeer de gegevens naar uw RDS:

    mysql -h<host> -u<user> -p<password>
    $ source all.sql
    

Antwoord 12

Probleem

Onderstaande verklaring of regel uw probleem met het maken van Dump-bestanden

DEFINER=username@`%

Eenvoudige oplossing

De oplossing die u kunt omzeilen, is door alle vermeldingen uit het SQL-dumpbestand te verwijderen en gegevens te importeren uit de GCP-console.

cat DUMP_FILE_NAME.sql |  sed -e 's/DEFINER=`<username>`@`%`//g' > NEW-CLEANED-DUMP.sql

het bovenstaande commando helpt om al die regels uit het dumpbestand te verwijderen en het nieuwe verse dumpbestand te maken zonder Definer.

Probeer een nieuw bestand te importeren(NEW-CLEANED-DUMP.sql).


Antwoord 13

* Antwoord is mogelijk alleen van toepassing op MacOS *

Bij het importeren van een .sql-bestand in een docker-container, kwam ik de foutmelding tegen:

Toegang geweigerd; je hebt (ten minste één van) de SUPER-privilege(s) nodig voor
deze operatie

Terwijl ik enkele van de andere suggesties probeerde, kreeg ik de onderstaande foutmelding op mijn MacOS (osx)

sed: RE-fout: illegale bytereeks

Ten slotte de volgende opdracht van deze bronmijn probleem “Toegang geweigerd” opgelost.

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

Dus ik kon importeren in de docker-database met:

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

Hopelijk helpt dit! 🙂


Antwoord 14

Moet “aan” serverparameter “log_bin_trust_function_creators” aan serverzijde instellen. Deze kun je gemakkelijk vinden op het linker zijblad als het azuurblauwe maria db is.


Antwoord 15

Als het helpt, kreeg ik deze foutmelding toen ik probeerde een DB-dump op mijn AWS MySQL RDS te herstellen:

ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER, 
SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation

Ik hoefde de DEFINER niet te wijzigen of regels te verwijderen/commentaar te geven. Ik heb net gedaan:

GRANT SESSION_VARIABLES_ADMIN ON *.* TO myuser@'myhost';
GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO myuser@'myhost';

En ik heb het herstel kunnen doen.


Antwoord 16

Probleem in dump.

Probeer dump op de volgende manier te krijgen:

mysqldump -h databasehost –user=databasegebruikersnaam –password –single-transactie databasenaam | sed -e ‘s/DEFINER[ ]=[ ][^]*/*/’ | gzip > /tmp/database.sql.gz

Probeer dan op de volgende manier te importeren:

zcat /tmp/database.sql.gz | mysql -h database_host -u gebruikersnaam -p databasenaam

LEAVE A REPLY

Please enter your comment!
Please enter your name here

7 + fourteen =

Other episodes