Mysql主从复制讲解 从官方手册说起

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

煮酒品茶-Mysql主从复制


我们来做这个复制,怎么做?

command:

1
2
3
4
5
6
7
show processlist;
show slave status;
show master status;
SHOW MASTER LOGS
SHOW BINARY LOGS
SHOW SLAVE HOSTS
show binlog events\G


A-A1,A2 > B-A1,A2

A:

A1,A2 -- time

A1,A2,A3 > A1,A2 update


A-A1,A2 - time

-----------end

---start

A-A1(edit),A3 - time

A-A1(edit),A3(edit) - time


A-A1(edit) > B-A1?

md5

{

table

}


1、从服务器 start slave,创建I/O线程。

2、主服务器创建I/O线程,用来传送binlog日志。(SHOW PROCESSLIST)

3、从服务器接收binlog日志,并把它保存到本地(中继日志)。

4、从服务器创建 SQL线程用来执行刚保存的binlog日志。


1、实现主从数据相同的过程

  1、锁表 FLUSH TABLES WITH READ LOCK;

  2、备份数据并在从服务器上导入数据,使之数据相同。mysqldump....

  3、记录binlog日志文件以及偏移量 show master status;

  4、增加同步的权限(用户,密码,权限,同步主机。)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';


2、修改配置文件

  主:

   server_id

log-bin

从:

server_id

3、在从服务器上设置同步选项

1
2
3
4
5
6
mysql>  CHANGE  MASTER  TO
            ->      MASTER_HOST = 'master_host_name' ,
             ->      MASTER_USER = 'replication_user_name' ,
             ->      MASTER_PASSWORD = 'replication_password' ,
             ->      MASTER_LOG_FILE = 'recorded_log_file_name' ,
             ->      MASTER_LOG_POS =recorded_log_position

4、启动从服务器同步 start slave;

5、开启主服务器上的锁表unlock table;


二进制日志文件\索引\最后一次成功更新的位置\封锁并等待主服务器通知新的更新

主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主 服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。


LVS>mysql1

   mysql2

通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。


主从复制执行过程:


MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。


MASTER:

1
2
3
4
5
6
7
8
9
10
11
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
      Id: 2
    User: root
    Host: localhost:32931
      db: NULL
Command: Binlog Dump
    Time: 94
   State: Has sent all binlog to slave; waiting  for  binlog to
          be updated
    Info: NULL


SLAVE:  

mysql> SHOW PROCESSLIST\G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
*************************** 1. row ***************************
      Id: 10
    User: system user
    Host:
      db: NULL
Command: Connect
    Time: 11
   State: Waiting  for  master to send event
    Info: NULL
*************************** 2. row ***************************
      Id: 11
    User: system user
    Host:
      db: NULL
Command: Connect
    Time: 11
   State: Has  read  all relay log; waiting  for  the slave I /O
          thread to update it
    Info: NULL


mysql> SHOW SLAVE STATUS\G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
*************************** 1. row ***************************
                Slave_IO_State: Waiting  for  master to send event
                   Master_Host: 192.168.100.220
                   Master_User: rep1
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mysql-bin.000006
           Read_Master_Log_Pos: 240
                Relay_Log_File: Web2-221-relay-bin.000006
                 Relay_Log_Pos: 253
         Relay_Master_Log_File: mysql-bin.000006
              Slave_IO_Running: Yes
             Slave_SQL_Running: No
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno: 1050
                    Last_Error: Error  'Table ' 100w ' already exists'  on query. Default database:  'test' . Query: 'create table 100w(
` id ` int(11) not null,
`number` int(11) not null
)'
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 107
               Relay_Log_Space: 691
               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: NULL
Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error:
                Last_SQL_Errno: 1050
                Last_SQL_Error: Error  'Table ' 100w ' already exists'  on query. Default database:  'test' . Query: 'create table 100w(
` id ` int(11) not null,
`number` int(11) not null
)'
   Replicate_Ignore_Server_Ids:
              Master_Server_Id: 1
1 row  in  set  (0.00 sec)


Master info:

1
2
3
4
5
6
7
8
9
10
11
--master-host
·         --master-user
·         --master-password
·         --master-port
·         --master-connect-retry
·         --master-ssl
·         --master-ssl-ca
·         --master-ssl-capath
·         --master-ssl-cert
·         --master-ssl-cipher
·         --master-ssl-key


SHOW PROCESSLIST输出的State字段的拷贝。SHOW PROCESSLIST用于从属I/O线程。如果线程正在试图连接到主服务器,正在等待来自主服务器的时间或正在连接到主服务器等,本语句会通知您。在6.3节,“复制实施细节”中列出了可能的状态。旧版本的MySQL在连接主服务器不成功时,允许线程继续运行。对于旧版本的MySQL,观看此字段是必须的。如果它正在运行,则无问题;如果它没有运行,则您会在Last_Error字段中发现错误(后面有说明)。


·         Master_Host


当前的主服务器主机。


·         Master_User


被用于连接主服务器的当前用户。


·         Master_Port


当前的主服务器接口。


·         Connect_Retry


--master-connect-retry选项的当前值


·         Master_Log_File


I/O线程当前正在读取的主服务器二进制日志文件的名称。


·         Read_Master_Log_Pos


在当前的主服务器二进制日志中,I/O线程已经读取的位置。


·         Relay_Log_File


SQL线程当前正在读取和执行的中继日志文件的名称。


·         Relay_Log_Pos


在当前的中继日志中,SQL线程已读取和执行的位置。


·         Relay_Master_Log_File


由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称。


·         Slave_IO_Running


I/O线程是否被启动并成功地连接到主服务器上。对于旧版本的MySQL(在4.1.14和5.0.12之前),如果I/O线程已被启动,即使从属服务器仍没有连接到主服务器上,Slave_IO_Running也将被设置到YES。


·         Slave_SQL_Running


SQL线程是否被启动。


·         Replicate_Do_DB, Replicate_Ignore_DB


使用--replicate-do-db和--replicate-ignore-db选项指定的数据库清单。


·         Replicate_Do_Table, Replicate_Ignore_Table, Replicate_Wild_Do_Table, Replicate_Wild_Ignore_Table


使用--replicate-do-table, --replicate-ignore-table, --replicate-wild-do-table和--replicate-wild-ignore_table选项指定的表清单。


·         Last_Errno, Last_Error


被多数最近被执行的查询返回的错误数量和错误消息。错误数量为0并且消息为空字符串意味着“没有错误”。如果Last_Error值不是空值,它也会在从属服务器的错误日志中作为消息显示。


下面列出了控制复制的启动选项:许多选项可以在服务器运行时通过CHANGE MASTER TO语句重新进行设置。其它选项,例如--replicate-*选项,只能在从服务器启动时进行设置。我们计划将修复该问题。


·         --logs-slave-updates


通常情况,从服务器从主服务器接收到的更新不记入它的二进制日志。该选项告诉从服务器将其SQL线程执行的更新记入到从服务器自己的二进制日志。为了使该选项生效,还必须用--logs-bin选项启动从服务器以启用二进制日志。如果想要应用链式复制服务器,应使用--logs-slave-updates。例如,可能你想要这样设置:


A -> B -> C

也就是说,A为从服务器B的主服务器,B为从服务器C的主服务器。为了能工作,B必须既为主服务器又为从服务器。你必须用--logs-bin启动A和B以启用二进制日志,并且用--logs-slave-updates选项启动B。


·         --logs-warnings


让从服务器向错误日志输出更详细的关于其执行操作的消息。例如,通知你网络/连接失败后已经成功重新连接,并通知你每个从服务器线程如何启动。该选项默认启用;要想禁用它,使用--skip-logs-warnings。放弃的连接不记入错误日志,除非该值大于1。


请注意该选项的效果不限于复制。可以对服务器的部分动作产生警告。


·         --master-connect-retry=seconds


在主服务器宕机或连接丢失的情况下,从服务器线程重新尝试连接主服务器之前睡眠的秒数。如果主服务器.info文件中的值可以读取则优先使用。如果未设置, 默认值为60。


·         --master-host=host


主复制服务器的主机名或IP地址。如果没有给出该选项,从服务器线程不启动。如果主服务器.info文件中的值可以读取则优先使用。


·         --master-info-file=file_name


从服务器用于记录主服务器的相关信息使用的文件名。默认名为数据目录中的mysql.info。


·         --master-password=password


连接主服务器时从服务器线程用于鉴定的账户的密码。如果主服务器.info文件中的值可以读取则优先使用。如果未设置,假定 密码为空。


·         --master-port=port_number


主服务器正帧听的TCP/IP端口号。如果主服务器.info文件中的值可以读取则优先使用。如果未设置,假定使用编译进来的设定值。如果你未曾用configure选项进行修改,该值应为3306。


·         --master-ssl、--master-ssl-ca=file_name、--master-ssl-capath=directory_name、--master-ssl-cert=file_name、--master-ssl-cipher=cipher_list、--master-ssl-key=file_name


这些选项用于使用SSL设置与主服务器的安全复制连接。它们的含义与5.8.7.6节,“SSL命令行选项”中描述的相应—ssl、--ssl-ca、--ssl-capath、--ssl-cert、--ssl-cipher、--ssl-key选项相同。如果主服务器.info文件中的值可以读取则优先使用。


·         --master-user=username


连接主服务器时从服务器线程用于鉴定的账户的用户名。该账户必须具有REPLICATION SLAVE权限。如果主服务器.info文件中的值可以读取则优先使用。如果未设置主服务器用户,假定使用用户test。


·         --max-relay-logs-size=size


自动循环中继日志。参见5.3.3节,“服务器系统变量”。


·         --read-only


该选项让从服务器只允许来自从服务器线程或具有SUPER权限的用户的更新。可以确保从服务器不接受来自客户的更新。


·         --relay-log=file_name


中继日志名。默认名为host_name-relay-bin.nnnnnn,其中host_name是从服务器主机的名,nnnnnn表示中继日志在编号序列中创建。如果中继日志太大(并且你不想降低max_relay_log_size),需要将它们放到数据目录之外的其它地方,或者如果想要通过硬盘之间的负载均衡提高速度,可以指定选项创建与主机名无关的中继日志名。


·         --relay-log-index=file_name


中继日志索引文件使用的位置和名称。默认名为host_name-relay-bin.index,其中host_name为从服务器名。


·         --relay-log-info-file=file_name


从服务器用于记录中继日志相关信息的文件名。默认名为数据目录中的relay-log.info。


·         --relay-log-purge={0|1}


禁用或启用不再需要中继日志时是否自动清空它们。默认值为1(启用)。这是一个全局变量,可以用SET GLOBAL Relay_log_purge动态更改。


·         --relay-log-space-limit=size


限制所有中继日志在从服务器上所占用空间的上限(0值表示“无限制”)。从服务器主机硬盘空间有限时很有用。达到限制后,I/O线程停止从主服务器读取二进制日志中的事件,直到SQL线程被闭锁并且删除了部分未使用的中继日志。请注意该限制并不是绝对的:有可能SQL线程删除中继日志前需要更多的事件。在这种情况下,I/O线程将超过限制,直到SQL线程可以删除部分中继日志。(不这样做将会造成死锁)。--relay-log-space-limit的值不能小于--max-relay-logs-size(或如果--max-relay-logs-size为0,选--max-binlog-size)的值的两倍。在这种情况下,有可能I/O线程等待释放空间,因为超过了--relay-log-space-limit,但SQL线程没有要清空的中继日志,不能满足I/O线程的需求。强制I/O线程临时忽视--relay-log-space-limit。


·         --replicate-do-db=db_name


告诉从服务器限制默认数据库(由USE所选择)为db_name的语句的复制。要指定多个数据库,应多次使用该选项,每个数据库使用一次。请注意不复制跨数据库的语句,例如当已经选择了其它数据库或没有数据库时执行UPDATE some_db.some_table SET foo='bar'。如果需要跨数据库进行更新,使用--replicate-wild-do-table=db_name.%。请读取该选项列表后面的注意事项。


CHANGE MASTER TO master_def [, master_def] ...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
master_def:
       MASTER_HOST =  'host_name'
     | MASTER_USER =  'user_name'
     | MASTER_PASSWORD =  'password'
     | MASTER_PORT = port_num
     | MASTER_CONNECT_RETRY = count
     | MASTER_LOG_FILE =  'master_log_name'
     | MASTER_LOG_POS = master_log_pos
     | RELAY_LOG_FILE =  'relay_log_name'
     | RELAY_LOG_POS = relay_log_pos
     | MASTER_SSL = {0|1}
     | MASTER_SSL_CA =  'ca_file_name'
     | MASTER_SSL_CAPATH =  'ca_directory_name'
     | MASTER_SSL_CERT =  'cert_file_name'
     | MASTER_SSL_KEY =  'key_file_name'
     | MASTER_SSL_CIPHER =  'cipher_list'





本文转自 煮酒品茶 51CTO博客,原文链接:http://blog.51cto.com/cwtea/1243060,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 存储 关系型数据库
MySQL的主从复制&主从同步
MySQL的主从复制&主从同步
38 0
|
5月前
|
SQL 关系型数据库 MySQL
面试官:说一下MySQL主从复制的原理?
面试官:说一下MySQL主从复制的原理?
99 0
面试官:说一下MySQL主从复制的原理?
|
5月前
|
SQL 关系型数据库 MySQL
MySQL主从复制
MySQL主从复制
|
26天前
|
负载均衡 容灾 关系型数据库
mysql主从复制
mysql主从复制
38 1
|
2月前
|
SQL 存储 运维
MySQL高可用性:主从复制和集群
MySQL高可用性:主从复制和集群
47 0
|
4天前
|
设计模式 容灾 关系型数据库
MySQL 主从复制架构
MySQL 主从复制架构
|
11天前
|
存储 SQL 关系型数据库
MySQL学习手册(第一部分)
mysql日常使用记录
72 0
|
5月前
|
关系型数据库 MySQL Linux
Linux下搭建MySQL主从复制之一主一从架构
Linux下搭建MySQL主从复制之一主一从架构
64 0
|
25天前
|
SQL 关系型数据库 MySQL
mysql主从复制
mysql主从复制
|
2月前
|
缓存 关系型数据库 MySQL
为啥MySQL官方不推荐使用uuid或者雪花id作为主键
为啥MySQL官方不推荐使用uuid或者雪花id作为主键
25 1