/ / replikacja mysql działa tylko wtedy, gdy wybiorę bazę danych według bazy danych USE - mysql, replikacja

replikacja mysql działa tylko wtedy, gdy wybiorę bazę danych według bazy danych USE - mysql, replikacja

Mam replikację master-slave mysql.

Kiedy używam następującego po aktualizacji, to nie zmienia ona niewolnika:

UPDATE database.table SET key = "value" WHERE ID = 1;

Ale gdy użyjesz następującego zapytania, slave działa poprawnie i aktualizuje bazę danych:

USE database;
UPDATE table SET key = "value" WHERE ID = 1;

Co powoduje problem?

Odpowiedzi:

1 dla odpowiedzi № 1

Prawdopodobnie jest to błąd MySQL z replikacją instrukcji i replikacją-ignore-db / replicate-do-db, co powoduje, że ignoruje błędne instrukcje.

Przejście do formatu replikacji opartego na wierszach powinno rozwiązać ten problem (i kilka innych ...).

Możesz także "naprawić" go, używając tabeli ignore / do, zamiast db w konfiguracji. konfiguracja


0 dla odpowiedzi nr 2

Masz rację. Więcej znajduje się w podręczniku (http://dev.mysql.com/doc/refman/5.1/en/replication-options-binary-log.html):

Rejestrowanie oparte na oświadczeniach. Tylko te instrukcje są zapisywane w dzienniku binarnym, gdzie domyślną bazą danych (to znaczy wybraną przez USE) jest db_name. Aby określić więcej niż jedną bazę danych, użyj tej opcji wiele razy, raz dla każdej bazy danych; jednak nie spowoduje to, że instrukcje cross-database, takie jak UPDATE some_db.some_table SET foo = "bar" będą rejestrowane, gdy wybrana zostanie inna baza danych (lub brak bazy danych).

Ostrzeżenie Aby określić wiele baz danych, musiszużyj wielu instancji tej opcji. Ponieważ nazwy baz danych mogą zawierać przecinki, lista będzie traktowana jako nazwa pojedynczej bazy danych, jeśli podasz listę rozdzielaną przecinkami.

Przykład tego, co nie działa tak, jak możeszoczekiwać przy użyciu rejestrowania opartego na instrukcjach: Jeśli serwer jest uruchamiany z opcją --binlog-do-db = sales i wydawane są następujące instrukcje, instrukcja UPDATE nie jest rejestrowana:

USE prices;
UPDATE sales.january SET amount=amount+1000;