Zkousel nekdo napsat program nejlepe v PHP na replikaci MySQL databaze z jednoho serveru na jiny server?
Dodavam, ze servery jsou na Internetu, kazdy na jinem kontinentu Potebuju jen tak 1x denne updatovat databazi na druhem serveru o data zapsana do databaze na 1.serveru.
P.S. pisu to tu jako "neregistrovany" protoze tu zlobi login - po zapsani meho username a passwordu se objevi bila stranka a prd ...
Jinak tu jsem radne registrovany Remmidemmi.
Fórum › MySQL
Replikace databaze
Primo psat sem nepsal, ale tak na rychlo me napadlo mit nejaky timestamp u kazdeho radku a pri updatu vybrat vsechny radky, ktere jsou od urciteho timestampu a zapsat je na druhy server. To mi prijde jako nejjednodussi reseni, ale jestli nejlepsi, to momentalne nevim.
To dannyk :
nejde o to urcit ktera data jsou nova a ktera se maji updatovat na novy server. To je trivialni.
Ale co nevim, jak ta data presunout na ten druhy server. Jak automaticky otevrit relaci a zapis do druhyho serveru....
Prohlizel jsem ruzna PHP fora a googloval po svete, ale vetsinou se do tohoto nikomu moc nechce.
Predstav si to takhle: mas MySQL databazi treba na serveru Tiscali.cz a chces urcita data z ni zapsat do stejne databaze ale na serveru Seznam.cz
Od obou serveru mas k dispozici pristupova prava.
Rucne to udelat umim, tak, ze si stahnu data k sobe a pak je odsunu na druhy server. To je ovsem pitome reseni. Potrebuju aby se to delalo automaticky.
Podobne by se pak dalo resit zalohovani cele databaze z 1. serveru na 2.server.
Ma nekdo napad jak to napsat?
P.S. - stale nefunguje prihlasovani, heslem to neni a WEB prohlizecem take ne...
To Remmidemmi : tak to zautomatizuj CRONom... na servery 2 sa pripoj na server 1 ktory urobi export db do suboru a ten si nasledne stiahnes...
to Marioff: mas nejaky priklad jak to udelat?
cron jestli to dobre chapu, mi akorat nastavi periodu, kdy delat upgrady. jenze ten kamen urazu je v navazani spojeni mezi temi servery. ty servery nejsou u me v kanclu, ale jeden je v usa a druhy v asii. jde o to, jak otevrit ten druhy server z toho prvniho ... to se mi nedari...
newiem v com mas stranky... ak v php tak by som pouzil kniznicu cURL http://sk2.php.net/manual/en/book.curl.php
na servery ktory SA BUDE replikovat umiestnis kod ktory bude spustat cron napr. o polnoci. Ten bude obsahovat pripojenie (najlepsie s pomocou hesla, a certifikatu) na server (teda na druhy kod) z ktoreho replikujes databazu. Ten vytvori export databazy napr. v XLS formate (alebo rovno SQL), a posle ho prvemu kodu na replikovanom servery. A nakoniec dany vystup ktory ziskal spracuje a vlozi do db.....
neco zkusim napsat a pripadne se ozvu... dik
To Marioff: mrkni na tenhle link
http://www.phppro.jp/school/pear/vol8/2
co ty na to? :)
uplne nejzasadnejsi otazka je, jestli mas k dane db pristup jen pres php, nebo muzes "pracovat" s celym danym strojem/serverem...
pokud muzes pracovat se serverem, obsahuje mysql nastroj pro replikaci [1]
pokud ovsem ne, pak nezbyva nez pomoci cronu si nechat volat php, ktere pres nejaky http request, tunel, ci ja nevim co protlaci data... a to uz mi silne zavani prasarnama... takze tomu se vyhni...
jinak ten link co si ted posla, to je trochu mimo, hlave japonsky, ci co.. na to kasli. staci se normalne podivat na google [2], a naprogrmaovat si to spojeni a poslat treba v postu par dat. samozrejme, ne vsechno na jednou, ale treba vybirat sqlkem ty data pomoci limitu a kdyz limit bude naplne, tak to stale cyklit, dokud ty data postupne vsechny neodesles. doporucuji to provadet tak po 1000 radcich, vic uz asi radej ne.
[1] = http://www.google.com/search?q=php+mysql+replication
[2] = http://www.google.com/search?q=php+curl+post+ssl
To hrach :
Server 1: pomocou cURL (s POST-om hesla) sa pripojis na Server 2 protokolom https, s pouzitim slusneho certifikatu, a budes cakat na odpoved, teda cisty vystup....
Server 2: tu bude kod ktory vyexportuje data z db napr. rovno v SQL formate... a zobrazi ich klasicky "do prehliadaca" tak aby si ich prvy server zobral ako vystup... (samozrejme len s pouzitim spravneho hesla)
Server 1: spojenie zavrie, prijaty vystup skontroluje a vlozi do db....
nepripada mi to prasacke, s ohladom nato ze si nemyslim ze ma pristup k ssh...
toto riesenie by bolo asi najjednoduchsie si myslim
To remmidemmi : to je len nejaka funkcia na http_request... to ti kludne a jednoduchsie (a aj lepsie) nahradi cURL.....
je to divne, ted jsem sem vepsal dlouhou odpoved, pozralo ji to, ale nic tu neni ...
tak tedy znovu:
bohuzel s celym strojem pracovat nemohu, jen s casti.
Ta japonstina mi zase az tak nevadi, je to celkem kulturni jazyk.
Ale k veci - cely prodlem se zda byt v tom, jak napsat cestu na druhy(vzdaleny) server.
Napsal jsem toto:
require_once('/u/web/local_path/mysql_conf.inc.php'); // access right for remote access
$link = mysql_connect(REMOTE_HOST, REMOTE_USER, REMOTE_PASSWORD)
or die("Could not connect : " . mysql_error());
mysql_select_db(REMOTE_DATABASE) or die("Could not select database");
az sem to chodi. Potom je problem v tomto:
require_once(/u/web/user/remote_server_path/my_file.php);
Otazka je jak sem zapsat celou cestu na web ( http://www.... )
Nebo zda lze do radky prohledavajici databazi napsat cestu na tabulku vcetne web adresy
$query = 'SELECT * FROM '. my_table .'
WHERE ........
To jest '. my_table .' mit vcetne adresy na vzdaleny web ...
Ale myslim, ze urcite nad celym strojem, serverem existuje neco na replikaci databaze... jen se k tomu umet dostat. Bych to nemusel takhle mastit.
To marioff :
O neco takoveho se snazim, ze otevru databazi, tabulku na vzdalenymserveru, prectu si potrebna data a zobrazim je na prohlizeci a ulozim na lokalnim serveru. Bohuzel to vazne na napsani cest do tech prikazu.
Samozrejme uplne lepsi by bylo, kdyby vzdaleny server jednou denne v predem dany cas updatoval tabulku na 1. server.
Ono to je tak, ze uzivatele maji pristup k zapisu jen na vzdalenem serveru, zatimco na mistim se tabulka jen prohlizi a slouzi jako backup. Jenze nevyhoda je v tom, ze po jistem case se na mistnim serveru prohlizeji stara data, protoze se ze vzdaleneho serveru na lokalni nijak nedostanou.
Kdyz budou uzivatele zapisovat data na lokalni server, budou zase chybet na tom vzdalenem, kde je jina skupina uzivatelu nejen zapisuje, ale take prohlizi.
Pokud nemas kontrolu nad stroji a tedy nemuzes pouzit replikaci integrovanou v MySQL, tak si muzes pomoci jinak. Moznosti je vice:
Pokud ma jeden stroj povolene pripojeni do MySQL zvenku (coz moc nebyva), tak se muzes z toho druheho pripojit promo na oba stroje napr. z PHP a pak tam data pretahovat dle potreby.
BTW: Tohle je blbost ... prihlasovaci informace do vzdalene DB tezko budes mit nekde verejne vystavane, takze si je rucne uloz na ten stroj, kde je potrebujes.
require_once(/u/web/user/remote_server_path/my_file.php);
Dalsi moznosti je na jednom serveru si udelat skript, kterymu das na vstupu SQL dotaz a on ti vrati vysledek dotazu. Tento skript potom budes volat (pomoci file_get_contents() nebo CURL apod.) a stahovat si tak potrebne informace. Pripadne skript muzes udelat na miru a neumoznoval posilani libovolnych dotazu. Kazdopadne jej musis nejak zabezpecit ... idelane pres HTTPs a volat s nejakym tajnym heslem, ktery skript overi.
Otazka je, jak provadet synchronizaci, tedy jaka data prenaset.
- jedna moznost je udelat vzdy uplny DUMP DB a ten prenest na naimportovat. Pokud je DB trochu vetsi, tak je to pomerne pomale reseni.
- druha moznost je oznacovani si zaznamu, ktere se zmenily (pridaly, editovaly, smazaly) a prenaset jen tyto zmeny ... pokud se meni i struktura DB, tak musis prenaset cele tabulky
- dalsi moznost je logovat (klidne na urovni aplikace ... tedy napr. PHP) vsechny dotazy do DB krome SELECTu a tyto dotazy potom prenest a provest na druhem serveru. Pokud je zmen pomerne malo a DB velka, muze to byt vhodne reseni. Mohou se ale vyskytnout problemy. Zaprve napr. INSERT INTO ... neco=NOW(), kdyz se provede na druhem serveru, tak ulozi jiny cas. To lze obejit tak, ze cas budes generovat primo ve aplikaci (PHP skriptu). Zadruhe se dotazy mohou zalogovat v jinem poradi, nez ve kterem se provedou. Pokud dotaz aktualizoval stejne zaznamy, vysledek nemusi dopadnou stejne. Ale zase to muzes provadet prubezne a tedy druhou DB udrzovat aktualni prakticky porad.
Replikace na urovni MySQL oba problemy eliminuje automaticky (misto NOW() primo do logu uklada jiz konkretni cas a porad vykonani zna, takze loguje ve spravnem poradi).
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
MSSQL - obnovení replikace — založil Robert
Tabulky databáze, relační databáze a relace — založil mger789
C++ a databáze — založil miguel
Moderátoři diskuze