« 1 2 »
Autor Zpráva
Tomas_2
Profil *
Potřebuji na web nahrát 2GB (RAR či ZIP) databáze (po rozbalení to má téměř 5GB). Místo v mySQL by bylo, ale řeším tady spíše problém, jak dostat tak velké množství dat do mySQL. Existuje nějaký PHP script, který by po dávkách nahrál data do mySQL?

Děkuji za Vaše rady.
Darker
Profil
A jsi si skutečně jistý že je nezbytné ta data nahrávat do MySQL místo do souboru?
Pokud ano, nahraj data binárně a pomocí fread vždy přečti přesně tak dlouhý kus jako je max prostor v řádku. To celé v cyklu.
Tomas_2
Profil *
Našel jsem na internetu php script, který by snad i mohl celou věc vyřešit: http://www.ozerov.de/bigdump/, ale moc si v tom jistý nejsem. Vyzkouším a uvidím.
Kajman
Profil
Php na to nebude ideální.

Pokud máte na serveru ssh přístup, tak stačí pustit mysql a předat mu rozbalený export.

Pokud máte povolený přístup do db z vaší ip, tak by to taky neměl být problém.
Tomas_
Profil *
Zkoušeli jsme to snad 3x a ani jednou se nám nepodařilo uploadovat vše do mySQL. Uploaduje se nám vždy jen polovina :(
SSH přístup bohužel nemám.

Neporadí někdo, jak uploadovat větší objem dat do mySQL?
_es
Profil
Tomas:
Tak to najprv prenes ako súbor cez ftp a potom rieš ako to skopíruješ do databázy.
Tomas_
Profil *
_es: Ale já ten soubor samozřejmě na FTP mám. Přes bigdump, kde mam v PHP zadanou cestu k tomuto souboru, tento bigdump.cz od ozerov.de ... spouštím. Uploaduje se mě tam pouze polovina, tj. 2,5GB z 5-ti GB :( a vůbec nemám ponětí proč. Jak to mám nastaveno, přikládám níže:
$filename           = 'bookbyisbn.sql.gz';     // Specify the dump filename to suppress the file selection dialog
$ajax               = true;   // AJAX mode: import will be done without refreshing the website
$linespersession    = 50000;   // Lines to be executed per one import session
$delaypersession    = 1000;      // You can specify a sleep time in milliseconds after each session
                              // Works only if JavaScript is activated. Use to reduce server overrun

 // CSV related settings (only if you use a CSV dump)

 $csv_insert_table   = '';     // Destination table for CSV files
$csv_preempty_table = false;  // true: delete all entries from table specified in $csv_insert_table before processing
$csv_delimiter      = ',';    // Field delimiter in CSV file
$csv_add_quotes     = true;   // If your CSV data already have quotes around each field set it to false
$csv_add_slashes    = true;   // If your CSV data already have slashes in front of ' and " set it to false

 // Allowed comment delimiters: lines starting with these strings will be dropped by BigDump

 $comment[]='#';                       // Standard comment lines are dropped by default
$comment[]='-- ';
// $comment[]='---';                  // Uncomment this line if using proprietary dump created by outdated mysqldump
// $comment[]='CREATE DATABASE';      // Uncomment this line if your dump contains create database queries in order to ignore them
$comment[]='/*!';                  // Or add your own string to leave out other proprietary things
                    // Or add your own string to leave out other proprietary things
Kajman
Profil
Pokud ten soubor obsahuje sql příkazy, tak si můžete soubor ručně rozdělit na víc menších.
Tomas_
Profil *
To byla hned moje první možnost. Bohužel tabulek je tam jen 5, přičemž ta jedna tabulka má největší velikost, téměř 5 GB a zbytek tabulek je jen pár MB.
Alphard
Profil
Tak snad nejsou veškerá data v jedné buňce.
Jan Tvrdík
Profil
To nic nemění na faktu, že ji můžeš nahrát po částech.
_es
Profil
Tomas_2:
SQL príkaz: LOAD DATA LOCAL INFILE si skúšal?
Tomas_
Profil *
Nezkoušel jsem to. Jakou cestu k souboru mám použít? Stačí cesta jaká by byla cesta například /dumb/soubr.sql.gz nebo to musí být přímá cesta, kde se daný soubor na hostingu nachází (získání cesty třeba z $_SERVER)?
Davex
Profil
Nejjistější je absolutní cesta v rámci souborového systému na serveru (ze začátku $_SERVER['SCRIPT_FILENAME']), ale funguje i relativní s tečkou a lomítkem na začátku ./dump/soubor.sql.
Kajman
Profil
Takhle by mělo stačit naimportovat tu největší tabulku. Tedy si udělat sql export tabulek + jen strukturu té velké tabulky. To nahrát, a pak si přes
load data 
načíst uložené řádky z csv formátu.
Tomas_2
Profil *
Bohužel problém s importem trvá nadále. Data do CSV nedostanu, protože SQL mám z USA (koupené - jedná se o seznam knih).
Proto zkouším dostat data přímo do svého PC. Zkoušel jsem načíst 5GB sql přes adminer i přes phpmyadmin. Bohužel ani v jednom případě se mě to nepodařilo. Nejdál jsem se dostal s phpmyadmin, kde jsem měl čas nastaven na 300s (to mě v téměř 3/4 kleklo) i jsem měl čas 420s a opět nic.
Fatal error: Maximum execution time of 420 seconds exceeded in C:\wamp\apps\phpmyadmin3.4.5\libraries\dbi\mysqli.dbi.lib.php on line 199

Otestoval jsem i bigdump s funkcí javascript. Ten se bohužel ani nenačetl, včetně tabulky a ukazatele kolik se toho již nahrálo. Přes bigdump tam nahraji sotva 1/2 dat :(

Editovat soubor a vyjmout ho, případně nějak zpracovat .... nelze, protože na PC je pouze 2GB RAM a tato práce by byla úmorná.

U toho phpmyadmin jsem si data dal do složky ./upload a SQL soubor jsem tam nahrál, přičemž phpmyadmin zpracovavál soubor přímo ze složky. Opět jako na začátku ... bez úspěchu.

Neporadí mě někdo z Vás, jak tuto zapeklitou věc mám vyřešit?

PS: Těch 3/4 nahraných dat se týká 1 tabulky, kde má být 5,8GB s 12,7 milióny řádků. Zbytek jsou tabulky s menší velikostí dat.


Jediné, co mě v tuto chvíli napadá je nějaký PHP script, který umí převést SQL soubor do CSV podoby. Ale nic takového jsem zatím nenašel :(
Alphard
Profil
PHP není optimální pro práci s tak velkými soubory, kdybyste použil aplikaci pro správu databáze, asi byste si ušetřil starosti.
V nejhorším bych to zpracoval pomocí vlastního scriptu, založil bych ho na fgets(), prostě nenačítat celý soubor.
Tomas_2
Profil *
A ta aplikace, o kterou by šlo? Pracuji však na windows, tak nevím jestli tohle je vůbec možné.
Kajman
Profil
Kajman:
stačí pustit mysql a předat mu rozbalený export

Na svém pc si sql soubor můžete jednoduše naimportovat např. přes mysql.exe v adresáři bin.

mysql -h localhost -u root databaze < zaloha.sql
Tomas_2
Profil *
Ano je tam mysql konzole. Zeptám se ... zaloha.sql by měl být umístěný kde přesně?
Kajman
Profil
V adresáři, ve kterém příkaz pouštíte. Případně i kdekoliv jinde, uvedete-li k němu korektní cestu.
Tomas_2
Profil *
zaloha.sql jsem nahrál taktéž do složky bin, kde je ostatně i mysql.exe, kterou spustím. Po spuštění to chce heslo, které u mySQL nemám, tak že odentruji a dostanu se do konzole mySQL, kde dostanu: mysql> ....zde se píše. Napíši tam tedy:
mysql -h localhost -u root test < zaloha.sql
Bohužel to nic neudělá ... tedy po enter se dotanu na další prázdný řádek. Když se podívám do phpmyadmin, tak v databazi test nic není.
Alphard
Profil
Kajman neříkal nic o spuštění mysql.exe. Prostě se v konzoli (Spustit a cmd) přesuňte do toho adresáře, u mě cd C:\web\prog\mysql51\bin a spusťte ten příkaz.
Kajman
Profil
Tomas_2:
Jinak, pokud jste nepředal soubor na vstup a spustil konzoli bežně, můžete v ní i použít příkaz source. Viz odkaz výše.
Tomas_2
Profil *
Tak jsem to zkoušel 2x a ani jednou se mě nenatáhne celá mySQL. Sekne se to na nějakých 4-5GB (dle složky test, kde se data ukladaji). PC sice stále něco dělá, ale čekal jsem 2 hodiny a nepřidalo to ani 1kB. Nevíte co s tím může být? Zkoušel jsem to na 32bit i na 64bit (druhý PC). Ani v jednom případě to nešlo :/


Dělal jsem to přes ten CMD
Kajman
Profil
Tomas_2:
nepřidalo to ani 1kB
Jste si jistý?

Pokud se Vám nedaří práce s mysql klientem, zkuste nějaký gui nástroj. Třeba WorkBench. Osobně mám dobré zkušenosti s mysql administrátorem ze starších mysql qui tools, ale u něj možná bude muset být ten .sql soubor ve správném formátu, jinak nepůjde zanalyzovat.
Tomas_2
Profil *
Tak se to podařilo naimportovat. Nyní ale zase nefunguje například export dat do CSV. Tedy přesněji funguje, ale jen omezené množství, protože pokud v tabulce je řekněme 300MB v druhé pak 5GB, tak ani v jednom případě se nevyexportuje vše, ale vždy řekněme 120-130MB a konec, jako by mySQL mělo nastaveno nějaký maximalní limit pro export. Nevíte, kde se toto řeší, nastavuje?
Kajman
Profil
Těžko říct, jak děláte export. Zkuste si např. mysqldump s přepínačem --tab.
Kajman
Profil
A pro budoucí generace byste mohl napsat, jakým nástrojem se import podařil.
Tomas_2
Profil *
Import velkého objemu dat se podařil právě přes příkaz vložený do cmd (příkazový řádek windows). Na 64 bitové verzi windows 7 to trvalo zhruba 1-1,5 hodiny, přičemž posledních půl giga trvalo nejdéle - PC vypadal jako by měl tendenci zamrznout. Proto je nutné vyčkat ať se děje co se děje. Na 32 bitové verzi to už jelo podstatně pomaleji a proces mohl trvat i 4 hodiny (dál jsem to zastavil, protože PC jevil zamrznutí).

Export provádím nyní přes adminer. Bohužel ale má asi nějaké zabezpečení (maximální limit) a já nevím, kde tento limit přenastavit / zrušit.
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: