文章目录
- 1、环境准备
- 1.1、安装MySQL
- 1.2、设置root登录密码
- 2、主库配置
- 2.1、修改my.cnf
- 2.2、重启数据库
- 2.3、检验设置是否成功
- 2.4、建立主从复制的账号
- 3、从库配置
- 3.1、配置my.cnf
- 3.2、配置复制参数
- 3.3、查看从库状态
- 4、测试
- 5、注意事项
- 5.1、接口放行
- 5.2、防火墙关闭
- 5.3、Slave_IO_Running: No
- 6、总结
1、环境准备
本文主要是针对MySQL数据库做个主从复制测试,环境是Linux(在阿里云领取的免费服务器,可以试用一个月),MySQL数据库的版本我这里是5.7.40
主库IP:120.26.60.94
从库IP:120.27.241.69
1.1、安装MySQL
我这里安装的版本是5.7.40
首先进入opt目录,执行下面命令进行下载:
wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
然后执行下面命令进行安装:
rpm -ivh mysql57-community-release-el7-9.noarch.rpm
执行完成后会在/etc/yum.repos.d/
目录下生成两个repo文件mysql-community.repo
mysql-community-source.repo
必须进入到 /etc/yum.repos.d/目录后再执行安装
cd /etc/yum.repos.d/
yum install mysql-server --nogpgcheck //nogpgcheck表示不校验key
下面就表示安装成功了
运行下面命令进行启动:
systemctl start mysqld
设置开机自动启动:
systemctl enable mysqld
其他命令:
# 关闭开机启动
systemctl stop mysqld
# 关闭MySQL
systemctl stop mysqld
# 重启MySQL
systemctl restart mysqld
运行下面命令查看MySQL运行状态:
systemctl status mysqld
如下:
1.2、设置root登录密码
那么如何设置root账户的登录密码呢?可按照下面步骤修改root账户密码:
1、进入MySQL数据配置文件进行修改
vi /etc/my.cnf
再按字母【i】进入编辑模式,然后将下面这一行拷贝进去,放到最后一行,含义是免密码登录
skip-grant-tables
然后按【Esc】后再输入【:wq】,表示保存并退出
然后重启:
systemctl restart mysqld.service
2、直接免密登录
mysql -uroot -p
此时提示要你输入密码,什么都不用输入,直接回车就可以进入数据库了
3、设置密码
你可以使用以下命令来重置root账户的密码:(我这里设置的是AaBa123456,设置最好不要设置的太简单)
5.7以上版本运行:
update user set password= password("123456")where user='root';
5.7以下版本运行:
update user set authentication_string= password("123456")where user='root';
4、删除免密设置
按照刚才的步骤,进入【my.cnf】文件中,将【skip-grant-tables】代码删除,并保存退出,再重启MySQL服务器即可,这样以后就可以使用123456这个密码进行登录了
2、主库配置
下面所有配置都是在主库中进行的
2.1、修改my.cnf
执行下面命令:
vi /etc/my.cnf
然后按字母【i】进入编辑模式,将下面内容拷贝进去即可:(拷贝到【mysqld】节点下面)
[mysqld]
#开启log-bin二进制日志
log-bin=mysql-bin
#配置唯一的服务器ID,一般使用IP最后一位
server-id=94
#添加,允许从服务器更新二进制日志
log-slave-updates=true
#需要同步的数据库,如果有多个,复制多份指定数据库名即可
binlog_do_db=testdb
#不需要同步的数据库,如果有多个,复制多份指定数据库名即可
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#下面不是必须配置
#主要是为了使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性
innodb_flush_log_at_trx_commit = 1
#使binlog在每1次binlog写入后与硬盘同步
sync_binlog = 1
#只保留7天的二进制日志,以防磁盘被日志占满
expire-logs-days=7
然后按【Esc】后,再按【:wq】进行保存并退出操作
2.2、重启数据库
修改完配置文件后需要重启数据库,并查看配置是否生效,执行下面命令进行重启:
systemctl restart mysqld.service
然后在输入下面命令查看MySQL重启后的运行状态:
systemctl status mysqld
OK,到此主库设置完毕
2.3、检验设置是否成功
先使用下面命令登录数据库:
mysql -uroot -p123456
登录成功后输入下面命令检查:
show variables like 'server_id';
再输入命令:
show variables like 'log_bin';
再输入命令:
#skip_networking默认是OFF关闭状态,启用后,主从服务器将无法相互通信,所以这里必须是OFFer
show variables like '%skip_networking%';
OK,全部检查完毕,确实设置成功了
2.4、建立主从复制的账号
同样先登录MySQL之后,执行下面命令:
GRANT REPLICATION SLAVE ON *.* to 'slavetest'@'%' identified by 'root@123456';
注意:
上面SQL的作用是创建一个用户【slavetest】密码为【root@123456】并且给【slavetest】用户授予REPLICATION SLAVE权限,常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制,如下:
然后执行下面命令:
#查看master的状态
show master status\G
就不用再执行其他命令了
上面结果中的File和Position的值需要记录一下,待会要用到
主库的配置就搞完了,都已经做好准备了,下面我们开始搞从库
3、从库配置
先在从库上执行下面语句检查下刚刚建立的账号是否可以连接
#IP是主库IP
mysql -uslavetest -p'root@123456' -h120.26.60.94
确定可以连接
3.1、配置my.cnf
执行下面命令编辑my.cnf
vi /etc/my.cnf
然后在【mysqld】节点下面新增下面内容:
#配置唯一的服务器ID,一般使用IP最后一位
server-id=69
如下:
然后重启数据库,并查看刚配置的是否生效:
systemctl restart mysqld
mysql -uroot -p123456
show variables like 'server_id';
show variables like 'log_bin';
如果报错:
那就执行:
ALTER USER USER() IDENTIFIED BY 'Admin2023!';
就可以了执行了:
3.2、配置复制参数
配置同步,注意 MASTER_LOG_FILE 和 MASTER_LOG_POS 的值要与Master的一致,登录MySQL后运行下面语句:
CHANGE MASTER TO MASTER_HOST='120.26.60.94',MASTER_USER='slavetest',MASTER_PASSWORD='root@123456',MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=434;
下面是主库的参数:
如果执行失败,就执行:reset slave;
我这里执行成功了,就可以直接执行下面语句了:
start slave;
3.3、查看从库状态
执行下面命令查看从库状态:
show slave status\G
参数介绍:
# 负责与主机的io通信
Slave_IO_Running: Yes
# 负责自己的slave mysql进程
Slave_SQL_Running: Yes
若出错,则清理掉之前的配置,执行以下命令:
mysql> stop slave;
mysql> reset slave all;
4、测试
在我本地用Navicat工具连接主库和从库:
目前两个库都是一样的库,我现在在主库上面新建一个【testdb】数据库,然后从库直接刷新,就可以看到这个数据库了,同样的,你在主库上新建什么表,添加什么数据,刷新从库后,会发现,数据都在了,说明测试成功了,现在主从复制功能就实现了:
5、注意事项
如果你设置都已经设置好了,确保没有问题了,但是本机windows就是无法远程连接Linux中的MySQL服务器的话,那就需要检查下:
- 接口是否放行
- 防火墙是否关闭
一般情况下,需要检查下Linux服务器的防火墙是否关闭,然后检查端口是否放行(不放行的话其他服务器上连接不成功的)
5.1、接口放行
我这里是阿里云的服务器,所以登录到阿里云的控制台中,如下这样配置:
5.2、防火墙关闭
防火墙相关命令:
- 远程访问linux时,需要关闭防火墙,否则访问linux上的tomcat,mysql等服务可能会失败;
- 查看防火墙状态: systemctl status firewalld.service(绿的running表示防火墙开启)
- 执行关闭命令(立即关闭 - 立即生效): systemctl stop firewalld.service
- 再次执行查看防火墙命令:systemctl status firewalld.service
- 执行开机禁用防火墙自启命令(永久关闭 - 重启生效): systemctl disable firewalld.service
- 开启防火墙:systemctl start firewalld.service
5.3、Slave_IO_Running: No
一般出现这样的问题有以下几种情况,逐一检查下即可:
- 网络不通
- my.cnf 配置有问题
- 密码、file 文件名、pos 偏移量不对
- 防火墙没有关闭
6、总结
- 本文梳理出了在Linux环境中如何做主从复制,希望对大家有帮助
如果本文对你有帮助的话,记得点赞+关注哦