Translate

четвер, 18 квітня 2013 р.

Mysqld_multi: декілька демонів mysql на одному хості

Іноді постає необхідність встановити ще одну базу даних на тому ж хості, але просто на іншому порту. І як показала практика, краще за все це робити за допомогою функціоналу mysqld_multi, котрим володіють останні версії mysql.

1) Ясна справа у вас має бути встановлений mysql-server та mysql-client.

2) Зупиняємо наявний демон, якщо його запущено, бекапимо конфіг /etc/mysql/my.cnf (чи просто /etc/my.cnf).

3) Створюємо новий:

cat /etc/my.cnf

[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin

[mysqld1]
datadir = /var/lib/mysql1
socket = /var/lib/mysql1/mysql.sock
pid-file = /var/run/mysqld/mysqld1.pid
user = mysql
port = 3306
log-error=/var/log/mysqld1.log

[mysqld2]
datadir=/var/lib/mysql2
socket=/var/lib/mysql2/mysql.sock
pid-file = /var/run/mysqld/mysqld2.pid
user=mysql
port = 3307
log-error=/var/log/mysqld2.log

[mysqld3]
datadir=/var/lib/mysql3
socket=/var/lib/mysql3/mysql.sock
pid-file = /var/run/mysqld/mysqld3.pid
user=mysql
port = 3308
log-error=/var/log/mysqld3.log


Одне невеличке зауваження: директорія /var/run - це сімлінк на директорію /run, що примонтована як віртуальна файлова система (tmpfs), тому краще за все не створювати нових піддерикторій для розміщення pid-файлів, адже вони просто не будуть створені при наступному перезавантаженні. Або ж можна створювати pid-файли на реальній файлові системі...

4) Зупиняємо/видаляємо/редагуємо правила системного демона безпеки. Наприклад, для Ubuntu - це Apparmor, для Centos/Red Hat - це SElinux і т.п. Впевнений, що вам допоможуть ці посилання: 


5) Генеруємо структуру баз даних для інстансів в кожній директорії /var/lib/mysql[1,2,3]:

mysql_install_db --user=mysql --datadir=/var/lib/mysql1
mysql_install_db --user=mysql --datadir=/var/lib/mysql2
mysql_install_db --user=mysql --datadir=/var/lib/mysql3

Звісно, що директорії /var/lib/mysql[1,2,3] мають існувати перед цим.

6) Встановлюємо правильного власника на директорії:

chown mysql:mysql /var/lib/mysql[1,2] -R

7) Запускаємо mysql і читаємо лог-файли при необхідності:

mysqld_multi start

Перевіряємо статус роботи серверів:

# mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running
MySQL server from group: mysqld3 is running

Можна запустити лиш один/декілька серверів із групи:

mysqld_multi start 1
mysqld_multi start 1,2

8) Перевіряємо роботу інстансу, підключившись до нього:

mysql -P3306 --protocol=tcp
mysql -P3307 --protocol=tcp
mysql -P3308 --protocol=tcp

Або ж через сокети:

mysql -S /var/lib/mysql1/mysql.sock
mysql -S /var/lib/mysql2/mysql.sock
mysql -S /var/lib/mysql3/mysql.sock

ПС. Якщо підключатись лише з ключем порту, то кожного разу ви будете потрапляти до дефолтного інстансу на 3306 порту.

Ось власне і  все. Додам декілька корисних посилань:

4 коментарі:

  1. chkconfig --add mysqld_multi
    пишет не такого файл или процесса. в /etc/rc.d/init.d там действительно нет этого файла.
    как то победить это можно?

    ВідповістиВидалити
    Відповіді
    1. на убунті в автозапуск дещо інакше додається. а я підозріваю що в тебе взагалі freebsd.

      Видалити
    2. так, выдповідно коли mysql_multi запускається як:

      mysql_multi start N

      То init.d скрипт выдсутній. Тому є два варіанти: додати команду запуску в /etc/rc.local чи написати свій init.d скрипт, щось на зразок цього http://www.cyberciti.biz/tips/linux-write-sys-v-init-script-to-start-stop-service.html

      Видалити