MySQL: kod błędu: 1118 Row size too large (> 8126). Zmiana niektórych kolumn na tekst lub BLOB

Chcę utworzyć tabelę 325 kolumna:

CREATE TABLE NAMESCHEMA.NAMETABLE 
(   
      ROW_ID TEXT NOT NULL ,        //this is the primary key

324 column of these types:
      CHAR(1), 
      DATE, 
      DECIMAL(10,0), 
      DECIMAL(10,7), 
      TEXT, 
      LONG,

) ROW_FORMAT=COMPRESSED;

Zastąpiłem cały VARCHAR tekstem i dodałem Barracuda w my.plik INI z MySQL, jest to atrybut dodany:

innodb_file_per_table=1
innodb_file_format=Barracuda
innodb_file_format_check = ON

Ale i tak mam ten błąd:

Error Code: 1118
 Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

EDIT: nie mogę zmienić struktury bazy danych, ponieważ jest to starsza aplikacja / system/baza danych. Utworzenie nowej tabeli jest eksportem starszej bazy danych.

EDIT2: napisałem to pytanie, które jest podobnie jak inne, ale w środku jest jakieś rozwiązanie, które znalazłem w Internecie, takie jak VARCHAR i Barracuda, ale nadal mam ten problem, więc postanowiłem otworzyć nowe pytanie z już klasyczną odpowiedzią w środku, aby zobaczyć, czy ktoś ma inne odpowiedzi

Author: Benjamin, 2014-03-25

15 answers

Ostatnio zmagałem się z tym samym kodem błędu, z powodu zmiany w MySQL Server 5.6.20. Udało mi się rozwiązać problem zmieniając innodb_log_file_size w my.plik tekstowy ini.

W Uwagach do wydania wyjaśniono, że zbyt mały innodb_log_file_size spowoduje błąd " zbyt duży rozmiar wiersza."

Http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-20.html

 46
Author: user2635717,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-18 22:31:07

Próbowałem wszystkich rozwiązań tutaj, ale tylko ten parametr

innodb_strict_mode             = 0
Rozwiązałem mój dzień...

Z podręcznika:

Ustawienie innodb_strict_mode wpływa na obsługę błędów składniowych dla CREATE TABLE, ALTER TABLE i CREATE INDEX. innodb_strict_mode umożliwia również sprawdzenie rozmiaru rekordu, tak aby wstawić lub aktualizacja nigdy nie zawodzi ze względu na to, że rekord jest zbyt duży dla wybrany rozmiar strony.

 35
Author: Stefano Brozzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-06 15:25:38
ERROR 1118 (42000) at line 1852:    
Row size too large (> 8126). Changing some columns to TEXT or 
     BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

[mysqld]

innodb_log_file_size = 512M

innodb_strict_mode = 0

Ubuntu 16.04 edytuj ścieżkę:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

W MS Windows ścieżka będzie wyglądać następująco:

C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
Nie zapomnij o ponownym uruchomieniu usługi (lub ponownym uruchomieniu maszyny)
 20
Author: ตอ ตอม,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 14:46:30

Niedawno utworzyłem tabelę z 82 kolumnami i miałem ten sam błąd z InnoDB. Aby ominąć ten problem, zmieniliśmy format tabeli na MyISAM, ponieważ był on używany tylko w formie podstawowej.

 6
Author: Guillaume Pommier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 13:30:38

MySQL jest dość jasne co do maksymalnego rozmiaru wiersza:

Każda tabela (niezależnie od silnika pamięci) ma maksymalny rozmiar wiersza 65 535 bajtów Silniki magazynowe mogą nakładać na to dodatkowe ograniczenia limit, zmniejszając efektywny maksymalny rozmiar wiersza.

. . .

Poszczególne silniki pamięci mogą nakładać dodatkowe ograniczenia, które limit liczby kolumn tabeli. Przykłady:

InnoDB pozwala na 1000 kolumn.

InnoDB ogranicza rozmiar wiersza do mniej niż połowy strony bazy danych (około 8000 bajtów), nie wliczając VARBINARY, VARCHAR, BLOB lub Kolumny tekstu.

Różne formaty pamięci InnoDB (skompresowane, nadmiarowe) używają różnych ilości nagłówka strony i danych przyczepy, co wpływa na ilość magazyn Dostępny dla rzędów.

Jeśli masz 325 powtarzających się zestawów kolumn, przekraczasz kilka ograniczeń. Jest to również podejrzany format danych. Powinieneś miej 325 wierszy dla każdego wiersza w żądanej tabeli, po jednym dla każdej grupy kolumn.

 4
Author: Gordon Linoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-25 14:41:43

Chcę tylko zapewnić innym ludziom pomoc w poważniejszym wariancie tego problemu. W niektórych sytuacjach błąd ("rozmiar wiersza jest zbyt duży .. Zmiana niektórych kolumn na tekst lub BLOB") nastąpi nawet w przypadku instrukcji" alter table drop column "i" ALTER TABLE modify column"!

W konsekwencji możesz stać się całkowicie zablokowany, nie możesz zmienić varchara na tekst, lub upuścić kolumny (próba rozwiązania problemu ironicznie skutkuje tym samym komunikatem).

Jeśli masz to problem, rozwiązaniem jest zmiana lub upuszczenie wielu kolumn naraz. Możesz to zrobić w MySQL za pomocą składni "ALTER TABLE example drop column a, drop column b, drop column c" i jeśli upuścisz wystarczająco dużo kolumn na raz, to faktycznie będzie to wykonywane zamiast wywoływać błąd.

 4
Author: Julian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-14 23:00:49

Dla MySQL 5.7 na Mac OS X El Capitan:

OS X dostarcza przykładowe pliki konfiguracyjne w /usr / local / mysql/support-files / my-default.cnf

Aby dodać zmienne, najpierw zatrzymaj serwer i po prostu skopiuj powyższy plik do /usr / local / mysql / etc / my.cnf

cmd : sudo cp /usr/local/mysql/support-files/my-default.cnf /usr/local/mysql/etc/my.cnf

Uwaga: utwórz folder' etc 'pod' mysql', jeśli nie istnieje.

cmd : sudo mkdir /usr/local/mysql/etc

Raz my.cnf jest tworzony pod etc. czas ustawić zmienną w środku.

cmd: sudo nano my.cnf

Ustaw zmienne poniżej [mysqld]

[mysqld]
innodb_log_file_size = 512M
innodb_strict_mode = 0

Teraz uruchom serwer!

 3
Author: imbond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-05 07:39:33

Zmiana na MyISAM nie jest rozwiązaniem. Dla innodb po pracował dla mnie.

Set followings on my.cnf

Innodb_strict_mode = 0

 3
Author: Karl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-03 12:04:31

Też się na to natknąłem. Zmiana "innodb_log_file_size", "innodb_log_buffer_size" i innych ustawień w "my.plik ini nie rozwiązał mojego problemu. Przekazuję go zmieniając moje kolumny typu "text" na varchar(20) i nie używając wartości varchar większych niż 20 . Może można zmniejszyć rozmiar kolumn, zbyt, jeśli to możliwe. tekst - - - >varchar (20) varchar(256) -- > varchar (20)

 2
Author: ÖMER TAŞCI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-11 16:28:57

Co poprawiło moje było dodać

SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;
Na początku mojego".SQL " Plik, jak to jest powiedziane w: https://gist.github.com/tonykwon/8910261
 1
Author: Aritz Barrondo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-10 18:42:42

(REAL SOLUTION MYSQL 5.7)

Napotkałem ten sam błąd na najnowszym serwerze mysql (5.7.21):

Zbyt duży rozmiar wiersza (>8126). Zmiana niektórych kolumn na tekst lub BLOB może pomóc. W bieżącym formacie wiersza prefiks BLOB o wartości 0 bajtów jest zapisywany w wierszu.

Po spędzeniu kilku godzin na czytaniu instrukcji MYSQL, znalazłem rozwiązanie!

Kluczowym parametrem jest: innodb_page_size

Wsparcie dla stron 32k i 64K było dodany w MySQL 5.7. Dla stron o rozmiarze 32k i 64K maksymalna długość wiersza wynosi około 16000 bajtów.

Sztuczka polega na tym, że ten parametr można zmieniać tylko podczas inicjalizacji z instancji usługi mysql, więc nie ma żadnego wpływu, jeśli zmienisz ten parametr po zainicjowaniu instancji (Pierwsze uruchomienie instancji).

Innodb_page_size można skonfigurować tylko przed zainicjalizowaniem MySQL instancji i nie można go później zmienić. Jeśli nie podano żadnej wartości, wystąpienie jest inicjalizowane przy użyciu domyślnego rozmiaru strony. Patrz Sekcja 14.6.1, "Konfiguracja Uruchamiania InnoDB".

Więc jeśli nie zmienisz tej wartości w moim.ini przed inicjalizacją domyślną wartością będzie 16K, która będzie miała limit rozmiaru wiersza ~8K. dlatego pojawia się błąd.

Jeśli zwiększysz wartość innodb_page_size, należy również zwiększyć wartość innodb_log_buffer_size. ustaw go przynajmniej na 16m. Również jeśli ROW_FORMAT jest ustawiony na COMPRESSED nie można zwiększyć innodb_page_size do 32k lub 64K. powinien być dynamiczny(domyślnie w 5.7).

ROW_FORMAT = COMPRESSED nie jest wspierany, gdy innodb_page_size jest ustawiony na 32KB lub 64KB. Dla innodb_page_size=32k rozmiar zakresu wynosi 2MB. Dla innodb_page_size=64k rozmiar zakresu wynosi 4MB. innodb_log_buffer_size powinien być ustawiony na co najmniej 16m (domyślne) przy użyciu rozmiaru stron 32k lub 64K.

Ponadto innodb_buffer_pool_size należy zwiększyć z 128M do 512M przynajmniej, w przeciwnym razie pojawi się błąd podczas inicjalizacji instancji (nie mam dokładnego błędu).

Po tym, błąd rozmiaru wiersza zniknął.

Problem polega na tym, że musisz utworzyć nową instancję MySql i przenieść dane do nowej instancji bazy danych ze starej.

Parametry, które zmieniłem i działają (po utworzeniu nowej instancji i zainicjowaniu ojej.ini, które jest najpierw modyfikowane tymi ustawieniami):

innodb_page_size=64k
innodb_log_buffer_size=32M
innodb_buffer_pool_size=512M

Wszystkie ustawienia i opisy, w których znalazłem rozwiązanie można znaleźć tutaj:

Https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html

Mam nadzieję, że to pomoże! Pozdrawiam!
 1
Author: fefe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-17 12:44:23

Mam podobny problem dziś rano i następujący sposób uratował mi życie:

Czy próbujesz wyłączyć innodb_strict_mode?
SET GLOBAL innodb_strict_mode = 0;

A następnie spróbuj ponownie zaimportować.

innodb_strict_mode jest na użyciu MySQL > = 5.7.7, przed był wyłączony.

 1
Author: Star,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 06:37:30

Żadna z odpowiedzi do tej pory nie wspomina o wpływie parametru innodb_page_size. Prawdopodobnie dlatego, że zmiana tego parametru nie była obsługiwaną operacją przed MySQL 5.7.6. Z Dokumentacji :

Maksymalna długość wiersza, z wyjątkiem kolumn o zmiennej długości (VARBINARY, VARCHAR, BLOB i TEXT), jest nieco mniejsza niż połowa strony bazy danych o rozmiarach 4KB, 8KB, 16KB i 32KB. Na przykład maksymalna długość wiersza dla domyślnego innodb_page_size wynosi 16KB jest około 8000 bajtów. Dla strony InnoDB o rozmiarze 64kB, maksymalna długość wiersza wynosi około 16000 bajtów. Kolumny LONGBLOB i LONGTEXT muszą być mniejsze niż 4 GB, a całkowita długość wierszy, w tym kolumn BLOB i TEXT, musi być mniejsza niż 4 GB.

Zauważ, że zwiększenie rozmiaru strony nie jest pozbawione wad. Ponownie z dokumentacji:

Od MySQL 5.7.6 obsługiwane są rozmiary stron 32KB I 64KB, ale ROW_FORMAT = COMPRESSED nadal nie jest obsługiwany dla rozmiarów stron większych niż 16KB. Dla stron o rozmiarze 32KB I 64KB maksymalny rozmiar zapisu to 16KB. Dla innodb_page_size=32k rozmiar zakresu wynosi 2MB. Dla innodb_page_size=64k rozmiar zakresu wynosi 4MB.

Wystąpienie MySQL używające określonego rozmiaru strony InnoDB nie może używać plików danych ani plików dziennika z wystąpienia, które używa innego rozmiaru strony. To ograniczenie może wpływać na operacje przywracania lub obniżania wersji przy użyciu danych z MySQL 5.6, które obsługują rozmiary stron inne niż 16 KB.

 0
Author: Ken Clubok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 17:52:55

Jeśli używasz MySQLWorkbench masz możliwość zmiany aby zmienić query_alloc_block_size= 16258 i zapisać go.

Krok 1. kliknij na options file po lewej stronie. Tutaj wpisz opis obrazka

Krok 2: Kliknij na General i wybierz checkBox z query_alloc_block_size i zwiększ ich rozmiar. na przykład zmień 8129 -- > 16258

Tutaj wpisz opis obrazka

 0
Author: Prabhat Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-14 10:42:37

W moim przypadku była to Obudowa Z limitów liczby kolumn tabeli i wielkości wierszy i dokonywanie zmian opisanych w tej odpowiedzi uratowało mój dzień.

  1. Dodaj następujące do my.plik cnf w sekcji [mysqld].

    Innodb_file_per_table
    innodb_file_format = Barracuda

  2. Zmień tabelę, aby użyć ROW_FORMAT = COMPRESSED.

    ALTER TABLE table_name
    ENGINE=InnoDB
    ROW_FORMAT=COMPRESSED
    KEY_BLOCK_SIZE=8;

Https://stackoverflow.com/a/15585700/2195130

 0
Author: Arman Petrosyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:58