潘瑞峰的个人博客

mysql主从复制

潘瑞峰 mysql主从复制

主从复制

主从复制是指有两个数据库,它们的角色分别是master和slave。所有数据库操作都在master端进行,slave会自动同步master的操作。

主从复制目的

  • 最常见的目的就是备份
  • 用于数据挖掘。如果直接从生产数据库中挖掘,会占用数据库资源。
  • 数据库读写分离,减少负荷。master和slave同时投入生产,用户所有的写操作在master端进行,所有的读操作在slave端进行。将数据库访问请求分摊,降低负荷。

环境准备

我准备了两台服务器A和B,都是Ubuntu系统。记它们的ip分别是ipA和ipB。master对应A服务器,slave对应B服务器。

Master节点

修改mysql的配置文件my.cnf,增加如下配置,然后重启mysql服务

[mysqld]
#master-slave
server-id=1
log-bin=mysql-bin
binlog-do-db=mstest      #要同步的mstest数据库,要同步多个数据库,就多加几个replicate-db-db=数据库名
binlog-ignore-db=mysql  #要忽略的数据库

创建slave账号

mysql> GRANT REPLICATION SLAVE ON *.* to 'slave_user'@'ipB' identified by 'password';
#这样就创建了一个用户名为slave_user,密码为password的用户,且只允许该用户的访问来源是localhost或者ipB

完成后,查看master的状态

Slave节点

修改mysql的配置文件my.cnf,增加如下配置,然后重启mysql服务

[mysqld]
#master-slave
server-id=2

配置master的信息,并且启动slave

mysql> change master to master_host='ipA',master_user='slave_user',master_password='password',
         master_log_file='mysql-bin.000015',master_log_pos=424;
#注意master_log_file和master_log_pos要对应master状态中的File和Position列

mysql> start slave;
#启动slave

完成后,查看slave的状态,Slave_IO和Slave_SQL的状态必须是yes,否则说明配置失败了

测试

我在A服务器上创建了表test,然后插入两条数据 在B服务器上也能看到

注意

  • 最好先在两台服务器上分别手动创建需要同步的数据库,然后再启动slave,否则可能会出问题
  • 上述配置是单向的
  • 直接在slave数据库中进行写操作,会出问题。我尝试直接在ipB上执行insert语句,然后就不再同步了。也就是之后在ipA上的insert不会同步到ipB上。(这部分我还没弄清楚)
潘瑞峰
五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。