MySQL的多实例
MySQL多实例与单实例的区别
单实例
一台linux中,一个mysql,一个进程,一个端口
多实例
一台linux中,多个mysql,多个进程,多个端口
#实例1
/usr/local/mysql/3306/my.cnf
/usr/local/mysql/3306/mysqld
/usr/local/mysql/3306/data
#实例2
/usr/local/mysql/3307/my.cnf
/usr/local/mysql/3307/mysqld
/usr/local/mysql/3307/data
MySQL多实例的部署
基于一个mysql应用
然后初始化三次,生成三个独立的mysql数据目录,即为三个实例
如何准备一个MySQL应用
让你安装一个MySQL
二进制方式安装MySQL
二进制安装MySQL
#二进制安装
wget https://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz
#安装依赖
yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake
#清除之前的环境
#清除mysq客户端的环境变量
#卸载之前的mysql以及停用mysql端口
[root@localhost ~]# vim /etc/profile
[root@localhost ~]# source /etc/profile
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]#
#创建用户
useradd -M -s /sbin/nologin mysql
id mysql
#准备好多实例mysql的安装目录
[root@localhost ~]# mkdir -p /my_mysql/{3306,3307}
[root@localhost ~]# tree /my_mysql/
bash: tree: 未找到命令...
[root@localhost ~]# yum -y install tree
[root@localhost ~]# tree /my_mysql/
/my_mysql/
├── 3306
└── 3307
2 directories, 0 files
[root@localhost ~]#
#解压二进制文件
[root@localhost home]# tar -zxvf mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz -C /application/
#二进制安装目录,已经编译好的,有bin目录的
[root@localhost home]# ls -l /application/
总用量 0
drwxr-xr-x. 13 root root 191 8月 21 11:06 mysql-5.6.50-linux-glibc2.12-x86_64
准备二进制安装所需要的环境
- 准备多个实例
- 3306
- 3307
- 准备各个启动管理脚本
- 数据初始化,生成mysql的初始化data数据
准备多个实例的配置文件
3306的实例的my.cnf
#这是配置客户端的,可以先不配置
[client]
#下面是配置服务端的,需要配置
[mysqld]
#使用的用户名启动
user=mysql
#默认的端口号码
port=3306
#指定进程套接字文件
socket=/my_mysql/3306/mysql.sock
#二进制安装的目录
basedir=/application/mysql-5.6.50-linux-glibc2.12-x86_64/
#数据存储文件
datadir=/my_mysql/3306/data/
log-bin=/my_mysql/3306/mysql-bin
#唯一标识,给主从使用
server-id=1
[mysqld_safe]
#日志错误日志
log-error=/my_mysql/3306/mysql_3306_error.log
#进程id号
pid-file=/my_mysql/3306/mysqld_3306.pid
准备下面的实例配置可以用sed进行修改
#修改306变成3307
[root@localhost 3306]# sed 's/3306/3307/g' my.cnf >> /my_mysql/3307/my.cnf
[root@localhost 3306]# tree ../
../
├── 3306
│ └── my.cnf
└── 3307
└── my.cnf
#修改server-id
[root@localhost 3306]# sed -i 's/^server.*/server-id=2/g' /my_mysql/3307/my.cnf
3307的实例的my.cnf
注意修改如下参数
第一个是,所有的3306换成3307
service-id一定不能和3306的实例重复
#这是配置客户端的,可以先不配置
[client]
#下面是配置服务端的,需要配置
[mysqld]
#使用的用户名启动
user=mysql
#默认的端口号码
port=3307
#指定进程套接字文件
socket=/my_mysql/3307/mysql.sock
#二进制安装的目录
basedir=/application/mysql-5.6.50-linux-glibc2.12-x86_64/
#数据存储文件
datadir=/my_mysql/3307/data/
log-bin=/my_mysql/3307/mysql-bin
#唯一标识,给主从使用
server-id=2
[mysqld_safe]
#日志错误日志
log-error=/my_mysql/3307/mysql_3307_error.log
#进程id号
pid-file=/my_mysql/3307/mysqld_3307.pid
mysql_3306启停脚本
#!/bin/bash
port=3306
mysql_user="mysql"
Cmdpath="/application/mysql-5.6.50-linux-glibc2.12-x86_64/bin"
mysql_sock="/my_mysql/${port}/mysql.sock"
mysqld_pid_file_path=/my_mysql/${port}/mysqld_${port}.pid
start (){
if [ ! -e "$mysql_sock" ];then
printf "Starting Mysql..../n"
/bin/sh ${Cmdpath}/mysqld_safe --default-file=/my_mysql/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
sleep 3
else
printf "MySQL is running.../n"
exit 1z
fi
}
stop(){
if [ ! -e "$mysql_sock" ] ;then
printf "MySQL is stopped.../n"
exit 1
else
prinitf "Stoping MySQL.../n"
mysqld_pid=`cat "$mysqld_pid_file_path"`
if(kill -0 $mysqld_pid 2>/dev/null)
then
kill $mysqld_pid
sleep 2
fi
fi
}
restart(){
printf "Restarting MySQL.../n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage: /my_mysql/${port}/mysql{start|stop|restart}/n"
esac
赋予权限
[root@localhost 3307]# chmod +x mysql_3307
[root@localhost 3307]# ls -l
总用量 8
-rw-r--r--. 1 root root 585 8月 21 12:15 my.cnf
-rwxr-xr-x. 1 root root 916 8月 21 12:40 mysql_3307
[root@localhost 3307]# chmod +x ../3306/mysql_3306
[root@localhost 3307]#
mysql_3307启停脚本
需要更改port就行
同时也要赋予权限
#!/bin/bash
port=3307
mysql_user="root"
Cmdpath="/application/mysql-5.6.50-linux-glibc2.12-x86_64/bin"
mysql_sock="/my_mysql/${port}/mysql.sock"
mysqld_pid_file_path=/my_mysql/${port}/mysqld_${port}.pid
start (){
if [ ! -e "$mysql_sock" ];then
printf "Starting Mysql..../n"
/bin/sh ${Cmdpath}/mysqld_safe --default-file=/my_mysql/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
sleep 3
else
printf "MySQL is running.../n"
exit 1z
fi
}
stop(){
if [ ! -e "$mysql_sock" ] ;then
printf "MySQL is stopped.../n"
exit 1
else
prinitf "Stoping MySQL.../n"
mysqld_pid=`cat "$mysqld_pid_file_path"`
if(kill -0 $mysqld_pid 2>/dev/null)
then
kill $mysqld_pid
sleep 2
fi
fi
}
restart(){
printf "Restarting MySQL.../n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage: /my_mysql/${port}/mysql{start|stop|restart}/n"
esac
赋予执行权限
用户、用户组赋权
降低权限,赋予mysql权限
[root@localhost ~]# chown -R mysql.mysql /my_mysql/
[root@localhost ~]# ls -l /my_mysql/3306/
总用量 8
-rw-r--r--. 1 mysql mysql 585 8月 21 12:14 my.cnf
-rwxr-xr-x. 1 mysql mysql 916 8月 21 12:38 mysql_3306
[root@localhost ~]# ls -l /my_mysql/
总用量 0
drwxr-xr-x. 2 mysql mysql 38 8月 21 12:38 3306
drwxr-xr-x. 2 mysql mysql 38 8月 21 12:40 3307
[root@localhost ~]#
PATH配置
[root@localhost ~]# vim /etc/profile
[root@localhost ~]# tail -1 /etc/profile
export PATH=$PATH:/application/mysql-5.6.50-linux-glibc2.12-x86_64/bin/
[root@localhost ~]# source /etc/profile
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/application/mysql-5.6.50-linux-glibc2.12-x86_64/bin/
[root@localhost ~]#
创建多个实例的数据目录
分别创建3306和3307的数据目录
[root@localhost ~]# mkdir /my_mysql/3307/data
[root@localhost ~]# mkdir /my_mysql/3306/data
[root@localhost ~]# tree /my_mysql/
/my_mysql/
├── 3306
│ ├── data
│ ├── my.cnf
│ └── mysql_3306
└── 3307
├── data
├── my.cnf
└── mysql_3307
4 directories, 4 files
[root@localhost ~]#
创建之后需要重新赋予权限
[root@localhost ~]# ls -l /my_mysql/3306/
总用量 8
drwxr-xr-x. 2 root root 6 8月 21 13:53 data
-rw-r--r--. 1 mysql mysql 585 8月 21 12:14 my.cnf
-rwxr-xr-x. 1 mysql mysql 916 8月 21 12:38 mysql_3306
[root@localhost ~]# chown -R mysql.mysql /my_mysql/
[root@localhost ~]# ls -l /my_mysql/3306/
总用量 8
drwxr-xr-x. 2 mysql mysql 6 8月 21 13:53 data
-rw-r--r--. 1 mysql mysql 585 8月 21 12:14 my.cnf
-rwxr-xr-x. 1 mysql mysql 916 8月 21 12:38 mysql_3306
[root@localhost ~]#
见证多实例化MySQL的初始化
先初始化3306的数据
#执行初始化,生成mysql运行所需要的数据
[root@localhost ~]# /application/mysql-5.6.50-linux-glibc2.12-x86_64/scripts/mysql_install_db --defaults-file=/my_mysql/3306/my.cnf --basedir=/application/mysql-5.6.50-linux-glibc2.12-x86_64/ --datadir=/my_mysql/3306/data/ --user=mysql
#两个OK之后运行成功
#此时会正常生成data数据
[root@localhost ~]# ls -l /my_mysql/3306/data/
总用量 110600
-rw-rw----. 1 mysql mysql 12582912 8月 21 14:04 ibdata1
-rw-rw----. 1 mysql mysql 50331648 8月 21 14:04 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 8月 21 14:00 ib_logfile1
drwx------. 2 mysql mysql 4096 8月 21 14:00 mysql
drwx------. 2 mysql mysql 4096 8月 21 14:04 performance_schema
drwx------. 2 mysql mysql 6 8月 21 14:00 test
在初始化3307的数据
#初始化之前是没有数据的
[root@localhost ~]# ls -l /my_mysql/3307/data/
总用量 0
#执行初始化,生成mysql运行所需要的数据
[root@localhost ~]# /application/mysql-5.6.50-linux-glibc2.12-x86_64/scripts/mysql_install_db --defaults-file=/my_mysql/3307/my.cnf --basedir=/application/mysql-5.6.50-linux-glibc2.12-x86_64/ --datadir=/my_mysql/3307/data/ --user=mysql
#两个OK之后运行成功
#此时会正常生成data数据
[root@localhost ~]# ls -l /my_mysql/3307/data/
总用量 110600
-rw-rw----. 1 mysql mysql 12582912 8月 21 14:06 ibdata1
-rw-rw----. 1 mysql mysql 50331648 8月 21 14:06 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 8月 21 14:06 ib_logfile1
drwx------. 2 mysql mysql 4096 8月 21 14:06 mysql
drwx------. 2 mysql mysql 4096 8月 21 14:06 performance_schema
drwx------. 2 mysql mysql 6 8月 21 14:06 test
[root@localhost ~]#
分别启动mysql的实例
启动3306实例
#确保没有其他数据启动
[root@localhost ~]# netstat -antlp | grep mysql
[root@localhost ~]#
#启动数据库(用启动脚本)
[root@localhost ~]# /my_mysql/3306/mysql_3306 start
Starting Mysql....
/bin/sh: /applicationmysql-5.6.50-linux-glibc2.12-x86_64/bin/mysqld_safe: 没有那个文件或目录
[root@localhost ~]#
#报错,是由于启动脚本写目录少了“/”
翻车日记
指定的mysql的my.cnf使用路径有问题
- 这里是由于在启动脚本中的default错了一定是–defaults-file=
- 记得一定要s
[root@localhost 3306]# /my_mysql/3306/mysql_3306 start
Starting Mysql....
Logging to '/usr/local/mysql/data/localhost.localdomain.err'.
[root@localhost 3306]# netstat -antlp |grep mysql
[root@localhost 3306]#
未创建错误日志的的文件也会报错
[root@localhost 3306]# ./mysql_3306 start
Starting Mysql....
220821 15:07:20 mysqld_safe error: log-error set to '/my_mysql/3306/mysql_3306_error.log', however file don't exists. Create writable for user 'mysql'.
#创建完成之后就正常了
[root@localhost 3306]# touch ./mysql_3306_error.log
[root@localhost 3306]# ./mysql_3306 start
Starting Mysql....
[root@localhost 3306]#
报错总结
- 首先查看my.cnf配置文件的问题
- 查看pid、错误日志目录是否创建、查看basedir、datadir是否正确,权限是否正确
- 查看启动脚本是否正确
- 查看初始化脚本是否正确
在此,多实例配置启动完成
[root@localhost 3306]# netstat -antpu |grep mysql
tcp6 0 0 :::3306 :::* LISTEN 3795/mysqld
tcp6 0 0 :::3307 :::* LISTEN 2974/mysqld
[root@localhost 3306]#
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288375.html