Привет. Обычно я пользуюсь FreeBSD, поэтому, возможно, ответ на мой вопрос будет тривиальным. Мне нужно установить два MySQL сервера на одну CentOS. Всё работает, но при перезапуске системы запускается только один MySQL.
Вот описание того, как я проводил установку. Сначала я установил MySQL и добавил сервис к автозапуску при перезагрузке:
[console]>yum update
>yum install mysql-server.i386
>chkconfig mysqld on
>service mysqld start[/console]
Всё работает и MySQL запускается и при перезапуске системы, и из шелла.
Потом я начал разделение на два сервера. В качестве руководства использовалась статья http://blog.mydream.com.hk/howto/linux/mysql-multiple-instance-on-centos-howto. Для первого сервера файлы были переименованы следующим образом:
[console]>chkconfig --del mysqld
>mv /etc/my.cnf /etc/my1.cnf
>rm -rf /var/lib/mysql
>mv /etc/init.d/mysqld /etc/init.d/mysqld1
>chkconfig --add mysqld1
>chkconfig mysqld1 on
>rm /var/log/mysqld.log[/console]
Отредактированные my1.cnf и mysqld1 я приаттачиваю к посту. Если в двух словах, я поменял пути к сокету, локу, логу, директории с БД, добавил added "port=3306" в my1.cnf и "--defaults-file=/etc/my1.cnf" в mysqld1.
Всё по-прежнему работает, первый сервер нормально запускается и при перезапуске системы, и из шелла.
Настройка второго сервера на порту 3307:
[console]>cp -vp /etc/my1.cnf /etc/my2.cnf
>cp -vp /etc/init.d/mysqld1 /etc/init.d/mysqld2
>chkconfig --add mysqld2
>chkconfig mysqld2 on
>semanage port -a -t mysqld_port_t -p tcp 3307[/console]
Отредактированные my2.cnf и mysqld2 тоже есть в архиве. Единственное отличие от конфига для первого MySQL — пути содержат 2 вместо 1 и порт изменён на 3307.
Оба сервера нормально стартуют из шелла, но только первый запускается при перезагрузке. В логах ничего вразумительного. Второй сервер запускается и сразу останавливается:
[console]>less /var/lib/mysql2/mysqld.log
111106 02:32:32 mysqld started
111106 02:32:32 mysqld ended
111106 02:38:29 mysqld started
111106 02:38:29 mysqld ended
111106 02:44:50 mysqld started
111106 02:44:51 mysqld ended
111106 02:48:21 mysqld started
111106 02:48:21 mysqld ended
111106 02:56:23 mysqld started
111106 02:56:23 mysqld ended
111106 03:06:31 mysqld started
111106 03:06:31 mysqld ended[/console]
Есть у вас хоть какие-то идеи, что я сделал не так? Вроде как это не проблема с правами или владельцем файлов. Для меня это выглядит как какой-то подозрительный глюк MySQL или неправильно настроенный перезапуск сервиса из-за того, что у меня нет опыта работы с CentOS.
Конфиг CentOS практически ничем не отличается от дефолтного. Я отключил ip6tables и добавил pc.lan в /etc/hosts и/etc/sysconfig/network.
[console]>chkconfig --list mysqld1
mysqld1 0:off 1:off 2:on 3:on 4:on 5:on 6:off
>chkconfig --list mysqld2
mysqld2 0:off 1:off 2:on 3:on 4:on 5:on 6:off[/console]
[console]>ls -lA /etc/rc.d/rc?.d/ | grep mysql
lrwxrwxrwx 1 root root 17 Nov 6 02:54 K36mysqld1 -> ../init.d/mysqld1
lrwxrwxrwx 1 root root 17 Nov 6 03:27 K36mysqld2 -> ../init.d/mysqld2
lrwxrwxrwx 1 root root 17 Nov 6 02:54 K36mysqld1 -> ../init.d/mysqld1
lrwxrwxrwx 1 root root 17 Nov 6 03:27 K36mysqld2 -> ../init.d/mysqld2
lrwxrwxrwx 1 root root 17 Nov 6 03:27 K36mysqld2 -> ../init.d/mysqld2
lrwxrwxrwx 1 root root 17 Nov 6 02:54 S64mysqld1 -> ../init.d/mysqld1
lrwxrwxrwx 1 root root 17 Nov 6 03:27 K36mysqld2 -> ../init.d/mysqld2
lrwxrwxrwx 1 root root 17 Nov 6 02:54 S64mysqld1 -> ../init.d/mysqld1
lrwxrwxrwx 1 root root 17 Nov 6 03:27 K36mysqld2 -> ../init.d/mysqld2
lrwxrwxrwx 1 root root 17 Nov 6 02:54 S64mysqld1 -> ../init.d/mysqld1
lrwxrwxrwx 1 root root 17 Nov 6 03:27 K36mysqld2 -> ../init.d/mysqld2
lrwxrwxrwx 1 root root 17 Nov 6 02:54 S64mysqld1 -> ../init.d/mysqld1
lrwxrwxrwx 1 root root 17 Nov 6 02:54 K36mysqld1 -> ../init.d/mysqld1
lrwxrwxrwx 1 root root 17 Nov 6 03:27 K36mysqld2 -> ../init.d/mysqld2[/console]
[console]>uname -a
Linux pc.lan 2.6.18-274.7.1.el5 #1 SMP Thu Oct 20 16:20:37 EDT 2011 i686 i686 i386 GNU/Linux
>rpm -qa | grep mysql
mysql-5.0.77-4.el5_6.6
mysql-server-5.0.77-4.el5_6.6[/console]
[console]>diff /etc/my1.cnf /etc/my2.cnf
2,4c2,4
< port=3306
< datadir=/var/lib/mysql1
< socket=/var/lib/mysql1/mysql.sock
---
> port=3307
> datadir=/var/lib/mysql2
> socket=/var/lib/mysql2/mysql.sock
16,17c16,17
< log-error=/var/lib/mysql1/mysqld.log
< pid-file=/var/run/mysqld/mysqld1.pid
---
> log-error=/var/lib/mysql2/mysqld.log
> pid-file=/var/run/mysqld/mysqld2.pid[/console]
[console]>diff /etc/init.d/mysqld1 /etc/init.d/mysqld2
9,10c9,10
< # config: /etc/my1.cnf
< # pidfile: /var/run/mysqld/mysqld1.pid
---
> # config: /etc/my2.cnf
> # pidfile: /var/run/mysqld/mysqld2.pid
19c19
< prog="MySQL1"
---
> prog="MySQL2"
34c34
< get_mysql_option mysqld datadir "/var/lib/mysql1"
---
> get_mysql_option mysqld datadir "/var/lib/mysql2"
38c38
< get_mysql_option mysqld_safe log-error "/var/lib/mysql1/mysqld.log"
---
> get_mysql_option mysqld_safe log-error "/var/lib/mysql2/mysqld.log"
40c40
< get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld1.pid"
---
> get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld2.pid"
61c61
< /usr/bin/mysqld_safe --defaults-file="/etc/my1.cnf" --datadir="$datadir" --socket="$socketfile" \
---
> /usr/bin/mysqld_safe --defaults-file="/etc/my2.cnf" --datadir="$datadir" --socket="$socketfile" \
86c86
< [ $ret -eq 0 ] && touch /var/lock/subsys/mysqld1
---
> [ $ret -eq 0 ] && touch /var/lock/subsys/mysqld2
107c107
< rm -f /var/lock/subsys/mysqld1
---
> rm -f /var/lock/subsys/mysqld2
127c127
< [ -e /var/lock/subsys/mysqld1 ] && restart || :
---
> [ -e /var/lock/subsys/mysqld2 ] && restart || :[/console]
Не разобрался с аттачами на форуме, поэтому залил файлы на внешний сервер: http://zalil.ru/32000948. В архиве /etc/my?.cnf, /etc/init.d/mysqld* и скриншот того, что происходит при запуске.
Если надо, могу залить образ виртуальной машины VMware, на которой я провожу настройку.
Непонятная проблема при автостарте двух MySQL
Американцы тоже молчат :D
http://www.linuxforums.org/forum/red-hat-fedora-linux/184235-mysql-autostart-problem.html
Седня просто день такой, завтра народ понабежит...
Седня просто день такой, завтра народ понабежит...
Очень на это надеюсь.
Как то сложно все, а если так:
http://dev.mysql.com/doc/refman/5.0/en/mysqld-multi.html
Как то сложно все, а если так:
http://dev.mysql.com/doc/refman/5.0/en/mysqld-multi.html
Ты вываливаешь слишком общий кусок и предлагаешь сделать какие-то выводы на его основе. "Так" это конкретно как? В статье тоже переделывают RC скрипт и тоже советуют сделать cnf файл под каждый из серверов. Что именно сложно? Что я не учёл? Обоим серверам точно передаются правильные пути:
datadir="/var/lib/mysql1"
socketfile="$datadir/mysql.sock"
errlogfile="/var/lib/mysql1/mysqld.log"
mypidfile="/var/run/mysqld/mysqld1.pid"datadir="/var/lib/mysql2"
socketfile="$datadir/mysql.sock"
errlogfile="/var/lib/mysql2/mysqld.log"
mypidfile="/var/run/mysqld/mysqld2.pid"Второй сервис не стартует даже если отключить первый при помощи chkconfig mysqld1 off. Т. е. когда нет lock'а и pid'а от первого сервера. Прописывание таких же путей, как у меня в консоли тоже не помогло.
fmyoen, Ок, ладно, тогда пойдем по другому пути, а что у нас в логах? есть ли ошибки какие, так как на скрине лишь только значение сервиса помеченным как failed который мало о чем скажет.
Ок, ладно, тогда пойдем по другому пути, а что у нас в логах?
Об этом я тоже писал:
В логах ничего вразумительного. Второй сервер запускается и сразу останавливается:
[console]>less /var/lib/mysql2/mysqld.log
111106 02:32:32 mysqld started
111106 02:32:32 mysqld ended
111106 02:38:29 mysqld started
111106 02:38:29 mysqld ended
111106 02:44:50 mysqld started
111106 02:44:51 mysqld ended
111106 02:48:21 mysqld started
111106 02:48:21 mysqld ended
111106 02:56:23 mysqld started
111106 02:56:23 mysqld ended
111106 03:06:31 mysqld started
111106 03:06:31 mysqld ended[/console]
на скрине лишь только значение сервиса помеченным как failed который мало о чем скажет.
На скрине ещё не самый худший вариант — я сделал, чтобы сообщение mysql_safe не перенаправлялись в /dev/null.
fmyoen, а в /var/log/messages нет ни чего что ли? какие то не информативные логи.
fmyoen, а в /var/log/messages нет ни чего что ли?
Упоминаний о каких-то ошибках или о mysql нет. Если надо, могу приаттачить файл, но там действительно ничего нет.
какие то не информативные логи.
Для сравнения вот как выглядит /var/lib/mysqld2/mysqld.log, когда сервер стартует и останавливается из шелла:
[console]111106 17:42:28 mysqld started
111106 17:42:28 [Warning] option 'max_join_size': unsigned value 18446744073709551615 adjusted to 4294967295
111106 17:42:28 [Warning] option 'max_join_size': unsigned value 18446744073709551615 adjusted to 4294967295
111106 17:42:28 InnoDB: Started; log sequence number 0 43655
111106 17:42:28 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.0.77' socket: '/var/lib/mysql2/mysql.sock' port: 3307 Source distribution
111106 17:44:21 [Note] /usr/libexec/mysqld: Normal shutdown
111106 17:44:21 InnoDB: Starting shutdown...
111106 17:44:22 InnoDB: Shutdown completed; log sequence number 0 43655
111106 17:44:22 [Note] /usr/libexec/mysqld: Shutdown complete[/console]
Может быть по экспериментировать с версиями MySQL...
fmyoen,в доке то что вы привели, уж очень много воды, и как это работает мне не понятно, если можно руководствоваться документацией, кстати, я ее вам привел. Если вы внимательно почитаете, то увидите то что используется лишь только один /etc/my.cnf файл, а в нем прописываются только [mysqldX], где X номер сервиса, к примеру [mysqld2] или [mysqld3], далее приведен скрипт mysqld_multi , который помещен в /etc/init.d/ . Может все же вы попробуете сделать так как пишут в документации?
Может быть по экспериментировать с версиями MySQL...
Надо документацию читать, а не экспериментировать. smile
Может все же вы попробуете сделать так как пишут в документации?
Если в двух словах, я тоже делаю правильно. В твоей "правильной" статье есть ссылка http://dev.mysql.com/doc/refman/5.0/en/multiple-servers.html, в которой multiple_mysql называется лишь одним из вариантов руления множественными серверами. И я думаю, лучше его не использовать — он требует регистрации отдельного пользователя с правами шатдауна сервера и помещения его пароля в открытом виде в my.cnf. Да и идея с общим конфигом мне не нравится. У меня уже всё заработало. Проблема была не в mysql, а в том, что selinux, с которым под фрёй, понятное дело, я не сталкивался, блокировал второй сервер. Спасибо за желание помочь.
fmyoen,в доке то что вы привели, уж очень много воды, и как это работает мне не понятно
Нет там воды и состоит она преимущественно из конфигов. И что непонятного в произведённых действиях?
1. Заменены пути к логу, локу, датадиру и конфигу. Они заменены и в конфиге mysql, и в скрипте из init.d. Можно было, в общем-то, только в конфиге.
2. Переименован init.d скрипт и сделана ещё одна его копия, запускающая второй сервер, в ней исправлены пути под второй сервер.
Это, собственно, всё.