道者编程

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  #屏蔽主键冲突错误,不过会引起数据不一致的情况,差别太多,建议重新弄主从。


最新评论:
2楼 北京市 (静安中心机房) 发表于 2018-08-21 17:36:19
陈总6得一B
共有 1 条记录  首页 上一页 下一页 尾页 1
我要评论:

看不清楚