Mysql多实例实现的3种方式
目录
Mysql多实例实现的3种方式
1.基于多配置文件
1.官网下载:
2.下载:
3.解压
4. 移动压缩包到usr/local目录下,并重命名文件
5. 创建mysql账户
6. 对mysql下所有的文件授权给mysql用户
7. 给mysql用户进行授权
8. 切换成mysql用户
9. 进入mysql文件夹,进行初始化
2.基于mysqld_multi
1.创建多实例数据目录
2.配置Mysql的配
置文件/etc/my.cnf
3.初始化各个实例
4.开启各实例的SSL连接
5.复制多实例脚本到服务管理目录下
6. 添加环境变量
7.测试实例
8. 连接实例
9.允许远程连接mysql
10.关闭实例
11.忘记密码
1.基于多配置文件
通过使用多个配置文件来启动不同的进程,以此来实现多实例。
优点:逻辑简单,配置简单
缺点:管理起来不方便
1.官网下载:
https://dev.mysql.com/downloads/mysql/
2.下载:
wget –O mysql8 -P /opt https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz
3.解压
tar –xvf mysql8
4. 移动压缩包到usr/local目录下,并重命名文件
mv /opt/mysql-8.0.25-linux-glibc2.12-i686/ /opt/mysql8
ls /usr/local/mysql
5. 创建mysql账户
groupadd mysql
useradd -g mysql mysql
6. 对mysql下所有的文件授权给mysql用户
cd /usr/local/mysql
chown -R mysql:mysql ./
7. 给mysql用户进行授权
visudo /etc/sudoers
sed -i '/^root/amysql ALL=(ALL) ALL' /etc/sudoers
sed -n '/^root/,+1p' /etc/sudoers
8. 切换成mysql用户
su mysql
注:This account is currently not available.
用户的shell禁止登录了
cat /etc/passwd | grep mysq
发现它的shell是“/sbin /nologin”,需要将起改成“/bin/bash”
或者删除用户和用户组,新建
userdel -r mysql
groupdel mysql
9. 进入mysql文件夹,进行初始化
cd /opt/mysql3306
1.把etc目录下的my.cnf复制到mysql文件夹下,并且更改名为my.cnf.backup
cp /etc/my.cnf /usr/local/mysql
mv /etc/my.cnf /etc/my.cnf.backup
2.进入mysql文件夹下对my.cnf进行配置修改
vi my.cnf
[mysqld]
### 端口号
port=3306
### 安装目录
basedir=/opt/mysql3306
### 数据存放路径
datadir=/opt/mysql3306/data/
### 会话文件目录
socket=/opt/mysql3306/mysql.sock
# 允许连接失败的最大次数
max_connect_errors=20
# 服务端的字符集编码
character-set-server=utf8
# 默认存储引擎
default-storage-engine=INNODB
# 默认用户
user=root
# 开启慢查询
slow_query_log=on
# 慢查询日志文件目录
slow_query_log_file=/opt/mysql3306/slow-query.log
[client]
### 连接服务端使用的端口号
### 会话文件
socket=/opt/mysql3306/mysql.sock
# 默认字符集编码
default-character-set=utf8
3.修改自带的默认配置
vim ./support-files/mysql.server
# 将文件中的所有有关basedir和datadir的配置全部修改为当前的路径
# 修改support-files文件夹下的mysqld_multi.server文件
vim ./support-files/mysqld_multi.server
4.初始化
cp –r /opt/mysql8 /opt/mysql3306
cp –r /opt/mysql8 /opt/mysql3307
mkdir /opt/mysql3306/data
mkdir /opt/mysql3306/data
cp /etc/my.cnf /opt/mysql3306
cp /etc/my.cnf /opt/mysql3307
./bin/mysqld --defaults-file=/opt/mysql3306/my.cnf --initialize --console --user=root
初始化失败:./bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
解决方法:
yum install -y libaio //安装后在初始化就OK了
检查data文件夹是否为空
5. 启动服务
./bin/mysqld_safe --defaults-file=./my.cnf &
注:
查看my.cnf的权限
权限777,任何一个用户都可以改my.cnf
,存在很大的安全隐患.
chmod 644 /etc/my.cnf
my.cnf设置为用户可读写,其他用户不可写.
6.登录
./bin/mysql --socket=./mysql.sock -uroot -p
2.基于mysqld_multi
通过官方自带的 mysqld_multi 工具,使用单独配置文件来实现多实例
优点: 便于集中管理管理
缺点: 不方便针对每个实例配置进行定制
Mysql多实例即一台服务器上运行多个Mysql服务进程 ,开启不同的服务端口,通过不同的socket 监听不同的服务端口来提供各自的服务
1.创建多实例数据目录
mkdir -p /data/mysql_data{1..2}
2.配置Mysql的配
置文件/etc/my.cnf
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /tmp/mysql_multi.log
[mysqld1]
datadir = /data/mysql_data1 #设置数据目录
socket = /data/mysql.sock1 #设置sock文件存放路径
port = 3306 #设置监听开放端口
user = mysql #设置运行用户
performance_schema = off #关闭监控
innodb_buffer_pool_size = 32M #设置innodb 缓存大小
bind_address = 0.0.0.0 #设置监听IP地址
skip-name-resolve = 0 #关闭DNS反向解析
3.初始化各个实例
初始化完后会在日志中生成密码,记得保存,一会要用
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1
4.开启各实例的SSL连接
/usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1
5.复制多实例脚本到服务管理目录下
cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi
给予脚本可执行权限: chmod +x /etc/init.d/mysqld_multi
加入service服务管理: chkconfig --add mysqld_multi
6. 添加环境变量
vim /etc/profile
export MYSQL_HOME=/usr/local/mysql
export PATH=${MYSQL_HOME}/bin:$PATH
使修改的配置文件生效:source /etc/profile
7.测试实例
查看多个实例状态:mysqld_multi report
启动各个实例 : mysqld_multi start
查看实例的监听端口: ss -tulpn|grep mysqld
8. 连接实例
mysql -S /tmp/mysql.sock1 -p前面生成的密码
进去后修改root密码: set password=password('123456');
flush privileges;
9.允许远程连接mysql
mysql8以前版本:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
mysql8版本:
CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
GRANT ALL ON *.* TO 'root'@'%';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
FLUSH PRIVILEGES;
10.关闭实例
1. 直接使用mysqld_multi来关闭实例
使用mysqld_multi关闭多实例数据库目前来看比较麻烦,需要在my.cnf文件的[mysqld_multi]模块里面配置用户密码,并且各个数据库的用户密码都需要相同,否则无法关闭。
当执行:mysqld_multi stopt时,mysqld_multi会调用mysqladmin去关闭数据库,使用的是[mysqld_multi]里面配置的账号密码,此时3306的密码是正确的
mysqld_multi stop 3306
2. 使用mysqladmin来关闭实例
mysqladmin -h127.0.0.1 -uroot -p -P3306 shutdown
11.忘记密码
1. killall mysqld //杀死msyqld进程,可以多尝试几次
2. mysqld_safe --defaults-file=/data/3306/my.cnf --skip-grant-table & //跳过授权表 后面直接多几个回车
--defaults-file 按实际填写
3.确认程序 ss -antlup | grep 330
4. mysql -uroot -S /data/3306/mysql.sock //登录数据库,不需要输入密码 直接就可以登陆了
5.修改密码
mysql> show databases;
mysql> select user,host,password from mysql.user;
mysql> UPDATE mysql.user SET password = PASSWORD('new password') WHERE user = 'root'