一、准备服务器,我们这里准备三台服务器02、03、04,并安装好mysql,安装步骤这里不再详诉。

image.png

二、配置主从关系

假设02这台服务器是主数据库,03与04为从数据库

主数据库名为shop_db

03服务器上数据库名为user_db

04服务器上数据库名为product_db

这三个数据库表结构一致,只是数据库名称不一样

当然一般不考虑分库分表的情况下,这个三个数据库名是一致的,我们这里就以分库分表为例

1、首先在主数据库shop_db创建测试表格

create database shop_db;	
use shop_db;	
create table user (	
	user_id int not null primary key auto_increment,
	user_name varchar(20) not null,
	UNIQUE KEY `user_name` (`user_name`)
) engine=innodb default charset=utf8;	


2、创建好后,需要用mysqldump命令备份一下刚才创建的这个数据库

mysqldump --master-data=2 --single-transaction --routines --triggers --events -uroot -p shop_db > /home/bak_shop_db.sql	

  --master-data mysql当前二进制日志点

  --single-transaction 保证在同一个事物中进行的备份

  --routines 存储过程备份

  --triggers 触发器备份

  --events 事件备份

备份好后,我们打开这个数据库文件看一看

cat /home/bak_shop_db.sql	


image.png

注意这一句

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000022', MASTER_LOG_POS=729;	

它表示,从服务器同步的时候只会同步729节点之后的数据,之前的数据我们已经初始化了。

3、我们将这个主服务器的数据库备份文件拷贝到从服务器

可以使用lrzsz,也可以使用scp命令

scp /home/bak_shop_db.sql root@192.168.0.191:/home

登录从服务器192.168.0.191

image.png

我们可以看到已经把数据库备份文件拷贝过来了

在从服务器上继续操作,导入数据库表结构

create database user_db;
mysql -uroot -p user_db< /home/bak_shop_db.sql

4、进入主服务器,配置用户

#创建同步账户

create user 'db_repl'@'%' identified by '123456';

#为同步账户授权

grant replication slave on *.* to 'db_repl'@'%';

5、进如从服务器,配置复制链路

change master to master_host="192.168.0.190",master_user="db_repl",master_password="123456",master_log_file='mysql-bin.000022', MASTER_LOG_POS=729;

#复制过滤,解决数据库名不一致的问题

#mysql中可以如下修改
change replication filter replicate_rewrite_db=((shop_db,user_db));
#如果是MariaDB,则在配置文件的server-id下添加
replicate-rewrite-db=shop_db->user_db

修改mysql配置文件

如果不知道mysql配置文件放在何处,可以用以下命令查找

cd mysql/bin
./mysqld --verbose --help|grep -A 1 "Default options"

image.png

将配置文件中的server-id换成和主服务器不一致的ID号,全局唯一配置,

配置log-bin

log-bin=mysql-bin

image.png

6、启动测试

从服务器进入mysql

start slave;

查看状态

show slave status \G

image.png


如果以上两项是yes状态,说明主从配置已经成功了,可以开始测试了。

如果Slave_IO_Running是no的状态,那么可能是主服务器没有对外开放mysql端口,

firewall-cmd --zone=public --add-port=3306/tcp --permanent
systemctl restart firewalld.service

停掉主从同步

stop slave;
reset slave all;

reset salve all是清除掉所有的slave信息,如果要重新启动同步

需要重新到主服务器执行

show master status \G

image.png

然后回到从服务器

change master to master_host="192.168.0.190",master_user="db_repl",master_password="123456",master_log_file='mysql-bin.000026', MASTER_LOG_POS=326;
start slave;