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”?

kfmfe04
źródło
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';
Abdul Manaf
źródło
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
pręt
źródło
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';

ColinM
źródło
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.

x-yuri
źródło
To najczystsza odpowiedź
Wolfe