Secondary MySQL server

При установке сервера зачатую приходится ещё и ставить какую нибудь СУБД. Ну и кончно же большую популярность на рынке СУБД приобрела MySQL. Много есть учебников, пособий по тому как с ней работать. Когда сильно увлекаешся всем эим делом, то иногда забываешь, что силы MySQL ограничены.

Вот буквально на днях случилось. На сервере установлена система управления учебным процессом Claroline (ОС Gentoo Linux). Вроде и штука неплохая и преподавателям нравится, но с БД в неё явно проблемы. При установке предлагало, что можно сделать её мультибазовой, чтобы она сама могла создавать БД по мере надобности. Но так как для этого очевидно требуются немалые права, а на этом MySQL сервере ещё не один проект, то делать это как то стрёмно. Поэтому выбрал вариант с однобазовой конфигурацией, где бы все таблицы предварялись префиксами и ложились в одну БД. Ой, зря...

Немного времени прошло, БД разрослась до 768 таблиц (!). Много, нечего сказать. И всё бы было до лампочки, если бы не было такого при попытке сделать бэкап:

mysqldump: Got error: 23: Out of resources when opening file './claroline/c_С001_qwz_tracking.MYD' (Errcode: 24) when using LOCK TABLES

ffrustration

Вот и задумался над тем как сделать так, чтобы и баз было несколько, и всё это было безопасно. Сначала думал собрать из исходников, положить в отдельную папку и там юзать. Но потом стал ман курить и что-то не вкурил. cmake отказался конфигурать исходники, поэтому был найден другой путь. Оказывается иметь ещё одну копию бинарников вовсек необязательно, можно просто дважды запустить одни и те же, только с разными конфигурациями.

Итак для начала я создал папку, куда бы собирал все файлы от другого сервера.

# mkdir -p /opt/claroline/{conf,db,var}
# chown mysql:mysql /opt/claroline/{db,var}

Далее копирую существующий конфиг MySQL в новую папку:

# cp /etc/mysql/my.cnf /opt/claroline/conf/

Далее правлю новый конфиг. Внёс вот такие изменения:

[client]
port = 3307
socket = /opt/claroline/var/mysqld.sock

[mysqld_safe]
err-log = /opt/claroline/var/mysql.err

[mysqld]
port = 3307
socket = /opt/claroline/var/mysqld.sock
pid-file = /opt/claroline/var/mysqld.pid
log-error = /opt/claroline/var/mysqld.err
basedir = /usr
datadir = /opt/claroline/db

Больше ничего не трогал. Думаю очевидно что 3307 - это номер порта, по которому мы будем коннектится, а /opt/claroline/var/mysqld.sock - это соответственно UNIX-сокет. Теперь ставлю базовіе таблицы mysql:

# mysql_install_db --defaults-file=/opt/claroline/conf/my.cnf

Далее запуск и настройка. Запускаем командой:

# start-stop-daemon --verbose --start --exec /usr/sbin/mysqld --background --pidfile /opt/claroline/var/mysqld.pid \
 --wait 1000 --nicelevel 0 --ionice 2 -- --defaults-file=/opt/claroline/conf/my.cnf

У меня почему то он не захотел встать на порт 3307, как я ему сказал. Почему он так поступил неизвестно. Но пока можно обойтись и коннектится через сокет. Меняю пароль для рута:

# mysqladmin --socket=/opt/claroline/var/mysqld.sock -u root password 'new-password'

Сервер останавливаем командой:

# start-stop-daemon --verbose --stop --exec /usr/sbin/mysqld --pidfile /opt/claroline/var/mysqld.pid --retry 120 \
 -- --defaults-file=/opt/claroline/conf/my.cnf

Но как выяснилось позже, это просто nmap не захотел показать, что порт 3307 кем то обслуживается... netstat же убедил меня что порт 3307 прослушивается и готов принимать соединения. Но вот только такая бадяга: обратится можно только как к 127.0.0.1:3307. К localhost:3307 почему то не прокатило.

jecky-chan

Даные мутки необходимы на всех вещах, которые юзают этот сервер. Хотя лично от себя рекомендую коннектится через сокет. Я так настроил phpMyAdmin и теперь он предлагает два сервера на выбор. К обоим нормально коннектится и в обоих может всё настроить. Команды на запуск и остановку сервера закинул в /etc/local.d. Пока что...

Логичеким продолжением истории является публикация о перенесении БД Claroline с single-mode в multi-mode.