1.理解MySQL主从复制原理。
2.完成MySQL主从复制。
一、MySQL主从复制原理
MySQL主从复制是指将一个MySQL数据库服务器(称为主服务器)上的数据复制到其他MySQL数据库服务器(称为从服务器)的过程。它的原理如下:
- 主服务器将修改操作记录在二进制日志(二进制日志)中。
- 从服务器连接到主服务器,并请求复制日志的内容。
- 主服务器将二进制日志的内容发送给从服务器。
- 从服务器将接收到的二进制日志应用到自己的数据库中,以保持与主服务器的数据一致性。
(1)主从复制可以实现以下几个目标
- 数据备份:从服务器可以作为主服务器的备份,以防止数据丢失。
- 负载均衡:可以将读操作分散到多个从服务器上,减轻主服务器的压力。
- 高可用性:如果主服务器出现故障,可以快速切换到从服务器提供服务。
(2)MySQL支持的复制类型
1.基于语句( statement )的复制
在主服务器上执行SQL 语句,在从服务器上执行同样的语句。 MySQL 默认采用基于语句的复制,效率比 较高。
2.基于行( row )的复制
把改变的内容复制过去,而不是把命令在从服务器上执行一遍。从MySQL 5.0 开始支持。
3.混合型( mixed )的复制
默认采用基于语句的复制,一旦发现基于语句的无法精确复制时,就会采用基于行的复制。
(3)为什么要做主从复制
灾备
数据分布
负载平衡
读写分离
提高并发能力
(4)如何实现主从复制
在主服务器(master )上
(1)、启用二进制日志
(2)、选择一个唯一的server-id
(3)、创建具有复制权限的用户
在从服务器(slave )上
(1)、启用中继日志 (二进制日志可开启,也可不开启)
(2)、选择一个唯一的server-id
(3)、连接至主服务器,并开始复制
二、完成MySQL主从复制
完成MySQL主从复制,需要执行以下步骤:
配置主服务器:
- 在主服务器的配置文件(通常是my.cnf或my.ini)中启用二进制日志功能。
- 配置一个唯一的server-id。
- 重启主服务器以使配置生效。
创建复制用户:
- 在主服务器上创建一个用于复制的用户,并为其授予REPLICATION SLAVE权限。
备份主服务器数据:
- 在主服务器上执行适当的备份操作,以确保从服务器可以使用这个备份进行初始化。
配置从服务器:
- 在从服务器的配置文件中启用复制功能。
- 配置一个唯一的server-id。
- 重启从服务器以使配置生效。
初始化从服务器:
- 将主服务器上的备份数据导入到从服务器中。
启动复制过程:
- 在从服务器上执行CHANGE MASTER TO命令,指定主服务器的IP地址、复制用户的凭据以及二进制日志文件和位置。
- 启动从服务器的复制进程。
完成上述步骤后,MySQL主从复制将开始运行。你可以通过在主服务器上进行修改操作,然后在从服务器上查看是否同步来验证复制是否成功。
(1)主机环境
主节点: 192.168.186.251 master
从节点 :192.168.186.100 slave1
(2)环境准备
关闭防火墙
[root@master ~]# systemctl disable firewalld
关闭selinux[root@master ~]# setenforce 0
时间同步
主、从服务器使用相同版本的mysql数据库
(3)主节点配置
1.启用二进制日志 ,并为当前节点设置一个全局唯一的ID号,然后创建目录修改权限
[root@master ~]# vim /etc/my.cnf
[mysqld]
log_bin = /data/logbin/mysql-bin
server_id = 1
[root@master ~]# mkdir /data
[root@master ~]# mkdir /data/logbin
[root@master ~]# chown mysql.mysql /data/logbin/
2.重新启动mysql服务
[root@master ~]# systemctl restart mysqld
3.查看/data/logbin/目录是否有数据
[root@master ~]# ls /data/logbin
mysql-bin.000001 mysql-bin.index
4.登录mysql,创建账号,账号授权
[root@master ~]# mysql -uroot -p123456
mysql5.7 [(none)]>create user wp@'192.168.186.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql5.7 [(none)]>grant replication slave on *.* to wp@'192.168.186.%';
Query OK, 0 rows affected (0.01 sec)
mysql5.7 [(none)]>show grants for 'rep'@'192.168.186.%';
+---------------------------------------------------------+
| Grants for rep@192.168.186.% |
+---------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.186.%' |
+---------------------------------------------------------+
1 row in set (0.00 sec)
5.锁表设置只读,查看主库状态
mysql5.7 [(none)]>flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql5.7 [(none)]>show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 28800 |
+-----------------------------+----------+
13 rows in set (0.00 sec)
mysql5.7 [(none)]>show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 607 | | | 388ebd53-291b-11ee-b68c-000c29090543:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
mysql5.7 [(none)]>\q
Bye
6.备份数据库数据
[root@master backup]# mysqldump -uwp -p -A -B | gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
Enter password:
[root@master backup]# ll
total 4
-rw-r--r--. 1 root root 20 Jul 25 11:17 mysql_bak.2023-07-25.sql.gz
(4)从节点设置
设置全局唯一的ID号
[root@slave1 ~]# vim /etc/my.cnf
[mysqld]
server_id=2
(5)在主节点将备份的数据复制到从节点上,并在从节点查看
master:
[root@master ~]# scp /server/backup/mysql_bak.2023-07-25.sql.gz 192.168.186.100:/server/backup
The authenticity of host '192.168.186.100 (192.168.186.100)' can't be established.
ECDSA key fingerprint is SHA256:ZGkVpFFM8KD+H3SRgZmWUpD+IlNK9Dwqcd+TAiGoyzM.
ECDSA key fingerprint is MD5:c2:93:1c:0a:8e:e1:4e:86:cc:90:78:5d:81:42:76:aa.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.186.100' (ECDSA) to the list of known hosts.
root@192.168.186.100's password:
mysql_bak.2023-07-25.sql.gz 100% 20 21.8KB/s 00:00
slave1:
[root@slave1 ~]# ll /server/backup/
总用量 4
-rw-r--r-- 1 root root 20 7月 25 23:35 mysql_bak.2023-07-25.sql.gz
[root@slave1 ~]# cd /server/backup/
[root@slave1 backup]# gzip -d mysql_bak.2023-07-25.sql.gz
[root@slave1 backup]# ll
总用量 0
-rw-r--r-- 1 root root 0 7月 25 23:35 mysql_bak.2023-07-25.sql
(6)设定主从库同步
mysql> change master to
MASTER_HOST='192.168.186.251',
MASTER_PORT=3306,
MASTER_USER='wp',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000025',
MASTER_LOG_POS=194;
(7)启动主从库同步开关
mysql> start slave;
检查状态:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.186.251
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000025
Read_Master_Log_Pos: 194
Relay_Log_File: slave1-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000025
Slave_IO_Running: Yes
Slave_SQL_Running: Yes