Дано: OS Linux CentOS 6.5. Как ставить MySQL-сервер или его производные (например, Percona), я рассказывать не стану, перейду сразу к делу. Поставили, запустили.
[bash title=»код»][root@localhost /]# ps aux | grep sql
[/bash]
[bash title=»код»]root 8455 0.0 0.2 5064 1344 pts/0 S 01:36 0:00 /bin/sh /usr/bin/mysqld_safe —datadir=/var/lib/mysql —socket=/var/lib/mysql/mysql.sock —pid-file=/var/run/mysqld/mysqld.pid —basedir=/usr —user=mysql
mysql 8566 0.0 3.0 135476 15328 pts/0 Sl 01:36 0:00 /usr/libexec/mysqld —basedir=/usr —datadir=/var/lib/mysql —user=mysql —log-error=/var/log/mysqld.log —pid-file=/var/run/mysqld/mysqld.pid —socket=/var/lib/mysql/mysql.sock —port=3306
[/bash]
Сервер запустился, всё работает. Все параметры по-умолчанию, если не указано обратное в my.cnf.
Теперь займёмся запуском второго инстанса. Создаем место для второй базы:
[bash title=»код»]mkdir /var/lib/mysql2 && chown -R mysql:mysql /var/lib/mysql2[/bash]
Для хранения логов:
[bash title=»код»]mkdir /var/log/mysql2 && chown -R mysql:mysql /var/log/mysql2[/bash]
Копируем дефолтный конфигурационный файл для второго инстанса:
[bash title=»код»]cp /etc/my.cnf /etc/my2.cnf[/bash]
Займёмся отдельной директорией в /var/run:
[bash title=»код»]mkdir /var/run/mysqld2 && chown -R mysql:mysql /var/run/mysqld2[/bash]
Осталось поправить my2.cnf и добавить init-скрипт в /etc/init.d/ для корректного управления новым инстансом.
Правим /etc/my2.cnf:
[bash title=»код»][mysqld]
bind-address=127.0.0.1
port=3307
datadir=/var/lib/mysql2
socket=/var/lib/mysql2/mysql2.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysql2/mysqld.log
pid-file=/var/run/mysqld2/mysqld.pid[/bash]
Чем различаются конфигурационные файлы:
[bash title=»код»][root@localhost mysqld2]# diff /etc/my.cnf /etc/my2.cnf
3,5c3,5
< port=3306
< datadir=/var/lib/mysql
< socket=/var/lib/mysql/mysql.sock
—
> port=3307
> datadir=/var/lib/mysql2
> socket=/var/lib/mysql2/mysql2.sock
11,12c11,12
< log-error=/var/log/mysqld.log
< pid-file=/var/run/mysqld/mysqld.pid
—
> log-error=/var/log/mysql2/mysqld.log
> pid-file=/var/run/mysqld2/mysqld.pid
[/bash]
Ну и, наконец, подготовим init-скрипт для запуска второго сервера. Здесь начинается самое интересное:
[bash title=»код»]cp /etc/init.d/mysqld /etc/init.d/mysqld2[/bash]
Открываем и правим отдельные строчки в файле /etc/init.d/mysqld2:
1) Во-первых, нам нужно закомментировать (или удалить) функцию get_mysql_option(), дабы она не подсовывала mysqld_safe значения по-умолчанию:
[bash title=»код»]#get_mysql_option(){
# result=`/usr/bin/my_print_defaults «$1» | sed -n «s/^—$2=//p» | tail -n 1`
# if [ -z «$result» ]; then
# # not found, use default
# result=»$3″
# fi
#}[/bash]
2) Также комментируем её использование в дальнейшем и записываем в нужные переменные уникальные пути и директории для нового инстанса:
[bash title=»код»]#get_mysql_option mysqld datadir «/var/lib/mysql2″
datadir=»/var/lib/mysql2»
#get_mysql_option mysqld socket «$datadir/mysql2.sock»
socketfile=»$datadir/mysql2.sock»
#get_mysql_option mysqld_safe log-error «/var/log/mysql2/mysqld.log»
errlogfile=»/var/log/mysql2/mysqld.log»
#get_mysql_option mysqld_safe pid-file «/var/run/mysqld2/mysqld.pid»
mypidfile=»/var/run/mysqld2/mysqld.pid»[/bash]
3) Последний штрих: в функции start() явно указываем mysqld_safe использовать наш отдельный конфигурационный файл и писать в отдельную папку логи. Для этого приводим следующую строку к приблизительно такому виду:
[bash title=»код»]$exec —defaults-file=/etc/my2.cnf —datadir=»$datadir» —socket=»$socketfile» \
—pid-file=»$mypidfile» —log-error=/var/log/mysql2/mysqld.log \
—basedir=/usr —user=mysql >/dev/null 2>&1 &[/bash]
Сохраняем. Запускаем, выполняя /etc/init.d/mysql2 start. Остановка: /etc/init.d/mysql2 stop. Проверка:
[bash title=»код»][root@localhost run]# ps aux | grep sql2
root 9375 0.0 0.2 5064 1348 pts/1 S 02:44 0:00 /bin/sh /usr/bin/mysqld_safe —defaults-file=/etc/my2.cnf —datadir=/var/lib/mysql2 —socket=/var/lib/mysql2/mysql2.sock —pid-file=/var/run/mysqld2/mysqld.pid —log-error=/var/log/mysql2/mysqld.log —basedir=/usr —user=mysql
mysql 9489 0.1 3.0 135476 15328 pts/1 Sl 02:44 0:00 /usr/libexec/mysqld —defaults-file=/etc/my2.cnf —basedir=/usr —datadir=/var/lib/mysql2 —user=mysql —log-error=/var/log/mysql2/mysqld.log —pid-file=/var/run/mysqld2/mysqld.pid —socket=/var/lib/mysql2/mysql2.sock —port=3307
root 9510 0.0 0.1 4356 732 pts/1 S+ 02:44 0:00 grep sql2[/bash]
Ну и, наконец-то, подключаемся с помощью клиента к нашему второму MySQL-серверу путем явного указывания сокет-файла:
[bash title=»код»]mysql -S /var/lib/mysql2/mysql2.sock[/bash]
… и видим, что у нас всё получилось.
Спасибо за внимание.
P.S. В директории второй базы можно сначала использовать либо дефолтную, скопировав её из /var/lib/mysql, либо заново созданную — с помощью mysql_install_db, либо уже имеющуюся (например, бэкап, созданный Percona XtraBackup). Самое главное — корректный пользователь-владелец (mysql) на файлы базы.
Автор: Илья Костюченко