Запуск двух mysql-серверов на freebsd

Оговоримся сразу: в том, что изложено ниже, ничего нового нет.
Для чего это нужно?
— Например, у Вас один «боевой» mysql-сервер, обслуживающий проекты на этом сервере, и один для репликации данных с другого сервера.
Почему бы не использовать mysqld_multi?
— Похоже, мейнтейнеры «забили» на mysqld_multi. Для разных версий mysql этот скрипт может вести себя по разному. Плюс, он заточен по линукс, часто, перед использованием на frebsd, его нужно править.
— Стоит ли его использовать ради запуска одного дополнительного mysql-сервера?
— Просто удобно задать параметры дополнительного сервера стандартно в rc.conf.
Почему для для репликации баз с удаленного сервера не использовать основной mysql? GTID в 5.6 и старше, вроде, позволяет это сделать.
— Для экономии ресурсов, дополнительный mysql-сервер может быть существенно «поджат» по используемым ресурсам.
— Так привычнее.
Собственно, как?
— За основу берем стандартный стартовый скрипт /usr/local/etc/rc.d/mysql-server, копируем его в mysql1-server, правим:

#!/bin/sh
#

# PROVIDE: mysql
# REQUIRE: LOGIN
# KEYWORD: shutdown

# Add the following line to /etc/rc.conf to enable mysql:
# mysql1_enable (bool): Set to "NO" by default.
#                       Set it to "YES" to enable MySQL.
# mysql1_limits (bool): Set to "NO" by default.
#                       Set it to yes to run `limits -e -U mysql`
#                       just before mysql starts.
# mysql1_dbdir (str):   Default to "/var/db/mysql"
#                       Base database directory.
# mysql1_optfile (str): Server-specific option file.
#                       Default to "${mysql_dbdir}/my.cnf".
# mysql1_pidfile (str): Custum PID file path and name.
#                       Default to "${mysql_dbdir}/${hostname}.pid".
# mysql1_args (str):    Custom additional arguments to be passed
#                       to mysqld_safe (default empty).
#

. /etc/rc.subr

name="mysql1"
rcvar=mysql1_enable

load_rc_config $name

: ${mysql1_enable="NO"}
: ${mysql1_limits="NO"}
: ${mysql1_dbdir="/var/db/mysql"}
: ${mysql1_optfile="${mysql1_dbdir}/my.cnf"}

mysql_user="mysql"
mysql_limits_args="-e -U ${mysql_user}"
: ${hostname:=`/bin/hostname`}
pidfile=${mysql1_pidfile:-"${mysql1_dbdir}/${hostname}.pid"}
command="/usr/sbin/daemon"
command_args="-c -f /usr/local/bin/mysqld_safe --defaults-extra-file=${mysql1_optfile} --user=${mysql_user} --datadir=${mysql1_dbdir} --pid-file=${pidfile} ${mysql1_args}"
procname="/usr/local/libexec/mysqld"
start_precmd="${name}_prestart"
start_postcmd="${name}_poststart"
mysql_install_db="/usr/local/bin/mysql_install_db"
mysql_install_db_args="--basedir=/usr/local --datadir=${mysql1_dbdir} --defaults-extra-file=${mysql1_optfile} --force"

mysql_create_auth_tables()
{
        eval $mysql_install_db $mysql_install_db_args >/dev/null 2>/dev/null
        [ $? -eq 0 ] && chown -R ${mysql_user}:${mysql_user} ${mysql1_dbdir}
}eval $mysql_install_db $mysql_install_db_args >/dev/null 2>/dev/null
        [ $? -eq 0 ] && chown -R ${mysql_user}:${mysql_user} ${mysql1_dbdir}
}

mysql1_prestart()
{
        if [ ! -d "${mysql1_dbdir}/mysql/." ]; then
                mysql_create_auth_tables || return 1
        fi
        if checkyesno mysql1_limits; then
                eval `/usr/bin/limits ${mysql_limits_args}` 2>/dev/null
        else
                return 0
        fi
}

mysql1_poststart()
{
        local timeout=15
        while [ ! -f "${pidfile}" -a ${timeout} -gt 0 ]; do
                timeout=$(( timeout - 1 ))
                sleep 1
        done
        return 0
}

run_rc_command "$1"

Дальше, в /etc/rc.conf добавляем строки типа:

...
mysql1_enable="YES"
mysql1_dbdir="/data1/mysql"
mysql1_args="--socket=/tmp/mysql1.sock --port=3307"
...

И штатно запускаем второй экземпляр mysql-сервера. Конфиги ложим в папки с данными. Естественно, что точно также можно запустить больше одного дополнительного mysql-сервера. Главное, что бы для каждого экземпляра отличались:
а) port
б) socket
в) datadir
г) pidfile

Запись опубликована в рубрике Записки админа. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *