Mysql主从复制
Posted 杨灏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql主从复制相关的知识,希望对你有一定的参考价值。
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)开启bin-log,并创建主从复制的账号.在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中记录当前应用中继日志的文件名及位置点。
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.51 172.16.1.51 db02 10.0.0.52 172.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 0 128 :::3306 :::* users:(("mysqld",4656,12)) tcp LISTEN 0 128 :::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 in set (0.15 sec)
建立账号授权【主库】
[root@db02 scripts]# mysql -S /data/3306/mysql.sock mysql> grant replication 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 in set (0.16 sec) mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 405 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (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 in set (0.02 sec) mysql> create database 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 in set (0.03 sec)
以上是关于Mysql主从复制的主要内容,如果未能解决你的问题,请参考以下文章