AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 6370
Accepted
Dimitre Radoulov
Dimitre Radoulov
Asked: 2011-10-01 06:00:03 +0800 CST2011-10-01 06:00:03 +0800 CST 2011-10-01 06:00:03 +0800 CST

在同一主机上运行多个实例

  • 772

我需要为我们的一位客户在同一主机上设置多个 MySQL 实例。据我所知,我可以选择:

  1. mysqld_multi
  2. MySQL 沙盒

这应该是企业级生产环境的长期解决方案。

我们需要将当前使用具有主动/被动节点的 RedHat 集群的现有环境迁移到没有集群软件的新 VM(将使用 VMware HA 解决方案,我知道它会有所不同)。

有 3 个独立的 MySQL 实例/集群资源。我不知道这种分离的最初动机,但我想客户希望能够自主地停止/启动(补丁、升级......)不同的资源。

任何意见和建议 - 优点,缺点和现实世界的经验都非常欢迎!

mysql
  • 2 2 个回答
  • 8053 Views

2 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-10-01T07:33:44+08:002011-10-01T07:33:44+08:00

    为了回答您关于如何设置的直接问题,我和 Randy Melder 在 2011 年 5 月 31 日解决了这个问题。

    DTest 和 Laurynas Biveinis 最近回答了这个问题(2011 年 9 月 20 日)。

    如今,有些人对它的使用发誓。

    多年前,mysql 曾经提供一个名为的脚本safe_mysqld,它使拥有多个 mysql 实例变得简单。您所做的只是在您想要的任何端口上为 what 实例创建一个 my.cnf。然后调用:

    safe_mysqld custom_my.cnf
    

    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
    

    接下来,为特定端口创建 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
    

    确保 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
    

    datadir 和 socket 可以在您选择的位置。

    要创建 mysql3308 和其他服务,遵循相同的范例,但使用始终定义的确切端口号。

    试试看 !!!

    • 5
  2. Mukesh Vishwakarma
    2012-02-24T03:58:24+08:002012-02-24T03:58:24+08:00

    此链接可能会有所帮助:

    我花了很多时间弄清楚如何在同一台机器上安装多个 mysql 实例。所以我想分享在同一台机器上设置多个 Mysql 的过程对于寻找此类手册的人很有用......

    • 1

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve