Obnova DB na MySQL pomoci php

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod mrlicker 31. 7. 2007 17:41

Zdravim,
resim mensi problem. Pomoci crona budu spoustet kazdou pulnoc php script. A pomoci toho scriptu potrebuju updatovat mysql DB z dumpu, ktery jsem si ze stejne DB udelal drive. Jenze zaboha nemuzu prijit jak toho docilit, jakym prikazem. Rucne se mi to doopravdy psat nechce. Existuje vubec nejaky prikaz kterym v php vlozim ten dump a DB se aktualizuje??

Diky
mrlicker
Junior

Odeslat příspěvekod AndrewN 31. 7. 2007 21:13

Je opravdu nutný to dělat v PHP? Co takhle tím cronem pouštět něco jako:

mysql -u uzivatel --password=heslo < dump.sql

A kdyby ten dump neobsahoval příkaz na vybrání DB, tak tam přihodíš ještě -D jmeno_databaze.

Jinak kdybys trval na PHP, nebude to tak jednoduchý, nejspíš ten dump budeš muset rozparsovat na jednotlivý dotazy, což bude zoufale neefektivní...
AndrewN
Junior

Odeslat příspěvekod mrlicker 31. 7. 2007 22:29

nj, jenze ja mam k dispozici rozhrani, kde zadam soubor, ktery cron spusti v dany okamzik. Takze asi nic jineho nez php mi nezbyva.
mrlicker
Junior

Odeslat příspěvekod yaroslaf 31. 7. 2007 22:42

A nemůžeš z PHP spouštět přímo příkazovou řádku mysql...?
Třeba přes exec nebo shell_exec.
yaroslaf
Junior
Uživatelský avatar

Odeslat příspěvekod mrlicker 31. 7. 2007 22:50

no tak jsem testoval.
exec("whereis mysqldump");
-nevypise nic

shell_exec("whereis mysqldump");
-Warning: shell_exec() has been disabled for security reasons in /home/hosting/standard/globals.off/awiscz.com/www/internetovy_obchod/cron/Novy2.php on line 4

Tak uz fakt nevim :-)
mrlicker
Junior

Odeslat příspěvekod AndrewN 31. 7. 2007 22:52

Funkce exec nic nevypisuje, výstup vrací jako string. A podle toho, co píšeš, jí máš asi povolenou. Takže bych to napřed zkusil přes ní, kdyby to nešlo, tak kopií databáze (viz dál) a až jako nouzovku bych to proháněl PHP.

Pro PHP máš teoreticky dvě možnosti:
1. Slyšel jsem, že mysqli_query umí víc dotazů najednou, PDO možná taky (ale to nevím jistě). Takže bys obsah toho dumpu moh dát jako parametr tý funkce. Ale ta funkce bude mít (ať už interně v PHP nebo v MySQL knihovně) nejspíš nějaký omezení dýlky dotazu, takže na obnovování databáze v řádu desíte MB to fakt nebude.
2. Rozparsovat dump. Podle mě by to mělo jít po jednotlivých řádkách - dostaneš jednotlivý dotazy a "něco navíc" (komentáře), ty budeš muset odfiltrovat.

Každopádně obě řešení jsou nic moc. Mimochodem, jestli potřebuješ "resetovat" databázi, nebylo by jednodušší mít někde bokem její kopii, tu starou vždycky smazat a na její místo zkopírovat tu "záložní"?


// sorry za trochu zmatenej příspěvěk, předělával jsem ho, když jsem zjistil, že jsi ten exec() a shell_exec() zkoušel
AndrewN
Junior

Odeslat příspěvekod mrlicker 31. 7. 2007 23:03

no jasne, ja potrebuji jak rikas "reset", ale aby se del automaticky. A jak to tak vidim budu muset parsovat :-)
mrlicker
Junior

Odeslat příspěvekod AndrewN 31. 7. 2007 23:19

Tak jsem našel ještě jednu možnost - příkazy BACKUP TABLE a RESTORE TABLE. Zkus se na to podívat do dokumentace MySQL, vypadá to, že by to mohlo být ono. Za předpokladu, že používáš MyISAM tabulky; s jinýma to nejde. Jak jsem pochopil, pomocí BACKUP TABLE si uděláš zálohu každý tabulky a tím cronem bys pak postupně pro každou tabulku pouštěl RESTORE TABLE. Ale nikdy jsem to osobně nezkoušel.
AndrewN
Junior

Odeslat příspěvekod mrlicker 31. 7. 2007 23:21

jj tohle jsem tez nasel, ale je prave blbe ze to je po tabulkach, takze stejne se nevyhnu nejake te praci. Uz to robim v php :-)
mrlicker
Junior

Odeslat příspěvekod K8 1. 8. 2007 18:55

a co LOAD DATA INFILE ?
K8
Pokročilý

Odeslat příspěvekod AndrewN 1. 8. 2007 19:24

To by mohlo stačit, kdyby tazatel nepotřeboval tabulky vytvářet a stačilo mu je naplnit daty. Ale pořád to je operace jenom s jednou tabulkou...
AndrewN
Junior

Odeslat příspěvekod mrlicker 1. 8. 2007 23:53

jj presne tak. Jinak uz jsem to vyresil. Proste jsem to jen vyparsoval. Diky za ochotu
Core 2 Duo E6750 2,66GHz | 2x DDR2 1024MB 1066MHz Kingmax |
PALIT X1950GT 512MB GDDR3 (256bit), PCI-E | MB GIGABYTE P35-DS3 | SEAGATE 320 GB BARRACUDA SATAII |
LG MT LCD 19" L194WT | BLUESTORM II - FORTRON 500W ATX | COOLERMASTER Elite 330
mrlicker
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků