Mysql 主从

mysql主从复制简述:
Mysql复制的方式:
1: 基于SQL语句的复制(statement-based replication, SBR)
     在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,   会自动选着基于行的复制  
2: 基于行的复制(row-based replication, RBR)
     把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持
3: 混合模式复制(mixed-based replication, MBR)
    默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

Mysql主从的特点:

1:  数据分布 (Data distribution )

2:  负载平衡(load balancing)
3:  备份(Backups)
4:  高可用性和容错行 High availability and failover

Mysql主从复制如何工作
1:  master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
2:  slave将master的binary log events拷贝到它的中继日志(relay log);    
3:  slave重做中继日志中的事件,将改变反映它自己的数据。


Mysql主从复制配置:
Master和slave的MySQL数据库版本必须完全相同,防火墙开通3306端口
1:配置:
 Master
  server-id=1  #Master服务器ID值,一般可以设置为IP最后一位
  log-bin=mysql-bin  #二进制变更日志

  配置完成后,重启mysql服务,然后通过SHOW MASTER STATUS查看状态

  +------------------+----------+--------------+------------------+
  | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  +------------------+----------+--------------+------------------+
  | mysql-bin.000006 |     3757 |              | mysql            |
  +------------------+----------+--------------+------------------+

 Slave:
  log_bin = mysql-bin  #二进制变更日志,Slave中非必须项
  server_id = 2  #Slave服务器ID值,一般可以设置为IP最后一位
  relay_log = mysql-relay-bin  #中继日志
  log_slave_updates = 1  #slave将复制事件写进自己的二进制日志
  read_only = 1  #防止改变数据(除了特殊的线程)
2:添加账户
  Master服务器中添加同步数据的账户,并授予授予REPLICATION SLAVE权限
  GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'tester'@192.168.81.112’ IDENTIFIED BY '123456'
  只允许192.168.81.112访问
3:复制数据
需要将Master数据库复制至Slave中,同时保证复制过程中Master中无新数据写入。这样保证数据一致性。如果数据库数据都是全新的,可忽略

4:启动Slave:
  change master to master_host='192.168.81.133',master_user='tester',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=0
  其中master_log_file和SHOW MASTER STATUS中的保持一致
  通过SHOW SLAVE STATUS\G命令查看Slave设置,然后START SLAVE;启动Slave,

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.81.113
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 3757
               Relay_Log_File: mysqld-relay-bin.000020
                Relay_Log_Pos: 251
        Relay_Master_Log_File: mysql-bin.000006
             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: 3757
              Relay_Log_Space: 552
              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:
               
Notice:
其中以下四项均一一对应,保持一致。同时Slave_SQL_Running和Slave_IO_Running任意一个为No均为有问题存在
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Master_Log_File: mysql-bin.000006
Relay_Master_Log_File: mysql-bin.000006
Read_Master_Log_Pos: 3757
Exec_master_log_pos: 3757


主从深入....后续

MySQL主从复制是一种常见的数据库架构,用于实现数据的高可用性、负载均衡和备份。其核心机制是将库(Master)上的数据变更记录到二进制日志(Binary Log),然后由从库(Slave)读取这些日志并在本地重放,从而实现数据同步。 ### 配置步骤 #### 1. 库配置 在库上需要启用二进制日志,并设置唯一的 `server-id`。以下是一个典型的配置示例: ```ini # /etc/my.cnf [mysqld] server-id = 1 log-bin = mysql-bin binlog-format = ROW binlog-do-db = mydb # 指定需要复制的数据库 expire_logs_days = 7 max_binlog_size = 100M ``` 配置完成后,重启 MySQL 服务以应用更改: ```bash systemctl restart mysqld ``` 接下来,创建一个用于复制的专用用户,并授予相应的权限: ```sql CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'SecurePass123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101'; FLUSH PRIVILEGES; ``` 最后,查看库的状态信息,以便后续在从库中使用这些信息进行连接: ```sql SHOW MASTER STATUS; ``` 此命令将返回当前的二进制日志文件名和位置,这对从库连接至关重要[^2]。 --- #### 2. 从库配置 在从库上也需要设置唯一的 `server-id`,并确保与库不同。此外,还需要指定一些其他参数来支持复制功能: ```ini # /etc/my.cnf [mysqld] server-id = 2 relay-log = mysql-relay-bin log-slave-updates = 1 read-only = 1 ``` 同样地,重启 MySQL 服务以应用新配置: ```bash systemctl restart mysqld ``` 为了保证数据一致性,通常会在初始阶段对库进行一次全量备份,并将其导入到从库中。可以使用 `mysqldump` 工具完成这一操作: ```bash mysqldump -uroot -A --master-data=2 --single-transaction > /tmp/full.sql ``` 然后将该备份文件传输至从库服务器,并执行导入: ```bash mysql < /tmp/full.sql ``` 之后,在从库上执行如下 SQL 命令建立与库的连接: ```sql CHANGE MASTER TO MASTER_HOST='10.0.0.201', MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_PORT=3307, MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=628, MASTER_CONNECT_RETRY=10; ``` 确认无误后,启动复制进程: ```sql START SLAVE; ``` 检查复制状态是否正常: ```sql SHOW SLAVE STATUS\G ``` 理想情况下,`Slave_IO_Running` 和 `Slave_SQL_Running` 字段都应显示为 `Yes`,表示复制链路已成功建立[^4]。 --- #### 3. 数据同步原理 MySQL 主从复制的工作流程如下: - 库将所有的数据变更写入二进制日志; - 从库通过 I/O 线程连接库并请求日志数据; - 库的 Binlog Dump 线程负责发送日志数据给从库; - 从库的 I/O 线程接收到日志后,将其写入本地的中继日志(Relay Log); - 最后,从库的 SQL 线程读取中继日志中的事件,并在本地重放这些 SQL 操作,以保持数据一致性[^2]。 --- #### 4. 生产环境注意事项 在生产环境中部署 MySQL 主从复制时,还需考虑以下几个方面: - **网络稳定性**:确保主从服务器之间的网络连接稳定可靠,避免因网络波动导致复制中断。 - **安全性**:限制复制用户的访问权限,仅允许特定 IP 地址连接;同时建议使用 SSL 加密通信,防止敏感信息泄露。 - **监控与维护**:定期检查复制状态,及时发现并解决延迟或错误问题;可借助第三方工具如 Percona Toolkit 进行自动化监控和优化。 - **故障恢复策略**:制定完善的故障切换方案,例如使用 MHA(Master High Availability)或 Orchestrator 实现自动故障转移,提高系统的可用性。 --- #### 5. 故障排查常见方法 如果遇到复制异常,可以通过以下方式进行排查: - 查看 `SHOW SLAVE STATUS\G` 输出中的 `Last_Error` 字段,了解具体的错误原因; - 检查 MySQL 错误日志,寻找可能的相关警告或错误信息; - 如果是因为网络问题导致复制中断,尝试重新启动复制线程; - 若存在较大的复制延迟,可通过调整 `slave_parallel_workers` 参数启用多线程复制,提升性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值