侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

MySQL 复制详解及简单实例

数据库  /  管理员 发布于 6年前   355

MySQL 复制详解及简单实例

 主从复制技术在MySQL中被广泛使用,主要用于同步一台服务器上的数据至多台从服务器,可以用于实现负载均衡,高可用和故障切换,以及提供备份等等。MySQL支持多种不同的复制技术,诸如单向,半同步异步复制等以及不同级别的复制,诸如数据库级别,表级,跨库同步等等。本文简要描述了一个基本的主从复制并给出示例。 

1、复制的基本原理(步骤)

    a、在主库上把数据更改记录的二进制日志(binary log)
    b、从库上的I/O线程连接到主库并请求发送其二进制日志文件(主库上的binlog dump线程将二进制日志内容发送到从库)
    c、从库上的I/O线程读取主服务发送的二进制内容并将其拷贝到中继日志
    d、从库上的SQL线程读取中继日志并执行日志中包含的更新 

2、为配置文件添加复制项

# 本文的演示基于同一服务器上的多实例环境,其中3406端口用作主库,而3506用作从库。 # 关于多实例的部署可参考: # MySQL多实例配置(一) http://blog.csdn.net/leshami/article/details/40339167 # MySQL多实例配置(二) http://blog.csdn.net/leshami/article/details/40339295 # 3406与3506为都为新装且含缺省库等,所以本文演示中未涉及先迁移主库数据到备库步骤 a、主库上的配置文件 # more my3406.cnf  [mysqld] socket = /tmp/mysql3406.sock port = 3406 pid-file = /data/inst3406/data3406/my3406.pid user = mysql log-error=/data/inst3406/data3406/inst3406.err datadir=/data/inst3406/data3406 basedir=/app/soft/mysql5  #### for master items #### server-id=3406 log_bin=/data/inst3406/log/bin/inst3406bin innodb_flush_log_at_trx_commit=1 sync_binlog=1  b、从库上的配置文件 # more my3506.cnf  [mysqld] socket = /tmp/mysql3506.sock   # Author : Leshami port = 3506# Blog  : <a target="_blank" href="http://blog.csdn.net/leshamipid-file" rel="external nofollow" >http://blog.csdn.net/leshami pid-file</a> = /data/inst3506/data3506/my3506.pid user = mysql log-error=/data/inst3506/data3506/inst3506.err datadir=/data/inst3506/data3506 basedir=/app/soft/mysql5  #### for slave items #### server-id=3506 relay_log=/data/inst3506/log/relay/relay-bin read_only=1 

3、创建复制账号

#启动端口为3406的实例并添加账户 [mysql@app ~]$ mysqld_safe --defaults-file=/data/inst3406/data3406/my3406.cnf & [mysql@app ~]$ mysql -P3406  #登陆到3406  master@localhost[(none)]> show variables like 'server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id   | 3406 | +---------------+-------+  #创建用于复制的账户 master@localhost[(none)]> grant replication slave,replication client on *.*   -> to repl@'192.168.1.177' identified by 'repl';  #初始化主库日志文件,生成环境慎用reset master@localhost[(none)]> reset master; Query OK, 0 rows affected (0.01 sec)  #查看主库的状态,日志初始化至000001, master@localhost[(none)]> show master status,Position为120 +--------------------+----------+--------------+------------------+-------------------+ | File        | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +--------------------+----------+--------------+------------------+-------------------+ | inst3406bin.000001 |   120 |       |         |          | +--------------------+----------+--------------+------------------+-------------------+ 

4、配置主从同步

#启动端口为3506的实例 [mysql@app ~]$ mysqld_safe --defaults-file=/data/inst3506/data3506/my3506.cnf &  [mysql@app ~]$ msyql -P3506  slave@localhost[(none)]> show variables like 'server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id   | 3506 | +---------------+-------+ 1 row in set (0.00 sec)  #为从库添加指向主库的相关配置信息,该命令会生成及修改备库上的master.info及relay-log.info文件 slave@localhost[(none)]> CHANGE MASTER TO MASTER_HOST='192.168.1.177',   -> MASTER_USER='repl',   -> MASTER_PASSWORD='repl',   -> MASTER_PORT=3406,   -> MASTER_LOG_FILE='inst3406bin.000001',   -> MASTER_LOG_POS=0; Query OK, 0 rows affected, 2 warnings (0.04 sec)  #出现了2个warnings,查看一下 slave@localhost[(none)]> show warnings \G *************************** 1. row ***************************  Level: Note   Code: 1759 Message: Sending passwords in plain text without SSL/TLS is extremely insecure. *************************** 2. row ***************************  Level: Note   Code: 1760 Message: Storing MySQL user name or password information in the master.info repository is not secure and is therefore not recommended.  Please see the MySQL Manual for more about this issue and possible alternatives. 2 rows in set (0.00 sec)  #此时查看从库的状态信息 slave@localhost[(none)]> show slave status \G *************************** 1. row ***************************         Slave_IO_State:           Master_Host: 192.168.1.177          Master_User: repl          Master_Port: 3406         Connect_Retry: 60        Master_Log_File: inst3406bin.000001      Read_Master_Log_Pos: 4         Relay_Log_File: relay-bin.000001         Relay_Log_Pos: 4     Relay_Master_Log_File: inst3406bin.000001        Slave_IO_Running: No   #IO线程没有运行       Slave_SQL_Running: No   #SQL线程没有运行           ......................        Master_Info_File: /data/inst3506/data3506/master.info  slave@localhost[(none)]> start slave; #启动slave Query OK, 0 rows affected (0.01 sec)  #含义如下 START SLAVE with no thread_type options starts both of the slave threads. The I/O thread reads events from the master server and stores them in the relay log. The SQL thread reads events from the relay log and executes them.  #再次查看slave的状态 robin@localhost[(none)]> show slave status\G *************************** 1. row ***************************         Slave_IO_State: Waiting for master to send event          Master_Host: 192.168.1.177          Master_User: repl          Master_Port: 3406         Connect_Retry: 60        Master_Log_File: inst3406bin.000001      Read_Master_Log_Pos: 120         Relay_Log_File: relay-bin.000002         Relay_Log_Pos: 285     Relay_Master_Log_File: inst3406bin.000001        Slave_IO_Running: Yes    #IO线程处于运行状态        Slave_SQL_Running: Yes    #SQL线程处于运行状态 ..............      Exec_Master_Log_Pos: 120        Relay_Log_Space: 452............        Master_Server_Id: 3406          Master_UUID: 32f53a0a-63ef-11e4-93d9-8c89a5d108ae        Master_Info_File: /data/inst3506/data3506/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 #重要的提示信息  #可以看到从库上的2个线程,一个是用于I/O线程,用于连接到主库请求主库发送binlog,一个是用于执行SQL的SQL线程。 slave@localhost[(none)]> show processlist\G *************************** 1. row ***************************    Id: 4   User: system user   Host:     db: NULL Command: Connect   Time: 510993  State: Waiting for master to send event   Info: NULL *************************** 2. row ***************************    Id: 5   User: system user   Host:     db: NULL Command: Connect   Time: 333943  State: Slave has read all relay log; waiting for the slave I/O thread to update it   Info: NULL 

5、验证同步情况

#下面在主库上执行一些操作以检查从库的同步情况 master@localhost[(none)]> show variables like 'server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id   | 3406 | +---------------+-------+ 1 row in set (0.00 sec)  #主库上Binlog Dump线程用于发送binlog日志文件到从库,如下查询 master@localhost[(none)]> show processlist\G *************************** 1. row ***************************    Id: 12   User: repl   Host: 192.168.1.177:57440    db: NULL Command: Binlog Dump   Time: 511342  State: Master has sent all binlog to slave; waiting for binlog to be updated   Info: NULL    #主库创建数据库及表 master@localhost[(none)]> create database tempdb; Query OK, 1 row affected (0.01 sec)  master@localhost[(none)]> use tempdb Database changed master@localhost[tempdb]> create table tb_engines as select * from information_schema.engines; Query OK, 9 rows affected (0.02 sec) Records: 9 Duplicates: 0 Warnings: 0  #下面是在从库上检查的结果 slave@localhost[(none)]> select count(*) from tempdb.tb_engines; +----------+ | count(*) | +----------+ |    9 | +----------+ 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


  • 上一条:
    mysql 5.7.18 安装教程及问题汇总
    下一条:
    mysql处理海量数据时的一些优化查询速度方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客