概述
1、master開啟二進制日志記錄
2、slave開啟IO進程,從master中讀取二進制日志并寫入slave的中繼日志
3、slave開啟SQL進程,從中繼日志中讀取二進制日志并進行重放
4、最終,達到slave與master中數據一致的狀態,我們稱作為主從復制的過程。
基礎環境設置
防火墻和上下文
#主從
[root@slave ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@slave ~]# getenforce
Enforcing
[root@slave ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@slave ~]# setenforce 0
網絡對時
#主從
[root@localhost ~]# cat /etc/chrony.conf | grep -Ev '^$|#'
server ntp.aliyun.com iburst ###添加或修改
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
[root@master ~]# timedatectl set-timezone Asia/Shanghai
[root@master ~]# date
2025年 07月 05日 星期六 17:18:20 CST
主從配置
主配置
#創建一個從可以登錄的賬戶,并賦予權限
mysql> create user 'slave'@'192.168.157.%' identified by '1230';
Query OK, 0 rows affected (0.01 sec)
#因為要同步所有數據,所以給全部權限
mysql> grant all on *.* to 'slave'@'192.168.157.%';
Query OK, 0 rows affected (0.00 sec)
#主服務文件配置
#屏蔽原有日志文件,新建日志文件,設置id值
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
log-bin=mysql-bin
binlog_format="statement"
server-id=101 #主從必須不一樣
#重啟MySQL服務
[root@master ~]# systemctl restart mysqld
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 157 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#注意:查看位置完畢后,不要對master做insert、update、delete、create、drop等操作!!!
從配置
#修改配置文件
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
relay-log-index=slave-bin.index 1
server-id=202 #與主配置要不一樣 1
#進入MySQL 指向主服務器
[root@slave mysql]# mysql
mysql> change master to master_host='192.168.157.150',master_user='slave',master_password='1230',master_log_file='mysqlbin.000003',master_log_pos=157;
#驗證
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.157.150Master_User: slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000003Read_Master_Log_Pos: 157Relay_Log_File: slave-relay-bin.000002Relay_Log_Pos: 326Relay_Master_Log_File: mysql-bin.000003Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 157Relay_Log_Space: 536Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 101Master_UUID: f2a6f311-51cb-11f0-bd56-000c299bfda5Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace:
測試
#從
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
#主
mysql> create database slave;
Query OK, 1 row affected (0.01 sec)
#從
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| slave |
| sys |
+--------------------+
5 rows in set (0.01 sec)
重復
reset replica;
##用于重置SQL線程對relay log的重放記錄!!