mysql主从复制搭建

主从同步介绍

什么是MySQL的主从同步:

主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。

怎么实现MySQL的主从同步:

MySQL 主从复制是基于主服务器在二进制日志跟踪所有对数据库的更改。因此,要进行复制,必须在主服务器上启用二进制日志。
每个从服务器从主服务器接收已经记录到日志的数据。当一个从服务器连接到主服务器时,它通知主服务器从服务器日志中读取最后一个更新成功的位置。
主服务器记录二进制日志:主服务器上的数据变化(如INSERT、UPDATE、DELETE操作)被记录到二进制日志(binlog)中。
从服务器读取二进制日志:从服务器通过I/O线程从主服务器读取二进制日志并写入本地的中继日志(relay log)。
从服务器应用中继日志:从服务器的SQL线程读取中继日志并执行其中的SQL语句,使从服务器的数据与主服务器的数据保持同步。

从服务器接收从那时发生起的任何更新,并在主机上执行相同的更新。然后封锁等待主服务器通知的更新。
从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。

在这里插入图片描述

MySQL主从同步复制模式

MySQL主从同步复制模式指的是主服务器(执行写操作的服务器)什么时候将SQL命令的执行结果返还给客户端

分为三种情况:

  • 异步复制(默认)
    • 主节点在执行写操作后,将写操作的日志异步发送到从节点。主节点不会等待从节点的同步完毕,直接讲结果返回给客户端,因此主节点可以以较高的速度执行写操作,而从节点可能会有一定的延迟。由于异步复制的延迟,如果主节点故障或数据丢失,可能会造成从节点数据与主节点不一致。
  • 全同步复制
    • 在全同步复制中,主节点在执行写操作后,等待所有从节点全部同步完数据之后,在将结果返回至客户端这样可以确保主节点和从节点的数据一致性,但会影响主节点的写操作速度,因为主节点需要等待从节点的确认。
  • 半同步复制
    • 在半同步复制中,主节点在执行写操作后,等待至少一个从节点同步完数据再将结果返回至客户端。这样可以提高主节点的写操作速度,同时保证主节点和至少一个从节点的数据一致性。但如果从节点故障或延迟高,可能会造成主节点的等待时间增加。
主从复制的类型

基于二进制日志复制(有三种形式)

  • 基于SQL语句的复制;

  • 基于行的复制;

  • 混合模式复制。

    基于GTID复制(Mysql版本 >= 5.7及以上推荐使用)

Mysql主从同步搭建

环境准备

zyj86 192.168.3.86 主库
zyj87 192.168.3.87 从库

安装mysql服务

dnf module install mysql -y
systemctl start mysqld
#登录mysql 修改root密码
mysql -uroot -p 
mysql> ALTER USER root@"localhost" IDENTIFIED BY 'aaa...111';

如果想使用简单密码可以修改密码策略

mysql> SET GLOBAL validate_password.policy=LOW;					#设置密码策略
mysql> SET GLOBAL validate_password.length=4;					#设置密码长度为4
mysql> SET GLOBAL validate_password.check_user_name=OFF;   #关闭用户名检测可以用用户名作为密码
配置主库

创建需要同步的数据库

mysql> create database HA;
mysql> use HA;
mysql> create table usr(id int,name varchar(20));

修改主库配置文件

vim /etc/my.cnf.d/mysql-server.cnf
server_id=1                     #指定server_id,每台主机都不一样
log-bin=mysql-bin-master        #启用二进制日志
binlog-do-db=HA                 #可以被从服务器复制的库, 二进制需要同步的数据库名,测试*****,之前存在的数据库不会被同步,需要导出数据到从库
binlog-ignore-db=mysql          #不可以被从服务器复制的库

指定同步的数据库或忽略的数据库

binlog_do_db 和 binlog_ignore_db 参数是互斥的,通常只选择其中一个进行设置。它们只能在启动命令行中或在配置文件中设置。如果同时指定了多个数据库,那么需要将它们分行写入,例如:

# 指定 db1 db2 记录binlog
[mysqld]
binlog_do_db = db1
binlog_do_db = db2

# 不让 db3 db4 记录binlog
[mysqld]
binlog_ignore_db = db3
binlog_ignore_db = db4

当 binlog_do_db 为空时,所有的数据库操作都会被记录到二进制日志中,除非 binlog_ignore_db 参数中指定了某些数据库。相反,当 binlog_ignore_db 为空时,没有任何数据库操作会被排除出二进制日志,除非 binlog_do_db 参数中指定了某些数据库

用户授权(用户slaveusr,密码为slavepwd,这个用户用于从服务器连接主服务器同步数据)

  • 使用 mysql_native_password 插件验证该用户的密码
  • REPLICATION SLAVE 表示使用户拥有向主服务器复制的权限
mysql> CREATE USER 'slaveusr'@'%' IDENTIFIED with mysql_native_password BY 'slavepwd';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slaveusr'@'%';

重启动mysqld服务

systemctl restart mysqld

查看状态信息:

mysql> show master status;
+-------------------------+----------+--------------+------------------+-------------------+
| File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| mysql-bin-master.000002 |      157 | HA           | mysql            |                   |
+-------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

查看主数据库是否启用二进制日志

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.01 sec)

查看二进制日志

mysql> show binlog events\G
*************************** 1. row ***************************
   Log_name: mysql-bin-master.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 126
       Info: Server ver: 8.0.36, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: mysql-bin-master.000001
        Pos: 126
 Event_type: Previous_gtids
  Server_id: 1
End_log_pos: 157
       Info: 
*************************** 3. row ***************************
   Log_name: mysql-bin-master.000001
        Pos: 157
 Event_type: Stop
  Server_id: 1
End_log_pos: 180
       Info: 
3 rows in set (0.00 sec)

**注意:**阻止主数据库的更改,如果能保证在数据库配置期间不对主数据库进行变更,可以跳过这一步

在数据库上加上读锁定

mysql> FLUSH TABLES WITH READ LOCK;

在所有配置完成之后,释放锁定(下面这条语句暂时不执行,在配置完成之后再释放)

mysql> UNLOCK TABLES;

至此主库配置完成

配置从数据库

测试从库是否可以连接主库

mysql -uslaveusr -pslavepwd -h 192.168.3.86

备份master主机上的数据(虽然现在没有多余的数据,但工作中一定会有旧数据)

备份已有HA数据库的数据

mysqldump -hlocalhost -uroot -p'aaa...111' -B HA > habackup.sql

拷贝到从库所在机器

scp habackup.sql 192.168.3.87:/root/habackup.sql

导入数据库

mysql -uroot -paaa...111 < /root/habackup.sql

修改从库配置文件

vim /etc/my.cnf.d/mysql-server.cnf
server-id=2

重启mysqld服务

systemctl restart mysqld

查看主服务器binlog日志状态

mysql> show master status;
+-------------------------+----------+--------------+------------------+-------------------+
| File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| mysql-bin-master.000002 |      157 | HA           | mysql            |                   |
+-------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

设置从库连接主库信息

#MASTER_HOST=       				指定主服务器的IP地址
#MASTER_USER=       				指定主服务器授权用户 
#MASTER_PASSWORD=   				指定授权用户的密码
#MASTER_LOG_FILE=   				指定主服务器binlog日志文件(到master上查看)
#MASTER_LOG_POS=   					指定主服务器binlog日志偏移量(去master上查看)

#先停止SLAVE进程
mysql> STOP SLAVE;

#指定主服务器信息
mysql> CHANGE MASTER TO MASTER_HOST="192.168.3.86",MASTER_USER="slaveusr",MASTER_PASSWORD="slavepwd", MASTER_LOG_FILE="mysql-bin-master.000002",MASTER_LOG_POS=157;

#启动SLAVE进程
mysql> START SLAVE;

查看从库同步状态

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.3.86
                  Master_User: slaveusr
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin-master.000002
          Read_Master_Log_Pos: 157
               Relay_Log_File: zyj87-relay-bin.000002
                Relay_Log_Pos: 333
        Relay_Master_Log_File: mysql-bin-master.000002
             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: 157
              Relay_Log_Space: 543
              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: 1
                  Master_UUID: 74be5df6-6a96-11ef-b1e2-000c29298301
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           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
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)

主库查看进程列表

mysql> show processlist\G

*************************** 2. row ***************************
     Id: 15
   User: slaveusr
   Host: 192.168.3.87:34662
     db: NULL
Command: Binlog Dump
   Time: 393
  State: Source has sent all binlog to replica; waiting for more updates
   Info: NULL

state 状态:Master 已经将所有binlog 发送到slave; 等待更多更新

插入数据测试同步

主库插入数据

mysql -uroot -paaa...111

mysql> use HA;

mysql> show tables;
+--------------+
| Tables_in_HA |
+--------------+
| usr          |
+--------------+
1 row in set (0.00 sec)

mysql> desc usr;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> INSERT INTO HA.usr VALUES(1,"Sam");
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO HA.usr VALUES(2,"jack");
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM HA.usr;
+------+------+
| id   | name |
+------+------+
|    1 | Sam  |
|    2 | jack |
+------+------+
2 rows in set (0.01 sec)

从库查看

mysql -uroot -paaa...111

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| HA                 |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use HA

mysql> show tables;
+--------------+
| Tables_in_HA |
+--------------+
| usr          |
+--------------+
1 row in set (0.00 sec)

mysql> select * from HA.usr;
+------+------+
| id   | name |
+------+------+
|    1 | Sam  |
|    2 | jack |
+------+------+
2 rows in set (0.00 sec)

至此主从同步就搭建完毕了。

从库停止而主库有写入再次启动也可以继续同步。

搭建完成


但是当我们使用这种位点同步的方式时,两种场景下的操作步骤比较复杂。

1:首次开启主从复制的步骤复杂

  • 第一次开启主从同步时,要求从库和主库是一致的。
  • 找到主库的 binlog 位点。
  • 设置从库的 binlog 位点。
  • 开启从库的复制线程。

2:恢复主从复制的步骤复杂

  • 找到从库复制线程停止时的位点。
  • 解决复制异常的事务。无法解决时就需要手动跳过指定类型的错误,比如通过设置slave_skip_errors=1032,1062。当然这个前提条件是跳过这类错误是无损的。(1062 错误是插入数据时唯一键冲突;1032 错误是删除数据时找不到行)

不论是首次开启同步时需要找位点和设置位点,还是恢复主从复制时,设置位点和忽略错误,这些步骤都显得过于复杂,而且容易出错。所以 MySQL 5.6 版本引入了 GTID,彻底解决了这个困难。

GTID的概念

  • GTID即全局事务ID:global transaction identifier;
  • GTID是一个事务一一对应,并且全局唯一ID;
  • 一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致;
  • GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。 而是使用MASTER_AUTO_POSTION=1的方式开始复制;
  • MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善;
  • 在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

GTID的优势

  • 更简单的实现failover,不用以前那样在需要找log_file和log_pos;
  • 更简单的搭建主从复制;
  • 比传统的复制更加安全;
  • GTID是连续的没有空洞的,保证数据的一致性,零丢失。

GTID的原理

  • 当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中;
  • binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值;
  • sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID;
  • 如果有记录,说明该GTID的事务已经执行,slave会忽略;
  • 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行;
  • 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

基于GTID的主从复制搭建

环境准备

zyj86 192.168.3.86 主库
zyj87 192.168.3.87 从库

安装mysql服务

dnf module install mysql -y
systemctl start mysqld
#登录mysql 修改root密码
mysql -uroot -p 
mysql> ALTER USER root@"localhost" IDENTIFIED BY 'aaa...111';

如果想使用简单密码可以修改密码策略

mysql> SET GLOBAL validate_password.policy=LOW;					#设置密码策略
mysql> SET GLOBAL validate_password.length=4;					#设置密码长度为4
mysql> SET GLOBAL validate_password.check_user_name=OFF;   #关闭用户名检测可以用用户名作为密码
配置主库

创建需要同步的数据库

mysql> create database HA;
mysql> use HA;
mysql> create table usr(id int,name varchar(20));

修改主库配置文件

vim /etc/my.cnf.d/mysql-server.cnf
server_id=1                     #指定server_id,每台主机都不一样
log-bin=mysql-bin-master        #启用二进制日志
binlog-do-db=HA                 #可以被从服务器复制的库, 二进制需要同步的数据库名,之前存在的数据库不会被同步,需要导出数据到从库
binlog-ignore-db=mysql          #不可以被从服务器复制的库
gtid_mode=ON                    # 开启GTID
enforce-gtid-consistency=ON     # 保证GTID的强一致性

GTID模式核心参数:

gtid-mode=on                        --启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true       --强制GTID的一致性
log-slave-updates=1                 --slave更新是否记入日志

指定同步的数据库或忽略的数据库

binlog_do_db 和 binlog_ignore_db 参数是互斥的,通常只选择其中一个进行设置。它们只能在启动命令行中或在配置文件中设置。如果同时指定了多个数据库,那么需要将它们分行写入,例如:

# 指定 db1 db2 记录binlog
[mysqld]
binlog_do_db = db1
binlog_do_db = db2

# 不让 db3 db4 记录binlog
[mysqld]
binlog_ignore_db = db3
binlog_ignore_db = db4

当 binlog_do_db 为空时,所有的数据库操作都会被记录到二进制日志中,除非 binlog_ignore_db 参数中指定了某些数据库。相反,当 binlog_ignore_db 为空时,没有任何数据库操作会被排除出二进制日志,除非 binlog_do_db 参数中指定了某些数据库

用户授权(用户slaveusr,密码为slavepwd,这个用户用于从服务器连接主服务器同步数据)

  • 使用 mysql_native_password 插件验证该用户的密码
  • REPLICATION SLAVE 表示使用户拥有向主服务器复制的权限
mysql> CREATE USER 'slaveusr'@'%' IDENTIFIED with mysql_native_password BY 'slavepwd';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slaveusr'@'%';

重启动mysqld服务

systemctl restart mysqld

查看状态信息:

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin-master.000001
         Position: 336
     Binlog_Do_DB: HA
 Binlog_Ignore_DB: mysql
Executed_Gtid_Set: be66dfd4-6ab8-11ef-8178-000c29298301:1
1 row in set (0.00 sec)

查看主数据库是否启用二进制日志

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.01 sec)

查看二进制日志

mysql> show binlog events\G
*************************** 1. row ***************************
   Log_name: binlog.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 126
       Info: Server ver: 8.0.36, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: binlog.000001
        Pos: 126
 Event_type: Previous_gtids
  Server_id: 1
End_log_pos: 157
       Info: 
*************************** 3. row ***************************
   Log_name: binlog.000001
        Pos: 157
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 236
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 4. row ***************************
   Log_name: binlog.000001
        Pos: 236
 Event_type: Query
  Server_id: 1
End_log_pos: 447
       Info: ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*EF0036DB88787680886352FD7982D31F99BBFAC4' /* xid=7 */
*************************** 5. row ***************************
   Log_name: binlog.000001
        Pos: 447
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 524
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 6. row ***************************
   Log_name: binlog.000001
        Pos: 524
 Event_type: Query
  Server_id: 1
End_log_pos: 626
       Info: create database HA /* xid=8 */
*************************** 7. row ***************************
   Log_name: binlog.000001
        Pos: 626
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 703
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 8. row ***************************
   Log_name: binlog.000001
        Pos: 703
 Event_type: Query
  Server_id: 1
End_log_pos: 828
       Info: use `HA`; create table usr(id int,name varchar(20)) /* xid=13 */
*************************** 9. row ***************************
   Log_name: binlog.000001
        Pos: 828
 Event_type: Stop
  Server_id: 1
End_log_pos: 851
       Info: 
9 rows in set (0.00 sec)

**注意:**阻止主数据库的更改,如果能保证在数据库配置期间不对主数据库进行变更,可以跳过这一步

在数据库上加上读锁定

mysql> FLUSH TABLES WITH READ LOCK;

在所有配置完成之后,释放锁定(下面这条语句暂时不执行,在配置完成之后再释放)

mysql> UNLOCK TABLES;

至此主库配置完成

配置从数据库

测试从库是否可以连接主库

mysql -uslaveusr -pslavepwd -h 192.168.3.86

备份master主机上的数据(虽然现在没有多余的数据,但工作中一定会有旧数据)

备份已有HA数据库的数据

mysqldump -hlocalhost -uroot -p'aaa...111' -B HA --set-gtid-purged=OFF > habackup.sql

拷贝到从库所在机器

scp habackup.sql 192.168.3.87:/root/habackup.sql

导入数据库

mysql -uroot -paaa...111 < /root/habackup.sql

修改从库配置文件

vim /etc/my.cnf.d/mysql-server.cnf
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ON

重启mysqld服务

systemctl restart mysqld

查看主服务器binlog日志状态

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin-master.000001
         Position: 336
     Binlog_Do_DB: HA
 Binlog_Ignore_DB: mysql
Executed_Gtid_Set: be66dfd4-6ab8-11ef-8178-000c29298301:1
1 row in set (0.00 sec)

设置从库连接主库信息

#MASTER_HOST=       				指定主服务器的IP地址
#MASTER_USER=       				指定主服务器授权用户 
#MASTER_PASSWORD=   				指定授权用户的密码
#MASTER_AUTO_POSITION=1             自动确定pos点

#先停止SLAVE进程
mysql> STOP SLAVE;

#指定主服务器信息
mysql> CHANGE MASTER TO MASTER_HOST="192.168.3.86",MASTER_USER="slaveusr",MASTER_PASSWORD="slavepwd",MASTER_AUTO_POSITION=1;

#启动SLAVE进程
mysql> START SLAVE;

查看从库同步状态

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.3.86
                  Master_User: slaveusr
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin-master.000001
          Read_Master_Log_Pos: 336
               Relay_Log_File: zyj87-relay-bin.000002
                Relay_Log_Pos: 566
        Relay_Master_Log_File: mysql-bin-master.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: 336
              Relay_Log_Space: 776
              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: 1
                  Master_UUID: be66dfd4-6ab8-11ef-8178-000c29298301
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: be66dfd4-6ab8-11ef-8178-000c29298301:1
            Executed_Gtid_Set: be66dfd4-6ab8-11ef-8178-000c29298301:1
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)
Master_Log_File: mysql-bin-master.000001      #自动找到
Read_Master_Log_Pos: 336                      #自动找到
Relay_Log_File: zyj87-relay-bin.000002        #本地relay文件
Executed_Gtid_Set: be66dfd4-6ab8-11ef-8178-000c29298301:1  #与master的一致
插入数据测试同步

主库插入数据

mysql -uroot -paaa...111

mysql> use HA;

mysql> show tables;
+--------------+
| Tables_in_HA |
+--------------+
| usr          |
+--------------+
1 row in set (0.00 sec)

mysql> desc usr;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> INSERT INTO HA.usr VALUES(1,"Sam");
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO HA.usr VALUES(2,"jack");
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM HA.usr;
+------+------+
| id   | name |
+------+------+
|    1 | Sam  |
|    2 | jack |
+------+------+
2 rows in set (0.01 sec)

从库查看

mysql -uroot -paaa...111

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| HA                 |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use HA

mysql> show tables;
+--------------+
| Tables_in_HA |
+--------------+
| usr          |
+--------------+
1 row in set (0.00 sec)

mysql> select * from HA.usr;
+------+------+
| id   | name |
+------+------+
|    1 | Sam  |
|    2 | jack |
+------+------+
2 rows in set (0.00 sec)

至此主从同步就搭建完毕了。

从库停止而主库有写入再次启动也可以继续同步。

#添加表字段语句
ALTER TABLE usr ADD age INT;
#插入语句
INSERT INTO HA.usr VALUES(1,"Sam");

SELECT * FROM HA.usr;
±-----±-----+
| id | name |
±-----±-----+
| 1 | Sam |
| 2 | jack |
±-----±-----+
2 rows in set (0.01 sec)


从库查看

```sql
mysql -uroot -paaa...111

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| HA                 |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use HA

mysql> show tables;
+--------------+
| Tables_in_HA |
+--------------+
| usr          |
+--------------+
1 row in set (0.00 sec)

mysql> select * from HA.usr;
+------+------+
| id   | name |
+------+------+
|    1 | Sam  |
|    2 | jack |
+------+------+
2 rows in set (0.00 sec)

至此主从同步就搭建完毕了。

从库停止而主库有写入再次启动也可以继续同步。

#添加表字段语句
ALTER TABLE usr ADD age INT;
#插入语句
INSERT INTO HA.usr VALUES(1,"Sam");
  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL主从复制是指将一个MySQL数据库的变化同步到另一个MySQL数据库上,从而实现数据的备份、负载均衡、读写分离等功能。下面我们来介绍一下MySQL主从复制搭建过程。 1. 配置主服务器 首先需要在主服务器上配置一些参数。打开MySQL配置文件my.cnf,在[mysqld]下添加以下内容: ``` server-id=1 #服务器唯一ID log-bin=mysql-bin #启用二进制日志 binlog-do-db=testdb #指定需要复制的数据库名 ``` 然后重启MySQL服务。 2. 配置从服务器 接着需要在从服务器上配置一些参数。打开MySQL配置文件my.cnf,在[mysqld]下添加以下内容: ``` server-id=2 #服务器唯一ID,要保证与主服务器不同 ``` 然后重启MySQL服务。 3. 创建复制用户并授权 在主服务器上创建一个用于复制的用户,并授权给从服务器使用。在MySQL命令行中输入以下命令: ``` CREATE USER 'replication'@'%' IDENTIFIED BY 'password'; #创建用户 GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%'; #授权 ``` 其中,'password'是复制用户的密码。 4. 获取主服务器状态信息 在主服务器上执行以下命令,获取主服务器的状态信息: ``` SHOW MASTER STATUS; ``` 会显示出如下信息: ``` +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 120 | testdb | | | +------------------+----------+--------------+------------------+-------------------+ ``` 其中,File列和Position列的值会在后面的步骤中用到。 5. 配置从服务器复制信息 在从服务器上执行以下命令,配置从服务器的复制信息: ``` CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replication', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', #主服务器的File值 MASTER_LOG_POS=120; #主服务器的Position值 ``` 其中,master_ip是主服务器的IP地址,'password'是复制用户的密码,mysql-bin.000001和120分别是主服务器的File值和Position值。 6. 开启从服务器复制 在从服务器上执行以下命令,开启从服务器的复制: ``` START SLAVE; ``` 执行成功后,可以使用以下命令查看从服务器的状态: ``` SHOW SLAVE STATUS\G; ``` 如果看到“Slave_IO_Running”和“Slave_SQL_Running”两项都为“YES”,则说明从服务器复制已经正常启动。 至此,MySQL主从复制搭建完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值