Биллинговая система Nodeny
26 Ноября 2024, 16:56:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: 1 [2]
  Печать  
Автор Тема: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error  (Прочитано 14238 раз)
k291
Старожил
****

Карма: -10
Offline Offline

Сообщений: 455


Просмотр профиля
« Ответ #15 : 26 Апреля 2018, 22:14:46 »

А что Вы делаете, когда появляется ошибка:
Цитировать
                   Last_Errno: 1032
                   Last_Error: Could not execute Update_rows event on table nodeny.auth_now; Can't find record in 'auth_now', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000228, end_log_pos 37949
Можно пропустит ошибку:
Код:
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=37949; START SLAVE;
Где 37949 номер ошибки. Команда выше, пропускает ошибку 37949
Но пропускать не хорошо, можно что-то важное не реплицировать.

На мастер и на свейв, auth_now одинаковые: Но разные id, start, last у IP и некоторое отсутствие данных в properties
Цитировать
mysql> DESCRIBE auth_now;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | bigint(20)       | NO   | PRI | NULL    | auto_increment |
| ip         | varchar(15)      | NO   | UNI | NULL    |                |
| start      | int(10) unsigned | NO   | MUL | 0       |                |
| last       | int(10) unsigned | NO   | MUL | 0       |                |
| properties | text             | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
Записан
Redmen
NoDeny
Ветеран
*

Карма: 62
Offline Offline

Сообщений: 546


Подяку в КАРМУ


Просмотр профиля WWW
« Ответ #16 : 26 Апреля 2018, 22:41:44 »

для правильной репликации желательно полностью  остановить мастер или лок бд.
1) на настроеном мастере: ресет мастер; лок таблес; шов мастер статус;
2) дамп бд, перенос на слейв, развертивание, запуск слейва
3) на мастере анлок бд

это нужно для того что бы от мастер ресет и до анлок дб не производилось никаких записей в мастер,
иначе ошибок не избежать, особенно с auth_now и auth_log т.к. в этих таблицах большая текучка данных (молчу про таблицы трафика)

у нас при переносе бд (за 8 минут) на 15 тышь абонов, ошибок связаных с auth_now и auth_log (других ошибок не было) около 3 000,
а так помог скриптик который скипал эти ошибки если они связаны были с auth_now или auth_log
Записан

Приймаю подяку у вигляді карми... та/або грошей Подмигивающий
t.me/MrMethod
Redmen
NoDeny
Ветеран
*

Карма: 62
Offline Offline

Сообщений: 546


Подяку в КАРМУ


Просмотр профиля WWW
« Ответ #17 : 26 Апреля 2018, 22:45:56 »

На мастер и на свейв, auth_now одинаковые: Но разные id, start, last у IP и некоторое отсутствие данных в properties

если разные id то это уже другая запись
Записан

Приймаю подяку у вигляді карми... та/або грошей Подмигивающий
t.me/MrMethod
k291
Старожил
****

Карма: -10
Offline Offline

Сообщений: 455


Просмотр профиля
« Ответ #18 : 28 Апреля 2018, 01:47:56 »

Большое спасибо! Помогло.
Ниже напиши инструкцию. Надо бы ее в wiki добавить.
________________________________________________________________________________________
Репликация Master-Slave с учетом постоянно активных таблиц auth_now и auth_log. -"это нужно для того что бы от reset master; и до UNLOCK TABLES; не производилось никаких записей в мастер":

ДЕЛАЕМ на МАСТЕР:
Шаг 1: Включаем репликацию на центральном сервере(Master):
Код:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
Рас комментируем:
Цитировать
server-id = 1 - цифра должна быть уникальной. На мастере 1, на слейве 2 и т.д.
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = nodeny - указываем БД резерва.можно за комментировать, чтобы резервировать все базы
binlog_do_db = example1 - указываем БД1 резерва.можно за комментировать, чтобы резервировать все базы
bind-address = 217.10.20.1- надо указывать адрес внешнего интерфейса, инача не откроется порт наружу(в интернет)

Код:
/etc/init.d/mysql restart


Шаг 2: Права на репликацию
Далее необходимо создать профиль пользователя, из под которого будет происходить репликация. Для этого запускаем консоль:
Код:
mysql -u root --password='hardpass'

Далее создаем и назначаем права пользователю для реплики:
Код:
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
# даем права пользователю slave_user с паролем password

Перезагружаем Мастер БД:
Код:
reset master;

Блокируем изменения в БД:
Код:
USE nodeny;
FLUSH TABLES WITH READ LOCK;

Смотрим статус Мастера:
Код:
SHOW MASTER STATUS;

Шаг 3: Дамп базы
Заходим через другую консоль, делаем дамп БД архивируем:
По умолчанию переносится только таблица и структура, для переноса процедур и тригеров надо добавить -R
Код:
cd /var/backups &&
mysqldump -R -u root --password='hardpass' nodeny > nodeny.sql &&
tar -czvf nodenyBD_280418.tar.gz nodeny.sql &&
cp nodenyBD_280418.tar.gz /usr/local/nodeny/htdocs/



ДЕЛАЕМ на СЛЕЙВ:

Шаг 4. Настройка Слейва
Код:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
Раскоментируем:
Цитировать
server-id = 2 - цыфра должна быть уникальной. На местере 1, на слейве 2 и т.д.
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = nodeny - указываем БД резерва.можно за комментировать, чтобы резервировать все базы
binlog_do_db = example1 - указываем БД1 резерва.можно за комментировать, чтобы резервировать все базы

Шаг 5:
Качаем БД с мастера на слейв и разархивируем:
Код:
wget my-sayt.net/htdocs/nodenyBD_280418.tar.gz &&
tar -xvf nodenyBD_280418.tar.gz -C /path/to/folder


Шаг 5.1: Создание базы на слейве
В консоли mysql на Слейве создаем базу с таким же именем, как и на Мастере:
Код:
mysql -u root --password='hardpass'
CREATE DATABASE nodeny;
quit;

После этого загружаем дамп (из bash):
Код:
mysql -u root --password='hardpass' nodeny < nodeny.sql



Шаг 6. Запуск Слейва
Код:
mysql -u root --password='hardpass'

Включаем репликацию на Слейв, указать параметры подключения к мастеру. В консоли mysql на Слейве необходимо выполнить запрос:
Код:
CHANGE MASTER TO MASTER_HOST='217.10.20.1',MASTER_USER='slave_user', MASTER_PASSWORD='password';

После этого запускаем репликацию на Слейве:
Код:
START SLAVE;

Осталось:
Возвращаемся в консоль mysql на Мастер:
Разблокируем БД:
Код:
UNLOCK TABLES;


______________________________________________________________________
Пометки:
START SLAVE; - запуск слейва
STOP SLAVE; - если надо остановить
SHOW SLAVE STATUS\G - статус репликации
# Должны быть значения Yes в:
#      Slave_IO_Running: Yes
#   Slave_SQL_Running: Yes
        иначе смотри какая ошибка.
Ошибку можно пропустить, но лучше этого не делать:
mysql> STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=25037950; START SLAVE;
Где 25037950 номер ошибки.
Записан
Redmen
NoDeny
Ветеран
*

Карма: 62
Offline Offline

Сообщений: 546


Подяку в КАРМУ


Просмотр профиля WWW
« Ответ #19 : 28 Апреля 2018, 14:02:24 »

bind-address = 217.10.20.1- надо указывать адрес внешнего интерфейса, иначе не откроется порт наружу(в интернет)

кроме того нужно проверить параметр skip-networking и закоментировать при наличии
bind-address =  0.0.0.0 // так откроются для любого внешнего адреса
а сам доступ к базе ограничить правами юзеров, тогда можно организовать схему мастер - мульти-слейв(мастер)

а так инструкция хорошая



Записан

Приймаю подяку у вигляді карми... та/або грошей Подмигивающий
t.me/MrMethod
k291
Старожил
****

Карма: -10
Offline Offline

Сообщений: 455


Просмотр профиля
« Ответ #20 : 01 Мая 2018, 11:29:00 »

ради теста, выключил mysql на слейве на 20минут. При запуске получил ошибки:
Цитировать
Last_SQL_Error: Could not execute Write_rows event on table nodeny.pays; Duplicate entry '25089' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000008, end_log_pos 78911415
Цитировать
Last_SQL_Error: Could not execute Update_rows event on table nodeny.auth_now; Can't find record in 'auth_now', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000001, end_log_pos 11512

Я предполагаю, что будут вечные проблемы с таблицами подобной auth_now.
Как вы решили данную проблему?
Записан
Redmen
NoDeny
Ветеран
*

Карма: 62
Offline Offline

Сообщений: 546


Подяку в КАРМУ


Просмотр профиля WWW
« Ответ #21 : 04 Мая 2018, 08:12:44 »

у нас нет такой проблемы.
Записан

Приймаю подяку у вигляді карми... та/або грошей Подмигивающий
t.me/MrMethod
k291
Старожил
****

Карма: -10
Offline Offline

Сообщений: 455


Просмотр профиля
« Ответ #22 : 05 Июня 2018, 10:30:47 »

Периодически выскакивает ошибка:
Цитировать
Last_Errno: 1051
                   Last_Error: Error 'Unknown table 'nodeny.X2018_3_22'' on query. Default database: 'nodeny'. Query: 'DROP TABLE `X2018_3_22` /* generated by server */'
Из за этого, останавливается репликация.
Решение:
Чтобы автоматически пропускать ошибки, делаем:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
в секцию
[mysqldump]
slave-skip-errors=1062,1032,1051
1032 -
1051 - отсутствует таблица
1062 - Такая ошибка в Mysql происходит по причине того, что на реплике уже существует запись, которая пришла с мастера.

Перезагружаем mysql
Записан
Страниц: 1 [2]
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!