MySQL主从复制的简单实现过程

一、主从复制的原理
数据库的主从复制均是通过日志实现数据的复制。主库更新写入二进制日志文件(binlog),并维护文件的一个索引以跟踪日志循环。当一个从服务器连接主服务器时,它通知主服务器并从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

  • mysql支持的复制类型
    (1)基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时, 会自动选着基于行的复制。
    (2)基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持。
    (3)混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
  • 复制解决的问题
    (1)数据分布(Data distribution)
    (2)负载平衡(load balancing)
    (3)备份(Backups)
    (4)高可用性和容错行(High availability and failover)
  • 主从复制如何工作
    (1)master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)
    (2)slave将master的binary log events拷贝到它的中继日志(relay log)
    (3)slave重做中继日志中的事件,将改变反映它自己的数据。
    注:主从进行修改的文件媒介是二进制变更日志(bin-log),所以主服务器必须激活二进制日志功能。

二、配置MySQL主从复制(Linux服务器)

(1)创建复制账户
在Master上创建一个备份账户,每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中
命令:

Mysql > GRANT REPLICATION SLAVE ON *.* TO ‘slave_account’@'a.b.c.d' IDENTIFIED BY '123456';
Mysql> flush privileges;

允许从服务器’a.b.c.d '使用’slave-account’及’123456’这个帐号密码对主服务器的所有数据库(.)进行主从复制(‘REPLICATION SLAVE’)。对从服务器授权后,需要进行权限的刷新。
(2)查看状态
查看主服务器master状态(注意File与Position项,从服务器需要这两项参数)

mysql> show master status;
 ±-----------------±---------±-------------±-----------------±------------------+
 | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
 ±-----------------±---------±-------------±-----------------±------------------+
 | mysql-bin.000001 | 630 | brian | mysql | |
 ±-----------------±---------±-------------±-----------------±------------------+


(3)设置slave库的配置文件(my.cnf)

#数据库唯一ID,主从的标识号绝对不能重复(通常写IP的最后一段,用于区分)
server-id=2	
log-bin=mysql-bin				#启动MySQ二进制日志系统
replicate-do-db=DB_NAME				#需要同步的数据库名。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。
replicate-ignore-db=mysql			#不同步mysql系统数据库
slave-skip-errors = all			#跳过所有的错误错误,继续执行复制操作
validate_password_policy=0		#指定密码策略
validate_password = off			#禁用密码策略

(4)配置slave库上的数据

  • 先创建一个DB_NAME空库,否则下面导入数据时会报错说此库不存在
mysql> create database DB_NAME character set utf8 collate utf8_general_ci;
  • 配置主从前,先停掉slave
mysql> stop slave;
  • 配置主从
mysql> 
change master to master_host='主库的ip地址,master_port=3306,master_user='slave_account',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=630;
  • 启动主从
mysql> start slave;
  • 查看同步状态(Slave_IO_Running和Slave_SQL_Running为YES表示主从配置成功)
mysql> show slave status \G;

(5)验证
在主服务器的XX数据库上的XX表中插入一条数据,在从服务器的XX数据库上的xx表中年查验是否新增了数据