- Wersja MySQL Master: 5.5.16-1
- Wersja MySQL Slave: 5.5.18-1
Migawka mistrza jest tworzona przez:
mysql> FLUSH TABLES WITH READ LOCK;
shell> mysqldump --all-databases --master-data > dbname_`date +%F`.sql
Ten plik zrzutu jest importowany do urządzenia podrzędnego (który jest uruchamiany z --skip-slave-start
opcją) bez błędu:
shell> pv dbname_`date +%F`.sql | mysql -u root -p
Ale wystąpił następujący błąd podczas wykonywania mysql> start slave;
:
Last_SQL_Errno: 1062
Last_SQL_Error: Error 'Duplicate entry '115846' for key
'PRIMARY'' on query. Default database: 'db'. Query: 'INSERT INTO
request_posted (id, user_id, channel, message, link, picture, name, ...
Jest tylko jeden rekord o ID 115846 na urządzeniu głównym:
mysql> select count(*) from request_posted where id=115846;
Current database: db
+----------+
| count(*) |
+----------+
| 1 |
+----------+
1 row in set (0.01 sec)
Spróbuj pominąć niektóre zapytania za pomocą:
mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> START SLAVE;
nie pomogło Nie chcę pomijać tych błędów, dodając:
slave-skip-errors = 1062
do my.cnf
pliku, ponieważ może to doprowadzić niewolnikami niespójne.
Co może być przyczyną tego błędu?
AKTUALIZACJA
Nie tak zazwyczaj konfiguruję replikację mySQL
Jakie kroki według ciebie nie postępuję zgodnie z dokumentem?
Zastanawiam się, czy napotkasz ten sam problem, jeśli skonfigurujesz całą konfigurację zamiast przekazać komendę mysqldump.
Nie, to działa normalnie, jeśli zmienię również master na odpowiednie współrzędne.
Spróbowałbym upuścić bazę danych na slave, upewnić się, że binlogs są czyste i zacząć od nowa. Sprawdź również tabelę na wzorcu, aby upewnić się, że indeksy nie zawierają błędów.
Czy usunięcie (przeniesienie) wszystkich danych jest wystarczające? Zrobiłem to i uzyskałem ten sam wynik.
Odpowiedz na @Dmytro Leonenko
'show status slave \ G' na slave, aby upewnić się, że jest poprawnie skonfigurowany, MASTER_LOG_POS ma wartość 0
Tylko „show slave statug \ G” po imporcie, ale przed „start slave;” może dać nam odpowiedź
Utworzyłem kopię zapasową datadiru, usunę wszystko i uruchomię mysql_install_db
, zaimportuję plik zrzutu, uruchom change master to
i oto wyniki:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: x.x.x.x
Master_User: xx
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: mysqld-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 0
Relay_Log_Space: 106
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
Zastanawiam się, dlaczego Master_Log_Pos ma 4 lata?
--master-data
Opcja jest już napisać binarne współrzędne dziennika do pliku zrzutu. Muszę tylko zmienić master na master_host, master_user, master_password.
--master-data
opcji podczas tworzenia migawki danych? Jeśli nadal tak się dzieje, gdy korzystam z --lock-all-tables
opcji i change master to master_log_file='', master_log_pos='', ...
jakie mogą być przyczyny?
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1
Czy zapytanie powodujące błąd zmienia się co najmniej? Czy pozycja binlogu podrzędnego została poprawnie ustawiona?