赞
踩
- master(主服务器)
1)开启binlog日志
2)授权主从同步用户
3)备份已有数据
- slave1(从服务器)
1)设置server_id,可不开启binlog日志
2)还原数据(实现主从结构前保证服务器基础数据统一)
3)搭建主从关系
使用CentOS7.9模板机克隆实验虚拟机(配置如下信息)
IP地址使用的是DHCP自动分配,因此请以自己分配的为准!
主机名 | IP地址 | 角色 |
---|---|---|
master | 192.168.8.100 | 主服务器 |
slave1 | 192.168.8.101 | 从服务器1 |
为两台虚拟机配置IP地址、指定阿里镜像站作为yum源
配置master主机
[root@localhost ~]# hostnamectl set-hostname master #配置主机名
[root@master ~]# nmcli connection modify ens33 ipv4.method auto \
connection.autoconnect yes
[root@master ~]# rm -rf /etc/yum.repos.d/*.repo #删除自带的repo文件
[root@master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo \ https://mirrors.aliyun.com/repo/Centos-7.repo #下载阿里镜像源
[root@master ~]# yum clean all #清空缓存
[root@master ~]# yum repolist #查看yum
配置slave主机
[root@localhost ~]# hostnamectl set-hostname slave1 #配置主机名
[root@slave1 ~]# nmcli connection modify ens33 ipv4.method auto \
connection.autoconnect yes
[root@slave1 ~]# rm -rf /etc/yum.repos.d/*.repo #删除自带的repo文件
[root@slave1 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo \ https://mirrors.aliyun.com/repo/Centos-7.repo #下载阿里镜像源
[root@slave1 ~]# yum clean all #清空缓存
[root@slave1 ~]# yum repolist #查看yum
2台主机均使用MobaXterm远程链接
将master和slave1搭建成MySQL主从结构
将学习环境中的mysql8-centos7目录上传至master和slave1主机的/root/
[root@master ~]# cd mysql8-centos7/
[root@master mysql8-centos7]# yum -y localinstall *.rpm
master主机指定server_id,开启binlog日志
[root@master ~]# vim /etc/my.cnf
...此处省略1万字,在第4行下方写入,不要写行号!...
4 [mysqld]
5 server_id=100 #指定server_id,每台主机都不一样,可以使用IP地址主机位区分
6 log_bin=master #指定binlog日志名
...此处省略1万字...
[root@master ~]# systemctl restart mysqld #重启动mysqld服务
[root@master ~]# ls /var/lib/mysql/master* #验证是否成功
/var/lib/mysql/master.000001 /var/lib/mysql/master.000002 /var/lib/mysql/master.index
[root@master ~]# grep -i password /var/log/mysqld.log #过滤初始密码(每个人都不一样)
2023-07-16T13:04:50.381204Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: (wgrk:_s(7yQ
[root@master ~]# mysql -uroot -p'(wgrk:_s(7yQ' #连接数据库
mysql> ALTER USER root@"localhost" IDENTIFIED BY '123tedu.CN'; #修改root密码
mysql> SET GLOBAL validate_password.policy=LOW; #设置密码策略
mysql> SET GLOBAL validate_password.length=4; #设置密码长度为4
mysql> SET GLOBAL validate_password.check_user_name=OFF; #关闭用户名检测可以用用户名作为密码
用户授权(用户slave1,密码为slavepwd,这个用户用于从服务器连接主服务器同步数据)
mysql> CREATE USER 'slave1'@'%' IDENTIFIED with mysql_native_password BY 'slavepwd';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
查看日志信息
mysql> SHOW MASTER STATUS ;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| master.000002 | 984 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
备份master主机上的数据(虽然现在没有多余的数据,但工作中一定会有旧数据)
[root@master ~]# mysqldump -hlocalhost -uroot -p'123tedu.CN' -A > ab1.sql #备份已有数据
[root@master ~]# scp ab1.sql 192.168.8.101:/root #同步备份文件(IP不要照抄)
slave1主机安装mysql
将学习环境中的mysql8-centos7目录上传至master和slave1主机的/root/
[root@slave1 ~]# cd mysql8-centos7/
[root@slave1 mysql8-centos7]# yum -y localinstall *.rpm
slave1主机修改server_id
[root@slave1 ~]# vim /etc/my.cnf
......
4 [mysqld]
5 server_id=101 #指定id号,默认与IP地址的主机位相同
......
[root@slave1 ~]# systemctl restart mysqld #重启服务
slave1主机设置密码
[root@slave1 ~]# grep -i password /var/log/mysqld.log #过滤初始密码(每个人都不一样)
2023-07-16T13:33:20.939066Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: (f190mI%onK%
[root@slave1 ~]# mysql -uroot -p'(f190mI%onK%'
修改密码
mysql> ALTER USER root@"localhost" IDENTIFIED BY '123tedu.CN'; #修改root密码
mysql> SET GLOBAL validate_password.policy=LOW; #设置密码策略
mysql> SET GLOBAL validate_password.length=4; #设置密码长度为4
mysql> SET GLOBAL validate_password.check_user_name=OFF; #关闭用户名检测可以用用户名作为密码
还原master主机备份过来的数据
[root@slave1 ~]# mysql -uroot -p'123tedu.CN' < /root/ab1.sql #数据还原
slave1指定主服务器信息
####指定主服务器信息
#MASTER_HOST= 指定主服务器的IP地址
#MASTER_USER= 指定主服务器授权用户
#MASTER_PASSWORD= 指定授权用户的密码
#MASTER_LOG_FILE= 指定主服务器binlog日志文件(到master上查看)
#MASTER_LOG_POS= 指定主服务器binlog日志偏移量(去master上查看)
mysql> CHANGE MASTER TO
-> MASTER_HOST="192.168.8.100", #指定自己主服务器master的IP地址
-> MASTER_USER="slave1",
-> MASTER_PASSWORD="slavepwd",
-> MASTER_LOG_FILE="master.000002",
-> MASTER_LOG_POS=984;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> START SLAVE; #启动SLAVE进程
mysql> SHOW SLAVE STATUS \G; #查看主从同步状态
主服务器master写入数据验证
mysql> CREATE DATABASE som; #新建som库
从服务器slave1写入数据验证
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| som |
| sys |
+--------------------+
5 rows in set (0.00 sec)
主服务器master写入数据验证
mysql> CREATE TABLE som.t1(id INT,name CHAR(10));
mysql> INSERT INTO som.t1 VALUES(1,"Sam");
mysql> INSERT INTO som.t1 VALUES(2,"Jack");
从服务器slave1写入数据验证
mysql> SELECT * FROM som.t1;
+------+------+
| id | name |
+------+------+
| 1 | Sam |
| 2 | Jack |
+------+------+
主机名 | IP地址 | 角色 |
---|---|---|
master | 192.168.8.100 | 主服务器 |
slave1 | 192.168.8.101 | 从服务器1 |
slave2 | 192.168.8.102 | 从服务器2 |
使用CentOS7.9模板机克隆slave2虚拟机,并为该虚拟机配置IP地址和阿里云镜像站点的yum源
配置完基础环境之后为slave2拍摄一张快照命名为"基础环境",用于后边的主从从实验,在操作前还原快照即可
[root@localhost ~]# hostnamectl set-hostname slave2 #配置主机名
[root@slave2 ~]# nmcli connection modify ens33 ipv4.method auto \
connection.autoconnect yes
[root@slave2 ~]# rm -rf /etc/yum.repos.d/*.repo #删除自带的repo文件
[root@slave1 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo \ https://mirrors.aliyun.com/repo/Centos-7.repo #下载阿里镜像源
[root@slave2 ~]# yum clean all #清空缓存
[root@slave2 ~]# yum repolist #查看yum
master主机需要重新完全备份(因为相对与上次备份已经产生了新数据)
[root@master ~]# mysqldump -uroot -p'123tedu.CN' -A > ab2.sql
[root@master ~]# scp ab2.sql 192.168.8.102:/root
slave2主机操作
将学习环境中的mysql8-centos7目录上传至master和slave2主机的/root/
[root@slave2 ~]# cd mysql8-centos7/
[root@slave2 mysql8-centos7]# yum -y localinstall *.rpm #安装MySQL
slave2主机修改server_id
[root@slave2 ~]# vim /etc/my.cnf
......
4 [mysqld]
5 server_id=102 #指定id号,默认与IP地址的主机位相同
......
[root@slave2 ~]# systemctl restart mysqld #重启服务
slave2主机设置密码
[root@slave2 ~]# grep -i password /var/log/mysqld.log #过滤初始密码(每个人都不一样)
2023-07-16T16:28:20.939066Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: eqCaZ1f=2*nu
[root@slave2 ~]# mysql -uroot -p'eqCaZ1f=2*nu'
修改密码
mysql> ALTER USER root@"localhost" IDENTIFIED BY '123tedu.CN'; #修改root密码
mysql> SET GLOBAL validate_password.policy=LOW; #设置密码策略
mysql> SET GLOBAL validate_password.length=4; #设置密码长度为4
mysql> SET GLOBAL validate_password.check_user_name=OFF; #关闭用户名检测可以用用户名作为密码
还原master主机备份过来的数据(使用ab2.sql)
[root@slave2 ~]# mysql -uroot -p'123tedu.CN' < /root/ab2.sql #数据还原
slave2指定主服务器信息
MASTER_LOG_FILE和MASTER_LOG_POS指定为master主机现使用的文件(SHOW MASTER STATUS查看)
master主机查看(每个人都不一样,以自己的为准)
mysql> SHOW MASTER STATUS ;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| master.000003 | 1461 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
####slave2指定主服务器信息
#MASTER_HOST= 指定主服务器的IP地址
#MASTER_USER= 指定主服务器授权用户
#MASTER_PASSWORD= 指定授权用户的密码
#MASTER_LOG_FILE= 指定主服务器binlog日志文件(到master上查看)
#MASTER_LOG_POS= 指定主服务器binlog日志偏移量(去master上查看)
mysql> CHANGE MASTER TO
-> MASTER_HOST="192.168.8.100", #指定自己主服务器master的IP地址
-> MASTER_USER="slave1",
-> MASTER_PASSWORD="slavepwd",
-> MASTER_LOG_FILE="master.000003",
-> MASTER_LOG_POS=1461;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> START SLAVE; #启动SLAVE进程
mysql> SHOW SLAVE STATUS \G; #查看主从同步状态
master测试数据写入
mysql> CREATE TABLE som.t2(id INT,name CHAR(10),male ENUM("male","female"));
mysql> INSERT INTO som.t2 VALUES(1,"Sam","male");
mysql> INSERT INTO som.t2 VALUES(2,"Janner","female");
slave1验证数据是否同步
mysql> USE som;
mysql> SHOW TABLES; #多出了som.t2表
mysql> SELECT * FROM som.t2;
+------+--------+--------+
| id | name | male |
+------+--------+--------+
| 1 | Sam | male |
| 2 | Janner | female |
+------+--------+--------+
2 rows in set (0.00 sec)
slave2验证数据是否同步
mysql> USE som;
mysql> SHOW TABLES; #多出了som.t2表
mysql> SELECT * FROM som.t2;
+------+--------+--------+
| id | name | male |
+------+--------+--------+
| 1 | Sam | male |
| 2 | Janner | female |
+------+--------+--------+
2 rows in set (0.00 sec)
slave1主机既是master主机的从服务器,也是slave2主机的主服务器
slave2使用之前拍摄的"基础环境"快照还原至没有安装MySQL状态
主机名IP | IP地址 | 角色 |
---|---|---|
master | 192.168.8.100 | 主服务器 |
slave1 | 192.168.8.101 | 从服务器/主服务器 |
slave2 | 192.168.8.102 | 从服务器 |
slave1备份所有数据,同步至slave2(主从同步前的准备工作)
[root@slave1 ~]# mysqldump -uroot -p'123tedu.CN' -A > /root/all.sql
[root@slave1 ~]# scp /root/all.sql root@192.168.8.102:/root/
slave1主机启用允许级联复制
[root@slave1 ~]# vim /etc/my.cnf #编辑主配置文件
......
4 [mysqld]
5 server_id=101 #指定id号,默认与IP地址的主机位相同
6 log_bin=master #指定binlog日志
7 log_slave_updates #启用级联复制(本身是主和从两种角色的机器需配置该项)
......
[root@slave1 ~]# systemctl restart mysqld #重启服务
slave2主机安装mysql,修改配置文件,指定serve_id,重启服务
[root@slave2 ~]# cd mysql8-centos7/
[root@slave2 mysql8-centos7]# yum -y localinstall *.rpm
[root@slave2 ~]# vim /etc/my.cnf
......
4 [mysqld]
5 server_id=102 #指定id号,默认与IP地址的主机位相同
......
[root@slave2 ~]# systemctl restart mysqld #重启服务
slave2主机修改密码
[root@slave2 ~]# grep -i password /var/log/mysqld.log #过滤初始密码(每个人都不一样)
2023-07-16T17:38:40.939066Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: awwB%7?uu#yf
[root@slave2 ~]# mysql -uroot -p'awwB%7?uu#yf'
修改密码
mysql> ALTER USER root@"localhost" IDENTIFIED BY '123tedu.CN'; #修改root密码
mysql> SET GLOBAL validate_password.policy=LOW; #设置密码策略
mysql> SET GLOBAL validate_password.length=4; #设置密码长度为4
mysql> SET GLOBAL validate_password.check_user_name=OFF; #关闭用户名检测可以用用户名作为密码
slave2主机还原slave1主机备份的数据
[root@slave2 ~]# mysql -uroot -p'123tedu.CN' < /root/all.sql
slave1主机查看binlog日志和偏移量
mysql> SHOW MASTER STATUS ;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| master.000001 | 157 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
slave2指定slave1为主服务器
####slave2指定主服务器信息 #MASTER_HOST= 指定主服务器的IP地址 #MASTER_USER= 指定主服务器授权用户 #MASTER_PASSWORD= 指定授权用户的密码 #MASTER_LOG_FILE= 指定主服务器binlog日志文件(到master上查看) #MASTER_LOG_POS= 指定主服务器binlog日志偏移量(去master上查看) mysql> CHANGE MASTER TO -> MASTER_HOST="192.168.8.101", #指定slave1主机的IP地址 -> MASTER_USER="slave1", #这个用户slave1从master同步过,如果没有需要授权 -> MASTER_PASSWORD="slavepwd", -> MASTER_LOG_FILE="master.000001, #slave1的日志文件 -> MASTER_LOG_POS=157; #slave1的偏移量 Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> START SLAVE; #启动SLAVE进程 mysql> SHOW SLAVE STATUS \G; #查看主从同步状态 ... Slave_IO_Running: Yes Slave_SQL_Running: Yes ...
master主机写入数据验证链式复制(主从从)
mysql> CREATE TABLE som.t3(id INT,name CHAR(8),age TINYINT UNSIGNED);
mysql> INSERT INTO som.t3 VALUES(1,"tom",8);
mysql> INSERT INTO som.t3 VALUES(2,"jerry",15);;
Query OK, 1 row affected (0.00 sec)
slave1验证数据是否写入
mysql> USE som; mysql> SHOW TABLES ; #多出了som.t3表 +---------------+ | Tables_in_som | +---------------+ | t1 | | t2 | | t3 | +---------------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM som.t3 ; #som.t3表中有数据 +------+-------+------+ | id | name | age | +------+-------+------+ | 1 | tom | 8 | | 2 | jerry | 15 | +------+-------+------+ 2 rows in set (0.00 sec)
slave2验证数据是否写入
mysql> USE som; mysql> SHOW TABLES ; #多出了som.t3表 +---------------+ | Tables_in_som | +---------------+ | t1 | | t2 | | t3 | +---------------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM som.t3 ; #som.t3表中有数据 +------+-------+------+ | id | name | age | +------+-------+------+ | 1 | tom | 8 | | 2 | jerry | 15 | +------+-------+------+ 2 rows in set (0.00 sec)
MySQL主从同步复制模式指的是主服务器(执行写操作的服务器)什么时候将SQL命令的执行结果返还给客户端
分为三种情况:
异步复制(默认)
全同步复制
半同步复制
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。