一、主从复制概述
MySQL复制是指从一个MySQL主服务器(master)将数据复制到另一台或多台MySQL从服务器(slave)的过程。将主数据库的DDL和DML操作二进制日志传到复制服务器上,然后从服务器上对这些日志重新执行,从而使得主从服务器的数据保持同步。在MySQL中,复制操作是异步进行的,slave服务器不需要持续的保持连接接受master服务器的数据。如果一台主服务器同时向多台从服务器上进行复制操作。如果主服务器的访问量比较大。可以在服务器上进行查询操作,从而降低主服务器的访问压力,同时从服务器可以作为主服务器的备份。可以避免主服务器的数据丢失。
MySQL复制操作大致可以分为以下三个步骤
步骤1:主服务器的数据改变记录到二进制日志(binary log)中
步骤2:从服务器将主服务器的binary log events 复制到它的中继日志(relay log)中。
步骤3:从服务器重做中继日志中的事件,将数据的改变与从服务器保持同步
slave上面的I/O进程连接上master,并发出日志请求,master接收到请求后。通过负责复制的I/O进程根据请求信息读取与指定位置之后的日志信息。返回给slave的I/O进程。返回信息除了包含日志所包含的信息,还包括本次返回的信息已经到master端的bin-log文件的名称以及bin-log的位置
slave的I/O进程接受到信息后,将接收到的日志内容依次添加到slave端的relay-log文件的末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中。
slave的SQL进程检测到relay-log中新增加的内容后,马上解析relay-log的内容,并在自身执行。
MySQL的复制环境一般都是一个master带一个或多个slave的架构模式。如果主从的压力不是很大的话。异步复制的延时一般很少。
二、开启主从复制的步骤
步骤一:修改master服务器的配置文件my.cnf。在主节点上开启二进制日志,并设置server-id
log-bin = /data/3306/binlog/mysqld-bin expire_logs_days = 7 server-id = 1
步骤二、登陆Master主服务器,创建一个用于复制的账户。并赋予REPLICATIN SLAVE权限,这里创建一个用户rep
grant replication slave on *.* to 'rep'@'%' identified by '111111'; flush privileges;
步骤三、在Masetr服务器上设置读锁,这个步骤的目的是确保在进行全量备份的过程中没有新的数据写入,主服务器只允许读操作
flush tables with read lock;
步骤四、另开一个窗口,对Master服务器进行全量备份。如果量大,可以对备份文件进行压缩。备份完成后,回到原来的窗口把锁打开,执行unlock tables。在备份的过程中使用 -x 参数,步骤三是可以省略的。
mysqldump -u root -p -S /data/3306/mysql.sock -A -B --master-data=2 | gzip > /home/backup/rep.sql
步骤五、将Master主服务器上的备份文件,在SLAVE服务器上进行数据恢复
mysql -u root -p -S /data/3307/mysql.sock < /home/backup/rep.sql
步骤六、对从服务器坐相应的设置,需要指定复制的用户,主数据的IP地址、端口号以及开始复制的日志文件和位置。如果备份的时候 --master-data 参数的值为1。这个步骤中就不需要指定复制的日志和位置了。设置的信息存放在master-info文件中,文件的存放位置默认在从服务器的data目录下。
在从库里边执行 CHANGE MASTER TO MASTER_HOST='192.168.222.145', MASTER_PORT=3306, MASTER_USER='rep', MASTER_PASSWORD='111111', MASTER_LOG_FILE='mysqld-bin.000004', MASTER_LOG_POS=1242;
步骤七、开启复制开关,在从服务器中启动。
start slave;
show slave statusG # 查看从服务器的状态
show processlist # 查看复制进度