Jestem całkiem nowy w MySQL i otrzymuję całkiem interesujący błąd, w którym nie mogę znaleźć żadnej pomocy za pośrednictwem google i wyszukiwania stackoverflow.
Używam lokalnego serwera MySQL 5.6.10 na MacOS 10.8.3 i zarządzam moją bazą danych przez Navicat essentials for MySQL.
Pojawia się błąd, który polega na tym, że po uruchomieniu i zarządzaniu moją bazą danych przez kilka dni / tygodni coś powoduje (wydaje się niecałkowicie) usunąć niektóre tabele, które utworzyłem za pomocą zapytań z Navicat.
Kiedy próbuję uruchomić zapytania przy użyciu tych tabel, Navicat ostrzega mnie, że dana tabela nie istnieje. Jak dotąd dobrze - oto dobra część:
Kiedy próbuję TWORZYĆ tabelę, np. O nazwie „temp”, która tam była wcześniej, pojawia się następujący komunikat o błędzie:
Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.
Jeśli jednak spróbuję usunąć tabelę lub odrzucić obszar tabel dla tej tabeli, użyj
DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;
Otrzymuję następujące komunikaty o błędach:
Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist
Oznacza to, że radzę wyrzucić obszar tabel, ale kiedy próbuję to zrobić, tabela nie istnieje. Czy jest możliwe, że jakaś pozostałość tej tabeli znajduje się w innym miejscu, w którym zapytanie DISCARD nie sprawdza? I czy ktoś ma pomysł, co może to wszystko wywołać - zupełnie przypadkowo, jak się wydaje?
Jak powiedziałem, jestem nowy w tym temacie i prawie nie mam pojęcia. Podejrzewam, że ponowne uruchomienie laptopa, tj. Zresetowanie mojego lokalnego serwera MySQL, lub może mieć z tym związek uprawnienia użytkownika, ale stawiam tu tylko hipotezę.
źródło
Odpowiedzi:
Trochę późno tutaj, ale ogólnie widziałem ten problem, gdy pojawia się błąd „pełna przestrzeń tabel” podczas pracy w trybie „innodb_file_per_table”. Bez wchodzenia w zbyt wiele szczegółów (więcej tutaj ), obszar tabel serwera bazy danych jest zdefiniowany przez ustawienie innodb_data_file_path i domyślnie jest raczej mały. Nawet powiększony, „pełny obszar tabel” może nadal występować przy większych zapytaniach i tym podobnych (przechowywanych jest tam wiele „rzeczy” niebędących tabelami, cofanie dzienników, pamięci podręcznych itp.).
W każdym razie stwierdziłem, że jeśli zajrzysz do katalogu systemu operacyjnego, w którym przechowywane są pliki na tabelę, / var / lib / mysql domyślnie w systemie OSX, / usr / local / var / mysql z homebrew iirc, znajdziesz osierocony plik tablename.ibd bez jego normalnego towarzyszącego pliku tablename.frm. Przeniesienie tego pliku .ibd do bezpiecznej lokalizacji tymczasowej (na wszelki wypadek) powinno rozwiązać problem.
Jedno zastrzeżenie, upewnij się, że wszystko, co pierwotnie powoduje problem, np. Długo działające zapytanie, zablokowana tabela itp., Zostało usunięte. W przeciwnym razie po drugiej próbie otrzymasz kolejny osierocony plik .ibd.
źródło
/usr/local/mysql/data
zamiast/var/lib/mysql/
. W przeciwnym razie doskonale rozwiązał problem.Użytkownicy Xampp i Mamp
Wystąpił ten sam błąd podczas importowania bazy danych (po jej opróżnieniu) przez MySQL. Okazało się, że został mi
tablename.ibd
plik, podczas gdy wszystkie inne zostały usunięte. Usunąłem go ręcznie zmysql/data/database_name
i błąd zniknął.źródło
Użytkownicy WAMP [Windows 7 Ultimate x64-bit]:
Zgadzam się z tym, co powiedział DangerDave, dlatego udostępniam odpowiedź użytkownikom WAMP .
Teraz zobaczysz foldery wszystkich swoich baz danych
[Your offending MySQL table name].frm
, zamiast tego powinien być plik[Your offending MySQL table name].ibd
[Your offending MySQL table name].ibd
źródło
Jeśli
.idb
po usunięciu ponownie odtworzysz plik, przeczytaj tę odpowiedź.Tak to działało ze mną. Miałem
.idb
plik bez odpowiadającego mu pliku.frm
i za każdym razem, gdy usuwam.idb
plik, baza danych ponownie go tworzy. i znalazłem rozwiązanie w jednej linii w dokumentacji MySQL (część Tablespace nie istnieje )Skopiowałem inny
.frm
plik tabeli i nadałem mu nazwę, jak moja brakująca tabela, a następnie wykonałem normalne zapytanie o tabelę upuszczania i voila, zadziałało, a tabela została normalnie usunięta!mój system to XAMPP w systemie Windows MariaDB v 10.1.8
źródło
W moim przypadku jedynym rozwiązaniem pracy było:
bad_table
ENGINE = MyISAM ...bad_table
źródło
Dokładnie to zrobiłem w mariadbie 10.2.16 na Fedorze, gdy miałem tabelę, która pokazywała dokładnie te same błędy w pliku dziennika, jak przypuszczam ...
Twój przebieg i błędy mogą się różnić, ale głównym, który zakładam, jest
z opuszczanym stołem nie działa tak dobrze, jak stół alter ...
tworzenie tabeli również kończy się niepowodzeniem:
Aby to naprawić, najpierw zrobiłem
następnie w katalogu / var / lib / mysql / nazwa_bazy_danych wykonałem następujące czynności jako root potwierdzając nadpisanie innodb_table.ibd powodujące problemy
potem w konsoli mysql wydałem pomyślne polecenie drop na obu tabelach
i wszystko jest teraz kwadratowe i mogę odtworzyć jeden pojedynczy stół ...
źródło
W moim przypadku:
Najpierw usuń
tableName.ibd
w katalogu bazy danych z MySQL, a następnie uruchom:źródło
Wystąpił ten sam błąd podczas uruchamiania go na wampserver podczas próby utworzenia tabeli użytkowników. Znalazłem plik users.ibd i po usunięciu tego pliku ponownie uruchomiłem polecenie migracji i zadziałało. Plik na moim komputerze z systemem Windows znajdował się w wamp / bin / mysql / mysql5.6.12 / data / myproject.
źródło
Rozwiązanie
Jednak łatwiejszą opcją jest: zrestartuj MySQL, a następnie wykonaj te same cztery kroki w następujący sposób:
W ten sposób zostanie dopasowany identyfikator obszaru tabel w słowniku danych i plik; w ten sposób import obszaru tabel powiódł się.
Może to dać ci większą pewność w radzeniu sobie z niektórymi problemami z InnoDB podczas procesu odzyskiwania, a nawet przesyłania plików.
ref
źródło
Oto kroki rozwiązania:
źródło
Miałem ten problem kilka razy. Jeśli masz dużą bazę danych i chcesz uniknąć tworzenia kopii zapasowych / przywracania (z dodaną brakującą tabelą), spróbuj kilka razy w tę iz powrotem:
DROP TABLE my_table;
ALTER TABLE my_table DISCARD TABLESPACE;
-i-
rm my_table.ibd (osierocony bez odpowiadającego my_table.frm) znajdujący się w katalogu / var / lib / mysql / my_db /
-i wtedy-
UTWÓRZ TABELĘ, JEŚLI NIE ISTNIEJE
my_table
(...)źródło
Usunięcie / przeniesienie nazwy tabeli.ibd z pewnością nie zadziałało.
Jak to rozwiązałem
Ponieważ zamierzałem usunąć uszkodzoną i nieistniejącą tabelę, wykonałem kopię zapasową innych tabel, przechodząc do phpmyadmin-> database-> export-> wybrane tabele do kopii zapasowej-> eksportu (jako .sql).
Następnie wybrałem ikonę bazy danych obok nazwy bazy danych, a następnie ją upuściłem. Utworzono nową bazę danych. Wybierz swoją nową bazę danych -> importuj -> wybierz wcześniej pobrany plik -> kliknij import. Teraz mam moje stare tabele robocze i mam usuniętą uszkodzoną tabelę. Teraz po prostu tworzę tabelę, która generowała błąd.
Prawdopodobnie miałem wcześniejszą kopię zapasową uszkodzonej tabeli.
źródło
Ten błąd występuje podczas wstrzymania niektórych funkcji. Podobnie jak uruchomienie poniższego zapytania z nieprawidłowym kluczem obcym.
źródło
Miał dokładnie ten sam problem; Dodałem napar
[email protected]
(po uprzednim napięciu 5,5).Wartości domyślne naparu dla 5,6 to,
innodb_file_per_table=1
podczas gdy w 5,5 sąinnodb_file_per_table=0
.Twój istniejący
ibdata1
plik (połączone dane innodb) nadal będzie zawierał odniesienia do tabel, które próbujesz utworzyć / upuścić. Zmień zinnodb_file_per_table
powrotem na 0 lub usuń plik danych ibdata1 ( spowoduje to utratę wszystkich danych, więc upewnij się, że najpierw mysqldump go lub masz już zrzut .sql ).Inną
[email protected]
domyślną wartością, która mnie ugryzła, był brak portu, więc sieć była domyślnie oparta na gniazdach unix, a klient mysql wciąż raportował:Dodałem
<string>--port=3306</string>
do.plist
tablicy, ale możesz również określićport=3306
w swoimmy.cnf
brew services stop [email protected]
Następnie uruchom, wprowadź zmianybrew services start [email protected]
źródło
Próba usunięcia obszaru tabel może spowodować inne błędy. U mnie pojawił się następujący błąd:
Moim rozwiązaniem było porzucenie bazy danych. Spowoduje to usunięcie wszystkich powiązanych obszarów tabel i umożliwi ponowne utworzenie tabel.
źródło
rm -r
. To irytujące, ale nie powstrzymujące.Jeśli masz inny serwer z dobrą wersją tej samej tabeli, możesz wykonać kopię (table_copy), przenieść table_copy na serwer powodujący problem. Następnie usuń tabelę problemów i zmień nazwę table_copy na table.
źródło
Pomogło mi to po prostu przejść do katalogu MYSQL DATA w / var / lib / mysql / {nazwa_db} (linux) i upuścić plik {nazwa_tabeli} .ibd , który był taki sam jak nazwa folderu.
źródło
Usuwam tylko moją starą bazę danych znajdującą się na moim lokalnym hoście bezpośrednio z wampa, zatrzymuję wszystkie usługi, przechodzę do wamp / bin / mysql / mysql [wersja] / data i znalazłem bazę danych z problemami, usuwam ją i uruchamiam ponownie wamp wszystkich usług, utwórz ponownie swoją bazę danych i gotowe, teraz możesz zaimportować swoje tabele,
źródło
Sposób, w jaki znalazłem rozwiązanie tego problemu, jest dość denerwujący, ale istnieje skrypt, który go rozwiązuje.
Zasadniczo musisz usunąć pliki
ibdata1
iib_logfile*
(zawierają one między innymi mapowania kluczy obcych). Jedyny bezpieczny sposobem na to jest wyeksportowanie wszystkich baz danych, zatrzymanie mysql, usunięcie plików, uruchomienie mysql, a następnie zaimportowanie plików.Skrypt, który pomaga rozwiązać ten problem jest https://github.com/uberhacker/shrink-ibdata1 , choć podanymi Celem tego skryptu jest inny, to nie rozwiąże problemu.
źródło
Jedyny sposób, w jaki to zadziałało, to:
źródło
jeśli masz ten problem i nie masz innej opcji, zmień silnik na inny, np. 'myisam', a następnie spróbuj utworzyć tabelę.
zastrzeżenie: to nie jest poprawna odpowiedź, ponieważ możesz mieć ograniczenia klucza obcego, które nie będą obsługiwane przez inny silnik pamięci masowej. Każdy silnik pamięci masowej ma swoją własną specjalizację w zakresie przechowywania i uzyskiwania dostępu do danych, należy też wziąć pod uwagę te punkty.
źródło
Proszę ODRZUCIĆ przestrzeń tabel przed IMPORTEM
Mam to samo rozwiązanie problemu znajduje się poniżej
Najpierw musisz usunąć nazwę bazy danych. jeśli twoja baza danych się nie usuwa, masz flow me. W systemie Windows twój katalog będzie C: / xampp / mysql / data / yourdabasefolder remove "yourdabasefolder"
Ponownie musisz utworzyć nową bazę danych i zaimportować stary plik sql. To będzie praca
Dzięki
źródło
Musiałem zlokalizować mój katalog danych MySQL:
POKAŻ ZMIENNE GDZIE Variable_Name LIKE "% dir"
Następnie wymuś usunięcie tej bazy danych:
sudo rm -rf
źródło
Możesz uruchomić następujące zapytanie jako użytkownik root mysql
źródło
Hej, programiści nie marnują czasu. Po prostu usuń bazę danych zawierającą tabele i ponownie zaimportuj całe tabele. Oszczędzaj czas = czas to pieniądz. Twoje zdrowie.
źródło