首先你使用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
只有明白这些,才能做出来只用一台主机进行主从配置。