Centos7 Mysql 主从复制
一:功能实现:主服务器为:A,从服务器为:B;B服务器同步A服务器的mysql;
A:192.168.0.25 主
B:192.168.0.23 重
二:主服务器配置
1:开启3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent #开启3306端口 firewall-cmd --reload #重启防火墙
2:为重服务器建立用户授权
#IP为192.168.0.23可以使用user1远程访问,密码为123 mysql> grant replication slave on *.* to 'user1'@'192.168.0.23' identified by '123';
从服务器通过该账号同步主服务器,授权完成后,在从服务器登录一下,看是否能够登录住服务器数据库,如果可以则成功。
mysql -uuser1 -p123 -h192.168.0.25
说明授权成功。
3:主数据库my.cnf配置
[mysqld] log-bin=mysql-bin #开启binlog日志 log-bin=/var/log/mysql/my-bin #binlong日志位置 server-id = 1 #serverid,主数据库标识 binlog-do-db=abc #要同步的数据库 #如果要同步多个数据库,这样写 binlog-do-db=abc1 binlog-do-db=abc2
重启数据库!
4:导出数据库
为什么要导出数据库?因为数据库同步是根据binlog日志来同步的,之前的数据只能先导入过去。需要注意的是,导出数据需要锁住表,如果不锁住,数据可能会出现不一致的情况。可以通过三种方式解决这个问题:
(1):停止apache、nginx等web服务器,web服务器停止了,mysql一般不会有操作(除非还有什么TCP等这些链接……)
(2):加锁解锁,导出数据之前先加锁,导完后解锁
mysql> flush tables with read lock; #该处是锁定为只读状态 mysql> unlock tables; #解锁(3):mysqldump 加-l 参数实现加锁,解锁,执行完毕后,自动解锁
mysqldump -uroot -p123 --databases ec -l -F > /tmp/ec.sql
-F:表示刷新binlog日志表,刷新后生成新的binlog文件
--lock-tables(-l):备份过程中,依次锁住备份的表。一般用于myisam引擎,用来保证一致性。对于innodb引擎不需要使用该参数。如果同时存在innodb和myisam的表,则只能使用--lock-tables
--lock-all-tables(-x):备份时锁住所有表
5:记录binlong日志的File和Position
mysql> show master status
这两个要记录下来,一个是日志,一个是日志节点,如果有数据库操作,Position值会改变,这样会造成数据不一致。
比较完美的步骤:
mysql> flush tables with read lock; #先锁定 #再导出,这里已经锁定就不用加 -l,执行这一步不要退出终端,否则解锁了,用另外一个终端执行以下的导出 mysqldump -uroot -p123 --databases abc -F > /tmp/abc.sql mysql> show master status #导出数据库后,记录File和Position mysql> unlock tables; #然后解锁
直接用mysqldump -uroot -p123 --databases ec -l -F > /tmp/ec.sql 也行,自动锁定,自动解锁,方便省事;但是导出完毕后,一定要赶快运行show master status 记录File和Position,一定要快,不然如果这时候有数据库操作,数据会出现不一致的情况。
5:把主服务器导出的数据库传到从服务器去
scp /tmp/ec.sql root@192.168.0.23:/tmp
输入23服务器密码,传输成功。
三:从服务器配置
1:从数据库my.cnf配置
server-id=2 #必须唯一 replicate-do-db=abc; #需要同步的数据库 #多个数据库 replicate-do-db=abc1; replicate-do-db=abc2;
2:导入主数据库
mysql> source /tmp/abc.sql;
3:重启数据库,设置同步参数:
mysql> change master to master_host='192.168.0.25', -> master_user='user1', -> master_password='123', -> master_log_file='my-bin.000006', -> master_log_pos=1757;4:开始同步:
mysql> start slave;
5:查看状态
mysql> show slave status\G
这里出现两个Yes,表示同步正常。
6:停止主从
mysql> stop slave;
注意:
mysql同步,建议在内网同步,外网同步建议加vpn通道或者ssh隧道,网络影响较大;
如果要屏蔽一些错误,可以在从服务器my.cnf设置:
比如:slave-skip-errors=1062 #屏蔽主键冲突错误,不过会引起数据不一致的情况,差别太多,建议重新弄主从。