时间:2021-07-01 10:21:17 帮助过:28人阅读
MySQL主从服务器链式复制配置(ubuntu)
服务器结构:
A、B、C三台服务器; 其中A为新闻数据源,A为B的Master,B为A的Slave,同时也是C的Master;
B服务器从A复制部分数据,C备份A的所有数据;
配置:
Master A的配置
sudo vi /etc/mysql/my.cnf
删除以下参数前的注释并修改
server-id = 1 //分配server-id
log-bin = master-bin //默认mysql-bin,可以不修改
log-bin-index = master-bin.index //非必须
bind-adress = 0.0.0.0 //默认127.0.0.1 不修改可能导致无法访问
修改系统防火墙使B服务器可以访问3306端口,(详查ufw命令)
重启mysql:
sudo /init.d/mysql restart
通过语句:
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO user@'ip B' IDENTIFIED BY 'password';
给B服务器建立一个可以连接到A的帐号
进入mysql,通过:
show master status;
查看A的状态,记录下file的位置和postion的参数
Slave B的配置
sudo vi /etc/mysql/my.cnf
server-id = 2
log-bin = slave-bin
bind-address = 0.0.0.0
relay-log-index = slave-relay-bin.index //非必须
relay-log = slave-relay-bin //非必须
添加参数:
log-slave-updates = 1
//通常情况,从服务器从主服务器接收到的更新不记入它的二进制日志。
//该选项告诉从服务器将其SQL线程执行的更新记入到从服务器自己的二进制日志。
replicate_wild_do_table = copy_db.copy_table //表示需要复制的库中的表,可以善用%
replicate_wild_ignore_table = ignore_db.ignore_table //不复制的表
至于为什么不使用replicate_do_db和replicate_ignore_db参数,
是为了方式跨库更新时出错,如果能确保不会跨库更新可考虑
重启mysql,进入本机mysql
执行以下语句:
CHANGE MASTER TO MASTER_HOST='server A ip',
MASTER_PORT=3306,
MASTER_USER='user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
//MASTER_LOG_FILE和MASTER_LOG_POS对应A中的file位置和postion参数,表示开始复制的bin文件和位置
start slave; //启动Slave
show slave status; //查看Slave_IO_State参数,如果是Waiting for master to send event,则正常
//正常状态下Slave_IO_Running与Slave_SQL_Running均为yes
//如不能正常链接,根据Slave_IO_State,Slave_IO_Running,Slave_SQL_Running,Last_IO_Error
//等参数查找失败原因
通过:
show master status;
命令记录file位置和postion参数;
给C服务器分配一个帐号用于同步;
方法参照A,防火墙设置参照A;
Slave C的配置
sudo vi /etc/mysql/my.cnf
server-id = 3
relay-log-index = slave-relay-bin.index //非必须
relay-log = slave-relay-bin //非必须
通过CHANGE MASTER TO语句来修改master的参数,参照B的配置;
通过
show slave status;
检查C的状态,参照B
bitsCN.com