Mam zrzut MySQL jednej z moich baz danych. Są w nim klauzule DEFINER, które wyglądają jak:
"DEFINER=`root`@`localhost`"
Mianowicie, te klauzule DEFINER znajdują się w moich instrukcjach CREATE VIEW i CREATE PROCEDURE. Czy istnieje sposób na usunięcie tych klauzul DEFINER z mojego pliku zrzutu?
Odpowiedzi:
Nie sądzę, aby można było zignorować dodawanie
DEFINER
s do zrzutu. Ale istnieją sposoby na ich usunięcie po utworzeniu pliku zrzutu.Otwórz plik zrzutu w edytorze tekstu i zamień wszystkie wystąpienia
DEFINER=root@localhost
na pustym ciągiem „”Edytuj zrzut (lub potokuj wyjście) używając
perl
:Przepuść wyjście przez
sed
:źródło
sed -E 's/DEFINER=
[^]+
@[^
] +/DEFINER=CURRENT_USER/g' dump.sql > new_dump.sql
Ma tę zaletę, że utrzymuje ograniczenia / kontrolę dostępu.sed
Komenda nie usuwa zapis definiujący od procedur i funkcji. Oto ulepszona wersja, która obsługuje widoki, wyzwalacze, procedury i funkcje:sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*PROCEDURE/PROCEDURE/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*FUNCTION/FUNCTION/'
Możesz usunąć za pomocą SED
W systemie MacOS:
źródło
-i extension
„Edytuj pliki w miejscu, zapisując kopie zapasowe z określonym rozszerzeniem. Jeśli podano rozszerzenie o zerowej długości, żadna kopia zapasowa nie zostanie zapisana. Nie zaleca się nadawania rozszerzenia o zerowej długości, gdy pliki do edycji lokalnej, ponieważ istnieje ryzyko uszkodzenia lub częściowej zawartości w sytuacjach, gdy miejsce na dysku jest wyczerpane itp. ”Od wersji mysql 5.7.8 możesz użyć tej
--skip-definer
opcji z mysqlpump, np:Zobacz zaktualizowaną instrukcję mysql na http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer
źródło
mysqldump
amysqlpump
- tutaj jest powiązane pytanie: dba.stackexchange.com/questions/118846/mysqldump-vs-mysqlpumpinformation_schema.user
i nie zawsze jest to czytelne dla wszystkich użytkownikówUżyłem tych pomysłów, aby usunąć klauzulę DEFINER z własnego wyniku mysqldump, ale wybrałem prostsze podejście:
Po prostu usuń
!
przed kodem i DEFINER, a reszta komentarza stanie się zwykłym komentarzem.Przykład:
staje się bezradny, tak mało jak to.
Najłatwiejszym regexp jest jednak usunięcie! i liczby
To usuwa
!#### DEFINER
i zastępuje DEFINER ... możesz też usunąć DEFINER, to naprawdę nie ma znaczenia - kiedy "!" przepadłoźródło
Zgodnie z zaleceniami drugiej strony, oto przykład, jak usunąć DEFINER ze zrzutu po zakończeniu zrzutu:
źródło
user
@localhost
* / / *! 50003 wyzwalaj my_triggername BEFORE INSERT ON my_table FOR EACH ROW .... * / ;; igrep -v
całkowicie usunie te linie. (chociaż 50017! = 50013)Jak wspominali inni, pozbycie się elementu definiującego jakimkolwiek wyrażeniem regularnym nie jest zbyt skomplikowane. Ale inne przykłady pozbawiły mnie definicji widoku.
Oto wyrażenie regularne, które zadziałało dla mnie:
źródło
*/
. MySQL 5.6.31.Aby uzyskać zautomatyzowane rozwiązanie, możesz spojrzeć na
mysqlmigrate
. Jest to opakowanie Bash,mysqldump
które umożliwia migrację baz danych i ignorowanie instrukcji DEFINER. Przykład:http://thesimplesynthesis.com/post/mysqlmigrate (lub GitHub )
W przeciwnym razie tak, potrzebne jest polecenie takie, jak wskazuje Abhay:
źródło
Inna opcja na OSX, aby usunąć definicje w pliku:
źródło
Powinieneś poszukać odpowiedzi tutaj: /dba/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079
Moim zdaniem najlepszym sposobem rozwiązania tego problemu jest nie dodawanie dodatkowej analizy ciągu z sed, grep lub jakimkolwiek innym, zamiast tego mysqldump jest w stanie wygenerować dobry zrzut, dodając --single-transaction
źródło
Szybkim sposobem na zrobienie tego jest potokowanie wyjścia mysqldump przez sed, aby usunąć
DEFINER
instrukcje opakowane w komentarze warunkowe. Używam tego do usuwaniaDEFINER
zCREATE TRIGGER
instrukcji, ale możesz dostosować numer wersji komentarza warunku w wyrażeniu regularnym, aby odpowiadał swoim celom.źródło
Nie wiem, czy to pomaga, ale używam SQLyog Community Edition, dostępnego pod adresem: -
https://code.google.com/p/sqlyog/wiki/Downloads
Podczas zrzucania sql lub kopiowania do innej bazy danych umożliwia `` Ignoruj DEFINER ''
Jest bezpłatny i zapewnia podstawową funkcjonalność, której wymaga wiele osób
Dostępna jest również wersja płatna: -
https://www.webyog.com/product/sqlyog
Twoje zdrowie
źródło
Dla mnie to działa:
perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp
. To usunęło DEFINER = root @ localhost z mojego zrzutu przy każdej instrukcji tworzenia proceduryźródło
Oto kompletne działające rozwiązanie do usuwania informacji DEFINER dla
MySQL 5.6.x
systemu i Linux (testowane naCentOS 6.5
).Zwykle musimy zastąpić następujące wpisy ze zrzutu Mysql (jeśli są wzięte razem z danymi i wyzwalaczami / procedurami / funkcjami).
Zrzut został wykonany za pomocą poniższego polecenia mysqldump.
Wymagany plik zrzutu bez informacji DEFINER można uzyskać za pomocą poniższych trzech poleceń.
Jeśli plik zrzutu znajduje się w Twoim bieżącym folderze, zignoruj [PATH /].
Jeśli dane w tabelach są bardzo duże, wykonaj zrzut w dwóch plikach, w jednym pliku zrzutu weź zrzut z danymi, aw innym pliku zrzutu weź zrzut tylko skryptów (Wyzwalacze / Funkcje / Procedury.) I uruchom trzy powyższe polecenia w drugim pliku zrzutu (skryptów).
źródło
Zamień wszystkich zdefiniowanych użytkowników na CURRENT_USER. W moim skrypcie Gradle, który tworzy kopię zapasową, mój skrypt zamiany wygląda następująco:
który tak naprawdę po prostu dzwoni do ANT. Wtedy nie będziesz musiał się tym martwić.
źródło
Na komputerach z systemem Linux możesz użyć tego jednowierszowego:
Musisz tylko zamienić pogrubione ciągi na poświadczenia użytkownika bazy danych i nazwę / podobny wzorzec bazy danych.
Więcej informacji tutaj: http://blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/
źródło
Jedyny sposób, w jaki mogłem go uruchomić pod Windows:
Zainstaluj http://gnuwin32.sourceforge.net/, aby mieć seda w linii poleceń i dodaj go do ŚCIEŻKI Windows : D: \ programy \ GetGnuWin32 \ bin;
źródło
Dziękuję wszystkim za podpowiedzi. Będąc leniwy, napisałem skrypt o nazwie: „MYsqldump”:
źródło
Na coś takiego:
Spróbuj tego:
źródło
otwórz swoją bazę danych dowolnym edytorem, którego używałem z notatnikiem ++,
znajdź wszystko, przetestuj to
DEFINER=root@localhost
i zamień na none (""
) IE. Usuń to.Następnie możesz zaimportować go do dowolnego hosta, który chcesz.
źródło
Najprostszym wyrażeniem regularnym, które działa dla mnie ze wszystkimi obiektami, jest:
Zauważ, że
quote-names
musi byćTRUE
(co jest domyślne).Mam nadzieję, że w nowszych wersjach przełącznik
--skip-definer
wprowadzony w mysqlpump w wersji 5.7 dotyczy również mysqldump.źródło
Użyłem skryptu PowerShell, aby usunąć wszystkie linie z
DEFINER
:get-content $ file_in_full_path | select-string -pattern $ line_string_delete -notmatch | Out-File -width 1000000000 -Encoding Domyślnie $ file_out_full_path
źródło
Nic dla mnie nie działało, więc musiałem napisać własny regex.
Spróbuj zrzucić bazę danych do pliku,
cat
całego pliku igrep
tylko zdefiniowanych instrukcji, aby je zobaczyć.cat plik.sql | grep -o -E '. {, 60} DEFINER. {, 60}'
Wpisz swoje wyrażenie regularne
Prześlij zrzut do seda za pomocą tego wyrażenia regularnego. Na przykład moje stwierdzenie to:
mysqldump | sed -E // *! 500 [0-9] [0-9] DEFINER =. +? * /// '| sed -E 's / DEFINER =
?[^ ]+?
? @?[^ ]+?
? //'Zysk!
źródło
remove_definers.bat:
źródło