В этой статье мы рассмотрим способ который покажет как запустить несколько экземпляров MySQL на одном сервере. Иногда требуется такое сделать, но русскоязычных инструкций очень мало, поэтому я решил что эта инструкция кому нибудь пригодится.
Установка нескольких экземпляров MySQL на одном сервере Linux
Я установил сначала mysql, а затем mariadb, не обязательно устанавливать в таком порядке как я. Вы можете сделать это в другом порядке (сначала maria, а затем mysql) или даже разные версии одной и той же базы данных. Да да да, так тоже можно.
Что нам нужно сделать, так это установить одину базу из пакетов с помощью apt-get, а другую скомпилировать из исходного кода. Позже вы увидите, почему именно так. Если вы выберете другой порядок или скомпилируете обе базы из исходного кода, тогда вам следует ознакомиться с официальной документацией.
Бинарные пакеты
Я работаю с Ubuntu 20.10 и собираюсь установить MySQL и MariaDB. Первый шаг очень прост, выполните следующие команды для установки mysql из пакетов, доступных в репозитории.
#
sudo -i
#
apt-get install mysql-server
Команда sudo -i эквивалентна команде su —, не забудьте выйти по завершении.
Далее остановите на время службу mysql. Делается это командой systemctl stop mysql
Компиляция базы данных из исходного кода
Если вы попытаетесь установить mariadb с помощью apt-get, когда mysql уже установлен, как это сделал я. То система попытается удалить mysql, это на мой взгляд очень правильно и разумно.
Система попытается удалить предыдущую базу данных, потому что mariadb и mysql, предназначены для одной и той же задачи. Из-за этого они и конфликтуют. Вот поэтому нам требуется установить одну из баз данных из исходников.
Зависимости
Вы можете получить общие и подробные инструкции по сборке mariadb здесь и здесь. На моей ubuntu я сделал следующее:
Сначала включите исходные репозитории.
# nano /etc/apt/sources.list
# apt-get update
Далее установите ряд инструментов сборочных зависимостей, которые необходимы для компиляции MariaDB. Вы можете легко установить их с помощью следующей команды.
# apt build-dep mariadb-server
Компиляция и установка
Зависимости установлены, теперь пришло время распаковать tarball.
# tar zxvf mariadb-10.6.5.tar.gz
# cd mariadb-10.6.5
Далее собираем с помощью cmake. В первом cmake я устанавливаю некоторые пути, чтобы убедиться, что все идет в /usr/local/mariadb, чтобы не конфликтовать с MySQL.
# cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/mariadb -DGRN_DEFAULT_DOCUMENT_ROOT:PATH=/usr/local/mariadb/share/groonga/html/admin -DGRN_LOG_PATH:FILEPATH=/usr/local/mariadb/var/log/groonga/groonga.log -DMYSQL_DATADIR:PATH=/usr/local/mariadb/data
Теперь мы можем сделать сборку и установить ее.
# cmake --build .
# cmake --install .
Создайте базу данных mysql и запустите службу
Сначала нам нужно создать минимальный конфигурационный файл со следующим содержимым:
# nano /usr/local/mariadb/etc/my.cnf
[mysqld]
user = mysql
pid-file = /usr/local/mariadb/var/run/mysqld/mysqld.pid
socket = /usr/local/mariadb/var/run/mysqld/mysqld.sock
port = 3307
datadir = /usr/local/mariadb/data
bind-address = 127.0.0.1
Обратите внимание, что я выбрал другой TCP порт для MariaDB, чтобы он не конфликтовал с MySQL. Теперь мы можем создать системную базу данных.
# cd /usr/local/mariadb
# ./scripts/mysql_install_db --defaults-file=/usr/local/mariadb/etc/my.cnf --user=mysql
Теперь, когда база данных системы создана, мы можем запустить демон (службу) mariadb. Делается это следующей командой.
# ./bin/mysqld_safe --defaults-file='https://1118798822.rsc.cdn77.org/usr/local/mariadb/etc/my.cnf' --datadir='/usr/local/mariadb/data' --user=mysql
Внимание! убедитесь, что параметр командной строки —defaults-file является первым! Иначе демон mariadb будет использовать /etc/mysql/my.cnf из mysql. Я потратил два дня, пытаясь понять, что происходит.
Тестирование работы нескольких экземпляров MySQL на одном сервере Linux
Сначала я попытаюсь подключиться к MariaDB, так как я использую нестандартный порт tcp и другой сокет, мне нужно сообщить об этом клиенту mysql.
# mysql -S /usr/local/mariadb/var/run/mysqld/mysqld.sock -P3307
Далее я перейду на другую вкладку, чтобы протестировать mysql. Вначале я остановил mysql, поэтому мне нужно запустить службу перед попыткой подключения.
# systemctl start mysql
# mysql
Последняя проверка может заключается в том, что каждая база данных прослушивает свой соответствующий порт tcp.
# netstat -puta
Порт tcp 3306 известен для службы mysql или mariadb. Но сейчас порт 3307 прослушивает соединения mariadb.
Это подтверждает, что у нас есть несколько экземпляров mysql на одном сервере. А вернее один из этих экземпляров не является mysql это mariadb.