我需要为我们的一位客户在同一台主机上设置多个 MySQL 实例。据我所知,我可以去:
mysqld_multi
这应该是企业级生产环境的长期解决方案。
我们需要将当前使用带有主动/被动节点的 RedHat 集群的现有环境迁移到没有集群软件的新 VM(将使用 VMware HA 解决方案,我知道会有所不同)。
有 3 个独立的 MySQL 实例/集群资源。我不知道这种分离的最初动机,但我认为客户希望能够自主停止/启动(补丁、升级......)不同的资源。
任何意见和建议 - 利弊和现实世界的经验是非常受欢迎的!
为了回答您关于如何设置它的直接问题,我和 Randy Melder 于 2011 年 5 月 31 日解决了这个问题。
DTest 和 Laurynas Biveinis 最近(2011 年 9 月 20 日)回答了这个问题。
有些人发誓这些天它的用法。
多年前,mysql 曾经提供一个名为的脚本safe_mysqld
,这使得拥有多个 mysql 实例变得简单。您所做的就是为您想要的任何端口上的 what 实例创建一个 my.cnf 。然后叫:
safe_mysqld custom_my.cnf
Run Code Online (Sandbox Code Playgroud)
MySQL 停止分发 safe_mysqld 以支持 mysqld_multi。
但是,我已经学会了如何使用 mysqld_safe。信不信由你,由于对 mysqld_safe 的理解,我实际上在 2011 年 2 月编写了我自己的 mysql 多实例引擎。它现在在我雇主的许多客户的生产中使用。这是我如何做到的:
首先,将这个服务引擎命名为 /etc/init.d/mysqlservice
#!/bin/bash
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
WHICH=/usr/bin/which
ECHO=`${WHICH} echo`
GREP=`${WHICH} grep`
#
# Check for a four digit number greater than 3306
# Make sure the my.cnf for the Port Number Exists
#
P1=${1}
if [ "${P1}" == "" ]
then
${ECHO} "Please Specify a Port Number for MySQL (3307 - 3399)"
exit
fi
X=`${ECHO} "${P1}" | ${GREP} -c "^[Hh][Ee][Ll][Pp]$"`
if [ ${X} -eq 1 ]
then
${ECHO} "Usage: service mysqlservice <port-number [3307-3399]> {start|stop|restart|status|mycnf}"
exit
fi
X=`${ECHO} "${P1}" | ${GREP} -c "^33[0-9][0-9]$"`
if [ ${X} -eq 0 ]
then
${ECHO} "Please Specify a Port Number for MySQL (3307 - 3399)"
exit
fi
MYSQLD_PORT=${P1}
if [ ${MYSQLD_PORT} -lt 3307 ]
then
${ECHO} "Please Specify a Port Number for MySQL (3307 - 3399)"
exit
fi
MYCNF=/etc/my${MYSQLD_PORT}.cnf
if [ ! -f ${MYCNF} ]
then
${ECHO} "${MYCNF} Does Not Exist"
exit
fi
MYCNF_BACKUP=${MYCNF}_backup
NOHUP=`${WHICH} nohup`
SLEEP=`${WHICH} sleep`
TAIL=`${WHICH} tail`
AWK=`${WHICH} awk`
CAT=`${WHICH} cat`
RM=`${WHICH} rm | ${TAIL} -1 | ${AWK} '{print $1}'`
MYSQLD_SAFE=`${WHICH} mysqld_safe`
MYSQLADMIN=`${WHICH} mysqladmin`
MYSQL=`${WHICH} mysql`
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1"
MYSQL_PING_FILE=/tmp/MySQL${MYSQLD_PORT}Ping.txt
MYSQL_STAT_FILE=/tmp/MySQL${MYSQLD_PORT}Status.txt
MYSQL_ERROR_LOG=/var/log/mysqld${MYSQLD_PORT}.log
MYSQLD_START="${MYSQLD_SAFE} --defaults-file=${MYCNF} --port=${MYSQLD_PORT}"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
MYSQLD_PING="${MYSQLADMIN} ${MYSQL_CONN} ping"
PROGNAME="MySQL (Port ${MYSQLD_PORT})"
#
# This service will use mysqld_safe to run mysql server instances on other ports
#
start() {
cd /tmp
${ECHO} -n $"Starting ${PROGNAME}"
${NOHUP} ${MYSQLD_START} 2>/dev/null 1>/dev/null &
ATTEMPTS=0
STARTING_MYSQLD=1
MINUTES_TO_TRY=3
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STARTING_MYSQLD} -eq 1 ]
do
${ECHO} -n "."
${SLEEP} 0.25
READY_FOR_CONNECTIONS=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "ready for connections\.$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STARTING_MYSQLD=0 ; fi
if [ ${READY_FOR_CONNECTIONS} -eq 1 ] ; then STARTING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STARTING_MYSQLD} -eq 2 ]
then
${ECHO} "Started ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
stop() {
${ECHO} -n $"Stopping ${PROGNAME}"
${MYSQLD_STOP}
ATTEMPTS=0
STOPPING_MYSQLD=1
MINUTES_TO_TRY=10
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STOPPING_MYSQLD} -eq 0 ]
do
${ECHO} -n "."
${SLEEP} 0.25
MYSQL_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STOPPING_MYSQLD=0 ; fi
if [ ${READY_FOR_CONNECTIONS} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STOPPING_MYSQLD} -eq 2 ]
then
${ECHO} "Stopped ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
# See how we were called.
${MYSQLD_PING} 2>/dev/null > ${MYSQL_PING_FILE}
MYSQL_RUNNING=`grep -c "mysqld is alive" ${MYSQL_PING_FILE}`
${RM} ${MYSQL_PING_FILE}
case "$2" in
start)
if [ ${MYSQL_RUNNING} -eq 0 ]
then
start
else
${ECHO} ${PROGNAME} is Running
fi
;;
stop)
if [ ${MYSQL_RUNNING} -eq 0 ]
then
${ECHO} ${PROGNAME} is Not Running
else
stop
fi
;;
restart)
stop
${SLEEP} 1
start
;;
status)
if [ ${MYSQL_RUNNING} -eq 0 ]
then
${ECHO} ${PROGNAME} is Not Running
else
${MYSQL} ${MYSQL_CONN} -A -e"status" > ${MYSQL_PING_FILE}
${GREP} "Server version:" < ${MYSQL_PING_FILE} > ${MYSQL_STAT_FILE}
${GREP} "UNIX socket:" < ${MYSQL_PING_FILE} >> ${MYSQL_STAT_FILE}
${GREP} "Uptime:" < ${MYSQL_PING_FILE} >> ${MYSQL_STAT_FILE}
${GREP} "Threads:" < ${MYSQL_PING_FILE} >> ${MYSQL_STAT_FILE}
${CAT} ${MYSQL_STAT_FILE}
fi
;;
mycnf)
less ${MYCNF}
;;
edit)
cp ${MYCNF} ${MYCNF_BACKUP}
vi ${MYCNF}
;;
*)
${ECHO} $"Usage: $0 {start|stop|restart|status|mycnf}"
${ECHO} $"Usage: $0 help"
exit 1
esac
exit
Run Code Online (Sandbox Code Playgroud)
接下来,为特定端口创建 mysql 实例文件。
例如这里是服务mysql3307
#!/bin/sh
#
# readahead: Prereads programs required for startup into memory
#
# chkconfig: 2345 4 99
# description: This service causes the programs used during startup \
# to be loaded into memory before they are needed,\
# thus improving startup performance
#
#
# Sanity checks.
[ -x /usr/sbin/readahead ] || exit 0
# Check for > 384 MB
#free -m | gawk '/Mem:/ {exit ($2 >= 384)?0:1}' || exit 0
# Source function library.
#. /etc/rc.d/init.d/functions
WHICH=/usr/bin/which
SERVICE=`${WHICH} service`
MYSQL=`${WHICH} mysql`
PORT_NUMBER=3307
# See how we were called.
case "$1" in
start) ${SERVICE} mysqlservice ${PORT_NUMBER} start ;;
stop) ${SERVICE} mysqlservice ${PORT_NUMBER} stop ;;
status) ${SERVICE} mysqlservice ${PORT_NUMBER} status ;;
restart) ${SERVICE} mysqlservice ${PORT_NUMBER} restart ;;
mycnf) ${SERVICE} mysqlservice ${PORT_NUMBER} mycnf ;;
edit) ${SERVICE} mysqlservice ${PORT_NUMBER} edit ;;
*)
echo $"Usage: $0 {start|stop|restart|status|mycnf}"
;;
esac
Run Code Online (Sandbox Code Playgroud)
确保 mysql 实例文件具有 PORT_NUMBER 中定义的 3307 和 3399 之间的端口号。
由于 mysql 实例文件调用 mysqlservice,请注意 mysqlservice 将检查特定端口的配置文件。
在mysql3307的情况下,mysqlservice会寻找/etc/my3307.cnf。
确保您在 /etc/my3307.cnf 中明确定义了以下内容
[mysqld]
datadir=/var/lib/mysql3307
socket=/var/lib/mysql3307/mysql.sock
port=3307
[mysqld_safe]
log-error=/var/log/mysqld3307.log
Run Code Online (Sandbox Code Playgroud)
datadir 和 socket 可以位于您选择的位置。
要创建 mysql3308 和其他服务,遵循相同的范例但使用完全定义的端口号。
试一试 !!!
归档时间: |
|
查看次数: |
7984 次 |
最近记录: |