Архив метки: mysql

Настройка репликации master-master на MySQL

Шаг 1 на сервере 1

В файл my.cnf добавляем/изменяем следующие строки:

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)
В консоли выполняем:

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)

create user 'replicator'@'%' identified by 'password';
grant replication slave on *.* to 'replicator'@'%';

Шаг 2 на сервере 2

В файл my.cnf добавляем/изменяем следующие строки:

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)
В консоли выполняем:

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)

create user 'replicator'@'%' identified by 'password';
grant replication slave on *.* to 'replicator'@'%';

Шаг 3 на сервере 1

В консоли выполняем

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

В консоли выполняем

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 добавить строчку

slave-skip-errors = 1062

Для пропуска ошибок вида Error ‘Duplicate entry…’ в случае одновременной записи в таблицу на обоих серверах (при небольшой нагрузке маловероятно). Иначе — необходимо настроить разный автоинскремент на серверах.

Как удалить репликацию данных?

В консоли на обоих серверах выполняем:

RESET MASTER;
stop slave;
CHANGE MASTER TO "";

 

Далее останавливаем сервер и из папки mysql удаляем все файлы вида

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

Дано: таблица вида

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:

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

Получение триггеров с учетом зависимостей. Т.е. Если некий тригер А зависит от триггера Б, то его в списке не будет.

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

Zabbix — MySQL запрос на выборку текущих активных алертов

SELECT groups.name,
       hosts.hostid,
       hosts.host,
       triggers.description,
       triggers.comments,
       triggers.triggerid,
       triggers.priority
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=3
  AND triggers.value=1;

Выбираем кто из пользователей Zabbix видит хост:

SELECT  
    usrgrp.usrgrpid ,  
    usrgrp.name  AS  user_group ,  
    groups.name  as  host_group , 
    host 
FROM  users  
    JOIN users_groups   ON  users.userid  =  users_groups.userid  
    JOIN usrgrp ON  users_groups.usrgrpid  =  usrgrp.usrgrpid  
    JOIN rights  ON  usrgrp.usrgrpid  =  rights.groupid  
    JOIN groups ON  rights.id  =  groups.groupid  
    JOIN hosts_groups  ON  groups.groupid  =  hosts_groups.groupid  
    JOIN hosts on  hosts_groups.hostid  =  hosts.hostid
    where hosts.hostid=1025;