zoukankan      html  css  js  c++  java
  • MySQL主从复制—2.一主一从

    1、准备说明

    - 两台服务器要时间同步,ntp+crontab
    
    - Master和Slave的版本最好相同,至少保证Slave的版本要比Master的版本高
    
    - 创建复制用用户repl并赋权
    
    - 主从服务器Server-ID要不同
    
    - 从服务器要启动中继日志,禁用二进制日志
    

     

    2、创建、赋权用户

    - 在主机创建并赋权复制用户
    | mysql> grant replication slave,replication client on *.* to 'repl'@'从机ip' identified by '密码';
    | # 单独赋权slave和client
    | # 出于安全考虑,只给从机地址访问权限
    
    - 出现ERROR 1819 (HY000): Your password does not satisfy ...
    | mysql> set global validate_password_policy=LOW;   // 降低密码复杂度
    
    mysql> grant replication slave,replication client on *.* to 'repl'@'从机ip' identified by '密码';
    mysql> flush privileges;
    

     

    3、设置配置文件

    3.1-配置概括

    - 主机
    | 1.设置server-id
    | 2.启动binlog
    
    - 从机
    | 1.设置server-id
    | 2.禁用binlog
    | 3.启动relaylog
    

    3.2-配置文件说明

    log_slave_updates            // 表示从节点自动更新
    slave_skip_errors=all        // 跳过所有错误日志
    
    sync_binlog=1                // 每次事务提交,MySQL都会写入binlog
    # 1最安全但是性能损耗最大;默认是0;一般有设置100的
    
    log_slave_updates=1          // 从库自动更新
    

    3.3-主库配置文件(/etc/my.cnf)

    ※ 傻瓜式安装,本地datadir的默认值 "datadir=/var/lib/mysql" ※
    ※ 遵循此目录手工添加二进制目录和中继目录,否则会报错 ※
    
    #binlog
    #binlog_format=statement
    server-id=1                              // id要不同
    log-bin=/var/lib/mysql/mysql-bin         // 开启二进制日志,并设置路径
    binlog_format=mixed                      // 设置混合模式
    binlog_cache_size=4M
    expire_logs_days=10
    sync_binlog=0
    log-bin-index=binlog.index     // 除了路径、id、模式,自玩其他都不重要
    

    3.4-从库配置文件(/etc/my.cnf)

    # binlog
    # binlog_format=statement
    server-id=2
    # log-bin=/var/lib/mysql/mysql-bin           // 关闭从机二进制文件
    binlog_format=mixed            
    binlog_cache_size=4M
    expire_logs_days=10
    sync_binlog=0
    log-bin-index=binlog.index
    
    relay_log_purge=1
    relay_log_recovery=1                  
    relay-log=/var/lib/mysql/rely-bin            // 开启从机中继日志
    relay-log-index=relay-bin.index
    

    3.5-查看相关状态

    [root@localhost mysql]# systemctl restart mysqld    // 主从都重启mysql
    
    mysql> show global variables like '%log_bin%';              // 主端
    +---------------------------------+--------------------------------+
    | Variable_name                   | Value                          |
    +---------------------------------+--------------------------------+
    | log_bin                         | ON                             |
    | log_bin_basename                | /var/lib/mysql/mysql-bin       |
    | log_bin_index                   | /var/lib/mysql/mysql-bin.index |
    | log_bin_trust_function_creators | OFF                            |
    | log_bin_use_v1_row_events       | OFF                            |
    +---------------------------------+--------------------------------+
    
    mysql> show global variables like '%relay%';                // 从端
    +---------------------------+------------------------------------------+
    | Variable_name             | Value                                    |
    +---------------------------+------------------------------------------+
    | max_relay_log_size        | 0                                        |
    | relay_log                 |                                          |
    | relay_log_basename        | /var/lib/mysql/localhost-relay-bin       |
    | relay_log_index           | /var/lib/mysql/localhost-relay-bin.index |
    | relay_log_info_file       | relay-log.info                           |
    | relay_log_info_repository | FILE                                     |
    | relay_log_purge           | ON                                       |
    | relay_log_recovery        | OFF                                      |
    | relay_log_space_limit     | 0                                        |
    | sync_relay_log            | 10000                                    |
    | sync_relay_log_info       | 10000                                    |
    +---------------------------+------------------------------------------+
    
    # basename,index与配置文件中不一致是我中间做了操作;这里显示的是默认值,后已变更。
    

     

    4、从端连接主端

    4.1-查看主机二进制文件信息

    mysql> show master status;
    +------------------+----------+--------------+---------- -+------------+
    | File             | Position | Binlog_Do_DB | Binlog_... | Executed...|
    +------------------+----------+--------------+------------+------------+
    | mysql-bin.000002 |      154 |              |            |            |
    +------------------+----------+--------------+------------+------------+
    
    # 连接的时候用这两个数值File和Position
    

    4.2-连接Master

    - 从库指定复制用户,主服务器IP、端口以及开始执行复制的日志文件和位置等
    | mysql> change master to master_host='主ip',master_user='复制用户',
    |     -> master_password='密码',master_port=3306,
    |     -> master_log_file='flie',master_log_pos=position;
    # master_port和master_log_pos是不加引号的
    # master_log_file和master_log_pos是上边查出来的值
    

    4.3-change master to 选项说明

    - master_bino='interfce_name'
    - master_host='host_name'               // 指定连接的Master服务器的地址
    - master_user='user_name'               // 指定连接的Master进行复制使用的账号
    - master_password='password'            // 密码
    - master_port=port_num                  // 指定连接Master的哪个端口
    - master_connect_retry=interval         // 重试间隔时间
    - master_retry_count=count              // 重试次数
    - master_delay=interval                 // 当Slave发现Master的心跳信息消失,隔多久中再次测试
    - master_heartbeat_period=interval      // Slave端每隔多长时间测试一次主端是否在线
    - master_log_file='master_log_name'     // 指定让Slave读取Master的哪个二进制日志文件
    - master_log_pos=master_log_pos         // 指定让Slave读取Master的哪个二进制日志文件的位置
    - master_auto_position={0|1}            // 1是自动找点同步
    - relay_log_file='relay_log_name' 
    - relay_log_pos=relay_log_pos
    - master_ssl={0|1}
    - master_ssl_ca='ca_file_name'
    - master_ssl_capath='ca_directory_name'
    - master_ssl_cert='cert_file_name'
    - master_ssl_crl
    - master_ssl_crlpath
    - master_ssl_key
    - master_ssl_cipher
    - master_ssl_verify_server_cert
    - master_tls_version
    - master_server_ids
    

     

    5、从端开启主从复制

    5.1-正常启动slave

    mysql> show slave status\G
    mysql> start slave;
    mysql> show slave status\G
    *************************** 1. row ***************************
                 Slave_IO_State: Connecting to master
                    Master_Host: 192.168.3.123
                    Master_User: repl
                    Master_Port: 3306
                  Connect_Retry: 60
                Master_Log_File: mysql-bin.000002
            Read_Master_Log_Pos: 154
                 Relay_Log_File: rely-bin.000002
                  Relay_Log_Pos: 4
          Relay_Master_Log_File: mysql-bin.000002
               Slave_IO_Running: Connecting         // 必须两个都是Yes,未开启是No
              Slave_SQL_Running: Yes                // connecting可能有多种原因造成  
    

    5.2-排查connecting错误后,重启

    mysql> stop slave;
    .....
    .....
    mysql> start slave;
    mysql> show slave status\G
    *************************** 1. row ***************************
                 Slave_IO_State: Waiting for master to send event
                    Master_Host: 192.168.3.123
                    Master_User: repl
                    Master_Port: 3306
                  Connect_Retry: 60
                Master_Log_File: mysql-bin.000004
            Read_Master_Log_Pos: 2033
                 Relay_Log_File: rely-bin.000007
                  Relay_Log_Pos: 2246
          Relay_Master_Log_File: mysql-bin.000004
               Slave_IO_Running: Yes
              Slave_SQL_Running: Yes
    
    # 排查后是ip写错;操作需谨慎;修改完最好刷新权限 flush privileges;
    # 配置新机,又connecting;firewall没设置,关闭;selinux不用理会
    ==================================================================
    
    - Slave_IO_Running的Connecting
    | 1.网络不通
    | 2.账号密码错误
    | 3.防火墙
    | 4.mysql配置文件问题
    | 5.连接服务器时语法问题
    | 6.主服务器mysql权限问题
    
    - Slvae_SQL_Running未碰到问题,不整理了
    

     

    6、从库设置只读

    mysql> set global read_only=1;              // 开启只读模式
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> flush tables with read lock;         // 从数据库设定全局锁
    mysql> unlock tables;                       // 从数据库解除全局锁
    
    # 1.只读模式只能限制普通用户,不能限制超级用户;也不能限制有较高权限普通用户。
    # 2.想要完全只读,只能锁表;锁表从库无法将读取到的二进制日志加载到数据库中。
    # 3.这种开启只读模式的方式只能是: read_only=1 + 用户权限设置
    # 4.如果加了全局锁,二进制日志是否同步?是否可以通过手动方式重新加载呢?
    

      

    7、从库清除主从复制

    # 增加清理步骤是为了汇总整理到一起
    
    mysql> stop slave;
    mysql> reset slave;
    mysql> show slave status\G
    *************************** 1. row ***************************   // 未清理干净
                   Slave_IO_State: 
                      Master_Host: 192.168.3.121
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: 
              Read_Master_Log_Pos: 4
                   Relay_Log_File: localhost-relay-bin.000001
                    Relay_Log_Pos: 4
            Relay_Master_Log_File: 
                 Slave_IO_Running: No
                Slave_SQL_Running: No
    
    =============================================================
    
    mysql> reset slave all;                      
    mysql> show slave status;                                      // 清理干净了
    Empty set (0.11 sec)  
    

     

    8、补充内容

    ¤ Ⅰ 连接主机设置说明 ¤
    mysql> change master to master_host='ip',master_user='用户',master_password='密码';
    
    # 1.没指定从哪个二进制文件开始复制,就是从0开始复制,会读取master的全部二进制日志文件。
    # 2.如Master已经运行很久了,不能这样写。
    # 3.我用5.7就这么写效果比较好。指定二进制文件的话,反而无法识别
    ==========================================================
    
    ¤ Ⅱ 启动复制相关线程 ¤
    
    - 三种启动模式
    
    - 1.默认启动
    | mysql> start slave;
    
    - 2.只启动某一个线程,比如启动io
    | mysql> start slave thread_type io_thread; 
    
    - 3.复制到指定位置就停止复制       
    | mysql> start slave until master_log_file='binlog-index-000012',master_log_pos=120;
    
  • 相关阅读:
    POJ 1416 Shredding Company
    HDU 2289 Cup
    Django Mysql数据库-F查询和Q查询
    Django Mysql数据库-聚合查询与分组查询
    Django Mysql数据库-基于双下划线的跨表查询
    centos下cp -r 命令可拷贝文件夹
    查看linux下mysql版本
    速卖通 排序规则解析
    跨境电商 -- 普及
    学习外贸英语单词--通过速卖通来学习句子和单词的含义
  • 原文地址:https://www.cnblogs.com/FGdeHB/p/15810811.html
Copyright © 2011-2022 走看看