Jak zmienić DEFINER WIDOKU w Mysql?


35

Po uruchomieniu mysqldump pojawia się błąd:

mysqldump: Got error: 1449: The user specified as a definer ('root'@'foobar') does not exist when using LOCK TABLES

Ma to sens, ponieważ foobarjest to starsza maszyna, która już nie istnieje.

Jak zmienić definicję wszystkich moich tabel na „root” @ „localhost”?


4
Czy masz widoki? Tabele nie mają definicji jestem pewien ... Zobacz także dba.stackexchange.com/q/4129/630
gbn

1
@ gbn +1 miałeś rację - były to wyświetlenia - dzięki za link, ale nie mogłem go poprawnie uruchomić. Byłem jednak w stanie zmodyfikować widoki w SQLyog, więc mogłem zrobić zrzut.
kfmfe04,

To działa dla mnie. {{przyznaj wszystko . na „root” @ „%” identyfikowany przez „hasło” z opcją przyznania; }}
Muhammad Azeem

Odpowiedzi:


33

Myślę, że baza danych, którą próbujesz zrzucić, zawiera procedury / metody zdefiniowane przez użytkownika podczas logowania jako root @ 'foobar'.

Teraz rozwiązaniem jest zastąpienie programu definiującego dla tych procedur / metod

wtedy możesz wygenerować zrzut bez błędu.

możesz to zrobić jak ...

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar'

Uważaj, ponieważ spowoduje to zmianę wszystkich definicji dla wszystkich baz danych.

Spróbuj....!

AKTUALIZACJA 9 lutego 2012 r

Jak zobaczyłem link podany przez @gbn, który jest odpowiedzią udzieloną przez @Rolando, może to być również przypadek. Proszę odwiedzić link

EDIT przez @RolandoMySQLDBA 16.12.2011 11:20 EDT

Chociaż ryzykowna, ta odpowiedź jest dobra. Wyjaśnij: możesz podać bazę danych w zapytaniu w następujący sposób:

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';

1
Powyższy link pokazuje, jak to zrobić za pomocą instrukcji ALTER, które mogą być mniej ryzykowne ... Proszę również sprawdzić moją aktualizację w celu
zdefiniowania definicji

UPDATEzmieniono tabelę, ale mysqldumpnie widzi: mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES. Nawet po ponownym uruchomieniu mysql. Biegnę mysql-5.5.31.
x-yuri

Mój błąd. Miałem też poglądy ze złym definicjorem. update mysql.procpodejście rzeczywiście działa.
x-yuri

Nie działał ....
カ オ ナ シ

3
Ta odpowiedź działa w celu zmiany definicji procedur i funkcji, ale nie zmienia definiatora widoku .
Anthony G - sprawiedliwość dla Moniki

35

Łatwiejszy w użyciu --single-transactionprzełącznik:

mysqldump --single-transaction -u username -p db > db.sql

1
Przepraszamy, w jaki sposób rozwiązuje to problem opisany w pierwotnym pytaniu? Wygląda na to, że odpowiedziałeś na złe pytanie ...
dezso

6
Struktura odpowiedzi jest nieprawidłowa, ponieważ - pojedyncza transakcja musi być wcześniejsza niż nazwa bazy danych, ale odpowiedź jest w rzeczywistości prawidłowa. Określenie tej opcji pozwala obejść ten problem, zmieniając zachowanie blokujące mysqldump, więc błąd w pierwotnym pytaniu już nie występuje.
Michael - sqlbot

napotkałem ten sam problem. pracował - jedna transakcja.

Nie jestem pewien, co to robi, ale działało! Dzięki
Sri Harsha Kappala

17

Najszybszym rozwiązaniem byłoby po prostu ponowne utworzenie definicji, aby istniała, o ile nie powoduje żadnych konfliktów z istniejącymi użytkownikami.

CREATE USER 'root'@'foobar';


Co jeśli użytkownik był „root” @ „%”? Po prostu zaprzeczam takiej rzeczy na serwerze, za który jesteśmy odpowiedzialni.
Attila Fulop

@AttilaFulop Tak, bezpieczeństwo zdecydowanie powinno być brane pod uwagę, ale powiedziałem, że to było „najszybsze” rozwiązanie, a nie idealne. Po zakończeniu importowania użytkownik może zostać usunięty, aby zmniejszyć ryzyko posiadania dodatkowych użytkowników.
ColinM

Masz rację. Chciałem tylko zwrócić uwagę na ten konkretny aspekt. Moi koledzy z pracy dodaliby „root” @ „%” i zostawili go tam, dopóki Chuck Norris żyje, tj. na zawsze;)
Attila Fulop

6

Wyeksportuj wszystkie widoki bazy danych <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

lub:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

Edytuj views.sqlje i utwórz ponownie:

cat views.sql | mysql <DB>

Określ -ui -pprzełącz w razie potrzeby.


To najczystsza odpowiedź
Wolfe
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.