mysql5.6多实例配置
多实例简述
在一台物理服务器上安装一套Mysql软件程序,创建多个Mysql实例,每个Mysql实例拥有各自独立的数据库、配置文件和启动脚本,多个Mysql实例共享服务器硬件资源(CPU,MEM,磁盘,网络)。可以将多实例形像的理解成一个房子里的多个房间,在房子里的浴室、厨房和客厅是公用资源。
多实例优劣
优点:
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
|
三、修改配置文件
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
|
1、3306数据库初始化
1
2
|
.
/mysql_install_db
--defaults-
file
=
/data/3306/my
.cnf--user=mysql \
--basedir=
/usr/local/mysql
--datadir=
/data/3306/data
|
2、3307数据库初始化
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
|
可以看到3306与3307两个监听端口
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;
|