mysql - replikacja w ramach tego samego serwera (lub bazy)
Plast - 11-11-2006 00:55
mysql - replikacja w ramach tego samego serwera (lub bazy)
Witam
Problem jest nastepujacy: czy da sie ustawic tak replikacje, zeby w obrebie tego samego serwera MySQL replikowac tabele X z bazy A do bazy B?
Moje poszukiwania i wnioski w tym temacie postuje ponizej, gdybys ktos zechcial rzucic na to okiem i ewentualnie wskazac bledy w rozumowaniu/skrytykowac/zasugerowac cos innego/etc. to bede wdzieczny.
== Na podstawie zdobytej wiedzy (stricte podrecznikowej poki co, niestety) wymyslilem sposob, ktory byc moze umozliwilby takie 'cudo' :), ale nie mam pojecia czy to zadziala... dodam, ze zakladam, ze pracuje na Linuxie, jesli ma to jakies znaczenie (raczej nie powinno).
Generalnie wydaje mi sie, ze nie da sie replikowac czegokolwiek w ramach tego samego serwera mysql. Powodow jest kilka, ponizej dwa najwazniejsze:
1) Przy korzystaniu z mechanizmu replikacji kazdy serwer, w tym wiec i master i wszystkie slave'y, musza miec unikalny numer 'server-id' podany w konfigu. Ten numer jest wykorzystywany przez mechanizm replikacji i mechanizm ten nie bedzie dzialal, jesli 'server-id' mastera slave'a beda takie same.
2) Replikacja wykorzystuje 'binary log' master serwera. W 'rules' tego binary logu ustawia sie, ktore bazy danych/tabele maja byc brane pod uwage (na slave mozna dodatkowo ustawic co ignorujemy). Tutaj pojawia sie pierwszy i od razu powazny problem - nie ma takiej 'rule' (czyt. nie znalazlem), ktora pozwolilaby ustawic jakakolwiek zmiane nazwy bazy/tabeli przy replikacji. Po prostu tabela X z bazy A przy replikacji na drugi serwer rowniez trafi do bazy A i bedzie sie rowniez nazywac X.
Oczywiscie mozna sprobowac obejsc te problemy i na tym opiera sie moje rozwiazanie teoretyczne:
Ad.1) Tego problemu pozbyc sie mozna chyba tylko uruchamiajac po prostu drugi serwer mysql, oczywiscie na tej samej maszynie, drugi proces na osobnym porcie. Jest to opisane w dokumentacji:
http://dev.mysql.com/doc/refman/4.1/...e-servers.html
Jesli sie wczytac w dokumentacje to oni tam odradzaja uruchamianie wiecej niz jednego serwera operujacego na tym samym katalogu z danymi, a u mnie tak to wlasnie by musialo niestety wygladac, no bo ma to byc ta sama baza danych. Oczywiscie opisywane przez nich problemy przy odpowiednich ustawieniach i zalozeniach wcale nie musialyby wystapic u mnie, ale nie mozna tego wykluczyc.
Drugi serwer pozwoli na zrobienie jednego serwera masterem, drugiego slavem i ustawienie dwoch roznych server-id. Nigdzie nie wyczytalem, ze replikacja nie moze sie odbywac na tej samej fizycznie maszynie, tzn. ze jest sprawdzany przez ten mechanizm nie tylko server-id, ale i np. IP maszyn, wiec istnieje duza szansa, ze ten sposob zadziala.
Ad.2) Tutaj z braku rozwiazan 'wbudowanych' wymyslilem posluzenie sie pewna 'sztuczka'.
Mianowicie mozna sprobowac ustawic dla serwera slave INNY katalog z danymi niz dla servera master, ale w tym INNYM katalogu z baza, ktorej tabele chcemy replikowac, wstawic zamiast prawdziwych plikow, symlinki o tych samych nazwach, ktore beda prowadzic do... jakiejs innej bazy na masterze! :) W ten sposob osiagniemy cos takiego: - master bedzie wysylal zmiany do slave'a, - slave bedzie je zapisywal do 'tej samej bazy/tabeli' w 'swoim' katalogu z danymi, a tak naprawde, dzieki symlinkom, do innej bazy w katalogu z danymi... serwera master.
Ma to sens?
-- "...I don't know half of you half as well as I should like and I like less than half of you half as well as you deserve..."
Filip Rembiałkowski - 12-11-2006 00:36
Plast wrote: > Witam > > Problem jest nastepujacy: czy da sie ustawic tak replikacje, zeby w > obrebie tego samego serwera MySQL replikowac tabele X z bazy A do bazy > B?
jeśli w ramach 1 serwera to zrób po prostu własne triggery do replikacji (after insert, after update, after delete).
use db1
CREATE TRIGGER repli AFTER INSERT ON X FOR EACH ROW INSERT INTO db2.X SELECT * FROM X WHERE id=NEW.id;
Plast - 12-11-2006 00:39
On Thu, 21 Sep 2006 11:12:22 +0200, Filip Rembiałkowski <plk.zuber@gmail.com> wrote:
>jeśli w ramach 1 serwera to zrób po prostu własne triggery do replikacji >(after insert, after update, after delete). > >use db1 > >CREATE TRIGGER repli AFTER INSERT ON X > FOR EACH ROW > INSERT INTO db2.X SELECT * FROM X WHERE id=NEW.id;
Dzieki. Niestety na serwerze jest mysql 4.1, a triggery sa dostepne o 5.x o ile sie orientuje :(.
-- "...I don't know half of you half as well as I should like and I like less than half of you half as well as you deserve..."
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
MySQL - jak =?ISO-8859-2?Q?wyeksportowa=E6_zawarto=B6=E6_wie?==?ISO-8859-2?Q?lkiej_tabeli?=
zanotowane.pldoc.pisz.plpdf.pisz.platanvarne633.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|