Репликация MySQL-сервера

Здравствуйте, коллеги!
Сегодня я вам расскажу про то, как обезопасить себя от краха империи, а именно — падения одного сервера с архи-важными данными и быстрое переключение на другой «запасной» MySQL-сервак, на который сваливались все операции, проводимые на главном серваке. Итак, приступим…

1. В конфиге мастер-хоста прописываем:
#replication 
server-id = 1
log_bin = D:/MYSQL/mysql-binus.log
expire_logs_days = 7
binlog-do-db = servicedb

(все базы, указанные в конфиге мастера в binlog-do-db будут реплицироваться на slave и в конфигурации подчиненного сервера их указывать не нужно!)

Читать дальше →

Перенос MyISAM в InnoDB

Процесс переноса из одно системы хранения (MyISAM) в другую (InnoDB) MySQL может состоять из одного только запроса и это было бы идеально, но не все так просто.

Условие № 1

Все таблицы в MyISAM перед конвертацией должны быть с первичными ключами (Primary key)

Условие № 2

В таблицах не должно быть дефолтных нулевых значений или как лайфхак можно применить две команды на сервере MySQL, куда мы конвертируем базу:
mysql> SET GLOBAL SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
mysql> SET SQL_MODE='ALLOW_INVALID_DATES';

Условие № 3
перед переносом сконвертированных баз с InnoDB во время экспорта нужно обязательно добавить два ключа:
--lock-tables=FALSE --add-locks=FALSE

п.ч. Persona Cluster не сможет симпортировать базу, в исходнике которой есть блокировка таблиц.


Читать дальше →

Чистим мусор в мускуле кроном в скрипте

Создаем скрипт /root/clearcontent.sh:
#!/bin/sh

/usr/local/mysql/bin/mysql -u root -pyourpass smeta_ru -sN -e "UPDATE smeta_ru.news SET clear_content = REPLACE(clear_content, ' ',' ');"
/usr/local/mysql/bin/mysql -u root -pyourpass smeta_ru -sN -e "UPDATE smeta_ru.page SET clear_content = REPLACE(clear_content, ' ',' ');"


Делаем его исполняемым:

chmod 750 /root/clearcontent.sh


В кроне запускаем каждые 20 минут:
*/20  * * * *   root    /root/clearcontent.sh

Обновляем данные в MySQL

//на определенную дату
UPDATE tariff SET DATE_CLOSE = '2013-09-09 11:11:11' WHERE DATE_CLOSE IS NULL OR DATE_CLOSE = '0000-00-00 00:00:00';


//реплейсем все совпадения
UPDATE news SET clear_content = REPLACE(clear_content, '& nbsp ;',' ');


//обновляем на текущую дату в C#
string datenow = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
string notnullsql = "UPDATE tariff SET DATE_CLOSE = '" + datenow + "' WHERE DATE_CLOSE IS NULL OR DATE_CLOSE = '0000-00-00 00:00:00'";
MySqlCommand notnullcmd = new MySqlCommand(notnullsql, Connection());
notnullcmd.ExecuteScalar();