zoukankan      html  css  js  c++  java
  • MySQL(Percona Server) 5.6 主从复制

        MySQL(Percona Server) 5.6.15
        主库:192.168.2.21
        从库:192.168.2.22
    

    例如我们同步的数据库为:test。 如果需要同步多个数据库下面会有说明。

    MySQL 主从复制原理

    1. master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);
    2. slavemasterbinary log events拷贝到它的中继日志(relay log);
    3. slave重做中继日志中的事件,将改变反映它自己的数据。

    主库(192.168.2.21):

    主库开放 3306 端口

    # /sbin/iptables -I INPUT -s 192.168.2.0/24 -p tcp --dport 3306 -j ACCEPT
    
    # service iptables save
    
     

    查看开放的端口:

    # service iptables status
    或
    # iptables -L -n
    
     

    授权同步账户

    mysql> GRANT REPLICATION SLAVE ON *.* TO rep@'192.168.2.22' IDENTIFIED BY '123';
    mysql> flush privileges;
    
     

    授权格式为:GRANT REPLICATION SLAVE ON *.* TO username@'ipaddress' IDENTIFIED BY 'password'

    现在可以在 192.168.2.22 从库上测试是否可以访问:

    # /usr/local/mysql/bin/mysql -h192.168.2.21 -urep -p123
    
     

    配置主库 my.cnf

    # vi /etc/my.cnf
    
    [mysqld]
    log-bin=mysql-bin  #开启 MYSQL 二进制日志
    server-id=1  #主库服务器 ID,注意服务器 ID 不能重复
    binlog-do-db=test  #需要做主从备份的数据库名,如果复制多个数据库,重复设置这个选项即可
    expire-logs-days=7  #只保留 7 天的二进制日志,以防磁盘被日志占满
    binlog_format=MIXED  #设置 binlog 的格式为 MIXED
    

    binlog 的三种格式 STATEMENTROWMIXED,详见 MySQL Binlog ROW 和 STATEMENT 选择

    可以通过 show variables like 'binlog_format'; 查看。

    保存,重启 MySQL

    # service mysql restart
    

    拷贝主库需要同步的数据到从库

    进入 mysql 终端 /usr/local/mysql/bin/mysql -uroot -p

    设置主库成只读状态

    mysql> use test;
    mysql> FLUSH TABLES WITH READ LOCK;
    

    重置 binlog 日志

    mysql> RESET MASTER;
    

    查看运行状态

    mysql> SHOW MASTER STATUSG;
    ******************* 1. row *******************
                 File: mysql-bin.000001
             Position: 120
         Binlog_Do_DB: test
     Binlog_Ignore_DB:
    Executed_Gtid_Set:
    1 row in set (0.00 sec)
    

    此处需记录 FilePosition 两个值,下面从库的 CHANGE MASTER TO 命令中需要用到这两个值。

    接下来切换到从库服务器,导出主库中需要同步的数据,并导入到从库:

    # /usr/local/mysql/bin/mysqldump -h192.168.2.21 -urep -p test > dumptest.db
    # /usr/local/mysql/bin/mysql -uroot -p test < dumptest.db
    

    再回到主库服务器解锁主库数据库只读状态

    mysql> UNLOCK TABLES;
    

    从库(192.168.2.22):

    配置从库 my.cnf

    # vi /etc/my.cnf
    
    [mysqld]
    server-id=2  #从库服务器 ID,注意服务器 ID 不能重复
    replicate-do-db=test  #需要做复制的数据库名,如果复制多个数据库,重复设置这个选项即可
    slave-skip-errors=1032,1062,126,1114,1146,1048,1396  #自动跳过的错误代码,以防复制出错被中断
    

    如果数据库中有不需要同步的表可以添加 replicate-ignore-table=table_name,... 配置项,自动跳过这些表。

    保存,重启 MySQL

    # service mysql restart
    

    指定主库

    进入 MySQL 终端:

    mysql> CHANGE MASTER TO
      MASTER_HOST='192.168.2.21',
      MASTER_USER='rep',
      MASTER_PASSWORD='123',
      MASTER_LOG_FILE='mysql-bin.000001',
      MASTER_LOG_POS=120;
    

    启动从库连接

    mysql> start slave;
    

    查看从库状态

    mysql> SHOW SLAVE STATUSG;
     ......
      Slave_IO_Running: Yes
     Slave_SQL_Running: Yes
     ......

    两个 Yes 成功。

    测试

    现在可以在主库中插入/更新数据,添加表等操作,看从库是否可以同步相应的数据。

    问题

    在最后使用 SHOW SLAVE STATUSG; 查看 slave 运行状态时,有一个错误:

    Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

    server uuid 是从 MySQL 5.6 开始添加进来的, 由于我偷了个懒,从库是直接在 VirtualBox 中 Clone 的主库,所以 /var/lib/mysql/auto.cnf 文件中的 server-uuid 的值是一样的。 随便改一个值,但是值的格式不能变,不与群组中的其他 server-uuid 重复即可。

    改完之后,重启 mysql:

    # service mysql restart

    再次使用 SHOW SLAVE STATUSG; 查看状态正常。

    附两个小命令:

    mysql> SHOW SLAVE HOSTS;  #需在 master 中执行,查看 slave 列表,包括相应的 server-uuid 值
    
    mysql> show variables like 'server_uuid';  #查看本机的 server-uuid 值

    Good Luck!

  • 相关阅读:
    异步任务AsyncTask
    巧用TextView实现分隔线
    android系统的常用权限
    浅析对话框AlertDialog
    LinearLayout中的layout_weight属性详解
    CLOB大数据对象
    模糊查询demo
    ES6 箭头函数
    ES6中数组求和,求平均数方法( reduce )
    ES6中数组方法( every 和 some )
  • 原文地址:https://www.cnblogs.com/shiyiwen/p/5604224.html
Copyright © 2011-2022 走看看