1114 (HY000): Stół jest pełny

114

Próbuję dodać wiersz do InnoDBtabeli za pomocą prostego zapytania:

INSERT INTO zip_codes (zip_code, city) VALUES ('90210', 'Beverly Hills');

Ale kiedy próbuję wykonać to zapytanie, otrzymuję następujące informacje:

ERROR 1114 (HY000): Stół zip_codesjest pełny

Robiąc

SELECT COUNT(*) FROM zip_codes

daje mi 188 959 wierszy, co nie wydaje się zbyt wiele, biorąc pod uwagę, że mam inną tabelę z 810 635 wierszami w tej samej bazie danych.

Jestem dość niedoświadczony InnoDB enginei nigdy nie doświadczyłem tego problemu MyISAM. Jakie są tutaj potencjalne problemy?

EDYCJA: występuje tylko podczas dodawania wiersza do zip_codestabeli.

Wickethewok
źródło
Czy błąd występuje podczas próby wstawienia do dowolnej tabeli, czy tylko do jednej z kodami_zip?
Chad Birch

Odpowiedzi:

92

EDYCJA: Najpierw sprawdź, czy nie zabrakło miejsca na dysku, przed rozwiązaniem problemu związanego z konfiguracją.

Wydaje się, że masz zbyt niski maksymalny rozmiar dla twojego innodb_data_file_pathw my.cnftym przykładzie

innodb_data_file_path = ibdata1:10M:autoextend:max:512M

nie można przechowywać więcej niż 512 MB danych we wszystkich tabelach innodb łącznie.

Może powinieneś przełączyć się na schemat innodb-per-table za pomocą innodb_file_per_table.

Martin C.
źródło
C, skąd otrzymujemy ten plik my.cnf w
3
@Nadh W Ubuntu 16.04 jest częścią /etc/mysql/i jest częściowo podzielony na dodatkowe pliki w/etc/mysql/conf.d
Martin C.
Mój działał po dodaniu innodb_data_file_pathlinii /etc/mysql/mysql.conf.d/mysqld.cnfi ponownym uruchomieniu usług mysqliapache2
Timmah
81

Innym możliwym powodem jest to, że partycja jest pełna - tak właśnie stało się teraz.

maaartinus
źródło
1
To zawsze powinno być pierwszą rzeczą do sprawdzenia. Zawsze wracaj do przewodu zasilającego, natknąłem się na to wiele razy.
Steven Church
1
Zaoszczędziłeś mi kilka godzin próbując zmienić konfigurację mysql. Partycja podstawowa była pełna. Musiał przenieść bazę danych mysql na partycję danych, a następnie utworzyć miękki link
Ganesh Krishnan
2
użyj df -hdo sprawdzenia rozmiaru dysku
Amit Bera
25

Otrzymasz również ten sam błąd ERROR 1114 (HY000): Tabela '# sql-310a_8867d7f' jest pełna

jeśli spróbujesz dodać indeks do tabeli, która korzysta z mechanizmu pamięci masowej MEMORY.

Zielona Karta
źródło
Zdarzyło mi się to, ale wydawało się, że mój klient używa złej składni. Podczas dodawania tego samego indeksu z prostym ALTER TABLE my_table ADD INDEX my_index (column_a, column_b);działało.
thephper
22

Musisz zmodyfikować limit limitu ustawiony w my.cnf dla tabel INNO_DB. Ten limit pamięci nie jest ustawiony dla pojedynczych tabel, jest ustawiony dla wszystkich tabel łącznie.

Jeśli chcesz, aby pamięć automatycznie rozszerzała się do 512 MB

innodb_data_file_path = ibdata1:10M:autoextend:max:512M

Jeśli nie znasz limitu lub nie chcesz nakładać limitu, możesz go zmodyfikować w ten sposób

innodb_data_file_path = ibdata1:10M:autoextend
Daniel Luca CleanUnicorn
źródło
Hostowaliśmy nasze ddbb na Amazon i zostało skonfigurowane z funkcją autoextend. Ale mieliśmy ten sam problem, który, jak zakładam, był spowodowany osiągnięciem skonfigurowanego zapisanego limitu
borjab
12

Ten błąd pojawia się również, gdy partycja, na której się tmpdirznajduje, zapełnia się (z powodu zmiany tabeli lub innej

fimbulvetr
źródło
11

W moim przypadku było tak, ponieważ partycja, na której znajduje się plik ibdata1, była pełna.

skiphoppy
źródło
10

Może zabraknąć miejsca na partycji, na której przechowywane są tabele mysql (zwykle / var / lib / mysql) lub w miejscu, w którym przechowywane są tabele tymczasowe (zwykle / tmp).

Możesz chcieć: - monitorować wolne miejsce podczas tworzenia indeksu. - skieruj zmienną tmpdir MySQL w inne miejsce. Wymaga to ponownego uruchomienia serwera.

Julio
źródło
8

Ja też napotkałem ten błąd podczas importowania pliku bazy danych sql o pojemności 8 GB. Sprawdziłem mój dysk instalacyjny mysql. Na dysku nie było wolnego miejsca. Zrobiłem więc trochę miejsca, usuwając niechciane elementy i ponownie uruchomiłem polecenie importu bazy danych. Tym razem się udało.

Arun Kumar
źródło
7

Jeśli używasz NDBCLUSTER jako mechanizmu przechowywania, powinieneś zwiększyć DataMemoryi IndexMemory.

Mysql FQA

metdos
źródło
6

O ile nie włączysz innodb_file_per_tableopcji, InnoDBwszystkie dane są przechowywane w jednym pliku, zwykle o nazwie ibdata1.

Sprawdź rozmiar tego pliku i sprawdź, czy masz wystarczającą ilość miejsca na dysku, na którym się znajduje.

Quassnoi
źródło
5

mieliśmy: SQLSTATE [HY000]: Błąd ogólny: 1114 Tabela „catalog_product_index_price_bundle_sel_tmp” jest pełna

rozwiązany przez:

edytuj konfigurację db:

nano /etc/my.cnf

tmp_table_size = 256 mln max_heap_table_size = 256 mln

  • zrestartuj db
Sition
źródło
1
Te ustawienia 512 MB są niebezpieczne. Kontrolują maksymalny rozmiar pamięci dla tabel tymczasowych w złożonych selekcjach. Dotyczy to nie tylko „na połączenie”, ale także „na tabelę tmp”. Tak więc te wartości mogą łatwo spowodować wyczerpanie pamięci RAM.
Rick James
4

Cytując dokumenty MySQL.

Mechanizm przechowywania danych InnoDB obsługuje tabele InnoDB w obszarze tabel, które można utworzyć z kilku plików. Dzięki temu tabela może przekroczyć maksymalny rozmiar pojedynczego pliku. Przestrzeń tabel może zawierać surowe partycje dysku, co pozwala na tworzenie bardzo dużych tabel. Maksymalny rozmiar obszaru tabel to 64 TB.

Jeśli używasz tabel InnoDB i zabraknie miejsca w obszarze tabel InnoDB. W takim przypadku rozwiązaniem jest rozszerzenie obszaru tabel InnoDB. Zobacz Sekcja 13.2.5, [„Dodawanie, usuwanie lub zmiana rozmiaru plików danych i dziennika InnoDB”].]

Ólafur Waage
źródło
4

w moim przypadku tylko dlatego, że serwer mysql działa razem z aplikacją, która zapisuje zbyt wiele logów, że dysk jest pełny.

możesz sprawdzić, czy na dysku jest wystarczająco dużo miejsca

df -h

jeśli procent użycia dysku wynosi 100%, możesz użyć tego polecenia, aby sprawdzić, który katalog jest za duży

du -h -d 1 /
Kai
źródło
4

UŻYTKOWNICY DOCKERA: Dzieje się tak również, gdy przekroczysz około 90% limitu rozmiaru obrazu Dockera (wydaje się, że 10% jest potrzebne do buforowania). Sformułowanie jest mylące, ponieważ oznacza to po prostu ilość miejsca na dysku, którą Docker może wykorzystać w zasadzie na wszystko.

Aby to naprawić, przejdź do ustawień pulpitu Docker> Dysk> przesuń suwak nieco bardziej w prawo> Zastosuj.

wprowadź opis obrazu tutaj

Sliq
źródło
2

W CentOS 7 po prostu zatrzymanie i uruchomienie usługi MySQL naprawiło to za mnie.

sudo service mysql stop

sudo service mysql start

crmpicco
źródło
O dziwo, to też zadziałało ... Nie miałem żadnych partycji, które byłyby zapełnione w ponad 80% i samo ponowne uruchomienie naprawiło to.
n0nag0n
2

Napotkałem ten sam problem z powodu małej ilości miejsca na dysku. Partycja, na której znajduje się plik ibdata1, będący systemowym obszarem tabel dla infrastruktury InnoDB, była pełna.

Saveendra Ekanayake
źródło
2

Miałem ten problem ... w moim przypadku skończyło mi się miejsce na serwerze dedykowanym. Sprawdź, czy wszystko inne zawiedzie i rozważ zwiększenie miejsca na dysku lub usunięcie niechcianych danych lub plików.

NotJay
źródło
1

W moim przypadku pamięć serwera była pełna, więc DB nie mógł zapisać danych tymczasowych. Aby go rozwiązać, wystarczy zrobić miejsce na dysku.

Pierre-Yves Guillemet
źródło
1

Rozwiązałem ten problem, zwiększając ilość pamięci dostępnej dla maszyny wirtualnej włóczęgi, na której znajdowała się baza danych.

yvoloshin
źródło
1

W moim przypadku próbowałem uruchomić polecenie alter table i dostępne miejsce na dysku było mniejsze niż rozmiar tabeli. Kiedyś zwiększyłem miejsce na dysku, problem zniknął.

Pratik Singhal
źródło
1

Ten dysk jest pełny w / var / www / mysql

wukong
źródło
-1

Może to być również limit InnoDB dotyczący liczby otwartych transakcji:

http://bugs.mysql.com/bug.php?id=26590

przy 1024 transakcjach, które mają cofnięte rekordy (jak w przypadku edytowania jakichkolwiek danych), InnoDB nie będzie działać


źródło
odpowiedź jest przestarzała.
Evan Carroll,