Метка: mysql
Настройка репликации master-master на MySQL
Шаг 1 на сервере 1
В файл my.cnf добавляем/изменяем следующие строки:
1 2 3 4 |
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = radme_rep bind-address = 10.10.0.1 |
Перезапускаем mysql, создаем базу (в моем случае это radme_rep)
В консоли выполняем:
1 2 3 4 5 6 7 |
SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 117 | radme_rep | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) |
Создаем пользователя и даем ему права на операции с БД (под ним будет заходить Сервер 2)
1 2 |
create user 'replicator'@'%' identified by 'password'; grant replication slave on *.* to 'replicator'@'%'; |
Шаг 2 на сервере 2
В файл my.cnf добавляем/изменяем следующие строки:
1 2 3 4 |
server-id = 2 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = radme_rep bind-address = 10.10.0.2 |
Перезапускаем mysql, создаем базу (в моем случае это radme_rep)
В консоли выполняем:
1 2 3 4 5 6 7 |
SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 107 | radme_rep | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) |
Создаем пользователя и даем ему права на операции с БД (под ним будет заходить Сервер 1)
1 2 |
create user 'replicator'@'%' identified by 'password'; grant replication slave on *.* to 'replicator'@'%'; |
Шаг 3 на сервере 1
В консоли выполняем
1 2 3 |
slave stop; CHANGE MASTER TO MASTER_HOST = '10.10.0.2', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 107; slave start; |
Шаг 4 на сервере 2
В консоли выполняем
1 2 3 |
slave stop; CHANGE MASTER TO MASTER_HOST = '10.10.0.1', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 117; slave start; |
Шаг 5
На обоих серверах можно в my.cnf добавить строчку
1 |
slave-skip-errors = 1062 |
Для пропуска ошибок вида Error ‘Duplicate entry…’ в случае одновременной записи в таблицу на обоих серверах (при небольшой нагрузке маловероятно). Иначе — необходимо настроить разный автоинскремент на серверах.
1 2 |
auto-increment-increment = 2 auto-increment-offset = 2 |
Как удалить репликацию данных?
В консоли на обоих серверах выполняем:
1 2 3 |
RESET MASTER; stop slave; CHANGE MASTER TO ""; |
Далее останавливаем сервер и из папки mysql удаляем все файлы вида
1 2 |
relay-* *.info |
Посмотреть статус репликации можно так:
mysql> SHOW SLAVE STATUS \G;
Поле Seconds_Behind_Master должно стремится к нулю.
Column count of mysql.user is wrong. Expected 45, found 42
ERROR 1805 (HY000): Column count of mysql.user is wrong. Expected 45, found 42. The table is probably corrupted
Сея ошибка у меня возникла после перемещения папок с БД MySQl с одного сервера на другой, с разными версиями самой MySQL. Да и ОС были разные: FreeBSD -> Ubuntu. Правильно конечно было сделать бекап и из бекапаже залить. НО! долго.
Чинится:
mysql_upgrade —force
Конвертируем дату в текстовом поле таблицы в формат даты MySQl
Дано: таблица вида
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
mysql> select * from config_common where nameparam like 'dtc-3-%-1' and valueparam<>"" limit 10; +--------+--------------+------------+ | id | nameparam | valueparam | +--------+--------------+------------+ | 3632 | dtc-3-1709-1 | 15.01.2016 | | 4147 | dtc-3-3513-1 | 01.03.2016 | | 343653 | dtc-3-5156-1 | 16.09.2016 | | 343519 | dtc-3-5143-1 | 16.09.2016 | | 343417 | dtc-3-5090-1 | 16.09.2016 | | 342901 | dtc-3-4951-1 | 16.09.2016 | | 342878 | dtc-3-4895-1 | 16.09.2016 | | 342832 | dtc-3-4664-1 | 16.09.2016 | | 342786 | dtc-3-4160-1 | 16.09.2016 | | 342513 | dtc-3-4395-1 | 16.09.2016 | +--------+--------------+------------+ 10 rows in set (0.00 sec) |
Как видим поле valueparam в текстовом виде, да еще не в формате MySQL. А выборка нужна именно по диапазону дат. Решение кроется в использовании функции STR_TO_DATE:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
mysql> select *,CONVERT(STR_TO_DATE(valueparam,"%d.%m.%Y"),date) as dt from config_common where nameparam like 'dtc-3-%-1' and valueparam<>"" and CONVERT(STR_TO_DATE(valueparam,"%d.%m.%Y"),date) between "2016-12-01" and "2016-12-31" limit 10; +--------+--------------+------------+------------+ | id | nameparam | valueparam | dt | +--------+--------------+------------+------------+ | 421968 | dtc-3-4059-1 | 13.12.2016 | 2016-12-13 | | 421943 | dtc-3-4452-1 | 13.12.2016 | 2016-12-13 | | 421917 | dtc-3-901-1 | 13.12.2016 | 2016-12-13 | | 421896 | dtc-3-3224-1 | 13.12.2016 | 2016-12-13 | | 421870 | dtc-3-1624-1 | 13.12.2016 | 2016-12-13 | | 421847 | dtc-3-3173-1 | 13.12.2016 | 2016-12-13 | | 421824 | dtc-3-5655-1 | 13.12.2016 | 2016-12-13 | | 421801 | dtc-3-845-1 | 13.12.2016 | 2016-12-13 | | 421778 | dtc-3-3994-1 | 13.12.2016 | 2016-12-13 | | 421743 | dtc-3-871-1 | 13.12.2016 | 2016-12-13 | +--------+--------------+------------+------------+ 10 rows in set (0.03 sec) |
Еще один полезный SQL запрос для Zabbix
Получение триггеров с учетом зависимостей. Т.е. Если некий тригер А зависит от триггера Б, то его в списке не будет.
1 |
SELECT (UNIX_TIMESTAMP()-triggers.lastchange)/60 as minut,hosts.host, triggers.description, triggers.comments, triggers.triggerid FROM triggers INNER JOIN functions ON triggers.triggerid=functions.triggerid INNER JOIN items ON items.itemid=functions.itemid INNER JOIN hosts ON hosts.hostid=items.hostid INNER JOIN hosts_groups ON hosts_groups.hostid=hosts.hostid INNER JOIN groups ON groups.groupid=hosts_groups.groupid WHERE hosts.status = 0 AND items.status = 0 AND triggers.status = 0 AND triggers.priority=5 AND triggers.value=1 and ((UNIX_TIMESTAMP()-triggers.lastchange)/60)>15 and triggers.triggerid in (select triggerid_up from trigger_depends where triggerid_down in (SELECT triggers.triggerid FROM triggers INNER JOIN functions ON triggers.triggerid=functions.triggerid INNER JOIN items ON items.itemid=functions.itemid INNER JOIN hosts ON hosts.hostid=items.hostid INNER JOIN hosts_groups ON hosts_groups.hostid=hosts.hostid INNER JOIN groups ON groups.groupid=hosts_groups.groupid WHERE hosts.status = 0 AND items.status = 0 AND triggers.status = 0 AND triggers.priority=5 AND triggers.value=1 and ((UNIX_TIMESTAMP()-triggers.lastchange)/60)>15 group by triggerid)) group by triggers.triggerid |