• mysql主从复制


    1,安装相同版本的mysql

    2, http://369369.blog.51cto.com/319630/790921

    http://www.cnblogs.com/yangxiaolan/p/5786119.html

    http://www.cnblogs.com/yangxiaolan/p/5786118.html

    http://www.cnblogs.com/yangxiaolan/p/5786117.html

    http://www.cnblogs.com/yangxiaolan/p/5786114.html

    http://www.cnblogs.com/yangxiaolan/p/5786113.html

    1、主从服务器分别作以下操作
      1.1、版本一致
      1.2、初始化表,并在后台启动mysql
      1.3、修改root的密码 

    2、修改主服务器master:
       #vi /etc/my.cnf
           [mysqld]
           log-bin=mysql-bin   //[必须]启用二进制日志
           server-id=222      //[必须]服务器唯一ID,默认是1,一般取IP最后一段

    3、修改从服务器slave:
       #vi /etc/my.cnf
           [mysqld]
           log-bin=mysql-bin   //[不是必须]启用二进制日志
           server-id=226      //[必须]服务器唯一ID,默认是1,一般取IP最后一段

    4、重启两台服务器的mysql
       /etc/init.d/mysql restart

    5、在主服务器上建立帐户并授权slave:
       #/usr/local/mysql/bin/mysql -uroot -pmttang   
       mysql>GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456'; //一般不用root帐号,%表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

    6、登录主服务器的mysql,查询master的状态
       mysql>show master status;
       +------------------+----------+--------------+------------------+
       | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
       +------------------+----------+--------------+------------------+
       | mysql-bin.000004 |      308 |              |                  |
       +------------------+----------+--------------+------------------+
       1 row in set (0.00 sec)
       注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

    7、配置从服务器Slave:
       mysql>change master to master_host='192.168.145.222',master_user='mysync',master_password='q123456',
             master_log_file='mysql-bin.000004',master_log_pos=308;   //注意不要断开,308数字前后无单引号。

    配置从服务器Slave:
    mysql>CHANGE MASTER TO
    MASTER_HOST='172.24.133.246',
    MASTER_USER='userslave',
    MASTER_PASSWORD='jake123!@#',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='mysql-bin.000007',
    MASTER_LOG_POS=1032,
    MASTER_CONNECT_RETRY=60;

       Mysql>start slave;    //启动从服务器复制功能   ,也可以使用  stop slave;  停止从库

    8、检查从服务器复制功能状态:

       mysql> show slave statusG

       *************************** 1. row ***************************

                  Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.222  //主服务器地址
                  Master_User: mysync   //授权帐户名,尽量避免使用root
                  Master_Port: 3306    //数据库端口,部分版本没有此行
                  Connect_Retry: 60
                  Master_Log_File: mysql-bin.000004
                  Read_Master_Log_Pos: 600     //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
                  Relay_Log_File: ddte-relay-bin.000003
                  Relay_Log_Pos: 251
                  Relay_Master_Log_File: mysql-bin.000004
                  Slave_IO_Running: Yes    //此状态必须YES
                  Slave_SQL_Running: Yes     //此状态必须YES
                        ......

    注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

    以上操作过程,主从服务器配置完成。

     9、主从服务器测试:

    主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:

    10、完成:
        编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。

    后续:

    1,    可以通过监控show slave statusG命令输出的Seconds_Behind_Master参数的值来判断,是否有发生主从延时。

      其值有这么几种:
      NULL - 表示io_thread或是sql_thread有任何一个发生故障,也就是该线程的Running状态是No,而非Yes.
      0 - 该值为零,是我们极为渴望看到的情况,表示主从复制良好,可以认为lag不存在。
      正值 - 表示主从已经出现延时,数字越大表示从库落后主库越多。

    2,   

    有如下3个重要参数控制着这个过程slave-net-timeout,master-connect-retry,master-retry-count。根据官方文档解释如下

    slave-net-timeout意味着在没有得到更多数据之后slave等待的时间,默认值3600s
    master-connect-retry意味着每次和主库建立链接重试的等待时间,默认值为60s
    master-retry-count意味着从库同主库建立链接的重试次数,默认86400次

      而这个重试机制是按照如下方法运行的,当从库发现从主库上无法获得更多的暑假了,就会等待slave-net-timeout时间,然后将IO thread置为no状态,接着开始尝试重建建立连接,每次建立失败之后等待master-connect-retry时间,一直重试master-retry-count次。

    其中 master-connect-retry 和 master-retry-count 需要在 Change Master 搭建主备复制时指定,而slave-net-timeout 是一个全局变量,可以在 MySQL 运行时在线设置。

    具体的重试策略为:备库过了 slave-net-timeout 秒还没有收到主库来的数据,它就会开始第一次重试。然后每过 master-connect-retry 秒,备库会再次尝试重连主库。直到重试了 master-retry-count 次,它才会放弃重试。如果重试的过程中,连上了主库,那么它认为当前主库是好的,又会开始 slave-net-timeout 秒的等待。

    slave-net-timeout 的默认值是 3600 秒, master-connect-retry 默认为 60 秒, master-retry-count默认为 86400 次。也就是说,如果主库一个小时都没有任何数据变更发送过来,备库才会尝试重连主库。这就是为什么在我们模拟的场景下,一个小时后,备库才会重连主库,继续同步数据变更的原因。

    这样的话,如果你的主库上变更比较频繁,可以考虑将 slave-net-timeout 设置的小一点,避免主库Binlog dump 线程 终止了,无法将最新的更新推送过来。

    当然 slave-net-timeout 设置的过小也有问题,这样会导致如果主库的变更确实比较少的时候,备库频繁的重新连接主库,造成资源浪费。

    沃趣科技的 Q Monitor 监控中对主备复制的延迟监控,并不是通过 Seconds_Behind_Master 来监控主备的。它采用了类似于 pt-heartbeat 的方式对主备进行复制延迟监控。

    3, 

    https://www.cnblogs.com/yangxiaolan/p/5786120.html

     

    (1) 【ERROR】1452:无法在外键的表插入参考主键没有的数据

    (2) 【ERROR】1032:删除或更新数据,从库找不到记录

     

    (3) 【ERROR】1062:从库插入数据,发生唯一性冲突

    ERROR】1452:无法在外键的表插入或更新参考主键没有的数据。由于item_discovery.itemid字段(外键)参考了items.itemid字段(主键),当要在item_discovery表插数据时,如果items表的主键没有对应的数据,则无法插入,报1452错误。此时可以检查参考的表的主键是否有主库对应的数据,如果有,则插入参考的表相应的数据,再开启复制恢复SQL线程。

    【ERROR】1032:删除或更新从库的数据,从库找不到记录。此时,主库的数据是比从库新的,可以采取从库添加相同的数据在开启复制恢复SQL线程。

    【ERROR】1062:从库插入数据,发生唯一性冲突。此时从库已经有相同主键的数据,如果再插入相同主键值的数据则会报错。可以查看主库的改行数据与从库的要插入数据是否一致,如一致则跳过错误,恢复SQL线程,如不一致,则以主库为准,将从库的该行记录删除,再开启复制。

    如果当前高可用架构为Master-Master,则以下均在从库的操作都必须set sql_log_bin=0,避免从库执行的语句同步到主库(恢复时以主库的数据为准)。

    https://www.cnblogs.com/zgx/archive/2011/09/13/2174823.html

    4、执行以下命令锁定数据库以防止写入数据。

    1. mysql>FLUSH TABLES WITH READ LOCK;
    2. 解锁数据表。

      1. mysql>UNLOCK TABLES;

    5, 

    登录mysql终端
    日志文件路径
    mysql> show variables like 'general_log_file';
    +------------------+------------------------------------+
    | Variable_name | Value |
    +------------------+------------------------------------+
    | general_log_file | /usr/local/mysql/data/localhost.log |
    +------------------+------------------------------------+
    1 row in set (0.00 sec)
    错误日志文件路径
    mysql> show variables like 'log_error';
    +---------------+------------------------------------+
    | Variable_name | Value |
    +---------------+------------------------------------+
    | log_error | /usr/local/mysql/data/localhost.err |
    +---------------+------------------------------------+
    1 row in set (0.00 sec)
    慢查询日志文件路径
    mysql> show variables like 'slow_query_log_file';
    +---------------------+-----------------------------------------+
    | Variable_name | Value |
    +---------------------+-----------------------------------------+
    | slow_query_log_file | /usr/local/mysql/data/localhost-slow.log |
    +---------------------+-----------------------------------------+
    1 row in set (0.01 sec)

    GRANT REPLICATION SLAVE ON *.* TO 'userslave'@'172.24.133.245' IDENTIFIED BY 'jake123!@#';

    配置从服务器Slave:
    mysql>CHANGE MASTER TO
    MASTER_HOST='172.24.133.246',
    MASTER_USER='userslave',
    MASTER_PASSWORD='jake123!@#',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='mysql-bin.000007',
    MASTER_LOG_POS=1032,
    MASTER_CONNECT_RETRY=60;

  • 相关阅读:
    github登录不上?!
    js -- even-loop 理解
    前端面试积累(整理中)
    各个ctr算法的比较
    常用ctr算法比较
    BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
    Attention is All You Need
    理解word2vec
    EDA时的画图函数
    alphogo 理解
  • 原文地址:https://www.cnblogs.com/maomaochong123/p/4910027.html
Copyright © 2020-2023  润新知