среда, 28 декабря 2011 г.

пятница, 16 декабря 2011 г.

Несколько копий MySQL на одном сервере

Стала задача запустить вторую копию MySQL на сервере где уже установлена одна копия из репозитория.
Есть несколько вариантов таких как использовать Mysqld_multi...
Так как мне нужно было использовать другую версию я решил использовать бинарную версию скачаную непосредственно с www.mysql.com

# cd /opt
# wget "http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.60-linux-x86_64-glibc23.tar.gz/from/http://mirrors.dotsrc.org/mysql/" 

# tar zxvf mysql-5.1.60-linux-x86_64-glibc23.tar.gz
# ln -s /opt/mysql-5.1.60-linux-x86_64-glibc23/ /opt/mysql

Если нужно добавляем пользователя и группу mysql

# chown -R mysql.mysql /opt/mysq/

# cd /opt/mysql
# scripts/mysql_install_db --user=mysql
# chown -R root .
# mkdir etc mysql-updates tmp logs
# chown -R mysql  data mysql-updates tmp logs
# cp support-files/my-medium.cnf /opt/mysql/etc/my.cnf

В фале конфигурации my.cnf заменяем стандартные порты и адрес к папке с базами данных
[mysqld]
user         = mysql
socket     = /opt/mysql/tmp/mysqld.sock
port         = 3307
pid_file   = /opt/mysql/tmp/mysqld.pid
basedir    = /opt/mysql
datadir    = /opt/mysql/data
tmpdir     = /opt/mysql/tmp
log-slow-queries = /opt/mysql/logs/mysql_slow.log
# Если используем bin-log  то для него тоже задаем путь
log-bin         = /opt/mysql/mysql-updates/worldticket

[client]
port      = 3307
socket  = /opt/mysql/tmp/mysqld.sock

[mysqld_safe]
socket   = /opt/mysql/tmp/mysqld.sock


Для запуска используем команду
# /opt/mysql/bin/mysqld_safe --defaults-file=/opt/mysql/etc/my.cnf &

Для подключения к серверу
# /opt/mysql/bin/mysql --defaults-file=/opt/mysql/etc/my.cnf

понедельник, 5 декабря 2011 г.

Перенос базы данных MySQL на другой сервер при минимальном простое

Для обычного перемещения базы MySQL с одного сервера на другой вполне подойдет обычный mysqldump, но когда это продакшен сервер и база занимает больше 10Gb простой может длиться слишком долго. В таких случаях подойдет репликация Master-Slave.

Для начала на обоих серверах включаем bin-log.  Не буду углубляться но этих настроек должно быть достаточно:
binlog-format = ROW
log-bin         = /var/lib/mysql/mysql-updates/mysql-binlogs
expire_logs_days = 14
max_binlog_size = 1024M

Далее на Master добавляем пользователя с правами для репликации
CREATE USER 'replication'@'10.0.0.18' IDENTIFIED BY '123password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'10.0.0.18';
FLUSH PRIVILEGES;

Делаем дамп необходимой базы с меткой позиции в bin-log
# mysqldump --add-drop-table --flush-logs --master-data=2 --single-transaction database_name | gzip --fast > database_name.sql.gz

 копируем дамп на Slave-сервер, распаковываем его и заливаем в базу
# gzip -d database_name.sql.gz
# mysql  database_name < database_name.sql

 В настройках MySQL (файл my.cnf) в разделе [mysqld]  добавляем параметр в котором укажем имя базы что мы будем реплицировать
   replicate-do-db = database_name
и перезапускаем MySQL

Из дампа смотри имя bin-log  файла и позицию
# cat database_name.sql | grep MASTER_LOG_POS

Далее на Slave в MySQL выполняем команды для настройки репликации
CHANGE MASTER TO MASTER_HOST='10.0.0.20', MASTER_USER='replication',MASTER_PASSWORD='123password', MASTER_LOG_FILE='mysql-binlogs.000267', MASTER_LOG_POS=125827306;
START SLAVE;

в параметрах передаем все необходимые значения.
После всех выполненных действий репликация должны начаться и базы должны быть идентичны.
Командой SHOW SLAVE STATUS\G  можем посмотреть состояние Slave и последние ошибки связанные с репликацией.

 После того как базы синхронизируются мы переводим Slave в режим Master
STOP SLAVE; CHANGE MASTER TO MASTER_HOST=''; RESET SLAVE;

Из конфига убираем replicate-do-db и перезапускаем MySQL.
Все, мы перенесли всю базу на новый сервер, в приложении необходимо всего навсего сменить настройки подключения у новой базе.



пятница, 2 декабря 2011 г.

Get MySQL database size

 SELECT table_schema "Data Base Name",
 sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MB",
 sum( data_free )/ 1024 / 1024 "Free Space in MB" FROM information_schema.TABLES
GROUP BY table_schema ORDER BY 2 DESC;