UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
    SET col_name1=expr1 [, col_name2=expr2, ...]
    [WHERE where_definition]
    [LIMIT #]
tbl_name
— Задает имя таблицы, в которой будут обновляться записи. На момент запуска команды UPDATE таблица с таким именем должна существовать в базе данных.
LOW_PRIORITY
— Если указан этот параметр, то обновление записи будет отложена до тех пор, пока другие сценарии не закончат чтение из этой таблицы.
IGNORE
— Если некоторые поля таблицы имеют ключи PRIMARY или UNIQUE, и производится обновление строки, в которой эти поля имеют дублирующее значение, то действие команды аварийно завершается и выдается ошибка №1062 («Duplicate entry 'val' for key N»). Если в команде INSERT указано ключевое слово IGNORE, то обновление записей не прерывается, а строки с дублирующими значениями просто не изменяются.
SET
— После этого ключевого слова должен идти список полей таблицы, которые будут обновлены и непосредственно сами новые значения полей в виде:
имя поля='значение'
Следующий пример производит обновление поля country у ВСЕХ записей в таблице users:
1 UPDATE
2     `users`
3 SET
4     `country`='Russia'
А здесь обновление полей country и city у ВСЕХ записей таблицы users:
1 UPDATE
2     `users`
3 SET
4     `country`='Russia',
5     `city`='Ryazan'
Если новое значение, присваиваемое командой UPDATE соответствует старому, то обновление этого поля не происходит.
Для задания нового значения можно использовать выражения.
Следующий пример увеличит возраст всех пользователей, записанных в таблице users на один год:
1 UPDATE
2     `users`
3 SET
4     `age`=`age`+1
WHERE
— Задает условие отбора записей, подлежащих изменению.
Следующий пример изменит название города в записях пользователей с «Ryazan» на «Рязань»:
1 UPDATE
2     `users`
3 SET
4     `city`='Рязань'
5 WHERE
6     `city`='Ryazan'
LIMIT
— Задает максимальное количество строк, которые могут быть изменены.
1 UPDATE
2     `users`
3 SET
4     `age`=`age`+1
5 LIMIT
6     5

 

http://www.spravkaweb.ru/mysql/sql/update

Небольшая заметка о том, как средствами Nginx-а закрыть доступ к файлам/папке по паролю. В nginx-е это решение не менее элегантно, чем в apache, а может и еще лучше, кому как нравится.

В конфигурационном файле, в папке, которую хотим закрыть надо только указать файл, где хранятся пароли.
Вот два примера для закрытия папки с файлами:

        location ^~ /files/ {
            root   /path/to/server;
            autoindex    on;
            autoindex_exact_size  off;
            auth_basic "Hello, please login";
            auth_basic_user_file /usr/nginx/passwords;
            access_log   /usr/nginx/logs/files.log   download;
        }

и админовской части c дополнительным ограничением по IP:

        location ^~ /admin/ {
            fastcgi_pass unix:/home/project/server.sock;
            include  conf/fastcgi.conf;
            allow 11.11.0.0/16;
            allow 22.22.22.22;
            deny all;
            auth_basic "Hello, Admin, please login";
            auth_basic_user_file /usr/nginx/adminpassword;
            access_log   /usr/nginx/logs/admin.log  main;
        }

Добавить пользователя можно с помощью стандартной утилиты от apache:

htpasswd -b passwords NewUser NewPassword

В файле запись с зашифрованным паролем имеет вид:

NewUser:P47ghZ4kloG78: Your Can Comment Here

Защиту от перебора паролей можно организовать одновременно двумя методами, основанными на использовании iptables:

  • Блокирование IP на время, если количество запросов в секунду превышает какое-либо разумное количество
  • Вести лог неудачных попыток подбора пароля и скриптом раз в минуту проверять лог и заносить IP адреса в iptables

Для первого варианта достаточно создать правила:

iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -m state --state NEW
            -m recent --name bhttp --set
iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -m state --state NEW
            -m recent --name bhttp --update --seconds 120
            --hitcount 360 -j DROP
iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -j ACCEPT

Можно вместо DROP использовать TARPIT, чтобы усложнить жизнь ломателям 🙂

Для второго варианта надо добавить в конфиг:

        location /401.html {
            root   /usr/nginx;
            access_log   /usr/nginx/logs/denied.log  error401;
        }

Формат error401, у меня например такой:

log_format error401  '$remote_addr - $remote_user [$time_local] '
                     '$status "$request"';

Теперь все неправильные попытки будут записываться в отдельный лог, который мы можем обрабатывать по cron-у:

*/1 * * * * root /usr/nginx/parser401.pl >/dev/null 2>&1

например, таким скриптом: parser401.pl Скрипт проверяет лог, и если обнаруживает больше 4-х попыток неправильного набора пароля, блокирует этот IP.

На мой взгляд, кажется удобней просматривать ллги используяяя таблицу   нежели файл.Т.е. можно выставить

SET GLOBAL log_output = 'TABLE';
SET GLOBAL general_log = 'ON';

После немного подождать и уже можно анализировать

SELECT * FROM mysql.general_log;
SELECT * FROM mysql.slow_log;

Также для удобства можно поставить индекс по дате, нонужно конвертнуть таблицы в MyISAM ( они по умолчанию CSV)

SET @old_logstate = @@global.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.slow_log    ENGINE = MyISAM;
ALTER TABLE mysql.slow_log    ADD INDEX (start_time);
ALTER TABLE mysql.general_log ADD INDEX (event_time);
SET GLOBAL slow_query_log = @old_logstate;

  1. Мониторинг web ресурсов

4.1.1. Создаем Host group для более удобного наблюдения за сайтами (Configuration → Host groups → Create hostgroup)

В Group name пишем Web monitoring.
4.1.2.        Добавляем Host или Сайт в Zabbix (Configuration → Hosts → Create hosts) Вкладка Host — Указываем Host name и DNS name, выбираем нужную Group.
4.1.3.        Добавляем элементы данных в наш сайт (Configuration → Hosts → Applications → Create application)
В Name пишем имя сайта – www.site.ru
4.1.4.        Создадим сценарий для сайта (Configuration → Web → Create scenario)
В Application выбираем наш сайт
В Name – site
Update time – 60
Agent – Internet Explorer 9.0

В вкладке Step пропишем, что проверять.

Required status codes – 200 (Означает, что сайт доступен)
4.1.5. Возвращаемся к нашему хосту и сделаем тригер (Configuration → Hosts → Triggers)

Выбираем Create trigger

В Name – Site www.site.ru

Severity – High

В Expression добавим:

Item – Response code for step — web.test.rspcode[]

Function – Last (most recent) T value is NOT N

N – 200
4.1.6. Добавляем Host или Коммутатор в Zabbix (Configuration → Hosts → Create hosts) Вкладка Host — Указываем Host name и IP address, выбираем нужную Group.

  1. Мониторинг Windows services

Для мониторинга служб на понадобятся сторонние программы (сылка). Распакуем их C:Program FilesZabbix

5.1. В конфигурационном файле zabbix_agentd.conf на машине с ОС Windows нужно добавить в самом конце документа эту строку — UserParameter=windows.services,"C:Program FilesZabbixservices.exe"

И включить параметр EnableRemoteCommands=1

Для  проверки работоспособности используем команду:

C:zabbix_agentd.exe -c «C:zabbix_agentd.conf» -t "system.run[C:Program FilesZabbixservices.exe]"

5.2. В Zabbix импортируем шаблон, и подключаем его к нужной машине (как в п. 2.3.). При отключении или отключении службы, будет срабатывать триггер.

  1. Создание триггеров

Создадим триггер на примере пинга какого-нибудь сервера.

Для начала нужно установить пакет fping

apt-get install fping

И дать права

# chown root:zabbix /usr/bin/fping

# chmod 710 /usr/bin/fping

# chmod ug+s /usr/bin/fping
6.1.1. Создаем Host group для более удобного наблюдения за пингом (Configuration → Host groups → Create host group)
В Group name пишем Ping monitoring.
6.1.2. Создаем шаблон в Zabbix (Configuration → Templates → Create template)
Назовём его Ping_VIP

В Items добавим три значения loss, ping и sec со следующими параметрами

Создадим триггер, перейдем в Triggers → Create trigger

Построим графики, перейдем в Graphs → Create graph и создадим три графика loss, ping и sec

6.1.3. Добавляем Host или Сайт в Zabbix (Configuration → Hosts → Create hosts)
6.1.4. Вкладка Host — Указываем Host name и IP address, выбираем нужную Group.
6.1.5. Вкладка Templates, добавляем наш шаблон Ping monitoring
6.1.6. Переходим в Actions и создаём действие (Configuration → Actions → Create action)

Создаём условия во вкладке Conditions

Добавим пользователей, кому отсылать уведомления (Вкладка Operations)

  1. Настройка отправки отчетов на email

Administration →  Media types → Email

Administration →  Users → Admin → Media (Добавляем почтовые ящики)

Configuration → Actions → Triggers → Enable

Если необходима отправка SMS на мобильный, то можно зарегистрироваться на площадке [urlspan]www.smstraffic.ru[/urlspan] и подключить к мобильному номеру почтовый ящик вида [urlspan]79008007060@site.smsmail.ru[/urlspan]

7. Ошибки возникающие в процессе работы

Zabbix proxy poller processes more than 75% busy

# nano /usr/local/etc/zabbix_server.conf

StartPollers=20

Zabbix icmp pinger processes more than 75% busy

# nano /usr/local/etc/zabbix_server.conf

StartPingers=10

StartDiscoverers=10

Zabbix unreachable poller processes more than 75% busy

# nano /usr/local/etc/zabbix_server.conf

StartPollersUnreachable=10

Это оптимальные параметры под мою систему (Hosts = 150)
Литература:

[urlspan]https://www.zabbix.com/documentation/ru/2.0/manual/installation/install[/urlspan]

[urlspan]https://habrahabr.ru/post/149500/[/urlspan]

http://www.qdesnic.ru/install-zabbix.html

Дано:

MySQL сервер (у меня он на Ubuntu, но тут, пожалуй не важно) — одна штука, база данных base1.

Надо:

Сделать репликацию базы на том же самом сервере, не запуская дополнительных процессов, в базу base2.

Решение:

Копируем base1 в base2, каким угодно способом, это ваше начальное состояние, после этого base1 не должна меняться.

Настраиваем [mysql] секцию в /etc/mysql/my.cnf, добавив:

...
server-id=1
report-host=master-is-slave-host
log-bin=myserver-binlog
relay-log=myserver-relaylog
replicate-same-server-id=1
binlog-do-db=base1
replicate-rewrite-db=base1->base2
replicate-do-db=base2
...

После этого следует перезапустить сервер и можно увидеть, что binlog начал писаться:

# service mysql restart
...
# ls /var/lib/mysql/myserver*
myserver-binlog.000001

Выдыхаем, запускаем работу вашего приложения с base1, теперь можно.

Осталось запустить репликацию, выполняем админом в базе:

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost' IDENTIFIED BY 'CoolPassW0rd';
FLUSH PRIVILEGES;
CHANGE MASTER TO MASTER_HOST='localhost', MASTER_USER='repl',
    MASTER_PASSWORD='CoolPassW0rd', MASTER_LOG_FILE='myserver-binlog.000001';
START SLAVE;

И для контроля, что всё ок, посмотрите, что выдают:

SHOW MASTER STATUS;
SHOW SLAVE STATUS;

Делая дамп базы user_database получаем ошибку:
mysqldump: Error 1194: TABLE 'ibf_spider_logs' IS marked AS crashed AND should be repaired when dumping TABLE `ibf_spider_logs` at row: 56215<code>

Самый простой способ с которого нужно начинать это REPAIR TABLE.

Заходим по ssh на сервер и выполняем команду:
mysqldump -u user -p pass user_database -e 'repair table имя таблицы'
+--------------------------------------------+------+----------+---------------------------------------------------------------------+
| TABLE | Op | Msg_type | Msg_text |
+--------------------------------------------+------+----------+---------------------------------------------------------------------+
| user_database.ibf_spider_logs | repair | info | Wrong bytesec: 0- 0- 0 at 4393280; Skipped |
| user_database.ibf_spider_logs | repair | warning | Number of rows changed FROM 68174 TO 68173 |
| user_database.ibf_spider_logs | repair | STATUS | OK |
+--------------------------------------------+------+----------+---------------------------------------------------------------------+

или же из консоли mysql

mysqldump -u user -p pass
mysql> repair TABLE имя таблицы;
+--------------------------------------------+------+----------+---------------------------------------------------------------------+
| TABLE | Op | Msg_type | Msg_text |
+--------------------------------------------+------+----------+---------------------------------------------------------------------+
| user_database.ibf_spider_logs | repair | info | Wrong bytesec: 0- 0- 0 at 4393280; Skipped |
| user_database.ibf_spider_logs | repair | warning | Number of rows changed FROM 68174 TO 68173 |
| user_database.ibf_spider_logs | repair | STATUS | OK |
+--------------------------------------------+------+----------+---------------------------------------------------------------------+