主从同步原理
主从同步原理
- 主服务器验证连接
- 主服务器为从服务器开启一个线程
- 从服务器将主服务器日志的偏移位告诉主服务器
- 主服务器检查该值是否小于当前二进制日志偏移位
- 如果小于,则通知服务器来取数据
- 从服务器持续从主服务器取数据,直至取完,这时,从服务器线程进入睡眠,主服务器线程同时进入睡眠
- 当主服务器有更新时,主服务器线程被激活,并将二进制日志推送给从服务器,并通知从服务器进入工作状态
- 从服务器SQL线程执行二进制日志,随后进入睡眠状态
配置实验环境
- 下载mysql安装包
# wget http://mirrors.sohu.com/mysql/MySQL-5.5/MySQL-server-5.5.38-1.rhel5.i386.rpm
# wget http://mirrors.sohu.com/mysql/MySQL-5.5/MySQL-client-5.5.38-1.rhel5.i386.rpm
- 执行安装
# rpm -ivh MySQL-server-5.5.36-1.rhel5.i386.rpm
# rpm -ivh MySQL-client-5.5.36-1.rhel5.i386.rpm
- 错误处理
缺少Perl包
error: Failed dependencies:/usr/bin/perl is needed by MySQL-server-5.5.36-1.rhel5.i386
安装Perl即可# yum install -y perl
与原先版本冲突 查看系统已经安装的版本# rpm -qa | grep mysql
卸载# rpm -e --nodeps mysql-libs-5.1.71-1.el6.i686
4.复制配置文件# cp /usr/share/mysql/my-large.cnf /etc/my.cnf
- 启动服务
# service mysql start
设置主服务器
修改my.cnf配置文件如下
log-bin=mysql-bin
[必须]服务器ID,必须唯一,通常取IP最后一位server-id=1
[必须]服务器ID,必须唯一,通常取IP最后一位binlog-do-db=testdb
[新增加]设置binlog记录的数据库,多个写多条binlog-ignore-db=testdb1
[非必须]设置binlog不记录的数据库,多个写多条expire-logs-days=10
设置binlog保存的天数为,默认保存30天
添加登录主服务器的账号
创建用户并授权
mysql> grant replication slave on *.* to 'slave'@'%' identified by 'admin888';
replication slave
授权为从服务器复制操作on *.*
表示所有库中的所有表'slave'@'%'
用户名为slave
,来源%
表示不限制identified by
设置密码
刷新授权表
mysql> flush privileges;
查看用户
mysql> select user,host from mysql.user;
锁定主服务器所有表
mysql> flush tables with read lock;
备份所有数据库数据
# mysqldump -uroot -p testdb>testdb.sql
导出testdb
数据库当当前文件夹下的testdb.sql
文件
复制数据到slave
# scp testdb.sql root@192.168.1.101:/root
查看主服务器状态
mysql> show master status
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 | 474 | hd | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
设置从服务器
修改mysql配置文件
# vim /etc/my.cnf
# 启用二进制文件
log-bin=mysql-bin
# 不能与主服务器相同,通常使用IP最后一位
server-id=2
重启mysql服务
service mysql restart
###导入从主服务器复制的sql文件
# mysql -uroot -padmin888 testdb<testdb.sql
> 如果出现错误 ERROR! MySQL server PID file could not be found!
> 执行 # rm -rf /var/lib/mysql/mysql-bin.index
同步binlog日志
mysql> change master to master_host='192.168.1.101',master_user='slave',master_password='admin888',master_log_file='mysql-bin.000009',master_log_pos=474;
开启从服务器(slave)同步
mysql> start slave;
解除主服务器(master)表锁定
mysql> unlock tables;
同步测试
在主服务器上插入数据,观察从服务器是否已经同步
主服务器查看状态
mysql> show processlist\G
*************************** 1. row *************************** Id: 4 User: slave Host: 192.168.100.103:41468 db: NULL Command: Binlog Dump Time: 2960 State: Master has sent all binlog to slave; waiting for binlog to be updated Info: NULL
####从服务器查看状态
mysql> show slave status;
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.100.101 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000009 Read_Master_Log_Pos: 474 Relay_Log_File: symo-centos-relay-bin.000009 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000009 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 474 Relay_Log_Space: 415 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.00 sec)