multiple MySQL instance on Fedora/CentOS/Redhat/Scientific Linux

Question:  How  to make  a  second  mysql server  running  on the same machine with another port and other directory ?

 Answer :

To do this, follow the steps as described beollow:

1- Create new database instance on new destination

mkdir /mysql2/mysql
mkdir /mysql2/mysql/data
mkdir /mysql2/mysql/log
mkdir /mysql2/mysql/run
mkdir /mysql2/mysql/lock
chown -R mysql:mysql /mysql2/mysql
mysql_install_db --datadir=/mysql2/mysql/data --user=mysql

2- Create new configuration file for new instance

/etc/my.server2.cnf

[mysqld]

port=3307

datadir=
/mysql2/mysql/data

socket=
/mysql2/mysql/mysql
.sock

user=mysql

# Default to using old password format for compatibility with mysql 3.x

# clients (those using the mysqlclient10 compatibility package).

old_passwords=1

log-bin =
/mysql22/mysql/log/mysql-bin
.log

[mysqld_safe]

log-error=
/mysql2/mysql/log/mysqld
.log

pid-
file
=
/mysql2/run/mysqld
.pid

[isamchk]

[myisamchk]

3-Create new init script

vi /etc/rc.d/init.d/mysqld.server2
#!/bin/bash
#
# mysqld.server2 This shell script takes care of starting and stopping
#               the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description:  MySQL database server 2nd instance.
# processname: mysqld
# config: /etc/my.server2.cnf
# pidfile: /mysql2/mysql/run/mysqld.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
prog="MySQL"
# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
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
}
get_mysql_option mysqld datadir "/mysql2/mysql/data"
datadir="/mysql2/mysql/data"
get_mysql_option mysqld socket "$datadir/mysql.sock"
socketfile="$datadir/mysql.sock"
get_mysql_option mysqld_safe log-error "/mysql2/mysql/log/mysqld.log"
errlogfile="/mysql2/mysql/log/mysqld.log"
get_mysql_option mysqld_safe pid-file "/mysql2/mysql/run/mysqld.pid"
mypidfile="/mysql2/mysql/run/mysqld.pid"
start(){
        touch "$errlogfile"
        chown mysql:mysql "$errlogfile"
        chmod 0640 "$errlogfile"
        [ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
        if [ ! -d "$datadir/mysql" ] ; then
            action $"Initializing MySQL database: " /usr/bin/mysql_install_db
            ret=$?
            chown -R mysql:mysql "$datadir"
            if [ $ret -ne 0 ] ; then
                return $ret
            fi
        fi
        chown mysql:mysql "$datadir"
        chmod 0755 "$datadir"
        # Pass all the options determined above, to ensure consistent behavior.
        # In many cases mysqld_safe would arrive at the same conclusions anyway
        # but we need to be sure.
        /usr/bin/mysqld_safe --defaults-file=/etc/my.server2.cnf --datadir="$datadir" --socket="$socketfile"
                --log-error="$errlogfile" --pid-file="$mypidfile"
                >/dev/null 2>&1 &
        ret=$?
        # Spin for a maximum of N seconds waiting for the server to come up.
        # Rather than assuming we know a valid username, accept an "access
        # denied" response as meaning the server is functioning.
        if [ $ret -eq 0 ]; then
            STARTTIMEOUT=30
            while [ $STARTTIMEOUT -gt 0 ]; do
                RESPONSE=`/usr/bin/mysqladmin -uUNKNOWN_MYSQL_USER ping 2>&1` && break
                echo "$RESPONSE" | grep -q "Access denied for user" && break
                sleep 1
                let STARTTIMEOUT=${STARTTIMEOUT}-1
            done
            if [ $STARTTIMEOUT -eq 0 ]; then
                    echo "Timeout error occurred trying to start MySQL Daemon."
                    action $"Starting $prog: " /bin/false
                    ret=1
            else
                    action $"Starting $prog: " /bin/true
            fi
        else
            action $"Starting $prog: " /bin/false
        fi
        [ $ret -eq 0 ] && touch /mysql2/mysql/lock/mysqld
        return $ret
}
stop(){
        MYSQLPID=`cat "$mypidfile"  2>/dev/null `
        if [ -n "$MYSQLPID" ]; then
            /bin/kill "$MYSQLPID" >/dev/null 2>&1
            ret=$?
            if [ $ret -eq 0 ]; then
                STOPTIMEOUT=60
                while [ $STOPTIMEOUT -gt 0 ]; do
                    /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
                    sleep 1
                    let STOPTIMEOUT=${STOPTIMEOUT}-1
                done
                if [ $STOPTIMEOUT -eq 0 ]; then
                    echo "Timeout error occurred trying to stop MySQL Daemon."
                    ret=1
                    action $"Stopping $prog: " /bin/false
                else
                    rm -f /mysql2/mysql/lock/mysqld
                    rm -f "$socketfile"
                    action $"Stopping $prog: " /bin/true
                fi
            else
                action $"Stopping $prog: " /bin/false
            fi
        else
            ret=1
            action $"Stopping $prog: " /bin/false
        fi
        return $ret
}
restart(){
    stop
    start
}
condrestart(){
    [ -e /mysql2/mysql/lock/mysqld ] && restart || :
}
# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status mysqld
    ;;
  restart)
    restart
    ;;
  condrestart)
    condrestart
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|condrestart|restart}"
    exit 1
esac
exit $?

4-Enable auto startup for new instance and start it

chmod +x /etc/init.d/mysqld.server2
chkconfig mysqld.server2 on
service mysqld.server2 start

5-Set new root  mysql password

mysqladmin -P 3307 --protocol=tcp -u root password 'NEWPASSWORD

6-Connect  and  check the new database

[root@centos-unixmen~]# mysql -P 3307 --protocol=tcp -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 11
Server version: 5.0.45-log Source distribution
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)
mysql>

 

7-Check the running  Daemons.:

 

[root@centos-unixmen~]# ps  -ef | grep -i sql
root      1807     1  0 May23 ?        00:00: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     1896  1807  0 May23 ?        00:44:10 /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
root      6641     1  0 17:05 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/my.server2.cnf --datadir=/mysql2/mysql2/data --socket=/mysql2/mysql/data/mysql.sock --log-error=/mysql2/mysql/log/mysqld.log --pid-file=/mysql2/mysql/run/mysqld.pid
mysql     6735  6641  0 17:05 ?        00:00:00 /usr/libexec/mysqld --defaults-file=/etc/my.server2.cnf --basedir=/usr --datadir=/mysql2/mysql/data --user=mysql --log-error=/mysql2/mysql/log/mysqld.log --pid-file=/mysql2/mysql/run/mysqld.pid --socket=/mysql2/mysql/data/mysql.sock --port=3307
root      7086  7062  0 18:37 pts/0    00:00:00 grep -i sql

Please enjoy