yum安装的mysql8在同一台机器上实现主从配置部署(同一台主机)(图文详解)

首先你使用yum安装了mysql8,还不会安装?(看我其他帖子内容)贼简单

CentOS7用yum安装MySQL8及各个版本_xiaomaomixj的博客-CSDN博客

我们首先部署一下主从配置的环境:

我们可以先看一下/etc/my.cnf文件,里面包含了我们使用yum安装mysql后,数据文件、日志文件等等。

vim /etc/my.cnf

datadir:存放数据库数据的目录(例如:mysql数据库里面的user表)(等会要用

socker:此文件是由mysqld服务运行时生成的文件,用于mysql的连接

log-error:用于存放mysqld的日志消息

pid-file:给予mysqld服务进程id

好了,我们简单的了解一下之后开始部署:

因为我希望这个主从配置并不会影响我原先的mysql,所以我们要准备两套配置文件,一个mysql_1一个mysql_2(mysql_1做主,mysql_2做从):

接下来就是配置文件(路径的话,自己决定):

cd /test
mkdir mysql_master_slave
cd mysql_master_slave
mkdir mysql_1
mkdir mysql_2

最后就是这个样子:

 然后我们分别进入到mysql_1和mysql_2,开始创建配置文件(注意:这里的/var/lib/mysql是上面的datadir的路径)

cd mysql_1
mkdir logs
cp /var/lib/mysql mysql
vim my.cnf
cd mysql_2
mkdir logs
cp /var/lib/mysql mysql
vim my.cnf

vim要填入的内容:

mysql_1(my.cnf):

[client]

port = 3307

[mysqld]

datadir=/test/mysql_master_slave/mysql_1/mysql
log-error=/test/mysql_master_slave/mysql_1/logs/mysqld.log
user=mysql
port = 3307
socket=/test/mysql_master_slave/mysql_1/mysql/mysql.sock

mysql_2(my.cnf):

[client]

port = 3308

[mysqld]

datadir=/test/mysql_master_slave/mysql_2/mysql
log-error=/test/mysql_master_slave/mysql_2/logs/mysqld.log
user=mysql
port = 3308
socket=/test/mysql_master_slave/mysql_2/mysql/mysql.sock

由此,我们可以看到,配置文件里面的路径对应了我们创建的路径(所以说如果你的路径与我的不同,就要自己改了):

 接下来,我们就要把这些文件的权限给mysql:

cd /test
chown -R mysql:mysql mysql_master_slave/

然后我们就可以启动了:

mysql_1:

mysqld --defaults-file=/test/mysql_master_slave/mysql_1/my.cnf

mysql_2:

mysqld --defaults-file=/test/mysql_master_slave/mysql_2/my.cnf

当然如果你不想开很多个终端的话,我们可以让他后台执行(我反正比较喜欢多个终端一块用,方便)

mysqld --defaults-file=/test/mysql_master_slave/mysql_1/my.cnf &
mysqld --defaults-file=/test/mysql_master_slave/mysql_2/my.cnf &

如果你的mysqld提示不是一个命令的话,就要看看你的$PATH变量了:

echo $PATH
find / -name mysqld

可以看到mysqld命令是在$PATH变量里面的 

启动成功后,我们就能看到/test/mysql_master_slave/mysql_1/mysql/mysql.sock和/test/mysql_master_slave/mysql_2/mysql/mysql.sock文件,没启动前它是没有的,前面也说了,他是mysqld服务运行时生成的文件。

sock$:$的意思是正则表达式结尾的意思

lsof -c mysqld|grep sock$

 有了mysql.sock文件,我们就可以利用它进行登录了:

mysql_1:

mysql -uroot -S /test/mysql_master_slave/mysql_1/mysql/mysql.sock -P 3307 -p

mysql_2:

mysql -uroot -S /test/mysql_master_slave/mysql_2/mysql/mysql.sock -P 3308 -p

前面我也说了,(datadir:存放数据库数据的目录(例如:mysql数据库里面的user表),所以它里面就包含了密码)密码就是你原先的mysql的密码

登进去之后,我们测试一下mysql_1和mysql_2是隔离的:

mysql_1:

show databases;
create database xiaomaomi;
show databases;

 mysql_2:

show databases;
show databases;

 我们发现,在mysql_1里面创建的xiaomaomi数据库,在mysql_2里面是没有的。

好了,到这里,主从配置的环境就部署好了。

接下来就是主从配置部署:

先把我们之前登录的mysql关闭掉:

exit

mysql_1: 

 mysql_2:

 然后我们需要把mysql_1和mysql_2的服务关掉(利用kill杀死进程服务):

ps -ef | grep mysqld
kill 36986
kill 37033

 然后我们修改一下mysql_1和mysql_2的配置文件(my.cnf)(需要注意的是主和从的server-id是不能一样的):

binlog-do-db:设置需要同步的数据库,(如果多个数据库用,分割

replicate-do-db:和上面一个意思

mysql_1(主)(my.cnf):

server-id=1
log-bin=mysql-bin
binlog-do-db=xjgg

mysql_2(从)(my.cnf):

server-id=2
log-bin=mysql-bin
replicate-do-db=xjgg

我踩了一个坑(后面会报错,先在这里解决吧),就不给你们演示,在这里解决就行了

 错误:([ERROR] [MY-013117] [Repl] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: MY-013117

原因:因为我们之前对于datadir目录直接复制了,导致目录里面/test/mysql_master_slave/mysql_1/mysql/auto.cnf 和/test/mysql_master_slave/mysql_2/mysql/auto.cnf里面的server-uuid一样

解决:改一下/test/mysql_master_slave/mysql_2/mysql/auto.cnf:

vim /test/mysql_master_slave/mysql_2/mysql/auto.cnf

 内容随便填,只要保证/test/mysql_master_slave/mysql_1/mysql/auto.cnf   和/test/mysql_master_slave/mysql_2/mysql/auto.cnf的server-uuid不一样就行了

然后启动mysql_1服务:

mysqld --defaults-file=/test/mysql_master_slave/mysql_1/my.cnf

mysql_2的服务:

mysqld --defaults-file=/test/mysql_master_slave/mysql_2/my.cnf

然后我们再登录进去:

mysql_1:

mysql -uroot -S /test/mysql_master_slave/mysql_1/mysql/mysql.sock -P 3307 -p

mysql_2:

mysql -uroot -S /test/mysql_master_slave/mysql_2/mysql/mysql.sock -P 3308 -p

首先我们要保持数据一致,分别在mysql_1和mysql_2创建数据库xjgg,并创建test表

CREATE DATABASE xjgg charset utf8;
use xjgg;
CREATE TABLE test (id int PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10),jieshao VARCHAR(30)) charset utf8;
show tables;

mysql_1:

mysql_2:

在mysql_1里面执行:

#创建账户
create user 'zyh'@'127.0.0.1' identified by 'Xmm123456!';

#赋予权限,with grant option这个选项表示该用户可以将自己拥有的权限授权给别人
grant replication slave on *.* to 'zyh'@'127.0.0.1' with grant option;

#改密码&授权超用户,flush privileges 命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里
flush privileges;

#加锁(解锁:unlock tables)
flush tables with read lock;

#这个生成的信息一会要用
show master status;

#解锁
UNLOCK TABLES;

 然后退出,我们用这个账户登陆测试一下:

exit
mysql -uzyh -S /test/mysql_master_slave/mysql_1/mysql/mysql.sock -P 3307 -p

然后在mysql_2里面执行:

用mysql_2的服务登录一下mysql_1的zyh账户测试能不能成功:

mysql -uzyh -h 127.0.0.1 -S /test/mysql_master_slave/mysql_2/mysql/mysql.sock -P 3307 -p

 然后再登录到mysql_2的root账户中:

mysql -uroot -S /test/mysql_master_slave/mysql_2/mysql/mysql.sock -P 3308 -p

master_host = '127.0.0.1',
master_port = 3307,
master_user = 'zyh',
master_password = 'Xmm123456!',
master_log_file='mysql-bin.000001',
master_log_pos=1369;
这些数据都在上面,请一一对应。 

#停止同步
stop slave;

#修改从库指向主库,使用上一步记录的文件名以及位点(注意没到分号就是一条语句)
CHANGE MASTER TO
master_host = '127.0.0.1',
master_port = 3307,
master_user = 'zyh',
master_password = 'Xmm123456!',
master_log_file='mysql-bin.000001',
master_log_pos=1369;

#启动同步
start slave;

#查看从库状态,Slave_IO_Running和Slave_SQL_Running都为yes说明同步成功,如果不为yes,请检查error_log,然后排查相关异常
show slave status\G;

 然后这就算是部署完毕!!!

我们测试一下:

登录进去mysql_1:

mysql -uroot -S /test/mysql_master_slave/mysql_1/mysql/mysql.sock -P 3307 -p

插入几条信息:

use xjgg;
INSERT INTO test (name,jieshao) values ('小猫咪','睡觉使我快乐!'),('张三','法外狂徒'),('李四','没有介绍!');
select * from test;

 然后我们看一下mysql_2有没有自动改变:

mysql -uroot -S /test/mysql_master_slave/mysql_2/mysql/mysql.sock -P 3308 -p

我们直接查询信息:

use xjgg;
select * from test;

 我们发现数据已经同步成功。

建议:MySQL主从机制比较脆弱,需要谨慎操作。如果重启mysql_1,务必要先把mysql_2的salve停掉,也就是说需要在mysql_2上去执行,stop slave 命令,然后再去重启mysql_1的MySQL服务,否则很可能就会中断了。当重启完后,还需要把mysql_2给开启 start slave

个人总结(这是说给作者自己听的):

直接执行mysql登录命令用的mysql.sock是/var/lib/mysql/mysql.sock

直接执行mysqld服务命令用的my.cnf是/etc/my.cnf

只有明白这些,才能做出来只用一台主机进行主从配置。

end...

猜你喜欢

转载自blog.csdn.net/xiaomaomixj/article/details/126110211