MySql教程

MySQL的多实例

本文主要是介绍MySQL的多实例,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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]# 
这篇关于MySQL的多实例的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!