1、首先确认主数据库和从数据库的版本一致(最起码从数据库要高于主数据库,尽量一致)

2、修改主和从数据库的配置文件(配置文件默认路径/etc/my.cnf)

3、在[mysqld]下,插入以下两行

  log-bin=mysql-bin              //启用二进制文件,从数据库不是必须启用二进制文件

  server-id=xxx                     //设置数据库服务唯一ID,默认为1,可自己更改,只要确认不被其他数据库占用即可,一般取IP最后三位。主从数据库的ID不能相同。

  binlog_do_db=数据库名    //指定要复制的数据库名,多个用逗号隔开

4、修改完后重启mysql服务service mysqld restart

5、在主数据库上建立slave账户,供从数据库连接到主数据库

  登录主数据库

  建立账户并授权slave账户

    grant replication slave on *.* to '主从账户名'@'%' identified by '主从账户密码';(注意分号)

      *.*:表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user

      主从账户名:设置的slave账户的账户名

      %:可从任意IP地址访问,可用具体IP代替

      主从账户密码:设置的salve账户的密码

  锁定主数据库,防止file和position变化

    Flush tables with read lock;(解锁:unlock tables;)

  查询主数据库的master状态

    show master status;

 

 

 

  配置从数据库

    change master to master_host='主库服务器ip', master_user='主从账户名', master_password='主从账户密码', master_log_file='File值', master_log_pos=Position值;(注意Position值没有单引号包裹,另外所有单引号都是在英文状态下输入)

    slave start;(有的数据库版本可能是start slave;)       //启动slave功能

    show slave status\G(注意G大写,且不加分号)       //检查从数据库复制功能

  //状态信息

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

              Slave_IO_State: Waiting for master to send event
              Master_Host: 192.168.x.xxx                                   //主服务器地址
              Master_User: uuu                                                   //授权帐户名,尽量避免使用root
              Master_Port: 3306                                                  //数据库端口,部分版本没有此行
              Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
             Read_Master_Log_Pos: 600                                   //同步读取二进制日志的位置
              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均属错误)。

测试

  在主数据库进行操作

  mysql> use db_uploadsystem;

  Database changed

  mysql> insert into db_uploadsystem values(…..);
  Query OK, 1 row affected (0.00 sec)

  在从数据库进行查询

  mysql> use db_uploadsystem;

  Database changed

  mysql> select * from sc_zizhizhengshulujing;

  +----+------+----------------+---------------------+

  | id | fid  | zhengshulujing | addtime             |

  +----+------+----------------+---------------------+

  |  1 |    2 | www.taide.com  | 2017-02-07 06:32:08 |

  |  2 |    2 | www            | 2017-02-23 06:42:06 |

  |  3 |    3 | www            | 2017-02-23 07:01:25 |

  +----+------+----------------+---------------------+
  1 row int set (0.00 sec)

配置过程中的错误解决

  1. 第6步执行show slave status\G,展示信息中Slave_IO_Running为no,出错原因除网上列举的几点外,还有一点是主数据库防火墙的问题,开放对应端口,或者关闭防火墙即可。
  2. 设置从数据库之前,应将主数据库的数据同步一份到从数据库,否则从数据库在复制执行主数据库日志文件的SQL语句时,遇到错误的话(如:查询数据库或者表不存在),会导致主从复制出错,出现Slave_SQL_Running为no的现象。
  3. 出现Slave_SQL_Running为no时的处理方法

1.跳过指定数量的事务:
mysql>slave stop(有的数据库版本可能是stop slave;)

mysql>set global sql_slave_skip_counter = x        //x:指定事务数量

mysql>slave start

2.修改mysql的配置文件,通过slave_skip_errors参数来跳过所有错误或指定类型的错误
vi /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146       //跳过指定error no类型的错误
#slave-skip-errors=all                             //跳过所有错误

binlog_do_db参数设置的坑

现象

在配置文件中想当然地配置成binlog_do_db=test,xx,jj,以为是三个库。结果无论什么操作都没有binlog产生

原因

mysql内部将“test,xx,jj”当成一个数据库了,结果因为我们没有这个db,自然就啥binlog都没写入了。

处理方法

正确的配置方法应该是这样

binlog_do_db=test

binlog_do_db=aa

binlog_do_db=bb

两种设置方法在show master status结果显示是完全一致的,也不报错,其他的过滤参数设置方法应该差不多,这真是太坑了!

3.建立账户并授权slave账户报错:Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

解决办法:https://www.cnblogs.com/tianshupei88/p/5075367.html