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_user
bestaat 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 DEFINER
heeft, 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 sed
het 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
-
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;
-
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.
- 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
- 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;
- 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 SET
in het bestand *.sql
en 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
- In mijn bestand was dat regel #22, dus ik typte:
-
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