系统环境:
windows: Win7 (mysql 5.5) --Master
linux: CentOS7 (mysql 5.5) --Slave
1.配置主从同步:
1.1:先配置前,为了无误,先将权限(远程访问)、防火墙等处理
1.1.1: 关闭防火墙:
windows: 右键“网络”
linux: (OS中执行)
service iptables stop
1.1.2:允许远程连接: (在Master和Slave的Mysql中都执行)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'dbpwd' WITH GRANT OPTION;
FLUSH PRIVILEGES;
1.2:再配置Mysql配置文件
1.2.1:主机配置(Master配置)
- 1> 在目录下(D:\MySQL\MySQL Server 5.5)打开编辑my.ini文件.
[mysqld]
#id
server-id=1
#二进制日志文件(注意是/ 不是\)
log-bin="D:/MySQL/MySQL Server 5.5/data/mysql-bin"
#错误记录文件
log-error="D:/MySQL/MySQL Server 5.5/data/mysql-error"
#主从同步时 忽略的数据库
binlog-ignore-db=mysql
#(可选)指定主从同步时,同步哪些数据库,如果是多个库,用逗号分割
binlog-do-db=test1,test2,test3
- 2> windows中的数据库(Master库)授权哪台计算机中的数据库是自己的从数据库,mysql中执行:
GRANT REPLICATION slave,reload,super ON *.* TO 'root'@'192.168.1.%' IDENTIFIED BY 'dbpwd';
FLUSH PRIVILEGES;
- 3>查看主数据库的状态(每次在主从同步前,需要观察主机状态的最新值)
show master status;
记录下File和Positon的值
1.2.2:从机配置(Slave配置)
- 1> 在目录下(/etc)打开编辑my.cnf文件.
[mysqld]
server-id=2
log-bin=mysql-bin
replicate-do-db=test1,test2,test3
- 2> linux中的数据(Slave)授权哪台计算机中的数据库是自己的主数据库(mysql中执行)
CHANGE MASTER TO
MASTER_HOST = '192.168.2.2',
MASTER_USER = 'root',
MASTER_PASSWORD = 'dbpwd',
MASTER_PORT = 3306,
master_log_file='mysql-bin.000001',
master_log_pos=107;
如果报错:This operation cannot be performed with a running slave; run STOP SLAVE first
解决:STOP SLAVE ;再次执行上条授权语句
如果只是想同步几张表,也可以:
replicate-do-db 设定需要复制的数据库(多数据库使用逗号,隔开)
replicate-ignore-db 设定需要忽略的复制数据库 (多数据库使用逗号,隔开)
replicate-do-table 设定需要复制的表
replicate-ignore-table 设定需要忽略的复制表
replicate-wild-do-table 同replication-do-table功能一样,但是可以通配符
replicate-wild-ignore-table 同replication-ignore-table功能一样,但是可以加通配符
增加通配符的两个配置
replicate-wild-do-table=db_name.% 只复制哪个库的哪个表
replicate-wild-ignore-table=mysql.% 忽略哪个库的哪个表
1.3:再开启主从同步:
#从机linux:(mysql中执行)
start slave ;
#检验: (mysql中执行)
show slave status \G;
主要观察: Slave_IO_Running和 Slave_SQL_Running,确保二者都是yes;如果不都是yes,则看下方的 Last_IO_Error。
本次 通过 Last_IO_Error发现错误的原因是 主从使用了相同的server-id, 检查:在主从中分别查看serverid: show variables like ‘server_id’ ;
可以发现,在Linux中的my.cnf中设置了server-id=2,但实际执行时 确实server-id=1,原因:可能是 linux版Mysql的一个bug,也可能是 windows和Linux版本不一致造成的兼容性问题。
解决改bug:
stop slave;
set global server_id =2 ;
start slave ;
show slave status \G;