MySQL多实例
## 4.1 MySQL多实例
### 4.1.1 什么是MySQL多实例
MySQL多实例4独特性:
1)独立进程
```
[root@jkl1234 ~]# ps -ef|grep mysql
root 1525 1 0 Jun05 ? 00:00:00 /bin/sh /www/server/mysql/bin/mysqld_safe --datadir=/www/server/data --pid-file=/www/server/data/jkl1234.pid
mysql 2519 1525 0 Jun05 ? 00:11:26 /www/server/mysql/bin/mysqld --basedir=/www/server/mysql --datadir=/www/server/data --plugin-dir=/www/server/mysql/lib/plugin --user=mysql --log-error=jkl1234.err --open-files-limit=65535 --pid-file=/www/server/data/jkl1234.pid --socket=/tmp/mysql.sock --port=3306
root 13263 27434 0 16:59 pts/1 00:00:00 grep --color=auto mysql
root 26764 15976 0 Jun11 pts/0 00:00:00 mysql -uroot -px xx
```
2)独立端口
```
[root@jkl1234 ~]# netstat -lntup|grep 3306
tcp6 0 0 :::3306 :::* LISTEN 2519/mysqld
```
3)独立配置文件
```
[root@jkl1234 ~]# ls /etc/my.cnf
/etc/my.cnf
```
4)独立数据文件
```
ls `cat /etc/my.cnf|grep innodb_data_home_dir|awk -F= '{print $2}'`
```
### 4.1.2 创建多实例
1.创建数据文件目录
```
mkdir -p /data/{3307,3308}/data
chown -R mysql.mysql /data
```
2.创建多实例配置文件
通过cat命令命令快速添加配置文件内容,命令如下:
```
# 3307实例
cat >/data/3307/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3307/data
port=3307
socket= /data/3307/mysql.sock
EOF
# 3308实例
cat >/data/3308/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
EOF
```
3.配置MySQL多实例文件权限
通过下面的命令授权mysql用户和组管理整个多实例的根目录/data。
`chown -R mysql.mysql /data/{3307,3308}/data`
4.初始化多实例数据库文件
(1)初始化MySQL数据库,初始化命令为(相关参数在第三章安装已经详细解释):
```
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data
```
### 4.1.3 启动登录多实例
1.启动多实例
```
临时启动MySQL多实例的命令为:
#<==3307实例启动命令。
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf &
#<==3308实例启动命令。
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3308/my.cnf &
```
```
[root@db01 ~]# netstat -lntup|grep 330
tcp6 0 0 :::33060 :::* LISTEN
31565/mysqld
tcp6 0 0 :::3306 :::* LISTEN
32022/mysqld
tcp6 0 0 :::3307 :::* LISTEN
31562/mysqld
tcp6 0 0 :::3308 :::* LISTEN
31565/mysqld
```
2.登录不同多实例
```
mysql -S /tmp/mysql.sock
mysql -S /data/3307/mysql.sock
mysql -S /data/3308/mysql.sock
```
### 4.1.4 配置命令启动MySQL
```
/data/3307/mysql {start|stop|restart}
/data/3308/mysql {start|stop|restart}
[root@localhost 3307]# cat mysql
#!/bin/bash
case $1 in
start)
/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --user=mysql --port=3307 --socket=/data/3307/mysql.sock >/dev/null 2>&1 &
;;
stop)
kill `netstat -tunpl|grep 3307|awk '{print $7}'|awk -F/ '{print $1}'`
;;
restart)
/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --user=mysql --port=3307 --socket=/data/3307/mysql.sock >/dev/null 2>&1 &
kill `netstat -tunpl|grep 3307|awk '{print $7}'|awk -F/ '{print $1}'`
;;
*)
echo "input (start|stop|restart|disable|enable)..."
;;
esac
cp /data/3307/mysql /etc/init.d/mysqld3307
cp /data/3308/mysql /etc/init.d/mysqld3308
chmod +x /etc/init.d/mysqld3307
chmod +x /etc/init.d/mysqld3308
service mysqld3307 start
service mysqld3308 start
/etc/init.d/mysqld3307 start
/etc/init.d/mysqld3308 start
[root@localhost ~]# service mysqld3307 start
[root@localhost ~]# netstat -tunpl|grep 330
tcp6 0 0 :::3306 :::* LISTEN 14057/mysqld
tcp6 0 0 :::3307 :::* LISTEN 18936/mysqld
tcp6 0 0 :::3308 :::* LISTEN 18042/mysqld
```
## 4.2 多实例应用场景
1.业务不是特别繁忙,且项目多,并且希望业务隔离开.
2.业务不是特别繁忙,想省钱
3.主从复制,读写分离集群环境,节省服务器数量...
4.大厂都会多实例,比如sina、百度、阿里。