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;
查询主数据库的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)
配置过程中的错误解决
- 第6步执行show slave status\G,展示信息中Slave_IO_Running为no,出错原因除网上列举的几点外,还有一点是主数据库防火墙的问题,开放对应端口,或者关闭防火墙即可。
- 设置从数据库之前,应将主数据库的数据同步一份到从数据库,否则从数据库在复制执行主数据库日志文件的SQL语句时,遇到错误的话(如:查询数据库或者表不存在),会导致主从复制出错,出现Slave_SQL_Running为no的现象。
- 出现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结果显示是完全一致的,也不报错,其他的过滤参数设置方法应该差不多,这真是太坑了!