前言
在学习过程中想要通过使用不同端口实现起多个MySQL实例,但是在网上搜寻一番后没能找到一个完整的案例,这是一个学习记录文章,记录我的实现过程和遇到的问题。
一、前置步骤
MySQL想要实现多案例有几种方式,这里记录我学习的一种,使用mysql压缩包的形式通过配置多个配置文件实现。
系统:Linux 版本:CentOS 镜像:Rocky8.6 虚拟机:VMware
MySQL包:mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
ps:本方法需要卸载原有mysql,不要原有my.cnf和mysql-server.cnf文件。
二、步骤
1.配置MySQL相关
1)下载MySQL包
因为使用的是本地虚拟机,所以直接在https://downloads.mysql.com/archives/community/网页选择Linux通用8.0.26版本压缩包,通过远程软件ssh传输进虚拟机
2)解压MySQL包
解压下载的mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz包并移动到/usr/local/mysql目录下:
tar -xf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
mv mysql-8.0.26-linux-glibc2.12-x86_64 /usr/local/mysql
3)创建MySQL组和用户
未安装过MySQL服务的主机是不会有mysql用户,需要自行创建
groupadd mysql
useradd -r -g mysql -s /sbin/nologin mysql
ps:-r 创建系统用户 -g指定基本组 -s指定登陆器
4)修改mysql文件夹权限
chown mysql:mysql -R /usr/local/mysql
chmod 0775 -R /usr/local/mysql/
5)将MySQL命令路径永久加入到PATH变量
vim .bash_profile
在结尾export PATH上添加PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
***
PATH=$PATH:$HOME/bin
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
export PATH
保存后使用source加载配置文件
source .bash_profile
使用echo $PATH查询
echo $PATH
ps:在这里添加后可以输入mysql回车查看是否报错,我这里显示mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory,解决办法为使用yum查询后下载对应包:
yum provides /usr/lib64/libtinfo.so.5
yum -y install ncurses-compat-libs-6.1-9.20180224.el8.x86_64
也可以通过以下命令检查环境:
ldd /usr/local/mysql/bin/mysql
安装后在此运行mysql显示ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)为正常的,因为还没有写配置文件。
2.编写MySQL配置文件
在/etc下编写my.cnf文件:
# vim /etc/my.cnf
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = root
[mysqld1]
datadir = /sqldata/mysqld1
port = 3306
log-error = /sqldata/mysqld1/mysqld1.err
pid-file = /sqldata/mysqld1/mysqld1.pid
socket = /sqldata/mysqld1/mysqld1.sock
[mysqld2]
datadir = /sqldata/mysqld2
port = 3307
log-error = /sqldata/mysqld2/mysqld2.err
pid-file = /sqldata/mysqld2/mysqld2.pid
socket = /sqldata/mysqld2/mysqld2.sock
3.创建存放数据文件夹并初始化
ps:在这里需要注意一下系统语言环境是否为en_US.UTF-8,这对于后面获取密码很重要,若为zh_CN.UTF-8则获取不到密码。
ps的ps:实测对于初始化没影响,只是后面起服务时会出现
Wide character in print at /usr/local/mysql/bin/mysqld_multi line 684.
并不影响正常使用。
查询语言环境:
echo $LANG
修改为en_US.UTF-8
echo 'LANG=en_US.UTF-8' > /etc/default/locale
加载配置文件
source /etc/default/locale
1)创建文件夹
mkdir -p /sqldata/mysqld{1,2}
2)初始化目录
ps:初始化目录需要使用mysqld命令,运行是可能会出现mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory缺少libaio.so.1,使用yum查找/usr/lib64/libaio.so.1并安装对应包。
yum provides /usr/lib64/libaio.so.1
yum -y install libaio-0.3.112-1.el8.x86_64
初始化使用mysqld --initailize --console 因为是自定义数据目录,所以需要使用–datadir指定数据目录,用–user指定用户这样初始化的目录拥有者和属组都为mysql防止因为权限不够而起不了服务。
记录最后一行的密码,若没有显示密码本文后面会给出解决方案
mysqld --initialize --console --datadir=/sqldata/mysqld1 --user=mysql
ps:这里要记住最后一行输出的密码比如:
[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: UQ*TyHyMk3wi
后面的root@localhost: UQTyHyMk3wi分别为登陆用户:root,登陆ip:localhost,和登陆密码:UQTyHyMk3wi
4.起服务
1)起第一个实例服务
ps:新建虚拟机可能没有perl环境,用yum下载个包就行,且因为前文将/usr/local/mysql/bin放入默认环境,所以可以直接使用mysqld_multi命令。
/usr/local/mysql/bin/mysqld_multi start 1
或
mysqld_multi start 1
通过socket连接
mysql -uroot -p'上条命令给出的密码' -S /sqldata/mysqld1/mysqld1.sock
2)起第二个实例服务
/usr/local/mysql/bin/mysqld_multi start 2
或
mysqld_multi start 2
通过socket连接
mysql -uroot -p'上条命令给出的密码' -S /sqldata/mysqld2/mysqld2.sock
3)查询端口
查询端口是否有3306和3307
ss -antulp | grep mysql
4)停止实例
mysqld_multi --user root --password 密码 stop 1
mysqld_multi --user root --password 密码 stop 2
ps:不知道密码解决方式:
先查询端口对应pid
ss -antulp | grep mysql
直接杀死进程
kill 对应PID
修改配置文件/etc/my.cnf添加skip-grant-tables
[mysqld1]
skip-grant-tables
***
[mysqld2]
skip-grant-tables
***
起服务
/usr/local/mysql/bin/mysqld_multi start 1
/usr/local/mysql/bin/mysqld_multi start 2
修改后可以直接无密码登录
mysql -uroot -S /sqldata/mysqld1/mysqld1.sock
查看存放密码的表头名
desc mysql.user ;
把mysql库下user表中 用户root的密码设置为无
update mysql.user set authentication_string="" where user="root";
修改后退出登录将修改的my.cnf中的skip-grant-tables注释掉或者删掉就可以了,之后按上述停服务步骤去掉密码重起一遍服务就可以正常使用,可根据需求重设或不设密码。
总结
本文记录了我通过使用不同端口起多个MySQL实例实现过程和遇到的问题,如果能有效帮助其他人就挺不错的·。