Więc próbuję zaimportować plik sql do rds (1G MEM, 1 procesor). Plik sql ma rozmiar 1,4G
mysql -h xxxx.rds.amazonaws.com -u użytkownik -ppass --max-allowed-packet = 33554432 db <db.sql
Utknęło w:
ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
Rzeczywista zawartość sql to:
/*!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
nie istnieje w rds, więc robię:
GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';
Wciąż nie ma szczęścia.
mysql
amazon-web-services
amazon-rds
kenpeter
źródło
źródło
DEFINER
gdy zalogowany użytkownik nie maSUPER
uprawnienia (co samo w sobie jest niedozwolone w RDS), umożliwiłoby dowolną eskalację uprawnień - zapisane programy działają z poświadczeniami i uprawnieniami ichDEFINER
(w przeciwieństwie do użytkownika dzwoniącego - ichINVOKER
), domyślnie. Również w przypadku awarii serwera .sed 's/\sDEFINER=`[^`]*`@`[^`]*`//' -i oldfile.sql
awk
co może być trochę szybsze niżsed
Jeśli twój plik zrzutu nie ma
DEFINER
, upewnij się, że te wiersze poniżej zostały również usunięte, jeśli się tam znajdują, lub zakomentowane za pomocą--
:Na początku:
-- SET @@SESSION.SQL_LOG_BIN= 0; -- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
Na końcu:
-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
źródło
--set-gtid-purged=OFF
domysqldump
polecenia. Znaleziono tutaj: stackoverflow.com/a/56251925Inną przydatną sztuczką jest wywołanie mysqldump z opcją --set-gtid-purged = OFF, która nie zapisuje następujących wierszy w pliku wyjściowym:
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ ''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
nie jestem pewien co do DEFINERA.
źródło
SET @@GLOBAL.GTID_MODE = OFF;
w MySql Workbench po stronie eksportującej ze źródłowej bazy danychTylko dodatkowa aktualizacja MacOS dla odpowiedzi hjpotter92.
Aby
sed
rozpoznać wzór w systemie MacOS, musisz dodać ukośnik odwrotny przed=
znakiem, na przykład:źródło
Problem : Próbujesz zaimportować dane (używając pliku mysqldump) do bazy danych mysql, ale wygląda na to, że nie masz uprawnień do wykonania tej operacji.
Rozwiązanie : Zakładając, że dane są migrowane, wysyłane i aktualizowane w bazie danych mysql, zrób migawkę za pomocą mysqldump i wyeksportuj ją do pliku
mysqldump -u [username] -p [databaseName] --set-gtid-purged=OFF > [filename].sql
Następnie połącz się z mysql za pomocą użytkownika root, nadaj uprawnienia, opróżnij je i sprawdź, czy uprawnienia użytkownika zostały poprawnie zaktualizowane.
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` | +------------------------------------------------------------------+
teraz przeładuj dane i operacja powinna być dozwolona .
źródło
Aby zaimportować plik bazy danych w
.sql.gz
formacie, usuń definicję i zaimportuj za pomocą poniższego poleceniaWcześniej wyeksportuj bazę danych w formacie .sql.gz za pomocą poniższego polecenia.
mysqldump -u user -p old_db | gzip -9 > path_to_db_exported.sql.gz;
Zaimportuj wyeksportowaną bazę danych i usuń definicję za pomocą poniższego polecenia,
zcat path_to_db_exported.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db
źródło
Podczas przywracania kopii zapasowej upewnij się, że używasz tej samej nazwy użytkownika dla starego i nowego.
źródło
Pełne rozwiązanie
Wszystkie powyższe rozwiązania są w porządku. I tutaj połączę wszystkie rozwiązania, aby działały we wszystkich sytuacjach.
Dla systemu Linux i Mac
W przypadku
pobierania atomu lub notatnika ++ dla systemu Windows otwórz plik dump sql za pomocą atomu lub notepad ++, naciśnij Ctrl + F
wyszukaj słowo DEFINER i usuń wiersz DEFINER =
admin
@%
(lub może być trochę inny dla ciebie) z dowolnego miejsca i zapisz plik.Jak na przykład
przed usunięciem tej linii: CREATE DEFINER =
admin
@%
PROCEDUREMyProcedure
Po usunięciu tej linii: CREATE PROCEDURE
MyProcedure
Przykład: Otwórz Dump2020.sql w Atom, naciśnij ctrl + F, wyszukaj SET @@ SESSION.SQL_LOG_BIN = 0 , usuń tę linię.
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ ''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
źródło
Skomentowałem wszystkie linie zaczynające się od
SET
w*.sql
pliku i zadziałało.źródło
* Odpowiedź może dotyczyć tylko systemu MacOS *
Podczas próby zaimportowania pliku .sql do kontenera Dockera, napotkałem komunikat o błędzie:
Następnie podczas wypróbowywania innych sugestii otrzymałem poniższy błąd na moim MacOS (osx)
Wreszcie następujące polecenie z tego zasobu rozwiązało mój problem „Odmowa dostępu”.
Mogłem więc zaimportować do bazy Dockera za pomocą:
Mam nadzieję że to pomoże! :)
źródło
Należy ustawić parametr serwera „on” „log_bin_trust_function_creators” po stronie serwera. Ten można łatwo znaleźć na lewym ostrzu, jeśli jest lazurowy maria db.
źródło
Komunikat
jest problemem w zrzucie kopii zapasowej.
Rozwiązaniem, które możesz obejść, jest usunięcie całego wpisu z pliku zrzutu sql i zaimportowanie danych z konsoli GCP.
Spróbuj zaimportować nowy plik (NEW-CLEANED-DUMP.sql).
źródło