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

    MySQL 主从复制原理

    mysql 主从搭建(先有主运行一段时间后搭建了从)

    主库上写一些数据以便测试

    create database test;
    use test;
    create table t1(id int,name varchar(50));
    insert into t1 values(1,'kobe');
    insert into t1 values(2,'ivring');
    View Code

    主上配置

    vi /etc/my.cnf 
        log-bin = /data/mysql/binlog/mysql-bin.log
        log_bin_index=/data/mysql/binlog/mysql-bin.index
        binlog-format=MIXED
        server-id=1
    
    mkdir -p /data/mysql/binlog/
    chown mysql.mysql /data/mysql/binlog/ -R
    
    grant replication slave on *.* to rep@'192.168.231.%' identified by '1qaz@WSX';
    flush privileges;
    flush  tables  with read  lock;        #会话别退出
    mysqldump -p'1qaz@WSX' --all-databases --single-transaction --master-data=2  --flush-logs > `date +%F`-all.sql    
    unlock tables;
    
    把备份出来的sql 语句文件复制到备机
    备份完成后再增加新数据
    insert into test.t1 values(3,'wade');
    insert into test.t1 values(6,'james');
    View Code

    备机操作配置

    vi /etc/my.cnf
        log-bin =/data/mysql/binlog/mysql-bin.log
        log_bin_index=/data/mysql/binlog/mysql-bin.index
        binlog-format=MIXED
        server-id=2
    
    mkdir -p /data/mysql/binlog/
    chown mysql.mysql /data/mysql/binlog/ -R
    systemctl start mysqld
    
    更改初始密码
    mysql -h 192.168.231.100 -urep -p'1qaz@WSX'    #测试是否能够连接到主库
    show grants;
    mysql -p'asdfgfdf'  < /opt/2019-07-18-all.sql
    mysql> change master to
        -> master_host='192.168.231.100',
        -> master_port=3306,
        -> master_user='rep',
        -> master_password='1qaz@WSX',
        -> master_log_file='mysql-bin.000002',        
    #通过备份的sql文件查看得到,或者在master 执行命令show master status;查看
        -> master_log_pos=154;
        start slave;
        show slave statusG;     #io和sql 进程全部YES就可以了
       
    View Code

    master-data=1 时备机操作

    #当在主机上备份库时mysqldump -p‘..’ --all-databases --single-transaction --master-data=1 时意味着在sql文件中记录了change master to ...的语句,且为非注释状态

    前几步骤同上    #先不执行mysqldump 备份的语句
    mysql> change master to
        -> master_host='192.168.231.100',
        -> master_port=3306,
        -> master_user='rep',
        -> master_password='1qaz@WSX',    #此处没有master_log_file master_log_pos 配置
    
    source /opt/2019-07-18-all.sql    
    #会话不要退出,执行source ,因为sql文件中记录了master_log_file master_log_pos ,所以此步骤就执行了change master to .. 的操作,一箭双雕,即导入了库,也配置了binlog 日志同步的位置。
    
    start slave;
    View Code

    mysql 主从-GTID

    5.6以后支持。主从复制无需配置change master to  logfile 和log position 直接自动协商

    流程图

    主上配置

    vi /etc/my.cnf
        log-bin
        server-id=1
        gtid_mode=ON
        enforce_gtid_consistency=1
    
    systemctl start mysqld
    grep 'temporary password' /var/log/mysqld.log
    mysqladmin -p'...' password "..."
    创建一些数据
    
    grant replication slave on *.* to rep@'192.168.231.%' identified by '1qaz@WSX';
    flush privileges;
    flush  tables  with read  lock;            #会话别退出
    mysqldump -p'1qaz@WSX' --all-databases --single-transaction --master-data=2  --flush-logs --skip-gtids=true > `date +%F`-all.sql    
    #如果开启了gtid 可以加上 --skip-gtid 参数
    unlock tables;
    View Code

    从上配置

    vi /etc/my.cnf
        log-bin
        server-id=2
        gtid_mode=ON
        enforce_gtid_consistency=1
    
    systemctl restart mysqld
    
    mysql> change master to
        -> master_host='192.168.231.102',
        -> master_port=3306,
        -> master_user='rep',
        -> master_password='1qaz@WSX',
        -> master_auto_position=1;            #binlog 日志位置采用自动协商方式
    
    mysql>source /opt/2019-07-19-all.sql
    mysql>show slave statusG
    View Code

    FAQ

    show slave statusG
    报错:
        Error 'Can't create database 'tem2'; database exists' on query. Default     
        database: 'tem2'. Query: 'create database tem2'
    
    解决:
        mysql> set global sql_slave_skip_counter = 1;
        mysql>start slave;
    
        报错:
            ERROR 1858 (HY000): sql_slave_skip_counter can not be set when the 
            server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each 
            transaction that you want to skip, generate an empty transaction with the 
            same GTID as the transaction
            原因也说的很清楚了,不支持GTID_MODE 模式运行的数据库
        
        解决:
            mysql> show slave statusG;    查看一下信息并记录下来
               Executed_Gtid_Set: 7f8d9eb8-a7fe-11e2-84fd-0015177c251e:1-260
            mysql> reset master;
            mysql> stop slave; 
            mysql> reset slave;
            重新设置GTID以跳过错误的信息,记得在第一步我们记录下来Executed_Gtid_set    
            吗? 没错执行它的时候粗错了,那么保守起见直接跳过这一条即可,在其ID上加1即可, 
            代码如下:
            mysql> set global gtid_purged=’7f8d9eb8-a7fe-11e2-84fd-5177c251e:1- 
                        261′;
            CHANGE MASTER TO MASTER_HOST=’192.168.1.136′,     
            MASTER_PORT=3306, 
            MASTER_USER=’dbadmin’,MASTER_PASSWORD=’123456′, 
            master_auto_position=1;
            
            start slave;
            show slave statusG;
    View Code
  • 相关阅读:
    form表单提交后保持输入的值
    django 自定义属性
    linux修改mysql密码
    linux下备份mysql数据库
    《小学数学辅导》服务协议
    《小升初辅导》服务协议
    《小学数学试题练习》服务协议
    清明节应该回高中学校扫扫墓,因为那里埋葬了你的青春。
    [转]智能聊天机器人小黄鸡及其制作方法
    人们问我,长大了要做什么?我写下“快乐”,他们说我理解错了题目。我告诉他们,他们理解错了人生。—— 约翰·列侬
  • 原文地址:https://www.cnblogs.com/fanggege/p/11221311.html
Copyright © 2011-2022 走看看