Tabela „performance_schema.session_variables” nie istnieje


299

Po aktualizacji MySQL do wersji 5.7.8-rc i zalogowaniu się na serwerze otrzymałem błąd:

Table 'performance_schema.session_variables' doesn't exist

Nie mogę znaleźć na to żadnego rozwiązania. Możesz pomóc ?


2
Inny. Wygląda na to, że aktualizacja nie powiodła się. Możesz rozważyć ponowne wykonanie aktualizacji (lub) ponowną instalację 5.7.8-rcwersji i przywrócenie z pełnej kopii zapasowej DB.
Rahul,

2
czy starałeś mysql_upgradesię upewnić, że dokonano jakichkolwiek zmian w podstawowych tabelach / dbs?
Marc B,

tak, zrobiłem mysql_upgrade, próbuję ponownie zainstalować go ponownie. Jeśli to nie zadziała, obniżę wersję do wersji 5.6
Taz

28
Wystąpił ten sam problem, aby go rozwiązać, uruchamiam mysql_upgrade -u root -p --force, a następnie ponownie uruchamiam serwer DB.
robregonm,

Jeśli polecenie mysql_upgrade nie działa, oznacza to, że tabela mysql.performance_schema mogła zostać uszkodzona. Mieliśmy ten problem. Aby rozwiązać problem, usunęliśmy serwer bazy danych za pomocą polecenia: apt-get purge mariadb-client-10.1 mariadb-common mariadb-server-10.1. Spowodowało to usunięcie wszystkich plików binarnych, konfiguracyjnych i danych z bazy danych. Następnie ponownie zainstalowaliśmy serwer bazy danych i zaimportowaliśmy bazy danych. Następnie serwer bazy danych działał bez problemów
Nadir Latif

Odpowiedzi:


227

Mysql_upgrade również dla mnie działał:

# mysql_upgrade -u root -p --force
# systemctl restart mysqld

Pozdrawiam, MSz.


25
Musiałem zrestartować mysqld ( mysql.server restartponieważ używam instalacji homebrew na systemie OS X), więc było to pomocne. W przeciwnym razie wystąpił błąd dotyczący nieprawidłowej struktury zmiennych_sesji.
Geoffrey Wiseman,

Identyczne zachowanie z Homebrew na OS X 10.10.5 (Yosemite). Wykonanie aktualizacji naprawia także awarię w Sequel Pro 1.1 (kompilacja 4499) podczas próby załadowania bazy danych.
William Turrell,

4
Native table 'performance_schema'.'session_variables' has the wrong structure
Stephen

8
Jeśli używasz brew services, możesz ponownie uruchomić serwer za pomocą brew services restart mysql.
Frederik Kammer

1
To nie działa dla mnie, prawidłową odpowiedź udziela viq. potrzebne jest tylko, aby umożliwić kompatybilność programu.
kato2

482

Byłem w stanie zalogować się na serwerze mysql po uruchomieniu polecenia @robregonm zasugerował:

mysql_upgrade -u root -p --force

Wymagane jest ponowne uruchomienie serwera MySQL.


6
To działało dobrze. Dzięki, chcę wiedzieć, jaki jest tego powód.
diguage

2
Dostaję się, Access denied for user 'root'@'localhost' (using password: YES) while connecting to the MySQL servermimo że używam poprawnego hasła roota. Jakaś pomoc?? : - /
sixty4bit

4
@ sixty4bit spróbuj usunąć -p
Mike Mellor,

1
@NevilleNazerane Nie jestem zaznajomiony z łatwym php, ale powinieneś być w stanie zlokalizować, gdzie instalowany jest mysql, a następnie po prostu otworzyć monit cdm i zmienić katalog na tę lokalizację. Teraz powinieneś być w stanie uruchomić polecenie.
Mihai Caracostea

4
@diguage Powodem jest to, że aktualizacja wersji MySQL wprowadziła schematy niezgodne z wersją dla wewnętrznych metadanych. Dla mnie aktualizuję MySQL 5.6 do MySQL 5.7 na Macu za pomocą Homebrew, a katalog danych MySQL pozostał niezmieniony, więc nowa wersja MySQL odczytywała stare wewnętrzne metadane, ale nie wiem, co robić - ten błąd, który tu widzieliśmy, to manifest tego problemu. Po mysql_upgradeponownym uruchomieniu wszystko działało. Zobacz: dev.mysql.com/doc/refman/5.7/en/mysql-upgrade.html
Devy

110
mysql -u app -p
mysql> set @@global.show_compatibility_56=ON;

zgodnie z http://bugs.mysql.com/bug.php?id=78159 pracował dla mnie.


1
To działało idealnie dla mnie! I nie musiałem restartować serwera mysql, który byłby tak uciążliwy
anu.agg

3
Przepraszam, jest to rozwiązanie nieco za duże: jak użycie bazooki do wystrzelenia muchy. Ten przełącznik zgodności ma o wiele więcej efektów, możesz nie chcieć wszystkich z nich.
Tuncay Göncüoğlu

@Tuncay Göncüoğlu jakie są niektóre z tych skutków ubocznych?
katzmopolitan

@katzmopolitan Przeczytaj tutaj: dev.mysql.com/doc/refman/5.7/en/… . Zmiany dotyczą głównie obsługi INFORMACJE_SCHEMA (bezpieczeństwo itp.), Ale jest ich więcej.
Tuncay Göncüoğlu

To też działało dla mnie. Komunikat o błędzie, który otrzymałem, pochodzi z mysqldump. Po dokonaniu sugerowanej zmiany mysqldump działał. Kiedy miałem zrzut, po prostu zmieniłem show_compatibility_56 z powrotem na OFF.
Bryan,

23

Ponieważ żadna z powyższych odpowiedzi tak naprawdę nie wyjaśnia tego, co się stało, postanowiłem wtrącić się i przedstawić kilka szczegółów tego problemu.

Tak, rozwiązaniem jest uruchomienie polecenia MySQL Upgrade w następujący sposób: mysql_upgrade -u root -p --forceale co się stało?

Podstawową przyczyną tego problemu jest uszkodzenie performance_schema, które może być spowodowane przez:

  • Korupcja organiczna (ilość woluminów w kaboomie, błąd silnika, problem ze sterownikiem jądra itp.)
  • Korupcja podczas łatki mysql (często zdarza się, że dzieje się to podczas łatki mysql, szczególnie w przypadku głównych aktualizacji wersji)
  • Prosty „upuść bazę danych Performance_schema” oczywiście spowoduje ten problem i będzie miał takie same objawy, jak gdyby był uszkodzony

Ten problem mógł występować w Twojej bazie danych nawet przed łatką, ale to, co wydarzyło się w MySQL 5.7.8, polega na tym, że flaga show_compatibility_56zmieniła domyślną wartość z ONdomyślnej zmiany na OFF. Ta flaga kontroluje zachowanie silnika w zapytaniach dotyczących ustawiania i odczytu zmiennych (sesyjnych i globalnych) w różnych wersjach MySQL.

Ponieważ MySQL 5.7+ zaczął odczytywać i przechowywać te zmienne performance_schemazamiast na information_schema, ta flaga została wprowadzona tak, jak ONw pierwszych wydaniach, aby zmniejszyć promień wybuchu tej zmiany i poinformować użytkowników o zmianie i przyzwyczaić się do niej.

OK, ale dlaczego połączenie się nie udaje? Ponieważ w zależności od używanego sterownika (i jego konfiguracji) może on uruchamiać polecenia dla każdego nowego połączenia inicjowanego z bazą danych ( show variablesna przykład). Ponieważ jedno z tych poleceń może próbować uzyskać dostęp do uszkodzonego performance_schema, całe połączenie zostaje przerwane, zanim zostanie w pełni zainicjowane.

Podsumowując, być może (teraz nie można stwierdzić) performance_schemabrakowało lub było uszkodzone przed łataniem. Łatka do 5.7.8 następnie zmusiła silnik do odczytania zmiennych performance_schema(zamiast, z information_schemaktórego odczytuje je z powodu zmiany flagi ON). Ponieważ performance_schemazostał uszkodzony, połączenia nie działają.

Uruchamianie aktualizacji MySQL jest najlepszym rozwiązaniem, pomimo przestoju. Włączenie flagi jest jedną z opcji, ale ma ona swój własny zestaw implikacji, jak już wskazano w tym wątku.

Oba powinny działać, ale rozważ konsekwencje i poznaj swoje wybory :)


1
Dzięki. Zastanawiałem się, co spowodowało ten problem, zanim wskoczyłem i wprowadziłem zmiany.
Ken Ingram

4

Wykonaj następujące kroki bez -p:

  1. mysql_upgrade -u root
  2. systemctl restart mysqld

Miałem ten sam problem i działa!


To działa! Tylko systemctl restart mysqldnie działało.
Ninja

następnie użyjsystemctl restart mysql
BitDEVil2K16

1

Jako sześćdziesięciobitowe pytanie, jeśli użytkownik root mysql wygląda na źle skonfigurowanego, spróbuj zainstalować rozszerzenie konfiguratora z oficjalnego źródła mysql:

https://dev.mysql.com/downloads/repo/apt/

Pomoże Ci to ustawić nowe hasło użytkownika root.

Zaktualizuj swoje repozytorium (debian / ubuntu):

apt-get update

0

W moim systemie problem polegał na tym, że wciąż miałem zainstalowany Mysql 5.6, dlatego zamiast tej dla 5.7 wywołano mysql_upgrade.exe z tej instalacji. Przejdź do C:\Program Files\MySQL\MySQL Server 5.7\bini uruchom.\mysql_upgrade.exe -u root


0

Jeśli podczas korzystania z mysql_upgrade -u root -p --forcepolecenia pojawia się ten błąd:

Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MySQL Servers datadir, errno: 13

po prostu dodaj sudoprzed poleceniem. To działało dla mnie i rozwiązałem mój problem. To jest: sudo mysql_upgrade -u root -p --force:)


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.