Запуск Двух Или Более Экземпляров Mysql На Одном Сервере Linux

Хочу поделиться еще одним способом решения такой проблемы, как запуск более одного mysql-сервера на одном Linux-сервере.

Думаю, некоторые из вас уже пробовали это сделать, запустив вручную, например так:

  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

mysqld_safe --defaults-file=.

my2.cnf. &

Я думаю, что такой подход не совсем корректен хотя бы потому, что не всегда можно корректно завершить работу такого работающего mysql-сервера.

Вы, конечно, также можете использовать mysqld_multi , но лично я предпочитаю полностью «изолировать» экземпляры друг от друга.

Именно поэтому я предлагаю вам в моей публикации использовать в помощь систему инициализации.

Дано: ОС Linux CentOS 6.5. Я не буду рассказывать, как установить MySQL-сервер или его производные (например, Percona), перейду сразу к делу.

Установил и запустил.



[root@localhost /]# ps aux | grep sql



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

Сервер запустился, все работает. Все параметры указаны по умолчанию, если иное не указано в п.

мой.

cnf .

Теперь приступим к запуску второго экземпляра.

Создайте место для второй базы:

mkdir /var/lib/mysql2 && chown -R mysql:mysql /var/lib/mysql2

Для хранения журналов:

mkdir /var/log/mysql2 && chown -R mysql:mysql /var/log/mysql2

Скопируйте файл конфигурации по умолчанию для второго экземпляра:

cp /etc/my.cnf /etc/my2.cnf

Давайте посмотрим на отдельный каталог в /var/run:

mkdir /var/run/mysqld2 && chown -R mysql:mysql /var/run/mysqld2

Осталось только исправить my2.cnf и добавить скрипт инициализации в /etc/init.d/ для корректного управления новым экземпляром.

.

Отредактируйте /etc/my2.cnf:

[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

Чем отличаются файлы конфигурации:

[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

И наконец, подготовим скрипт инициализации для запуска второго сервера.

Вот где начинается веселье:

cp /etc/init.d/mysqld /etc/init.d/mysqld2

Откройте и отредактируйте отдельные строки в файле /etc/init.d/mysqld2: 1) Для начала нам нужно закомментировать (или удалить) функцию get_mysql_option() , чтобы не проскальзывать значения по умолчанию mysqld_safe:

#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 #}

2) Так же комментируем его использование в дальнейшем и записываем в необходимые переменные уникальные пути и каталоги для нового экземпляра:

#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"

3) Последний штрих: в функции start() явно указываем mysqld_safe использовать наш отдельный файл конфигурации и записывать логи в отдельную папку.

Для этого мы сократим следующую строку примерно до этого:

$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 &

Сохранять.

Начнем с выполнения /etc/init.d/mysql2 start. Остановить: /etc/init.d/mysql2 стоп.

Обследование:

[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

Ну и наконец, подключаемся с помощью клиента к нашему второму серверу MySQL, явно указав файл сокета:

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

.

и мы видим, что у нас все получилось.

Спасибо за внимание.

P.S. В каталоге второй базы данных можно сначала использовать либо стандартную, скопировав ее из /вар/lib/mysql или вновь созданный - используя mysql_install_db или существующий (например, резервная копия, созданная Percona XtraBackup ).

Самое главное - правильный пользователь-владелец( MySQL ) в файлы базы данных.

Теги: #mysqld #centos #linux #multiple #MySQL

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.