目录
1. MySQL主从复制原理
1.1 为什么需要主从复制?
① 在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服
务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出
现了锁表的情景,通过读从库也可以保证业务的正常运作。
② 做数据的热备
③ 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁
盘I/O访问的频率,提高单个机器的I/O性能。
1.2 什么是mysql的主从复制?
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。
MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更
新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定
的表。
1.3 MySQL复制原理
原理:
① master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变
写入二进制日志中;
② slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改
变,则开始一个I/O Thread请求master二进制事件;
③ 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地
的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和
主节点的保持一致,最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次被唤醒。
也就是说:
-
从库会生成两个线程,一个I/O线程,一个SQL线程;
-
I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
-
主库会生成一个log dump线程,用来给从库I/O线程传binlog;
-
SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
2. 完成MySQL主从复制(一主两从)
1> 主库操作
1.1> 修改mysql配置文件中my.cnf文件,为server_id设置值并开启binlog参数,启用日志功能
[root@localhost ~]# vi /etc/my.cnf
log_bin=master_bin
server_id=1
#修改完成后重新启动mysql
[root@localhost ~]# service mysqld restart
1.2> 创建slave用户并赋予权限
mysql> grant replication slave on *.* to 'slave_name'@'slave_ip' identified by 'password';
#slave_name:从库登入主库时的用户名
#slave_ip:从库的ip地址
#password:从库登入主库时的密码
1.3> 主库设置锁表,为后面备份准备(注意:生产环境要提前申请停机时间)
mysql> flush tables with read lock;
#提示:如果超过设置时间不操作会自动解锁。
1.4> 查看主库状态,即当前日志文件名和二进制日志偏移量
mysql> show master status;
1.5> 备份数据库数据
[root@localhost mysql]# mysqldump -uroot -p'Chen1110!' -B test test > /mysql/backup/test.sql
1.6> 主库解锁
mysql> unlock tables;
1.7> 主库备份数据上传至从库
[root@localhost backup]# scp /mysql/backup/test.sql 192.168.139.135:/mysql
[root@localhost backup]# scp /mysql/backup/test.sql 192.168.139.136:/mysql
#记得密码一定要输入正确,否则会认证失败噢~
1.8> 查看主库的binlog日志以及其pos位置
mysql> show master status;
2> 从库操作
2.1> 设置server-id值并关闭binlog参数
#log_bin = /data/mysql/data/mysql-bin
server_id = 110
#修改完成后重新启动mysql
[root@localhost ~]# service mysqld restart
2.2> 在从库上还原刚才传送的数据库文件,保证主从库一致
[root@localhost mysql]# mysql -uroot -p'Chen1110!' < /mysql/test.sql
[root@localhost mysql]# mysql -uroot -p'Chen1110!' < /mysql/test.sql
#检查还原
mysql -uroot -p -e 'show databases;'
2.3> 设定从库同步(此处示例其中一台从主机,另一台做相同的操作)
mysql> change master to
-> master_host="192.168.139.134",
-> master_user="slave",
-> master_password="Chen110!",
-> master_log_file="mysql-bin.000002",
-> master_log_pos=400;
#启动从库同步开关
mysql> start slave;
#检查状态
mysql> show slave status\G
2.4> 验证主从复制是否成功,查看以下两条是否都为yes
mysql> show slave status \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
#主从状况监测主要参数:
Slave_IO_Running: IO线程是否打开 YES/No/NULL
Slave_SQL_Running: SQL线程是否打开 YES/No/NULL