Server1: 192.168.10.200  Master

  • Server2: 192.168.10.201  Slave

  •  vip:192.168.10.202

master-slave (master1)

MySQL 版本最好一致

设置 master

  1. 创建给 slave 登录用的用户名密码:

    mysql> GRANT REPLICATION SLAVE ON *.* TO 'tbmysql'@'192.168.10.201' IDENTIFIED BY 'tbmysql';
    #只允许192.168.10.201 通过tbmysql 登录;
    mysql> create database YunDa default charset utf8;  #创建数据库名为YunDa


  2. 配置 my.cnf
  3. # vim /etc/my.cnf
  4. server-id=1             #主机ID,整数
    log-bin=mysql-bin       
    read-only=0             #主机读写权限,读写都可以
    binlog-do-db=YunDa      #记录日志的数据库,需要备份的数据,多个写多行
    binlog-ignore-db=mysql  不记录日志的数据库:不需要备份的数据库,多个写多行
    auto-increment-increment = 2   # 每次递增的步长
    auto-increment-offset = 1   #初始值为1
    
    #################以下是SLAVE配制##############
    replicate-do-db =YunDa #只复制某个库,多个写多行
    replicate-ignore-db=mysql #不复制某个库
    #replicate-ignore-db=test
    # replicate-ignore-db=information_schema
    relay-log=mysqld-relay-bin # 开启日志中继
    log-slave-updates   # slave将复制事件写进自己的二进制日志
    #5.5#
    log-slave-updates = ON
    #5.1#
    log-slave-updates = 1


  5. 重启 mysql: serivce mysqld restart

  6. 导出数据库

    锁定数据库,不要退出 mysql shell

    mysql>FLUSH TABLES WITH READ LOCK;
    mysql># flush tables with read lock;

    新开一个终端,导出数据库

    mysqldump --master-data -uroot -p YunDa > YunDa.sql

    查看主服务器的状态

    mysql> show master status\G;
    *************************** 1. row ***************************
                File: mysql-bin.000001
            Position: 98
        Binlog_Do_DB: YunDa
    Binlog_Ignore_DB: mysql
    1 row in set (0.00 sec)ERROR: 
    No query specified

    记下 Position 和 File 的值。 解锁

    mysql> UNLOCK TABLES;
    mysql> # unlock tables;


设置 slave(master2)


  1. 编辑 my.cnf

    server-id=2             #主机ID,整数
    log-bin=mysql-bin       
    read-only=0             #主机读写权限,读写都可以
    binlog-do-db=YunDa      #记录日志的数据库,需要备份的数据,多个写多行
    binlog-ignore-db=mysql  不记录日志的数据库:不需要备份的数据库,多个写多行
    auto-increment-increment = 2   # 每次递增的步长
    auto-increment-offset = 1   #初始值为1
    
    #################以下是SLAVE配制##############
    replicate-do-db =YunDa #只复制某个库,多个写多行
    replicate-ignore-db=mysql #不复制某个库
    #replicate-ignore-db=test
    # replicate-ignore-db=information_schema
    relay-log=mysqld-relay-bin # 开启日志中继
    log-slave-updates   # slave将复制事件写进自己的二进制日志
    #5.5#
    log-slave-updates = ON
    #5.1#
    log-slave-updates = 1
  2. 导入 master 导出的数据库:

    mysql> create database hello default charset utf8;
    mysql -uroot -p YunDa< YunDa.sql
  3. 配置 master 信息:

    mysql> stop slave;  #此处有的版本语法是slave stop;
    
    mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.10.200', //主服务器的IP地址
    -> MASTER_USER='tbmysql', //同步数据库的用户
    -> MASTER_PASSWORD='tbmysql', //同步数据库的密码
    -> MASTER_CONNECT_RETRY=60,  // 如果从服务器发现主服务器断掉,重新连接的时间差(秒)
    -> MASTER_LOG_FILE='mysql-bin.000001', //主服务器二进制日志的文件名(前面要求记住的 File 参数) 
    -> MASTER_LOG_POS=98; //日志文件的开始位置(前面要求记住的 Position 参数)
  4. mysql> CHANGE MASTER TO MASTER_HOST='192.168.10.200', MASTER_USER='tbmysql', MASTER_PASSWORD='tbmysql', MASTER_CONNECT_RETRY=60, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;
    
    mysql > slave start;

    重启 master, slave: systemctl restart mysqld

    查看 slave 状态:

    进入 slave mysql:

    mysql> show slave status\G;
    *************************** 1. row ***************************
                Slave_IO_State: Connecting to master
                    Master_Host: 192.168.100.200
                    Master_User: tbmysql
                    Master_Port: 3306
                Connect_Retry: 60
                Master_Log_File: mysql-bin.000001
            Read_Master_Log_Pos: 98
                Relay_Log_File: mysqld-relay-bin.000001
                Relay_Log_Pos: 98
        Relay_Master_Log_File: mysql-bin.000001
           
                Replicate_Do_DB: hello
            Replicate_Ignore_DB: mysql,test,information_schema
            Exec_Master_Log_Pos: 98
                Relay_Log_Space: 98
                Until_Log_Pos: 0
        Seconds_Behind_Master: NULL
    1 row in set (0.00 sec)

    注意一定要有下面两项,没有的话查看错误日志(less /var/log/mysqld.log):

            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes



   同步错误处理方式:

 1、从库的约束比主库更多写造成
slave stop;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
slave start;

 2、主库删除的表在从库中不存在,导致从库在遇到删除不存在表的错误时无法继续同步

解决方法:利用slave-skip-errors参数,跳过对于的1146错误(这个参数是一个只读的,需要在配置文件中修改,并重启从库)
a、在my.cnf的[mysqld]下面添加slave_skip_errors=11462
b、重启从库 service mysql restart
c、在从库上启动同步
d、去掉my.cnf中的slave_skip_errors=1146
e、重启从库
f、启动从库复制