目录
1.理解MySQL主从复制原理。
2.完成MySQL主从复制。
1.理解MySQL主从复制原理。
1.主要基于MySQL二进制日志
2.主要包括三个线程(2个I/O线程,1个SQL线程)
概括:
1、MySQL将数据变化记录到二进制日志中;
2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中;
3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库
详细步骤:
1.【连接】
1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user、password、port、ip),并且让从库知道,二进制日志的起点位置(file名,position号):start slave
2、从库的IO线程和主库的dump线程建立连接。
2.【传输】
3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。
4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。
3.【应用】
5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到
master.info中
6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的relay会自动被清理purge
2.完成MySQL主从复制。
环境准备:两台机器一主一从。
主库(MySQL Master):[ip为192.168.111.30 port为3306]
从库(MySQL Slave ):[ip为192.168.111.40 port为3306和3307]0.首先做时间同步(两台主机上同时进行)
[root@mysql3 ~]# yum whatprovides ntpdate#看命令是属于哪个软件包
[root@mysql3 ~]# yum install ntp-4.2.6p5-29.el7.centos.2.x86_64
[root@mysql3 ~]# ntpdate ntp1.aliyun.com
主库配置:
1)设置server-id值并开启binlog参数
[mysqld]
log_bin = mysql1-bin
server_id = 30
重启数据库。之前已经设置过的话,就不需要修改了
2)建立同步账号
mysql> grant replication slave on *.* to 'rep'@'192.168.111.%' identified by 'redhat';
mysql> show grants for 'rep'@'192.168.111.%'; # 查看授权账号
3)锁表设置只读。原因是为后面备份准备,注意生产环境要提前申请停机时间;
mysql> flush tables with read lock;
提示:如果超过设置时间不操作会自动解锁。
mysql> show variables like '%timeout%'; # 查看超时时间
测试锁表后是否可以创建数据库:
4)查看主库状态
查看主库状态,即当前日志文件名和二进制日志偏移量
mysql> show master status;
+-------------------+----------+--------------+------------------+----------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+----------------------------------------------+
| mysql1-bin.000013 | 488 | | | 040934de-f7f3-11ed-887d-000c29f42778:1-62292 |
+-------------------+----------+--------------+------------------+----------------------------------------------+
1 row in set (0.00 sec)
5)备份数据库数据
[root@mysql1 ~]# mysqldump -uroot -predhat -A -B | gzip > /backup/mysql/all.sql.gz
6)解锁
mysql> unlock tables;
7)主库备份数据上传到从库
[root@mysql1 ~]# scp /backup/mysql/all.sql.gz 192.168.111.40:/opt/
从库配置:
从库上设置
1)设置server-id值并关闭binlog参数
#log_bin = /data/mysql/data/mysql-bin
server_id = 130
重启数据库:
2)还原从主库备份的数据,前提是保证数据库为开启状态
[root@mysql2 ~]# zcat /opt/all.sql.gz | mysql -uroot -predhat -S /mysql/3306/mysql.sock
[root@mysql2 ~]# zcat /opt/all.sql.gz | mysql -uroot -predhat -S /mysql/3307/mysql.sock
检查还原:
[root@mysql2 ~]# mysql -uroot -predhat -S /mysql/3306/mysql.sock -e 'show databases'
[root@mysql2 ~]# mysql -uroot -predhat -S /mysql/3307/mysql.sock -e 'show databases'
3)设定从主库同步(3306端口数据库和3307端口书库同时进行)
mysql> change master to
-> master_host='192.168.111.30',
-> master_port=3306,
-> master_user='rep',
-> master_password='redhat',
-> master_log_file='mysql1-bin.000013',
-> master_log_pos=488;
4)启动从库同步开关
mysql> start slave;
检查状态:
mysql> show slave status\G
5)测试主从同步1.在主库上插入数据,看从库上有没有同步过来,
2.在主库上删除数据,看从库上有没有同步过来。