Mam problemy z utworzeniem kopii zapasowej moich baz danych po aktualizacji. Grzebię w moim systemie, próbując dowiedzieć się, dlaczego. Jedno zapytanie, które uruchomiłem, zwróciło ten wynik.
Got error: 1449: The user specified as a definer ('cittool'@'%') does not exist when using LOCK TABLES
Po pewnym dochodzeniu wydaje się, że definicją tych widoków jest stare konto programisty, które zostało usunięte z systemu. Bazy danych i widoki z tym problemem są używane bardzo rzadko, a większość z nich jest przechowywana do celów archiwalnych.
Istnieje około 40 widoków z definicjorem, który już nie istnieje. Czy istnieje prosty sposób na zmianę definicji konta na inne konto na raz? Czy istnieje sposób, aby mysqldump po prostu zrzucił wszystkie widoki do pliku, abym mógł edytować ten plik i odtworzyć te widoki?
Odpowiedzi:
Utwórz plik tekstowy ze wszystkimi definicjami widoku:
Stamtąd edytujesz AllMyViews.sql. Następnie upuść widoki
Po edycji AllMyViews.sql załaduj je ponownie
Spróbuj !!!
źródło
The user specified as a definer ('abc'@'1.2.3.4') does not exist
CREATE USER 'abc'@'1.2.3.4';
. Następnie spróbuj ponownie.Możesz użyć ALTER VIEW w połączeniu ze schematem informacyjnym . Wspomniałeś o zrzuceniu go do pliku tekstowego, więc może coś takiego:
Wymieszaj to z wierszem poleceń mysql (zakładając, że * nix nie zna systemu Windows):
Sidenote: Nie można bezpośrednio zmieniać wpisów w schemacie informacji . Uwaga 2: Działa to tylko dla jednej bazy danych na raz, jeśli odrzucisz GDZIE schemat_tabeli, musisz wstawić między nimi polecenia USE.
źródło
SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp';
powroty| Staff | |
echo "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
Automatyzacja rozwiązania Dereka spowoduje zmianę DEFINERA na
root@localhost
i ustawienieSQL SECURITY INVOKER
(upewnij się, że chcesz tego najpierw!) We wszystkich widokach we wszystkich bazach danych:OSTRZEŻENIE: upewnij się, że wykonałeś pełną kopię zapasową mysql (np. Zatrzymując mysqld i wykonując kopię zapasową wszystkich plików w katalogu / var / lib / mysql) przed jego uruchomieniem - na wszelki wypadek ... Dla mnie zadziałało, ale YMMV .
powinieneś również sprawdzić wszystkie swoje tabele / widoki za pomocą:
nie powinien już narzekać na nieprawidłowe definicje w widokach.
źródło
Wyeksportuj wszystkie widoki bazy danych
<DB>
:lub:
Edytuj
views.sql
(zmień definicję) i utwórz je ponownie:Określ
-u
i-p
przełącz w razie potrzeby.źródło
views.sql
edytować WIDOKI ? Jak je odtworzyć?DEFINER = olduser@oldhost
naDEFINER = newuser@newhost
,cat views.sql | mysql <DB>
odtwarza widoki.