1 问题
数据对于我们来说是一项最重要的资产,因为数据丢失带来的损失,对于一家公司来说,有时也是毁灭性的。
那么如何确保数据安全,不因断电或系统故障带来数据丢失呢?
当用户增加,对数据库的访问量也随之升高,如何提高数据库性能,降低访问量增长对数据带来的压力呢?
主从复制无疑是其中一个比较好的选择,将主库的数据复制到多个从库中,如果主库挂掉,从库的数据也是完整的,能够继续为用户提供服务。
同时可以对数据库进行读写分离操作,主库用于数据的写入,而从库则用于数据的读取。
2 binlog 日志
2.1 什么是 binlog
是 MySQL 中最重要的一种日志,它记录了 MySQL 所有数据的变更,并以二进制的形式存储在磁盘上,这些变更包括了所有的表结构变更(CREATE、ALTER TABLE…)以及表数据变更(INSERT、UPDATE、DELETE…),不包括 SELECT 。
也是实现主从复制的数据来源。
binlog 日志有三种记录格式:
- statement 每次数据变更的 sql 都会被记录;
- row 仅记录被修改的数据;
- mixed 上述两种方式混合使用,一般的语句修改采用 statement,当全表更新时则采用 row,但是这种模式下无法使用 @@host name 函数。
2.2 binlog 日志相关的命令
登录进入到mysql的命令行中:
查看日志位置
show variables like '%log_bin%';
查看日志格式,这里的格式是指三种记录日志的格式
show variables like '%format%';
查看当前使用的日志文件
show master status;
3 主从复制的原理
从数据库中开启两个线程:
一个用于监控主数据库 binlog 日志的变化,如果有更新,就将其读取出来并写入到从数据库的 relay log 中;
另一个线程用于监控本地的 relay log 日志的变化,如果有更新,就将更新内容在本地执行一遍,这样就保证了从数据库与主数据库数据的一致性。
4 搭建主从复制
4.1 安装MySQL数据库
这里默认已经安装了至少两个MySQL数据库,如果有不清楚怎么安装的,可以在网上进行搜索。
4.2 开启数据库的 Binlog 日志
在主数据库 MySQL 的配置文件中增加两项配置
在从数据库也增加同样的配置,server-id 不能相同,需要改为 102。
设置完成后,需要重新启动数据库。
4.3 配置用于读取主数据库的用户
4.3.1 主数据库中的操作
首先,需要在主数据库中创建 binlog 日志的读用户,允许从数据库使用 slave 这个用户访问主数据库。
查看数据库中日志文件状态
show master status;
记住其中的两项参数,下边将在从库中需要使用。
在主数据库的命令行中执行:
grant replication slave on *.* to 'slave'@'%' identified by '123456';
4.3.2 从数据库中的操作
在从库中配置主库连接信息
命令中的各项信息,需要和主库中查询到的内容一致。
- master_host 主库的IP地址
- master_user 主库的用户
- master_password 主库的密码
- master_log_file 主库当前正在使用的 binlog 文件
- master_log_pos 主库当前 binlog 文件位置
change master to master_host='192.168.1.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=106;
查看从库状态
show slave status \G;
如果其中 Slave_IO_Running Slave_SQL_Running 参数都为YES时,表示同步正常。
否则需要查看是否是 防火墙的问题,或者是 数据库配置文件中 Server-id 相同导致的。
至此,只要在主库中做出修改数据的操作,从库中的数据将被自动刷新。
5 解除主从复制
进入到从库的命令行中,执行如下操作
mysql> stop slave;
Query OK, 0 rows affected (0.08 sec)
mysql> reset slave all;
Query OK, 0 rows affected (0.18 sec)
mysql> show slave status\G;
Empty set (0.00 sec)