MySQL主从复制是指数据可以从一个MySQL数据库服务器的主节点复制到一个或多个从节点。主节点记录了所有的写操作,并将这些写操作记录到二进制日志(binary log)中。从节点通过连接主节点,获取并应用这些二进制日志,从而实现数据的复制。
MySQL默认采用异步复制方式,这意味着主节点执行写操作后,并不会等待从节点应用这些操作,而是立即返回给客户端。从节点会异步地接收并应用主节点的二进制日志,以保持与主节点数据的一致性。
从节点可以复制主节点中的所有数据库,也可以选择复制特定的数据库或特定的表。通过配置主节点和从节点的参数,可以进行相应的设置。
Master服务器会记录数据的改变,并将这些改变写入二进制binary log日志
Slave服务器会定期检查Master的二进制日志,如果发现改变,就会请求Master发送二进制事件Master会开启一个I/O线程,将二进制事件发送给Slave并保存到从节点本地的中继日志中
从节点会启动SQL线程,从中继日志中读取二进制日志并在本地重放,使从节点的数据和Master节点保持一致
最后,I/O 线程和SQL 线程会进入睡眠状态,等待下一次被唤醒
提高可用性:当主节点发生故障时,可以快速切换到从节点,确保数据库的持续可用性
负载均衡:将写的请求分发到主节点上,将读操作分发到从节点上,减轻主节点的负载,提高性能
数据备份:从节点可以用作主节点的备份,以防止数据丢失
准备好两台服务器,分别安装MySQL
IP | 类型 |
---|---|
192.168.200.10 | 主节点 |
192.168.200.20 | 从节点 |
第一步:修改主机名
修改192.168.200.10的主机名为master
修改192.168.200.20的主机名为slave
[root@master ~]# hostname -I
192.168.200.10
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# bash
[root@master ~]#
[root@slave ~]# hostname -I
192.168.200.20
[root@localhost ~]# hostnamectl set-hostname slave
[root@localhost ~]# bash
[root@slave ~]#
第二步:下载rpm包
做这一步的时候你要确保你的虚拟机能连通外网,以及要下载wget
这里使用RPM安装MySQL
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
[root@master ~]# ls
anaconda-ks.cfg mysql-community-release-el7-5.noarch.rpm
[root@slave ~]# ls
anaconda-ks.cfg mysql-community-release-el7-5.noarch.rpm
第三步:安装
[root@master ~]# rpm -ivh mysql-community-release-el7-5.noarch.rpm
[root@slave ~]# rpm -ivh mysql-community-release-el7-5.noarch.rpm
[root@master ~]# yum install -y mysql-server
[root@slave ~]# yum install -y mysql-server
第四步:开启mysql服务并设置开机自启
[root@master ~]# systemctl enable mysqld --now
[root@slave ~]# systemctl enable mysqld --now
# 查看状态
[root@master ~]# systemctl status mysqld
[root@slave ~]# systemctl status mysqld
第五步:查看是否暴露了端口
[root@master ~]# netstat -tlnp |grep 3306
tcp6 0 0 :::3306 :::* LISTEN 12093/mysqld
[root@slave ~]# netstat -tlnp |grep 3306
tcp6 0 0 :::3306 :::* LISTEN 11574/mysqld
第六步:设置密码并测试登录
[root@master ~]# mysqladmin -u root password "000000"
[root@slave ~]# mysqladmin -u root password "000000"
[root@master ~]# mysql -uroot -p000000
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '000000';flush privileges;
# root 用户授予所有数据库的所有权限,并设置密码为 '000000'
[root@master ~]# exit;
[root@slave ~]# mysql -uroot -p000000
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '000000';flush privileges;
[root@slave ~]# exit;
第七步:防火墙放行3306端口
[root@master ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
success
[root@master ~]# firewall-cmd --reload
success
[root@slave ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
success
[root@slave ~]# firewall-cmd --reload
success
在SQLyog连接
修改MySQL数据库的配置文件
[root@master ~]# vim /etc/my.cnf
[mysqld]
# 添加如下两行信息
server-id=10
log_bin
重启mysql服务
[root@master ~]# systemctl restart mysqld
登录mysql
显示主节点上的二进制日志文件列表
记住下面的Log_name 和File_size,配置从数据库要用
mysql> show master logs;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| mysqld-bin.000001 | 120 |
+-------------------+-----------+
# Log_name 列显示二进制日志文件的名称
# File_size 列显示二进制日志文件的大小
创建用于复制的账户并授权
授权从节点进行主从复制。执行该命令后,从节点用户 csq
将被授予复制权限,并可以使用密码 000000
连接到主节点进行复制。
mysql> grant replication slave on *.* to 'csq'@'192.168.200.%' identified by '000000';
修改mysql数据库配置文件
[root@slave ~]# vim /etc/my.cnf
[mysqld]
# 添加如下信息
server-id=20
重启mysql服务
[root@slave ~]# systemctl restart mysqld
登录mysql
配置连接主数据库的信息
# 因为配置主数据库的信息参数有很多当你忘记的时候可以查看如下命令
mysql> help change master to;
我们可以复制稍微修改一下
这里要设置刚刚创建的用户账号信息,以及主数据库的IP
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.200.10',
-> MASTER_USER='csq',
-> MASTER_PASSWORD='000000',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mysqld-bin.000001',
-> MASTER_LOG_POS=120;
# MASTER_LOG_FILE 和 MASTER_LOG_POS
# 这两个参数就是指定主数据库的二进制日志文件名称和位置
# 从节点可以确定从哪个位置开始复制数据
启动从节点的主从复制过程。
mysql> start slave;
# 执行该命令后,从节点将开始连接主节点,并开始复制主节点上的二进制日志
查看从数据库的状态
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event # 表示等待主节点发送事件
Master_Host: 192.168.200.10
Master_User: csq
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000001
Read_Master_Log_Pos: 408
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 572
Relay_Master_Log_File: mysqld-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 408
Relay_Log_Space: 746
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_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: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 10
Master_UUID: f6f20d76-222c-11ee-9c60-000c29053974
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
主数据库创建一个数据库CSQ
mysql> create database CSQ;
从数据库查看
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| CSQ |
| mysql |
| performance_schema |
+--------------------+
SQLyog查看