mysql5.6多实例配置

 

多实例简述

在一台物理服务器上安装一套Mysql软件程序,创建多个Mysql实例,每个Mysql实例拥有各自独立的数据库、配置文件和启动脚本,多个Mysql实例共享服务器硬件资源(CPUMEM,磁盘,网络)。可以将多实例形像的理解成一个房子里的多个房间,在房子里的浴室、厨房和客厅是公用资源。

 

多实例优劣

优点:

    1、  充分利用服务器富余硬件资源,节约了硬件成本;

    2、  在业务量并不太大,并发度也不高的场景是不错的选择;

缺点:

    1、  共享硬件资源,容易造成资源争用;

    2、  并不适用于大规模高并发的应用场景;

 

多实例配置思路

一、安装Mysql软件 (省略,假定软件的安装目录/usr/local/mysql

二、创建库目录并授权

1
2
3
     mkdir  –p  /data {3306,3307} /data    (存放数据文件,二进制日志,sock和pid文件)
     mkdir  –p  /data/ {3306,3307} /logs   (存放错误日志和慢查询日志)
     chown  –R mysql.mysql  /data

wKiom1TS_G2A_6NhAAB9TCfl8As084.jpg

三、修改配置文件

    1、修改3306的配置文件

    vi /data/3306/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[client] 
port = 3306
socket =  /data/3306/data/mysql .sock
 
[mysqld]
port=3306
socket =  /data/3306/data/mysql .sock
pid- file  /data/3306/data/mysql .pid
basedir =  /usr/local/mysql
datadir =  /data/3306/data
server- id =1
log-bin=mysql-bin
log-bin-index= mysql-bin.index
 
# LOGGING
log_error= /data/3306/logs/mysql-error .log   
slow_query_log_file= /data/3306/logs/mysql-slow .log
slow_query_log=1

 

    2、修改3307的配置文件

    vi /data/3307/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[client]
port = 3307
socket =  /data/3307/data/mysql .sock
  
[mysqld]
port=3307
socket =  /data/3307/data/mysql .sock
pid- file  /data/3307/data/mysql .pid
basedir =  /usr/local/mysql
datadir =  /data/3307/data
server- id =3
log-bin=mysql-bin
log-bin-index= mysql-bin.index
 
# LOGGING
log_error= /data/3307/logs/mysql-error .log   
slow_query_log_file= /data/3307/logs/mysql-slow .log
slow_query_log=1

 

其余配置文件参数可根据实际情况做修改

 

四、初始化数据库 

1
       cd  /usr/local/mysql/scripts

       13306数据库初始化

1
2
       . /mysql_install_db  --defaults- file = /data/3306/my .cnf--user=mysql  \
       --basedir= /usr/local/mysql  --datadir= /data/3306/data

 

23307数据库初始化

1
2
       . /mysql_install_db  --defaults- file = /data/3307/my .cnf--user=mysql  \
       --basedir= /usr/local/mysql  --datadir= /data/3307/data

 

五、修改启动脚本

    可自行编写一个启动脚本,可参考/etc/init.d/portmap进行编写

    脚本思想:

    1、  启动mysql,使用mysqld_safe启动

1
2
    mysqld_safe--defaults- file = /data3306/my .cnf --user=mysql  \
    --basedir= /usr/local/mysql--datadir = /data/3306/data   &

    2、  停止mysql,使用mysqladmin平滑停止

1
    mysqladmin –uroot –p123456 –S /data/3306/data/mysql .sock  shutdown

    3、  重启mysql

    先停止,后启动。

    示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/bin/sh
  
# This is an interactive program, we needthe current locale
[ -f  /etc/profile .d /lang .sh ] && . /etc/profile .d /lang .sh
# We can't Japanese on normal console atboot time, so force.
if  "$LANG"  "ja"  -o "$LANG"  "ja_JP.eucJP"  ];  then
    if  "$TERM"  "linux"  ] ;  then
        LANG=C
    fi
fi
  
# Source function library.
/etc/init .d /functions
  
cmdPath= "/usr/local/mysql/bin"
myPath= "/data/3307"
softPath= "/usr/local/mysql"
socketfile= "$myPath/data/mysql.sock"
my_user= "root"
my_pass= "123456"
  
start(){
         if  [ ! -e  "$socketfile"  ]; then
                 printf  "Mysqldstarting......\n"
                 $cmdPath /mysqld_safe--defaults-file =$myPath /my .cnf --user=mysql \
                 --basedir=$softPath--datadir=$myPath /data  &> /dev/null  &
                 sleep  2
        else
                 printf  "Mysqld alreadyrunning\n"  &&  exit  1
        fi
}
  
  
stop(){
        if  [ -e  "$socketfile"  ]; then
                 printf  "Mysqldstoping......\n"
                 $cmdPath /mysqladmin-u "$my_user"  -p "$my_pass"  \
-S  "$socketfile"  shutdown  &> /dev/null
                 [ $? - ne  0 ] &&  echo "error username or password!!!"  &&  exit  1
                 sleep  3
        else
                 printf  "Mysqld alreadyclosed\n"  &&  exit  1
        fi
}
  
  
restart(){
        stop
         start
}
  
case  "$1"  in
        start)
                 start
        ;;
        stop)
                 stop
        ;;
        restart)
                 restart
        ;;
        status)
                 status mysqld
        ;;
        *)
                 echo  "Usage: $0{start|stop|restart|status}"
                 exit  1
esac

 

六、测试

      1、  查看进程

1
      ps  –ef| grep  mysqld | grep  v  grep

      可以看到四个进程

 

       2、  查看端口

1
       netstat  –nltup| grep  330

       可以看到33063307两个监听端口

 

       3、  测试mysql脚本

1
2
3
4
       /data/3306/data/mysql  start
       /data/3306/data/mysql  stop
       /data/3306/data/mysql  restart
       /data/3306/data/mysql  xxxx

 

七、多实例本地及远程登陆

       1、本地登陆,一定要添加sock区别不同实例

1
       mysql –uroot –p123456 –S  /data/3306/data/mysql .sock

2、远程登陆,与普通mysql连接一样,需要授权

1
       mysql –uroot –p123456 –h 192.168.31.200 –P 3307

 

八、多实例修改口令

       1、非交互式修改口令

1
       mysqladmin –uroot –p123456 password=’newpass’ –S /data/3306/data/mysql .sock

 

       2、root帐户连接到mysql,执行:

1
       mysql> set  passwordfor root@’192.168.31.%’=password(‘newpass’);

 

       3、直接修改mysql.user表来实现:

1
2
        mysql>update userset password=password( 'newpass' ) where host= "192.168.31.%"                       and user= "root"
        mysql>flush privileges;