一、Mysql数据库的主从复制原理过程:

(多实例的安装请参考我的另一篇文章:https://www.cnblogs.com/Template/p/9258500.html

Mysql的主从复制是一个异步的复制过程,数据将从一个Mysql数据库(master)复制到另一个Mysql数据库(slave),在Master和Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和I/O线程)在Slave端,另外一个线程(I/O线程)在Master端 ,要实现Mysql的主从复制,首先必须打开Master端的binlog记录功能,否则就无法实现。因为整个复制过程实际上就是Slave从Master获取binlog日志,然后再在Slave上以相同顺序执行获取的binlog日志中所记录的各种SQL操作 要打开Mysql的binlog记录功能,可以通过在Mysql的配置文件my.cnf中的mysqld模块([mysqld])增加"log-bin"参数选项来实现,具体信息如下:

[mysqld]
log-bin = /data//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线程会实时检测本地RelayLog中I/O线程新增加的日志内容,然后及时的吧RelayLog文件中的内容解析成SQL语句,并在Slave服务器上按解析SQL语句的位置顺序执行应用这些SQL语句,并在relay-log.info中记录当前应用中继日志的文件名及位置点

经过上面的过程,就可以确保Master端和Slave端执行了同样的SQL语句,当复制状态正常时,Master端和Slave端的数据是完全一样的

三、主从配置过程(以实例都在一台服务器上说明)

#####在Mysql主库上执行的操作过程

vim /data//my.cnf
修改[mysqld]下的两行
log-bin = /data//mysql-bin server-id =
[root@localhost ~]# egrep "server-id|log-bin" /data//my.cnf
log-bin = /data//mysql-bin
server-id =
[root@localhost ~]# /data//mysql restart  #重启Mysql主库
mysql -u root -p123456 -S /data//mysql.sock
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | |
+---------------+-------+
row in set (0.00 sec) mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
row in set (0.00 sec)

#根据主从复制的原理,从库想要和主库同步,必须要有一个可以连接主库的账号,并且这个账号是主库上面创建的,权限是允许从库连接并同步数据

mysql> grant replication slave on *.* to 'rep'@'192.168.56.%' identified by '123456';

Query OK, 0 rows affected (0.00 sec)

#刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

#检查主库创建的rep账号
mysql> select user,host from mysql.user;
+------+-----------------------+
| user | host |
+------+-----------------------+
| root | 127.0.0.1 |
| rep | 192.168.56.% |
| root | ::1

#检查权限
mysql> show grants for rep@'192.168.56.%';
+---------------------------------------------------------------------------------------------------------------------------+
| Grants for rep@192.168.56.% |
+---------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.56.%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

#对主数据库锁表只读
mysql> flush table with read lock;
Query OK, 0 rows affected (0.00 sec)

#查看自动解锁时长
mysql> show variables like '%timeout%';
+----------------------------+----------+
| Variable_name | Value |
+----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_lock_wait_timeout | 120 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+----------------------------+----------+
10 rows in set (0.00 sec)

#锁表后查看主库状态,命令显示的信息要记录在案,后面的从库导入全备后,继续和主库复制时就是要从这个位置开始

mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 334 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

##或者使用mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show master status"

#锁表后,一定单开一个新的ssh窗口,导出数据库的所有数据,如果数据量很大(50G以上),并且允许停机,可以停库直接打包数据文件进行迁移,那样更快

#新开一个窗口,备份数据库,以备迁移数据到从库

[root@localhost ~]# mkdir /server/backup -p

[root@localhost ~]# mysqldump -uroot -p123456 -S /data/3306/mysql.sock --events -A -B | gzip > /server/backup/mysql_bak.$(date +%F).sql.gz

#-A表示备份所有库;-B 表示增加use DB和drop等(导库时会直接覆盖原有的)

#导出数据完毕后,解锁主库,恢复可写,因为主库还要对外提供服务,不能一直锁定不让用户访问

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

######在Mysql从库上执行的操作过程

设置server-id
并关闭binlog功能(如果从库不做级联复制,并且不作为备份用,就不要开启binlog,开起了反而会增加从库磁盘I/O等的压力)

vim /data//my.cnf
server-id = #(参数要放在[mysqld]模块下,且参数不能重复)
[root@localhost ]# egrep "server-id|log-bin" /data//my.cnf
#log-bin = /data//mysql-bin
server-id = 7 /data/3307/mysql restart
mysql -uroot -p123456 -S /data//mysql.sock

mysql> show variables like "server_id";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | |
+---------------+-------+
row in set (0.00 sec) mysql> show variables like "log_bin";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
row in set (0.00 sec)

#把从主库导出的数据恢复到从库
cd /server/backup/
gzip -d mysql_bak.2018-07-03.sql.gz (-d 解压后删除源文件)

#还原数据库
[root@localhost backup]# mysql -uroot -p123456 -S /data/3307/mysql.sock < mysql_bak.2018-07-03.sql

提示:如果备份时使用了-A参数,则在还原数据到3307实例时,登录3307实例的密码也会和3306主库的密码一致,因为3307实例的授权表Mysql也被覆盖了

#登录3307从库,配置复制参数
mysql -uroot -p123456 -S /data/3307/mysql.sock

mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.11', #主库的IP
-> MASTER_PORT=3306, #主库的端口,从库端口可以和主库不同
-> MASTER_USER='rep', #主库上建立的用于复制的用户rep
-> MASTER_PASSWORD='123456', #rep用户的密码
-> MASTER_LOG_FILE='mysql-bin.000001', #show master status时查看到的二进制日志文件名称,注意不能有空格
-> MASTER_LOG_POS=334; #show master status时查看到的二进制日志偏移量,不能多空格
Query OK, 0 rows affected (0.01 sec)

提示:字符串用单引号括起来,数值不用引号,注意内容后面不能有空格

#启动从库主从复制开关,并查看复制状态
mysql -uroot -p'123456' -S /data/3307/mysql.sock -e "start slave;"

[root@localhost backup]# mysql -uroot -p'123456' -S /data/3307/mysql.sock -e "show slave status\G;"

[root@localhost backup]# mysql -uroot -p'123456' -S /data/3307/mysql.sock -e "show slave status\G;"| egrep "IO_Running|SQL_Running|_Behind_Master"
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

Slave_IO_Running: Yes
#这个是I/O线程状态,I/O线程负责从从库到主库读取binlog日志,并写入从库的中继日志,状态为Yes表示I/O线程工作正常

Slave_SQL_Running: Yes
#这个是SQL线程状态,SQL线程负责读取中继日志(relay-log)中的数据并转换为SQL语句应用到从数据库中,状态为YES表示I/O线程工作正常

Seconds_Behind_Master: 0
#这个是复制过程中从库比主库延迟的秒数,这个参数很重要,但企业里更准确的判断主从延迟的方法为:在主库写时间戳,然后从库中读取时间戳,和当前数据库时间进行比较,从而认定是否延迟

在主库上写入数据,然后观察从库的数据状况:
mysql -uroot -p123456 -S /data/3306/mysql.sock -e "create database template;"

[root@localhost backup]# mysql -uroot -p123456 -S /data/3307/mysql.sock -e "show databases like 'template';"
+---------------------+
| Database (template) |
+---------------------+
| template |
+---------------------+

mysql -uroot -p123456 -S /data/3306/mysql.sock -e "drop database template;"
mysql -uroot -p123456 -S /data/3307/mysql.sock -e "show databases like 'template';"

#根据测试可以判断,主从库是同步的

#####生产场景下部署MySQL主从复制
、快速配置MySQL主从复制
步骤如下: 、安装好要配置从库的数据库,配置好log-bin和server-id参数 、无需配置主库my.cnf文件,主库的log-bin和server-id参数默认就是配置好的 、登录主库,增加从库连接主库同步的账户,例如:rep,并授权replication slave 同步的权限 、使用曾经在半夜通过mysqldump 带-x和--master-data=1的命令及参数定时备份的全备数据文件,把它恢复到从库。 、在从库中执行change master to...语句,无需binlog文件及对应位置点 、从库开启同步开关,start slave 、从库show slave status\G,检查同步状态,并在主库进行更新测试。

配置过程如下: 、半夜在主库上通过定时任务执行如下命令,备份导出主库数据: mysqldump -uroot -p123456 -S /data//mysql.sock -A --events -B -x --master-data= | gzip >/opt/$(date +%F).sql.gz --master-data=1参数会在备份数据里增加如下语句 --Position to start replication or point-in-time recovery from CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=; 、白天找机会在需要做复制的从库上导入全备做从库,命令如下 gzip -d --.sql.gz mysql -uroot -p123456 -S /data//mysql.sock < --.sql mysql -uroot -p123456 -S /data//mysql.sock <<EOF
CHANGE MASTER TO MASTER_HOST='192.168.56.11',MASTER_PORT=,MASTER_USER='rep',MASTER_PASSWORD='';
EOF 这里的CHANGE MASTER后面无需指定binlog文件名及具体位置,因为这部分已经在还原数据时提前应用到数据库里了(备份时--master-data=1的功劳) start slave; #开启主从复制开关 show slave status\G; #查看主从复制状态

######MYSQL主从复制线程状态说明及用途

、登录数据库查看MySQL线程的同步状态

root@localhost ~]# mysql -u root -p123456 -S /data//mysql.sock -e "show processlist\G"
*************************** . row ***************************
Id:
User: rep
Host: 192.168.56.11:
db: NULL
Command: Binlog Dump
Time:
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL 提示:上述状态的意思是线程已经从binlog日志读取所有的更新,并已经发送到了从数据库服务器。线程目前为空闲状态,等待由主服务器上二进制日志中的新事件更新

主库I/O线程工作状态

主库I/O线程工作状态 解释说明
Sending binlog event to slave 线程已经从二进制binlog日志读取了一个事件并且正将它发送到服务器
Finished reading one binlog:switching to next binlog 线程已经读完二进制binlog日志文件,并且正打开下一个要发送到从服务器的binlog日志文件
Has sent all binlog to slave;waiting for binlog to be updated 线程已经从binlog日志读取所有更新并已经发送到了从服务器。线程目前为空闲状态,等待由主服务器上二进制binlog日志中的新事件更新
Waiting to finalize termination

线程停止时发生的一个很简单的状态

#登录从数据库查看Mysql线程工作状态

从库有两个线程,即I/O和SQL线程。

##从库I/O线程的状态如下:

[root@localhost ~]# mysql -u root -p123456 -S /data//mysql.sock -e "show processlist\G"
*************************** . row ***************************
Id:
User: system user
Host:
db: NULL
Command: Connect
Time:
State: Waiting for master to send event
Info: NULL

从服务器I/O线程的State列的最常见状态。该状态也出现在Slave_IO_State列,由SHOW SLAVE STATUS显示

从库I/O线程的工作状态 解释说明
Connecting to master 线程正试图连接主服务器
Checking master version 同主服务器之间建立连接后临时出现的状态
Registering slave on master 同主服务器之间建立连接后临时出现的状态
Requesting binlog dump 建立同主服务器之间的连接后临时出现的状态。线程向主服务器发送一条请求,索取从请求的二进制binlog日志文件名和位置开始的二进制binlog日志的内容
Waiting to reconnect after a failed binlog dump request 如果二进制binlog日志转储请求失败,线程进入睡眠状态,然后定期尝试重新连接,可以使用--master-connect-retry 选项指定重试时间的间隔
Reconnecting after a failed binlog dump request 线程正尝试重新连接主服务器
Waiting for master to send event 线程已经连上主服务器,正等待二进制binlog日志事件到达
Queueing master event to the relay log 线程已经读取一个事件,正将它复制到中继日志供SQL线程来处理  
Waiting to reconnect after a failed master event read   读取时(由于没有连接)出现错误。线程试图重新连接前将睡眠master-connect-retry秒
Reconnecting after failed master event read 线程正尝试重新连接主服务器。当连接重新重新建立后,状态变为Waiting for master to send event

#从库SQL线程的状态如下:

*************************** . row ***************************
Id:
User: system user
Host:
db: NULL
Command: Connect
Time:
State: Slave has read all relay log; waiting for the slave I/O thread to update it
Info: NULL

从库SQL线程的状态

从库SQL线程状态 解释说明
Reading event from the relay log 线程已经从中继日志读取一个事件,可以对事件进行处理了
Has read all relay log;waiting for the slave I/O thread to update it  线程已经处理了中继日志文件中的所有事件,现在正等待I/O线程将新事件写入中继日志
Waiting for slave mutex on exit 线程停止时发生的一个很简单的状态

MySQL主从复制原理及配置过程的更多相关文章

  1. Mysql主从复制原理及配置

    Mysql主从复制原理及配置 1.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其 ...

  2. MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现

    一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...

  3. MySQL主从复制原理及搭建过程

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 复制概述 复制即把一台服务器上的数据通过某种手段同步到另外一台或多台从服务器上,使得从服务器在数据上与主服务器保持一致. ...

  4. Mysql中主从复制的原理、配置过程以及实际案例

    Mysql中主从复制的原理.配置过程以及实际案例1.什么是主从复制?原理:主从分离,什么意思呢?我们不妨画个图看看.如图1所示: 2.准备工作:预备两台服务器,我这里使用虚拟机安装了两个Centos6 ...

  5. MySQL主从复制--原理

    简介 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一 ...

  6. Mysql主从复制原理及搭建

    ## Mysql主从复制原理 主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中.对于多级复制,数据库服务器即可充当主机,也可充当从 ...

  7. mysql主从复制原理及实践

    Mysql主从复制原理及实践 mysql主从框架       MySQL主从架构是MySQL集群中最基本也是最常用的一种架构部署,能够满足很多业务需求,常见的有一主一从或者一主多从.可以防止单一主机的 ...

  8. MySQL 主从复制原理不再难

    上篇我们分析过 Binlog 日志的作用以及存储原理,感兴趣的可以翻阅: 一文带你了解 Binlog 日志 Binlog 日志主要作用是数据恢复和主从复制.本身就是二进制格式的日志文件,网络传输无需进 ...

  9. mysql 主从复制原理

    主从形式   mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制---     用途及条件   mysql主 ...

随机推荐

  1. 11 Lists

    1       Lists 1.1  定义并访问Lists List list = new List[].也可以使用泛型.访问list中的元素,可以使用list.get(i) or list[i]. ...

  2. Jetty项目解压目录设置

    Ubuntu14.04 没有在Jetty的根目录下建立work文件夹时,Jetty会默认将项目解压到/var/cache/jetty/data/下,如果在Jetty的根目录下建立work文件夹,jet ...

  3. 最大利润-城市A和B

    1,问题描述 jack每天同时只能在A和B其中一个城市工作赚钱,假设两个城市间的交通费为m.已知每天在A 和 B 能赚到多少钱,那么jack怎么选择每天工作的城市才能赚到最大利润. 比如 moneyA ...

  4. UiAutomator快速调试

    步骤: 1.打开浏览器,输入网址https://github.com,搜索uiautomatorhelper 2. 3                    . 4.打开eclipse,File-&g ...

  5. CQRS之旅——旅程1(我们的领域:Contoso会议管理系统)

    旅程1:我们的领域:Contoso会议管理系统 起点:我们从哪里来,我们带来了什么,谁将与我们同行?" 只要前进,我愿意去任何地方." --大卫•利文斯通 本章介绍了一个虚构的公司 ...

  6. Maven的学习资料收集--(六) 构建Hibernate项目

    前面我们使用Maven构建了Struts2项目,这里我们来试一下Hibernate项目: 这里的例子,大体框架应该是正确的,但是,对于Maven的很多约定都没有掌握,估计包的命名都不是非常好,等以后, ...

  7. Chapter 18 MySQL NDB Cluster 7.3 and NDB Cluster 7.4渣翻

    Table of Contents 18.1 NDB Cluster Overview      18.2 NDB Cluster Installation      18.3 Configurati ...

  8. Swift网络库Alamofire的导入

    一.手动导入 1, 官网下载 Alamofire 2, 解压下载的文件 放入工程的顶层目录下 3, 打开工程 Add Files 4, 选中项目 TARGETS > General > E ...

  9. 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】

    初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...

  10. 基于python3.6的如何爬取百度地图

    先前参考了其他的代码,大多数是python2.7写的,而3.6用的类库以及规则有了很大的变动,所以自己写了一个这样的代码,供给大家参考. def get_station(i): station=[] ...