1,复制原理
官方参考文档:
博客地址1:
博客地址2:
如下图1.png所示:
该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQLslave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制 过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
2,mysql主从同步应用场景
(1):数据分布
(2):负载均衡
(3):备份
(4):高可用和容错
3,搭建mysql主从的环境要求
主从系统要保持一致:包括数据库版本,操作系统版本,磁盘IO磁盘容量,网络带宽等。
[root@data02 ~]# cat /etc/redhat-release
CentOS release 6.2 (Final)
[root@data02 ~]#
主库master
从库slave
OS系统版本
CentOS release 6.2 (Final)
CentOS release 6.2 (Final)
数据库版本
5.6.12-log
5.6.12-log
磁盘容量
50G
30G
主机ip地址
192.168.52.129
192.168.52.130
端口
3306
3306
内存
1G
1G
服务器类型
虚拟机
虚拟机
4,开始搭建mysql主从复制4.1建立复制账号
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.*TO repl@’192.168.52.130′ IDENTIFIED BY ‘repl_1234’;
建立一个复制账号,只允许从192.168.52.130上来访问登录主库进行二进制日志传输同步。PS:如果mysql版本新旧密码算法不同,可以设置set password for ‘backup’@’10.100.0.200’=old_password(‘1234’))
4.2 手动同步数据
因为当开始搭建的时候,主库上已经有了数据,所以要先把主库已经存在的数据先手动同步迁移到从库上面去。
这里可以用mysqldump也可以用xtrabackup导出主库上面的数据:
(4.2.1):xtrabackup方式
在主库上192.168.52.129上面进行数据备份,备份命令,要添加–safe-slave-backup参数:
innobackupex –user=backup–password="123456" –host=192.168.52.129 –socket=/tmp/mysql.sock–defaults-file=/etc/my.cnf /data/backups/mysql/repl/backup_slave –parallel=3–safe-slave-backup –no-timestamp
去备份目录/data/backups/mysql/repl/backup_slave查看备份时候的主库二进制信息,需要根据这个二进制信息来进行数据同步,如下所示:
[root@data01 test]# cd/data/backups/mysql/repl/backup_slave
[root@data01 backup_slave]# more xtrabackup_binlog_info
mysql-bin.000147 120
[root@data01 backup_slave]#
压缩备份文件并且传输到从库192.168.52.130上面:
tar -zcvf backup_slave.tar.gz backup_slave/
scp backup_slave.tar.gz192.168.52.130:/tmp/
(4.2.2)mysqldump方式
在主库上192.168.52.129上做基于主库做数据备份
/usr/local/mysql/bin/mysqldump -ubackup–password=123456 –host=192.168.52.129–single-transaction –flush-logs –master-data=2 –add-drop-table–create-option –quick –extended-insert=false –set-charset –disable-keys -A> /tmp/alldb.sql
压缩备份文件,传输到从库192.168.52.130上面去。
gzip /tmp/alldb.sql
scp /tmp/alldb.sql.gz 192.168.52.130:/tmp/
4.3 配置master库(192.168.52.129)
Vim /etc/my.cnf
server-id=129 # Server ID
log-bin =/home/data/mysql/binlog/mysql-bin
binlog-ignore-db=mysql # No sync databases
binlog-ignore-db=test # No sync databases
binlog-ignore-db=information_schema # No sync databases
binlog-ignore-db=performance_schema
binlog-do-db=user_db
保存退出,重启mysql主库,可以查看主库的状态,如下:
mysql> show master status;
+——————+———-+————–+————————————————–+——————-+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB| Executed_Gtid_Set |
+——————+———-+————–+————————————————–+——————-+
环境不会改变,解决之道在于改变自己。