it-swarm-eu.dev

MySQL server odešel, aby bránil importu velkých skládek

Snažím se importovat velký výpis sql (2 GB) do mého místního mysql v mém počítači Mac. V minulosti jsem to dokázal (používal jsem MAMP), ale nyní dostávám ERROR 2006 (HY000) na řádku 7758: Server MySQL odešel pokaždé, když se pokusím importovat výpis. Databáze obsahuje tabulky innodb.

Pokusil jsem se zkopírovat soubor my-innodb-heavy-4G.cnf do my.cnf, abych zjistil, zda by toto nastavení pomohlo, ale ne štěstí.

Nějaké nápady, co vyladit?

Používám zde „Mac OS X verze 10.6 (x86, 64-bit), archiv DMG“: http://dev.mysql.com/downloads/mysql/

14
naxoc

Jedním z tichých zabijáků spojení MySQL je paket MySQL. Tím může být obětí i I/O vlákno replikace MySQL.

Podle dokumentace MySQL

  • Tyto chyby můžete také získat, pokud odešlete dotaz na server, který je nesprávný nebo příliš velký. Pokud mysqld obdrží paket, který je příliš velký nebo mimo provoz, předpokládá se, že se klientovi něco pokazilo a připojení se uzavře. Pokud potřebujete velké dotazy (například pokud pracujete s velkými sloupci BLOB), můžete zvýšit limit dotazu nastavením proměnné max_allowed_packet serveru, která má výchozí hodnotu 1 MB. Možná bude také nutné zvýšit maximální velikost paketu na konci klienta. Další informace o nastavení velikosti paketu jsou uvedeny v Oddíl C.5.2.10, „Paket příliš velký“.

  • Příkaz INSERT nebo REPLACE, který vkládá mnoho řádků, může také způsobit tyto druhy chyb. Jeden z těchto příkazů odešle serveru jeden požadavek bez ohledu na počet řádků, které mají být vloženy; proto se často můžete této chybě vyhnout snížením počtu řádků odeslaných na VLOŽIT nebo VYMĚNIT.

Přinejmenším se musíte ujistit, že velikosti paketů jak pro stroj, ze kterého mysqldump'd, tak pro stroj, který načítáte, jsou identické.

Můžete použít dva (2) přístupy:

PŘÍSTUP 1: Proveďte mysqldump pomocí --skip-Extended-insert

Tím zajistíte, že paket MySQL nebude zaplaven několika poli BLOB, TEXT. Tímto způsobem jsou SQL INSERTy prováděny po jednom. Hlavní nevýhody jsou

  1. mysqldump je mnohem větší
  2. načtení takového výpisu trvá mnohem déle.

PŘÍSTUP # 2: Zvýšení max_allowed_packet ​​

Toto může být upřednostňovaný přístup, protože implementace je jen restartování mysql. Pochopení toho, co je paket MySQL, to může objasnit.

Podle strana 99 „Porozumění interním MySQL“ (ISBN 0-596-00957-7) , zde jsou odstavce 1-3, které to vysvětlují:

MySQL síťový komunikační kód byl napsán za předpokladu, že dotazy jsou vždy přiměřeně krátké, a proto je lze na server odesílat a zpracovávat v jednom bloku, který se v terminologii MySQL nazývá paket. Server přiděluje paměť dočasné vyrovnávací paměti pro uložení paketu a vyžaduje dost, aby se vešel úplně. Tato architektura vyžaduje preventivní opatření, aby se zabránilo vyčerpání paměti serveru --- omezení velikosti paketu, čehož tato možnost dosáhne.

Kód zájmu týkající se této možnosti je uveden v sql/net_serv.cc . Podívejte se na my_net_read () , poté následujte volání na my_real_read () a věnujte zvláštní pozornost net_realloc () .

Tato proměnná také omezuje délku výsledku mnoha řetězcových funkcí. Podrobnosti viz sql/field.cc a sql/intem_strfunc.cc .

Vzhledem k tomuto vysvětlení bude hromadné INSERTy načítat/vykládat paket MySQL poměrně rychle. To platí zejména tehdy, když je max_allowed_packet příliš malý pro dané zatížení dat přicházejících na něj.

[~ # ~] závěr [~ # ~]

Ve většině instalací MySQL to obvykle nastavím na 256M nebo 512M. Měli byste experimentovat s většími hodnotami, když načítání dat způsobí chyby „MySQL zmizelo“.

15
RolandoMySQLDBA

Ti, kteří neměli úspěch s ostatními návrhy, by mohli zvážit pohled na BigDump PHP rozložený výpis MySQL skript dovozce .

Jedná se o řešení pro import rozsáhlých databázových výpisů do MySQL. Úspěšně jsem jej použil k importu velké výpisu MySQL do mého místního vývojového prostředí (v tomto případě používám MAMP).

2
Marcus Barnes

Jak dlouho to trvá, než vyprší časový limit? První krok by se vsadil na kontrolu wait_timeout a interactive_timeout nastavení, abyste se ujistili, že jsou dostatečně velká pro váš import:

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;

Výchozí nastavení je 8 hodin (28 800), takže to pravděpodobně není problém. Další náznaky tohoto problému najdete zde . Jeden, který vyniká, je toto:

Klientská aplikace spuštěná na jiném hostiteli nemá potřebná oprávnění pro připojení k serveru MySQL z tohoto hostitele.

Nejprve ověřte oprávnění, ale poté projděte seznam možných problémů.

2
Derek Downey

Nemusí to být „správná“ věc, ale může to fungovat (udělejte hotovo, že?):

Zkuste rozdělit svůj velký výpis na více souborů a spouštět je postupně. Mým přístupem by bylo rozbít to na polovinu a vyzkoušet. Poté rozbijte každou polovinu na polovinu, opakujte test atd.

Jsem trochu zvědavý, jestli částka RAM, kterou máte v krabici) může mít něco společného s tím. Načte MySQL celý výpis do paměti, když jde o jeho spuštění? nevím ... ale pokud máte pouze 2 GB RAM a některé z nich se používají při spuštění operačního systému a dalších aplikací, pak by to mohlo být je problém.

2

Ano, obvykle si hraju s wait_timeout a max_allowed_packets mi umožňuje obejít se také chybová zpráva.

2
p4guru