zoukankan      html  css  js  c++  java
  • MySQL 主从复制

    背景

    公司内部 MySQL 只有一部,现在需要添加一个从库。办法把现有的 MySQL变成主库,新搭建一台 MySQL从库,组成一主一从让开发配置读写分离。

    操作系统 CentOS 7.4 64bit
    MySQL(5.7.20) 主库 192.168.0.237
    MySQL(5.7.20) 从库 192.168.0.227

    MySQL 主从复制图解

    1. 从库执行 change master to ,ip pot user password binlog position 信息写入到 master.info  
    2. 从库执行 start slave 时,从库会启动 IO 线程 和 SQL 线程 
    3. IO_T 会读取 master.info 信息,获取主库信息连接主库 
    4. 主库会生成一个准备 binlog 的 DUMP 线程,来响应从库 
    5. IO_T 根据 master.info 记录的 binlog 文件名和 position 号,请求主库 DUMP 线程最新的日志 
    6. DUMP 线程检查主库的 binlog 日志,如果有新的,TP(传送)给从从库的 IO_T 
    7. IO_T 将收到的日志存储到了 TCP/IP 缓存,立即返回 ACK 给主库,主库工作完成 
    8. IO_T 将缓存中的数据,存储到 relay-log 日志文件, 更新 master.info 文件 binlog 文件名和 postion,IO_T 工作完成 
    9. SQL_T 读取 relay-log.info 文件,获取到上次执行到的 relay-log 的位置,作为起点,回放 relay-log 
    10. SQL_T 回放完成之后,会更新 relay-log.info 文件。 
    11. relay-log 会有自动清理的功能。
    
    注意:主库一旦有新的日志生成,会发送 “信号” 给binlog dump线程,IO线程再请求
    

    主库操作

    vi /etc/my.cnf

    [mysqld]
    innodb_buffer_pool_size = 1024M
    character_set_server = utf8mb4
    skip-name-resolve
    innodb_file_per_table = 1
    basedir=/usr/local/mysql
    datadir=/iba/mysql/data
    port=3306
    user=mysql
    
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    max_connections=1024
    max_allowed_packet=128M
    show_compatibility_56 = on
    
    default_password_lifetime=0
    
    server-id = 1                      # 配置主从新增
    log-bin=/iba/mysql/mysql-bin       # 配置主从薪增
    
    [mysql.server]
    basedir=/usr/local/mysql
    

    重启 MySQL

    /etc/init.d/mysql stop
    /etc/init.d/mysql start
    

    创建复制用户

    mysql -uroot -p
    
    grant replication slave on *.* to rep@'192.168.0.%' identified by '123';
    flush privileges;
    

    从库操作

    # 开放防火墙
    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.0/16" accept"
    firewall-cmd --reload
    
    # 创建专用用户
    mkdir /iba/software
    groupadd mysql 
    useradd -r -g mysql mysql
    cd /usr/local
    
    # 上传软件 mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz  导 /iba/software
    tar zxvf /iba/software/mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz 
    mv mysql-5.7.20-linux-glibc2.12-x86_64 mysql
    
    cd /iba
    mkdir -p mysql/data -p
    chown -R mysql.mysql mysql
    cd /usr/local/mysql/
    
    # 初始化 mysql
    bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/iba/mysql/data --user=mysql
    # 需要记住密码
    
    echo "export PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
    source /etc/profile
    
    # 编辑 my.cnf  文件
    vi /etc/my.cnf
    [mysqld]
    innodb_buffer_pool_size = 1024M
    character_set_server = utf8mb4
    skip-name-resolve
    innodb_file_per_table = 1
    basedir=/usr/local/mysql
    datadir=/iba/mysql/data
    port=3306
    user=mysql
    
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    max_connections=1024
    max_allowed_packet=128M
    show_compatibility_56 = on
    
    default_password_lifetime=0
    
    server-id = 2
    read-only 
    
    [mysql.server]
    basedir=/usr/local/mysql
    
    # 配置启动脚本
    cp support-files/mysql.server /etc/init.d/mysql
    chmod +x /etc/init.d/mysql 
    chkconfig --add mysql
    chkconfig --level 345 mysql on
    
    # 启动 mysql
    /etc/init.d/mysql start
    
    # 备份MySQL主库的数据库
    cd /iba/software
    mysqldump -h192.168.0.237 -uroot -p'123456' --all-databases --master-data=1 |gzip > 237_bak.sql.gz
    
    yum install gunzip -y  
    gunzip  237_bak.sql.gz 
    
    # 导入数据
    
    mysql -uroot -p
    # 输入上面获取的密码
    
    source 237_bak.sql
    
    flush privileges;
    

    查看主库位置

    head -n 40  237_bak.sql |grep "CHANGE"
    # 得到下面信息,记录下来
    CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4369252;
    

    开启主从

    mysql -uroot -p
    change master to master_host='192.168.0.237', master_port=3306, master_user='rep', master_password='123',master_log_file='mysql-bin.000001',master_log_pos=4369252;
    
    start slave;
    flush privileges;
    
    # 检查主从复制状态
    show slave  status;
    
    # 到下面两个进程正常即可
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    

    相关命令详解

    # mysqldump 命令解释
    -A 表示备份所有库
    -B 表示增加use DB 和 drop 等(导库时会直接覆盖原来的)
    -F, --flush-logs
    -R 备份存储过程(-- routines)
    --triggers 备份触发器
    -E 备份定时任务(-- events)
    --master-data=2 在备份文件中以注释的形式记录备份开始时binlog的position,默认值是1,不注释
    --single-transaction 可以保证在备份过程中,整个备份集的数据一致性
    
    # 重置从库信息
    reset slave all;
    
    

    参考

    https://www.jianshu.com/p/6ed2cc292077
    
  • 相关阅读:
    phpcms v9 更改首页
    不是技术牛人,如何拿到国内IT巨头的Offer
    超实用的PHP代码片段!
    Android 中的 Service 全面总结
    近期十大优秀jQuery插件推荐
    DIOCP之编写第一个应用程序(二)
    DIOCP之编写第一个应用程序(一)
    DIOCP之DEMO学习顺序及达到要求
    DIOCP之EchoServer分析
    DIOCP之数据接收事件
  • 原文地址:https://www.cnblogs.com/klvchen/p/11714929.html
Copyright © 2011-2022 走看看