2012-03-23 15 views
33

Chcę zmienić tabelę z INNODB na MEMORY ENGINE.Jak zmusić Mysql MEMORY ENGINE do przechowywania większej ilości danych?

Więc Wpisałem polecenie:

alter table sns ENGINE=MEMORY;

Następnie MySQL pokazuje

ERROR 1114 (HY000): The table '#sql-738_19' is full 

Rozmiar danych dla tabeli 1GB i mam 8GB pamięci.

Sprawdziłem my.cnf i nie znalazłem, gdzie zmienić ustawienie max_size. Nie powinienem móc przechowywać więcej danych?

Odpowiedz

63

Należy dostosować sposób wprowadzania i załadować tabelę

CREATE TABLE sns_memory SELECT * FROM sns WHERE 1=2; 
ALTER TABLE sns_memory ENGINE=MEMORY; 
INSERT INTO sns_memory SELECT * FROM sns; 
DROP TABLE sns; 
ALTER TABLE sns_memory RENAME sns; 

To będzie ominąć wszelkich ograniczeń nałożonych przez tmp_table_size i max_heap_table_size.

Tak samo trzeba zrobić dwie rzeczy:

Dodaj to do /etc/my.cnf

[mysqld] 
tmp_table_size=2G 
max_heap_table_size=2G 

ten obejmie restartów MySQL. Aby ustawić te wartości w mysqld teraz bez ponownego uruchomienia to:

SET GLOBAL tmp_table_size = 1024 * 1024 * 1024 * 2; 
SET GLOBAL max_heap_table_size = 1024 * 1024 * 1024 * 2; 

Jeśli sprawdzeniu powyższych zmiennych z

SELECT @@max_heap_table_size; 

lub

SHOW VARIABLES LIKE 'max_heap_table_size'; 

można zauważyć, że don” Wydaje się zmieniać po wydaniu SET GLOBAL.... Jest tak dlatego, że ustawienia dotyczą tylko nowych połączeń z serwerem. Nawiązać nowe połączenie, a zobaczysz aktualizację wartości lub można ją zmienić w ciągu sesji uruchamiając:

SET tmp_table_size = 1024 * 1024 * 1024 * 2; 
SET max_heap_table_size = 1024 * 1024 * 1024 * 2; 
+0

Jeśli zmieniasz go na tabelę pamięci - dlaczego obawiasz się przeniesienia danych? Powinieneś być przygotowany na utratę! Więc po prostu skróć to, a następnie zmień tabelę ... – VBAssassin

+0

Dlaczego ustawiasz 'tmp_table_size = 2G'? Pozostawiłem to domyślnie (16 MB) na moim serwerze 5.5 i nadal mogę przechowywać do mojego 'max_heap_table_size' (~ 400MiB) w tabelach z pamięcią. –

+0

Możesz także zmienić powyższe 2 zmienne tylko dla sesji, wykonując to: 'SET GLOBAL tmp_table_size = 1024 * 1024 * 1024 * 2; USTAW GLOBALNY max_heap_table_size = 1024 * 1024 * 1024 * 2; ' – Jaylen

2

Zwiększenie max_heap_table_size.

2

Jeśli nadal masz problem, należy pamiętać, że miejsca na dysku zajmuje stół jest często mniej niż wymaganie pamięci. Użycie VARCHAR (256) z ciągiem o długości 8 spowoduje zużycie 8 bajtów na dysku, ale ponieważ STORAGE nie obsługuje dynamicznych wierszy, to rezerwuje pełne 256 bajtów w pamięci dla każdej instancji.

Powiązane problemy