How to fix Error No 1062 when your web appilcation is broken
Every database driven application like WordPress, Drupal or OpenCart distinguishes one user or data set from another using something called a “primary field”.
This primary field should be unique for each user, post, etc.
Web apps use a code like this to insert data:
Where “id” is the unique primar key, and is set to auto-increment (that is a number inserted will always be greater than the previous one so as to avoid duplicates).
This will work right if the value inserted is “NULL” and database table is set to “auto-increment”.
Some web apps make the mistake of passing the value as
where the first field is omitted. This will insert random numbers into the primary field, rapidly increasing the number to the maximum field limit (usually 2147483647 for numbers).
All subsequent queries will again try to over-write the field with “2147483647”, which MySQL interprets as a Duplicate.
Web app error solution
When we see a possible web application code error, the developers at our Website Support Services create a patch to the app file that fixes the database query.
Now, we have the non-sequential primary key table to be fixed.
For that, we create a new column (aka field), set it as auto-increment, and then make it the primary key.
The code looks approximately like this:
Once the primary key fields are filled with sequential values, the name of the new field can be changed to the old one, so that all web app queries will remain the same.
Warning : These commands can get very complex, very fast. So, if you are not sure how these commads work, it’s best to get expert assistance.
Коллекция GTID
GTID всегда сохраняется между ведущим и ведомым. Это означает, что вы можете определить источник любой транзакции, примененной к любому ведомому устройству, проверив двоичный журнал. Кроме того, как только транзакция с данным GTID фиксируется на данном сервере, любые последующие транзакции с тем же GTID будут игнорироваться сервером. Следовательно, транзакция, отправленная на главную станцию, применяется только один раз к подчиненной станции, что помогает обеспечить согласованность.
Генерация и жизненный цикл GTID: 1. Транзакция выполняется и отправляется на главном сервере. Используйте UUID главного сервера и наименьший ненулевой порядковый номер транзакции, который не использовался на этом сервере, чтобы назначить GTID транзакции; GTID записывается в двоичный журнал главного сервера. 2. После отправки двоичных данных журнала подчиненной станции и сохранения их в журнале ретрансляции подчиненной станции подчиненная станция считывает GTID и устанавливаетgtid_nextЭто сообщает ведомому устройству, что запись GTID должна использоваться для следующей транзакции. 3. Проверьте на сервере, применяет ли этот GTID эту транзакцию. 4. Поскольку gtid_next не пуст, запишите git_next, который представляет собой GTID, полученный от хоста, в двоичный журнал.
How to fix MySQL restore errors
Restore errors usually take the form of:
ERROR 1062 (23000) at line XXXX: Duplicate entry ‘XXXXXX’ for key X”
When restoring database dumps, this error can happen due to 2 reasons:
- The SQL dump file has dulpicate entries.
- The index file is duplicate rows.
To find out what is exactly going wrong, we look at the conflicting rows and see if they have the same or different data.
If it’s the same data, then the issue could be due to duplicate index rows. If it is different data, the SQL dump file needs to be fixed.
How to fix duplicate entries in database dumps
This situation can happen when two or more tables are dumped into a single file without checking for duplicates.
To resolve this, one way we’ve used is to create a new primary key field with auto-increment and then change the queries to insert NULL value into it.
Then go ahead with the dump.
Once the new primary field table is fully populated, the name of the field is changed to the old primary table name to preserve the old queries.
The alter table command will look like this:
If your index file is corrupted
There’s no easy way to fix an index file if there are duplicate entries in it.
You’ll have to delete the index file, and restore that file either from backups or from another server where your database dump is restored to a fresh DB server.
The steps involved are quite complex to list out here. We recommend that you consult a DB expert if you suspect the index file is corrupted.
шаг
1. Установите ведущее устройство в режим только для чтения, чтобы ведомое устройство могло догнать скорость обновления мастера. mysql >set global read-onlyПримечание. При настройке только для чтения суперпользователи могут писать, но обычные пользователи не могут. 2, остановите две машины
3. Измените конфигурацию и включите функцию GTID. Чтобы включить репликацию на основе GTID, вы должныgtid_modeПеременная установлена для включения режима GTID для запуска каждого сервера, иenforce_gtid_consistency Включите переменные, чтобы в журнал регистрировались только те утверждения, которые безопасны для репликации на основе GTID. Перед запуском ведомой машины используйте—skip-slave-startОтключите процесс репликации ведомого. Поскольку mysql.gtid_executed был добавлен в MySQL 5.7.5, ведомой машине нет необходимости включать двоичное ведение журнала для использования GTID. Это означает, что вы можете использовать GTID, но не использовать подчиненный сервер двоичного журнала. Чтобы иметь возможность репликации, главное устройство всегда должно включать двоичное ведение журнала. Для ведомого вам нужно настроить только эти переменные:
Однако для переключения с высокой доступностью рекомендуется следующая конфигурация.
4. Настройте ведомое устройство на использование GTID для синхронизации данных.Конечно, вам необходимо включить ведомое устройство на ведущем устройстве.
Установить режим синхронизации GTID
Примечание. Номера портов необходимо указывать 5. Создайте новую резервную копию. Существующая резервная копия, созданная до включения GTID, больше не может использоваться на этих серверах, поскольку вы включили GTID. Сделайте новую резервную копию на этом этапе, чтобы у вас не было доступных резервных копий. Например, физическая резервная копия.
6. Запустить процесс синхронизации ведомого
How to fix MySQL replication Error Code : 1062
Due to quirks in network or synching MySQL is sometimes known to try and write a row when it is already present in the slave.
So, when we see this error in a slave, we try either one of the following depending on many factors such as DB write traffic, time of day etc.
- Delete the row – This is the faster and safer way to continue if you know that the row being written is exactly the same as what’s already present.
- Skip the row – If you are not sure there’d be a data loss, you can try skipping the row.
How to delete the row
First delete the row using the primary key.
Then stop and start the slave:
Once it is done, check the slave status to see if replication is continuing.
If all is well, you’ll see “Seconds_Behind_Master” as a number. If not, your replication is broken and it needs to be fixed.
How to skip the row
For this, you can set the Skip counter to 1.
Here’s how it could look like:
Then check the slave status to see if replication is continuing.
Again, if all is well, you’ll see “Seconds_Behind_Master” as a number. If not, your replication is broken and it needs to be fixed.
Proceed with caution
Stopping and starting the slave cannot cause any issue unless you havea very busy database. But, the delete statement, skipping and following up with a broken replication requires expert knowledge about MySQL organization and functioning.
If you are not sure how these commands will affect your database, we recommend you talk to a DB administrator.
Распространенные ошибки
Ошибка: ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
Решение:
mysql> reset slave; Query OK, 0 rows affected (0.00 sec) mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.1', MASTER_USER='rep_user', MASTER_PASSWORD='rep_user', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=120, MASTER_CONNECT_RETRY=10; Query OK, 0 rows affected, 2 warnings (0.05 sec) mysql> start slave;
Ошибки:
- Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND for deleting row
- Can’t drop database ‘********’: database doesn’t exist’
- Error ‘Duplicate entry’
- Could not execute Write_rows event on table ***********: Duplicate entry ‘XXXXXXXX’ for key ‘ххххххх’, Error_code: 1062
Решение: Эти ошибки можно просто скипнуть, но посмотреть их причины сначала.
mysql -uroot -p -e 'STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;'
Ошибка: Relay log read failure (#1594): Could not parse relay log event entry.
Решение:
#Подключаемся к серверу, где возникла проблема и смотрим статус репликации root@server:~# mysql -uroot -p -e 'show slave status \G;' | grep -E 'Relay_Master_Log_File|Exec_Master_Log_Pos' Relay_Master_Log_File: mysql-bin.008189 Exec_Master_Log_Pos: 71687831 # Останавливаем репликацию и обновляем бин-лог и позицию #master_log_file = Relay_Master_Log_File = mysql-bin.008189 #master_log_pos = Exec_Master_Log_Pos = 71687831 root@server:~# mysql -uroot -p -e "STOP SLAVE;" root@server:~# mysql -uroot -p -e "CHANGE MASTER TO master_log_file='mysql-bin.008189', master_log_pos=71687831;" #Стартуем слейв root@server:~# mysql -uroot -p218e5ccb4a834382%FBF87B604F1FE14B -e "START SLAVE;"
Шаг 6. Запуск Слейва
Нам осталось включить репликацию, для этого необходимо указать параметры подключения к мастеру. В консоли mysql на Слейве необходимо выполнить запрос:
После этого запускаем репликацию на Слейве:
Статус репликации
Проверить работу репликации на Слейве можно запросом:
mysql> SHOW SLAVE STATUS\G Slave_IO_State: Waiting for master to send event Master_Host: localhost Master_User: root Master_Port: 3306 Connect_Retry: 3 Master_Log_File: gbichot-bin.005 Read_Master_Log_Pos: 79 Relay_Log_File: gbichot-relay-bin.005 Relay_Log_Pos: 548 Relay_Master_Log_File: gbichot-bin.005 Slave_IO_Running: Yes Slave_SQL_Running: Yes 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: 79 Relay_Log_Space: 552 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: 8
Репликация MySQL в виде Master/Slave
В данной статье предполагается наличие пользователя с привилегиями sudo, а также уже установленной системы MySQL. Чтобы установить MySQL, наберите:
Если используете deb’s ОС (Debian/Ubuntu):
Если используете rpm ОС (CentOS/Fedora/RedHat):
Вот некоторые полезные статьи:
Настройка безопасности MYSQL в Unix/Linux
Сменить кодировку в Mysql/MariaDB в Unix/Linux
Сколько MySQL соединений в Unix/Linux
Проверить тип баз данных MySQL для хранения данных в Linux
Тюнинг MySQL в Unix/Linux
Просмотр привилегий пользователя MySQL
Настройка Master
Открываем конфигурационный файл на master-сервере:
Сейчас я его немного видоизменю и для самого начала заменим ИП адрес который слушает mysql (он связывает сервер с локальным хостом):
Замените стандартный IP-адрес IP-адресом сервера.
PS: если он не прописан, то добавьте строку что выше себе в конфигурационный файл.
Идем далее, нужно прописать директиву «server-id»:
Она может принимать любое значение, но как по мне — проще начинать с 1. Данная величина должна быть уникальной и не совпадать ни с одним из другим «server-id» в этой группе репликации.
Находим» log_bin» — эта переменная будет нести в себе некоторые детали о самой репликации ( сервер slave будет копировать все изменения, зарегистрированные в указанном лог файле):
PS: Возможно, у вас не хватит прав на запись этого файла в указанной директории, по этому, измените путь или добавьте запись на папку.
И напоследок, стоит задать БД, которую необходимо будет копировать на slave-сервер( допускается добавлять более 1 БД, но для этого стоит прописывать данную строку, но с нужно базой), напимер:
И так, все было сделано и мой конфиг выглядит следующим образом:
Перезапускаем master с MySQL:
После перезапуска, нужно подключиться к самой оболочке MySQL:
Создаем пользователя, который будет передавать данные с мастера на слейв:
Сбросим все привелегии (чтобы все заработало):
Дальнейшие действия немного сложнее. Для реализации поставленной задачи нужно открыть новое окно или вкладку в дополнение к уже используемой.
И так, у нас настроен сервер с мастером и уже работает некоторая БД (у меня это magento_db), выберем ее для использования:
Поле чего, я заблокирую данную базу для того, чтобы не записывались никакие данные в нее:
выполняем проверку :
И видим, что мастер уже заработал:
Т.к я заблокировал все изменения, то не будет записываться ничего в эту БД и я могу создать дамп этой БД для переноса ее на слейв. Я выполню экспорт БД с помощью mysqldump:
После того как создался дам, нужно вернуть все на свои места и разблокировать БД:
Вуоля, master готов к использованию!
Настройка slave
Подключаемся на созданный slave сервер и создаем БД:
Выполняем импорт базы которую мы создали с мастера:
Открываем конфигурационный файл и внесем некоторые изменения:
Тоже прописываем ID сервера (значение должно быть не такое как у мастера):
И прописываем следующие значения:
Выполняем перезапуск MySQL со слейвом:
Осталось активировать репликацию в MySQL. Открываем оболочку MySQL и вводим:
Пояснения данной команды:
Запускаем slave-сервер следующей командой:
Проверяем что слейв запустился и работает должным образом:
Иногда возникают проблемы со связью и их можно решить:
Вот некоторые полезные статьи:
Duplicate entry/Error_code: 1062 в MySQL репликации (Master-Slave)
А на этом, у меня все и тема «Репликация MySQL в виде Master/Slave» завершена.