пятница, 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;

пятница, 25 ноября 2011 г.

Maximum possible memory usage for MySQL

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'innodb_additional_mem_pool_size';
SHOW VARIABLES LIKE 'innodb_log_buffer_size';
SHOW VARIABLES LIKE 'thread_stack';
SET @kilo_bytes = 1024;
SET @mega_bytes = @kilo_bytes * 1024;
SET @giga_bytes = @mega_bytes * 1024;
SET @innodb_buffer_pool_size = 2 * @giga_bytes;
SET @innodb_additional_mem_pool_size = 16 * @mega_bytes;
SET @innodb_log_buffer_size = 8 * @mega_bytes;
SET @thread_stack = 192 * @kilo_bytes;
SELECT
( @@key_buffer_size + @@query_cache_size + @@tmp_table_size
+ @innodb_buffer_pool_size + @innodb_additional_mem_pool_size
+ @innodb_log_buffer_size
+ @@max_connections * (
@@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size
+ @@join_buffer_size + @@binlog_cache_size + @thread_stack
) ) / @giga_bytes AS MAX_MEMORY_GB;

четверг, 24 ноября 2011 г.

Количество таблиц в базах - MySQL

echo "show databases;"|mysql |tail -n +2|while read db; do echo -n "$db ";echo "show tables;"|mysql $db|tail -n +2|wc -l; done ;
или проще
#mysqlshow -v

четверг, 10 ноября 2011 г.

вторник, 1 ноября 2011 г.

Изменение docroot для suexec - Apache2.2 (Ubuntu)

Проблема в том что при использовании suexec не возможно запускать скрипты вне директории docroot, а она задается при компиляции. Зачастую она указывает на /var/www, проверить это можно командой /usr/lib/apache2/suexec -V, но нам к примеру необходимо запускать скрипты из /home.

И так приступим

#cd /usr/src
#apt-get build-dep apache2-suexec-custom
#apt-get source apache2-suexec-custom
#cd apache2-2.2.2/
#vi debian/rules
и меняем параметр --with-suexec-docroot=/var/www на что что нам необходимо

после этого компилим пакет и устанавливаем его
#dpkg-buildpackage
#cd ..

проверяем что бы не был установлен apache2 и устанавливаем его из созданных пакетов
#dpkg -i apache2.2-common_2.2.20-1ubuntu1_amd64.deb apache2.2-bin_2.2.20-1ubuntu1_amd64.deb apache2-utils_2.2.20-1ubuntu1_amd64.deb apache2-suexec-custom_2.2.20-1ubuntu1_amd64.deb  apache2-mpm-worker_2.2.20-1ubuntu1_amd64.deb


возможно еще придется сменить права для suexec
#chown root:root /usr/lib/apache2/suexec
#chmod 4755 /usr/lib/apache2/suexec


готово