Mysql主从复制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Mysql主从复制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4898字,纯文字阅读大概需要7分钟。
内容图文
mysql原理介绍
MySQL的主从复制是一个异步的复制过程,数据将从一个MySQL数据库复制到另一个MySQL数据库,在master与slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和I/O线程)在slave端,另一个线程(I/O线程)在master端。
要实现MySQL的主从复制,首先必须打开master端的binlog记录功能,否则就无法实现。因为整个复制过程实际上就是slave从master端获取binlog日志,然后再在slave上以相同顺序执行获取的binlog日志中所记录的各种SQL操作。
要打开MySQL的binlog记录功能,可通过在MySQL的配置文件my.cnf中的mysqld模块增加“log-bin”参数选项来实现,具体信息如下:
[mysqld]
log-bin = /data/3306/mysql-bin
mysql原理详解
1)在slave服务器上执行start slave命令开启主从复制开关,开始进行主从复制。
2)此时,slave服务器的I/O进程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从指定binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。
3)master服务器接受到来自slave服务器的I/O线程的请求后,其上负责复制的I/O线程会根据slave服务器的I/O线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给slave端的I/O线程。返回的信息中除了binlog日志内容外,还有在master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置。
4)当slave服务器的I/O线程获取到master服务器上I/O线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到slave端自身的relay log(即中继日志)文件(MySQL-relay-bin.xxxxxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下次读取master端新binlog日志时能够告诉master服务器从新binlog日志的指定文件及位置开始请求新的binlog日志内容。
5)slave服务器端的SQL线程会实时检测本地relay log中I/O线程新增加的日志内容,然后及时地把relay log文件中的内容解析成SQL语句,并在自身slave服务器上按解析SQL语句的位置顺序执行应用这些SQL语句,并在relay-log.info中记录当前应用中继日志的文件名及位置点。
1.1 mysql原理小结
MySQL主从复制原理总结:
◆主从复制是异步的逻辑的SQL语句级的复制。
◆复制时,主库有一个I/O线程,从库有两个线程,即I/O和SQL线程。
◆实现主从复制的必要条件是主库要开启记录binlog功能。
◆作为复制的所有MySQL节点的server-id都不能相同。
◆binlog文件只记录对数据库有更改的SQL语句(来自主数据库内容的变更),不记录任何查询(select、show)语句。
实验环境的介绍
[ root@db02 ~ ]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@db02 ~]# uname -r 2.6.32-642.el6.x86_64 [root@db02 ~]# uname -m x86_64 开启两台虚拟机 db01 10.0.0.51172.16.1.51 db02 10.0.0.52172.16.1.51
多实例配置主从复制
开启mysql多实例,来进行实验
[ root@db02 ~ ]# /data/3306/mysql start Starting MySQL... [root@db02 ~]# /data/3307/mysql start Starting MySQL... [root@db02 ~]# ss -lntup |grep mysql tcp LISTEN 0128 :::3306 :::* users:(("mysqld",4656,12)) tcp LISTEN 0128 :::3307 :::* users:(("mysqld",5404,12))
开启多实例的binlog
参考前面的笔记 mysql > show variables like‘log_bin%‘; +---------------------------------+----------------------------+| Variable_name | Value |+---------------------------------+----------------------------+| log_bin |ON|| log_bin_basename |/data/3306/mysql-bin || log_bin_index |/data/3306/mysql-bin.index|| log_bin_trust_function_creators |OFF|| log_bin_use_v1_row_events |OFF|+---------------------------------+----------------------------+5 rows inset (0.15 sec)
建立账号授权【主库】
[ root@db02 scripts ]# mysql -S /data/3306/mysql.sock mysql>grantreplication slave on*.*to‘rep‘@‘172.16.1.%‘ identified by‘oldboy123‘; Query OK, 0 rows affected (0.45 sec) mysql> flush privileges; Query OK, 0 rows affected (0.07 sec) mysql> show databases; +--------------------+|Database|+--------------------+| information_schema || mysql || performance_schema || test |+--------------------+4 rows inset (0.16 sec) mysql> show master status; +------------------+----------+--------------+------------------+-------------------+|File| Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001|405||||+------------------+----------+--------------+------------------+-------------------+1 row inset (0.05 sec)
进行导出数据
[ root@db02 ~ ]# mkdir -p /server/backup[root@db02 ~]# mysqldump --master-data=2 -S /data/3306/mysql.sock -A -B |gzip >/server/backup/mysql_bak.$(date +%F).sql.gz
把数据库导入从库
[ root@db02 ~ ]# cd /server/backup/[root@db02 backup]# [root@db02 backup]# zcat mysql_bak.2017-05-03.sql.gz >mysql_bak.2017-05-03.sql [root@db02 backup]# ll total 812-rw-r--r--. 1 root root 650630 May 3 11:24 mysql_bak.2017-05-03.sql-rw-r--r--. 1 root root 178491 May 3 11:23 mysql_bak.2017-05-03.sql.gz[root@db02 backup]# mysql -S /data/3307/mysql.sock <mysql_bak.2017-05-03.sql
从库连接主库复制参数
mysql> CHANGE MASTER TO-> MASTER_HOST=‘172.16.1.52‘, -> MASTER_PORT=3306, -> MASTER_USER=‘rep‘, -> MASTER_PASSWORD=‘oldboy123‘, -> MASTER_LOG_FILE=‘mysql-bin.000001‘, -> MASTER_LOG_POS=405; Query OK, 0 rows affected, 2 warnings (0.11 sec)
启动同步开关
mysql> start slave; Query OK, 0 rows affected (0.01 sec)
检查
[ root@db02 backup ]# mysql -S /data/3307/mysql.sock -e "show slave status\G"|egrep -i "Yes|Behind_Master" Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0 主库上创建 [root@db02 backup]# mysql -S /data/3306/mysql.sock mysql> show databases; +--------------------+|Database|+--------------------+| information_schema || mysql || performance_schema || test |+--------------------+4 rows inset (0.02 sec) mysql>createdatabase yh; Query OK, 1 row affected (0.06 sec) 从库上查看 [root@db02 ~]# mysql -S /data/3307/mysql.sock mysql> show databases -> ; +--------------------+|Database|+--------------------+| information_schema || mysql || yh || performance_schema || test |+--------------------+5 rows inset (0.03 sec)
原文:https://www.cnblogs.com/HByang/p/9185886.html
内容总结
以上是互联网集市为您收集整理的Mysql主从复制全部内容,希望文章能够帮你解决Mysql主从复制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。