简介
一个服务器上执行过的sql语句在别的服务器上也重复执行一遍,这样只要两个数据库的初态是一样的,那么它们就能一直同步。
当然这种复制和重复都是mysql自动实现的,我们只需要配置即可。
对于一个mysql服务器, 一般有两个线程来负责复制和被复制。当开启复制之后。
1. 作为主服务器Master, 会把自己的每一次改动都记录到 二进制日志 Binarylog 中。 (从服务器会负责来读取这个log, 然后在自己那里再执行一遍。)
2. 作为从服务器Slave, 会用master上的账号登陆到 master上, 读取master的Binarylog, 写入到自己的中继日志 Relaylog, 然后自己的sql线程会负责读取这个中继日志,并执行一遍。 到这里主服务器上的更改就同步到从服务器上了。
配置过程
服务器信息
示例:
主服务器IP: 192.168.1.221 数据库账号: root/123456 数据库名: healthcare
从服务器IP: 192.168.1.209 数据库账号: root/123456 数据库名: healthcare
主服务器(master)配置
首先要保证从服务器对主服务器数据库的访问,即开启MySQL的远程访问。
修改master的数据库配置文件,默认配置文件在 /etc/my.cnf,打开之后在[mysqld]之后加入以下条目:
# 启用二进制日志 Enable binary log
log_bin = mysql-bin
#服务器唯一ID,默认是1,一般取IP最后一段
server-id = 111
#指定索引文件
log-bin-index=mysql-bin.index
#控制何时将日志写入硬盘,0由操作系统决定;1事务结束时
sync_binlog=1
#bin-log日志文件格式,设置为MIXED可以防止主键重复。
binlog_format=mixed
#需要同步的数据库名 多个库以逗号分隔
binlog-do-db = healthcare
#不需要同步的数据库名
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema
#若涉及及同步函数或者存储过程需要配置,否则主备会产生异常不能同步
log_bin_trust_function_creators=TRUE
修改my.cnf后重启mysql服务.
#service mysql restart
创建同步账号:
mysql> grant replication slave on *.* to [email protected] identified by '123456';
mysql> flush privileges;
mysql> show master status;
记录一下file(文件名)和position(位置).
从服务器(slave)配置
修改slave的数据库配置文件,默认配置文件在 /etc/my.cnf,打开之后在[mysqld]之后加入以下条目:
log-bin=mysql-bin
server-id=17
relay-log-index = slave-relay-bin.index
relay-log = slave-relay-bin
sync_master_info = 1
sync_relay_log = 1
sync_relay_log_info = 1
配置后重启mysql服务
#service mysql restart
配置连接主库
#mysql -uroot -p123456
mysql>
change master to master_host='172.16.0.10',master_user='slave',master_password='fbtslave20190220', master_log_file='mysql-bin.000003',master_log_pos=120;
开始同步:
mysql> start slave;
查看状态:
mysql> show slave status\G;
正常状态:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果Slave_IO_Running一直处于连接中,查询原因可以从:网络不通,密码不对,position不对查找.
测试是否同步
这里主要是测试一下主服务器修改一条记录后,看看主从服务器的数据是否已经同步
主服务器:
#mysq -uroot -p123456
Mysql>select id,mobile,real_name from tb_member where id = 9;
从服务器:
#mysq -uroot -p123456
Mysql>select id,mobile,real_name from tb_member where id = 9;
主服务器:
Mysql> update tb_member set real_name = 'demo_456' where id = 9;
Mysql>select id,mobile,real_name from tb_member where id = 9;
从服务器:
Mysql>select id,mobile,real_name from tb_member where id = 9;