Mysql主从同步原理:
主服务器每执行一个写操作,它都会往自己的数据库中存一份,与此同时这个写操作也会存储在二进制日志文件中一份,并且把它们保存为事件,所以在这个数据库上,前端数据每执行一个写操作或者有可能引起修改的操作,都会保存一个事件,
从服务器的IO-Thread线程从主服务器获取二进制文件,并在本地保存为中继日志,然后在从服务器通过SQL-Thread线程来从中继日志中一次读一个事件并且在本地执行一下,从而使从库与主库保持一致
主从同步的详细过程如下:
1. 主服务器验证连接。
2. 主服务器为从服务器开启一个IO线程。
3. 从服务器将主服务器日志的偏移位告诉主服务器。
4. 主服务器检查该值是否小于当前二进制日志偏移位。
5. 如果小于,则通知从服务器来取数据。
6. 从服务器持续从主服务器取数据,直至取完,这时,从服务器SQL线程进入睡眠,主服务器IO线程同时进入睡眠。
7. 当主服务器有更新时,主服务器IO线程被激活,并将二进制日志推送给从服务器,并通知从服务器SQL线程进入工作状态。
8. 从服务器SQL线程执行二进制日志,随后进入睡眠状态。
注意:
1.mysql版本一样
2.一定要打开主服务器log-bin(二进制文件)
3.server-id一定不一样
4.master和slave的hostname不能相同
5.两台服务器的时间同步
一、设置主服务器master:
#vim /etc/my.cnf
log-bin=mysql-bin //[必须]启用二进制日志server-id=13 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
#/etc/init.d/mysqld restart
#vim /etc/my.cnf
log-bin=mysql-bin //[不是必须]启用二进制日志
server-id=12 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
#/etc/init.d/mysqld restart
mysql>grant replication slave on *.* to 'replication'@'%' identified by 'replication';
mysql>flush privileges;
四、锁主库表
mysql>flush tables with read lock;
五、记录主库信息
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 308 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
记录下file(二进制文件名称)和position(二进制文件位置),这个界面不要关闭,防止主服务器再操作状态值会变化
#mysqldump -uroot -p --master-data=2 --databases zabbix > zabbix.sql
--master-data 参数在导出zabbix.sql这个快照的时候,里面会记录着mysql二进制日志位置,通过 cat /root/zabbix.sql | grep CHANGE MASTER 可以查看到二进制文件名称和二进制文件位置
七、解锁
mysql> unlock tables;
八、将备份的数据库scp到从服务器上
#scp /root/*.sql root@192.168.11.12:/root/
#mysql -uroot -p < dbdump.sql
Mysql>change master to master_host='192.168.145.222',master_user='replication',master_password='replication',master_log_file='mysql-bin.000004',master_log_pos=308;
Mysql>start slave;Mysql>show slave status \G;
如果Slave_IO_Running、Slave_SQL_Running状态为Yes则表明设置成功。
十、测试
Mysql>create database hi_db;
Mysql>use hi_db;
Mysql>create table hi_tb(id int(3),name char(10));
Mysql>insert into hi_tb values(001,'bobu');
Mysql>show databases;
主服务器上创建创建hi_db数据库,在从服务器上马上看到了效果。
Mysql>show full processlist; 观察期状态