1.优点
1)当数据库执行insert、udpate、delete操作时数据库会触发独占式封锁机制,也就是“锁表”,此时有查询操作需要等待,影响查询速度。而主从库读写分离可以避免这种情况。
2)做数据的热备份(相对于冷备份来说,热备份是在数据库正常工作的情况下进行备份,备份的数据是完整的,而冷备份是某一时间点的备份,如果需要回退,那么冷备份存在丢失数据的可能)
3)架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能(这句话抄来的,其实原来一个人工作的内容现在改为多个人做,提高每个人的工作效率)
2.原理
主从复制的原理简单说就是主库在数据库运行中会生成对应的操作日志,而从库通过读取主库的操作日志,完成和主库一样的动作即可实现复制(详细的原理机制此处不描述,文档末尾有推荐链接,写的很好)。
3.实践(测试服务器为linux环境)
1)准备两台服务器,装好Mysql数据库
2)进入主服务器修改MySQL配置文件(my.cnf或my.ini),开启二进制日志,修改内容如下:
vi /etc/my.cnf #修改文件命令
#修改下面内容
log-bin=mysql-bin #启用二进制日志
binlog_format=mixed #二进制日志的格式,有三种:statement/row/mixed,这里使用mixed
server-id=129 #服务器唯一ID,默认是1,一般取IP最后一段
3)修改配置文件保存退出后,重启MySQL服务
service mysqld restart
4)在主服务器上分配一个账户给从库,用于读取主服务器的日志文件
mysql> GRANT replication slave ON *.* TO 'slave'@'%' identified by '1234';
#其中‘replication slave’是指分配复制权限
#其中‘ON *.*’是指可以操作哪个数据库的哪张表,*.*就是所有库,所有表
#其中‘TO slave’中的slave是分配的用户名
#其中‘@%’中的%是所有电脑都可以使用
#最后的1234是slave用户对应的密码
**此处在实践过程中我想尝试想把mysql中的某个数据库开启主从复制而不是所有的,进而语句变成了
mysql> GRANT replication slave ON ceshi.* TO 'slave'@'%' identified by '1234';
**但是这种情况下,mysql会报错说复制权限是全局权限不能单独指定给某一个数据库。。。。。。。那么如何实现只同步某一个库呢,写在下面
5)查询主服务的配置状态,获取配置从数据库的信息(主服务器保持下面的页面不要做其他操作)
mysql> show master status;
6)配置从服务器,修改配置文件(同第二步),其中有几个额外参数介绍一下
vi /etc/my.cnf
#修改如下内容
[mysqld]
log-bin=mysql-bin
server-id=130
binlog_do_db=ceshi #此参数的意思是只同步哪些数据库,多个写多行即可
binlog-ignore-db = test #此参数的意思是不同步哪些数据库,多个写多行即可
7)保存配置文件,重启MySQL服务器(同第三步)
8)进入从库MySQL关闭slave
mysql>stop slave;
9)配置复制信息
mysql>change master to
master_host='192.168.47.129',
master_user='slave',
master_password='1234',
master_log_file='mysql-bin.000060',
master_log_pos=248;
#参数解释:
MASTER_HOST : 设置要连接的主服务器的ip地址
MASTER_USER : 设置要连接的主服务器的用户名
MASTER_PASSWORD : 设置要连接的主服务器的密码
MASTER_LOG_FILE : 设置要连接的主服务器的bin日志的日志名称,即第5步得到的信息
MASTER_LOG_POS : 设置要连接的主服务器的bin日志的记录位置,即第5步得到的信息,(这里注意,最后一项不需要加引号。否则配置失败)
10)启动slave同步
mysql>start slave;
11)检查从服务器复制功能状态
mysql> show slave status;
**这两项为Yes即为配置成功
12)主库进行操作,验证从库是否成功。
13)成功后在从库创建一个只读账号,防止从库修改数据导致与主库不同步的现象
GRANT Select ON *.* TO reader@"%" IDENTIFIED BY "123456"
4.参考资源
[MySQL高级](七) MySQL主从复制及读写分离实战
MySQL主从复制半小时学会