Google Plus

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

Written by Mel Kham on . Posted in Linux tutorials

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

For questions please refer to our Q/A forum at : http://ask.unixmen.com

Mel Kham

Founder of Unixmen, Living in Amsterdam. Am working in my free time to help people to understand the Opensource and to explain them in easy way how to make the fist steps to the the light. Working day and night with my Co-founder Zinovsky to keep this website live even with less resources.

Like us on Facebook

This week Top Posts

Write for us

Recent Comments

Snake

|

Wow, great. That’s what i’m waiting for too. I want to make DC with LDAP ( Active Directory alternative) and SAMBA on Ubuntu. :-)

Blawer

|

Thanks!!!!!!!!!!!!!!!!!! you rules!!! all the other “help” in google are useless… yours was very helpful. Thanks again

piCool

|

Great ! we have another another master trick :-)

Yilmaz Ulugtekin

|

Just delete the space after the slash (/) it will work.

Pat L

|

I tried it and it works with a regular zip file, but if you password-protect the .zip file it does NOT work.

 
IDG Tech Network
Copyright © 2008-2013 Unixmen.com .
Maintained by Anblik .