MySQL主从复制
1、数据库主从复制的基本介绍
数据库中的主从复制就是将主数据库中的 DDL 和 DML 操作通过二进制日志传输到从数据库上,然后将这些日志重新执行(重做),从而使得从数据库的数据与主数据库保持一致。
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。
MySQL复制是基于主服务器在二进制日志中跟踪所有对数据库的更改。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器已经记录到日志的数据。
当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。
MySQL复制是异步的且串行化的。主节点中一个用户请求一个写操作时,主节点并不需要等待从服务器也将这些写入操作执行完成后再响应用户,而是只要主节点把写入操作完成后就响应用户,因此从节点中的数据有可能会落后主节点。
1.1、主从复制的作用
主从复制的作用有以下:
- 主数据库出现问题,可以切换到从数据库。
- 可以进行数据库层面的读写分离。
- 可以在从数据库上进行日常备份。
2、MySQL主从复制的过程
主要有以下三步:
第一步:master 在每个事务更新数据完成之前,将该操作记录串行地写入到 binlog 文件中。master 将数据改变的记录到二进制日志(binary log),
这个记录的过程叫做二进制日志事件(binary log events)。
第二步:slave开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是将 master 的 binlog 拷贝到它的中继日志(relay log) 中
。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。
第三步:SQL Thread 会读取中继日志,并顺序执行该日志中的 SQL 事件,从而保持与主数据库中的数据一致。MySQL复制是异步的且串行化的。
(Binary log:主数据库的二进制日志。Relay log:从服务器的中继日志)
主从复制的原则主要有:
- 每个slave只有一个master
- 每个slave只能有一个唯一的服务器ID
- 每个master可以有多个salve
3、MySQL主从复制配置示例
注意:主机和从机的 mysql 版本尽量要保持一致。
首先准备两台服务器,如主数据库:192.168.32.130,从数据库:192.168.32.131。
修改两台服务器的数据库配置,如下:
修改配置文件:
vim /etc/my.cnf
主服务器修改:
主要就是在 [mysqld] 下面添加:
log-bin=mysql-bin server_id=1
上面的配置在配置文件中可能本身已经有了,这样就不用修改也行。如下:
server-id 的值不一定要是 1,也可以设置其他值,但不要和从服务器的相同。
从机的配置跟主机也一样,同样只是修改 log-bin 和 server_id,如下示例:
修改完之后记得要重启数据库:service mysql restart 才能生效。
可以通过 show variables like 'ser%'; 命令来查看 server_id 的值,如下:
然后在主服务器上为从服务器分配一个账号并授权,这样从服务器才能到主服务器上获取共享主服务器的日志文件。
GRANT REPLICATION SLAVE ON *.* TO '备份账号'@'从机数据库的IP' IDENTIFIED BY '密码'; -- 示例 GRANT REPLICATION SLAVE ON *.* TO 'zhangsan'@'192.168.32.131' IDENTIFIED BY '123456';
查看主服务器的BIN日志信息,执行完后需记录下 File 和 Position 的值,在配置完从服务器之前不要做主服务器上做任何操作,因为每次操作服务器的这两个值都会发生变化。
show master status;
最后设置从服务器。
如果之前有设置过主从复制的话则先关闭 slave,执行以下命令:
stop slave;
执行以下命令:
CHANGE MASTER TO MASTER_HOST='主服务器IP',MASTER_USER='创建用户名',MASTER_PASSWORD='创建的密码', MASTER_LOG_FILE='File 名字',MASTER_LOG_POS=Position 数字; -- 示例 CHANGE MASTER TO MASTER_HOST='192.168.32.130',MASTER_USER='zhangsan',MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=266;
最后启动从服务器复制功能
start slave;
可以查看从服务器状态,如果下面的 Slave_IO_Running 和 Slave_SQL_Running 的值都为YES,说明配置成功。不成功的话,重复上述步骤。
show slave status\G;
由此,主从复制就配置完成了。
我们可以在主机上进行一系列的 SQL 操作,从机上会自动同步这些操作,保持主从数据库一致。比如创建数据库、新建表、增删改查等等,都会自动同步到从数据库中。
但是需注意,主从复制功能只是说会同步那些在配置完主从复制后的操作,在这之前的主服务器的表、视图、数据库等都不会因为配置了主从复制而随之自动同步到从数据库中。
可以通过以下命令停止从数据库的复制功能,在从数据库中执行以下命令:
stop slave;