第20期 MySQL常规模式的主从搭建

来源:这里教程网 时间:2026-03-01 18:29:10 作者:

MySQL主从数据库复制是基于binlog实现的。熟悉Oracle的朋友都知道,MySQL不是有redo log日志吗?为什么不使用redo log来实现复制呢?原因是MySQL数据库的redo log是存储引擎层的日志,如果不使用innodb作为MySQL数据库的存储引擎是无法实现复制的。    MySQL的redo log日志是innodb存储引擎所独有的,MySQL作为一个支持可插拔存储引擎的数据库,MySQL不仅支持innodb存储引擎,还有MyISAM,Memory等其他存储引擎,对于这些存储引擎的操作需要持久化到binlog日志中,是不会存储到redo log中的。    说白了,就是redo log 是innodb存储引擎层实现的,而binlog是在server服务层实现的。 图片主从复制涉及到如下3个线程:1. 主库binlog dump 线程, Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中.2.从库I/O线程,从库读取主库的二进制日志文件Binlog,写入到从库的中继日志Relay Log;3.从库SQL线程,Slave重做中继日志中的事件,将改变数据更新同步到从库中;复制的流程如下:1. 从库执行完start slave启动命令后,会创建两个线程,I/O线程和SQL线程。2. I/O线程会建立一个到主库的连接,主库会创建一个binlog dump线程来响应这个连接的请求,此时,对主库来说,从库的I/O线程就是一个普通的客户端。3. I/O线程首先告诉主库应该从哪里开发发送二进制日志事件。4. 主库的binlog dump线程开始从指定位置点读取二进制日志事件,并发送给I/O线程。5. I/O线程接受到二进制日志事件后,将写入到relay log日志中。6. SQL线程读取relay log 日志中的日志事件,然后进行SQL重放。这样就实现了从库和主库数据一致的目的。

主从复制案例

前期准备

准备两台虚拟机,需要提前安装好 MySQL数据库(必须要开启二进制日志)。如下所示:

主从库
IP地址
主库
10.10.23.37
从库
10.10.23.38

主库配置

1)修改主库的MySQL核心配置文件/etc/my.conf,并添加如下配置信息:

[mysqld]
# 开启二进制日志(必须)
log-bin = mysql-bin
# MySQL服务ID,保证整个集群环境中唯一,默认为1(必须)
server-id = 1
# 二进制日志格式,默认ROW(可选)最好的row格式
binlog_format = ROW
# 忽略的数据,不需要同步的数据库
# binlog-ignore-db = mysql
# 指定同步的数据库
# binlog-do-db = db01
注意:这里binlog-ignore-db和binlog-do-db配置项没有指定,默认同步所有数据库信息。

2)重启 MySQL服务器。

systemctl restart mysql

3)登录MySQL数据库,创建远程连接的账号,并授予主从复制权限。

# 创建repl用户,并设置密码,该用户可在任意主机连接该MySQL服务
MySQL [(none)]> create user 'repl'@'%' identified by 'repl123456';
# 为'repl'@'%'用户分配主从复制权限
MySQL [(none)]> grant replication slave on *.* to  'repl'@'%';

为了验证创建的复制用户是否有效以及主从库之间的网络是否畅通,可以在从库上进行登陆测试

MySQL [(none)]>mysql -h10.10.23.37 -urepl -prepl123456

4)备份主库为了方便,我这里使用mysqldump进行备份,备份通过scp命令在拷贝到从库上。

mysqldump -uroot -p -h10.10.23.37  --single-transaction  --triggers --master-data=2 -E -R -A > /oradata/backupfile`date +"%Y%m%d%H%M%S"`.sqlscp backupfile20241223161344.sql mysql@10.10.23.38:/oradata

mysqldump 备份时,我们使用了参数--master-data=2,目的是在备份时,在备份文件中记录binlog位置点信息。

从库配置

1)修改从库的MySQL核心配置文件/etc/my.conf,并添加如下配置信息:

[mysqld]
# 开启二进制日志(必须)
log-bin = mysql-bin
# MySQL服务ID,保证整个集群环境中唯一,默认为1(必须)
server-id = 2
# 二进制日志格式,默认ROW(可选)最好的row格式
binlog_format = ROW
# 是否只读,1代表只读,0代表读写
read-only = 1

2)重启 MySQL服务器。

systemctl restart mysql
3)从库执行导入备份。
MySQL [(none)]> source /backup/backupfile20241223161344.sql
4)从库执行change master to 命令。
MySQL [(none)]> 
change master to
master_host='10.10.23.37',
master_port=3306,
master_user='repl',
master_password='repl123456',
master_log_file='mysql-bin00000057',
master_log_pos=896;
master_host:主库的主机信息,可以指定为主机名或者ip
master_port:主库的端口,若不指定,则默认为3306
master_user: 复制的用户
master_password:复制用户的密码
master_log_file和master_log_pos:从库I/O线程启动时,应该从主库的哪个binlog的哪个位置开始读取二进制日志事件。
这里master_log_file='mysql-bin00000057'和
master_log_pos=896信息可以到备份文件中查询。
使用grep命令获得信息。

[root@test oradata]# grep -m 1 "CHANGE MASTER TO"  backupfile20241223161344.sql-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin00000057', MASTER_LOG_POS=896;或者使用[root@test oradata]# head -n30 backupfile20241223161344.sql5)开启主从复制

MySQL [(none)]> start slave;

6)查看主从复制的状态

MySQL [(none)]>  show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.23.37
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin00000057
          Read_Master_Log_Pos: 896
               Relay_Log_File: mysql-relay-bin.000011
                Relay_Log_Pos: 423
        Relay_Master_Log_File: mysql-bin00000057
             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: 896
              Relay_Log_Space: 61
              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: 0
                  Master_UUID: d056e231-616f-11ec-89e7-fa163e153c3c
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read 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: 
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

从状态信息中,主要看 Slave_IO_RunningSlave_SQL_Running的状态,两个均为Yes代表主从复制搭建成功。今天我们就说这么多。请大家继续关注我。酋长彭谈数据库。谢谢。

相关推荐