环境
- ubuntu 18.04 64bit
- mysql 5.7
简介
本篇使用 mysql
自带的自动同步功能,来实现2台 mysql
服务器数据的单向同步。基本情况如下图,要求主机 master
(ip
地址是 192.168.1.161) 有任何数据更新时,备机 slave
(ip
地址是 192.168.1.161) 数据也要同步。
实操
主机master操作
ip
地址:192.168.1.161
登录到本地数据库
mysql -u root -p
然后,创建进行同步操作的专用账号和密码,并授予该用户特定的权限
CREATE USER 'sync'@'%' IDENTIFIED BY 'syncpassword';
# 授权,所有数据库和数据表,任意主机登录。权限可以细分,如SELECT、INSERT、UPDATE等,* 和 % 都是通配符,想限定ip,可以写成 'sync'@'192.168.1.100',如果再加上权限的话,可以是这样 GRANT INSERT, UPDATE ON testdb.testtable TO 'sync'@'192.168.1.100';
GRANT ALL ON *.* TO 'sync'@'%';
然后输入
# 用户名是sync,密码是syncpassword,备机的ip是192.168.1.192。意思就是允许备机192.168.1.192上的用户sync使用密码syncpassword可以进行同步
grant replication slave on *.* to 'sync'@'192.168.1.192' identified by 'syncpassword';
# 使之生效
flush privileges;
接着,来修改 mysql
的配置文件,打开 /etc/mysql/mysql.conf.d/mysqld.cnf
,添加语句
# 理论上是可以写任意值,建议一般不要用默认的值1
server-id = 100
# 存储二进制的日志文件,这个非常有用,同步本质上是通过它来进行的
log_bin = /var/log/mysql/mysql-bin.log
# 同步的数据库名称,如果要同步多个数据库,就增加多条binlog-do-db数据
binlog-do-db = testdb
# 开启后,从库从主库复制的数据会写入log-bin日志文件里
log-slave-updates = 1
最后,重启下 mysql
服务
sudo /etc/init.d/mysql restart
如果启动服务时报错,可以查看文件 /var/log/mysql/error.log
,进行排查并解决。
备机slave操作
ip
地址:192.168.1.192
同样是登录到本地数据库
mysql -u root -p
同样是创建进行同步操作的专用账号和密码,并授予该用户特定的权限
CREATE USER 'sync'@'%' IDENTIFIED BY 'syncpassword';
GRANT ALL ON *.* TO 'sync'@'%';
flush privileges;
接着编辑 mysql
配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf
,并添加语句
# 二进制日志文件
log-bin = /var/log/mysql/mysql-bin.log
# 设置一个值
server-id = 101
# 主机和备机的数据库不一样,通过 -> 隔开。如果2个服务器数据库一致的话,可以这样写 binlog-do-db = testdb
replicate-rewrite-db = testdb -> testdb1
# 如果是只同步某些表,每一个表一行
replicate-wild-do-table = mac_and_sale.productorder_carton
replicate-wild-do-table = mac_and_sale.productorder_carton_carton
replicate-wild-do-table = mac_and_sale.productorder_outbound
配置完成后,重启 mysql
sudo /etc/init.d/mysql restart
然后,进入 mysql
命令行配置主机
# 停止
stop slave;
# 查看master状态,注意 File 和 Position 字段的值,接下来就要用到
show master status;
# 设置master,包括了ip地址、同步账号、密码、
change master to
master_host='192.168.1.161',
master_user='sync',
master_password='syncpassword',
master_log_file='mysql-bin.000001',
master_log_pos=154;
最后输入
start slave;
# 查看slave状态,注意 Slave_IO_Running 和 Slave_SQL_Running 值
show slave status;
至此,配置就都完成了,不出意外的话,主机上的数据变化就会立刻同步到备机上去。