mysql主从服务器复制操作

master主机ip:192.168.1.19  用户名sunzy 密码123456
slave主机ip:192.168.1.20

1.配置master
1)接下来对master进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件加入如下值:
    [mysql]
    log-bin=mysql-bin   #二进制变更日值,[必须]启用二进制日志
    server-id=1    #为主服务master的ID值
2)重启master服务,运行SHOW MASTER STATUS,查看配置情况。

2.创建复制帐号
    在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中。
命令如下:
    mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* ‘TO backup‘@‘192.168.1.20‘ IDENTIFIED BY ‘1234‘;
建立一个帐户backup,并且只能允许从192.168.1.20这个地址上来登陆,密码是1234。

3.配置slave
Slave的配置与master类似,你同样需要重启slave的MySQL。如下:
    log_bin           = mysql-bin
    server_id         = 2             #server_id是必须的,而且唯一
    relay_log         = mysql-relay-bin
    log_slave_updates = 1
    read_only         = 1
  slave没有必要开启二进制日志,但是在一些情况下,必须设置,例如,如果slave为其它slave的master,必须设置bin_log。在这里,我们开启了二进制日志,而且显示的命名(默认名称为hostname,但是,如果hostname改变则会出现问题)。
  relay_log配置中继日志
  log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处)。
  有些人开启了slave的二进制日志,却没有设置log_slave_updates,然后查看slave的数据是否改变,这是一种错误的配置。所以,尽量使用read_only,它防止改变数据(除了特殊的线程)。但是,read_only并是很实用,特别是那些需要在slave上创建表的应用。

4.配置从服务器slave
1)接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:
  mysql> CHANGE MASTER TO MASTER_HOST=‘192.168.1.19‘,
         -> MASTER_USER=‘sunzy‘,
         -> MASTER_PASSWORD=‘123456‘,
         -> MASTER_LOG_FILE=‘mysql-bin.000001‘,
         -> MASTER_LOG_POS=0;          #MASTER_LOG_POS的值为0,因为它是日志的开始位置。
2)启动从服务器复制功能
  mysql>start slave; 
3)你可以用SHOW SLAVE STATUS语句查看slave的设置是否正确。
     mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.19
                  Master_User: sunzy
                   Master_Port: 3306
               Connect_Retry: 60
             Master_Log_File: mysql-bin.000001
     Read_Master_Log_Pos: 164
     Relay_Master_Log_File: mysql-bin.000001
                Relay_Log_Pos: 164
                Relay_Log_File: mysql-relay-bin.000001
           Slave_IO_Running: Yes
         Slave_SQL_Running: Yes
                             ...omitted...
      Seconds_Behind_Master: 0

在这里主要是看:
                   Slave_IO_Running=Yes
                   Slave_SQL_Running=Yes
slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。

4)你可查看master和slave上线程的状态。
   在master上输入show processlist\G;   #在master上,你可以看到slave的I/O线程创建的连接:
        在slave上输入show processlist\G;    #SQL线程状态

5.添加新slave服务器
假如master已经运行很久了,想对新安装的slave进行数据同步,甚至它没有master的数据。
此时,有几种方法可以使slave从另一个服务开始,例如,从master拷贝数据,从另一个slave克隆,从最近的备份开始一个slave。Slave与master同步时,需要三样东西:
  (1)master的某个时刻的数据快照;
  (2)master当前的日志文件、以及生成快照时的字节偏移。这两个值可以叫做日志文件坐标(log file coordinate),因为它们确定了一个二进制日志的位置,你可以用SHOW MASTER STATUS命令找到日志文件的坐标;
  (3)master的二进制日志文件。

可以通过以下几中方法来克隆一个slave:
(1)    冷拷贝(cold copy)
     停止master,将master的文件拷贝到slave;然后重启master。缺点很明显。
(2)    热拷贝(warm copy)
    如果你仅使用MyISAM表,你可以使用mysqlhotcopy拷贝,即使服务器正在运行。
(3)    使用mysqldump
    使用mysqldump来得到一个数据快照可分为以下几步:
    <1>锁表:如果你还没有锁表,你应该对表加锁,防止其它连接修改数据库,否则,你得到的数据可以是不一致的。如下:
      mysql> FLUSH TABLES WITH READ LOCK;
    <2>在另一个连接用mysqldump创建一个你想进行复制的数据库的转储:
      shell> mysqldump --all-databases --lock-all-tables >dbdump.db
    <3>对表释放锁。
      mysql> UNLOCK TABLES;

附:复制的常用拓扑结构
复制的体系结构有以下一些基本原则:
  (1) 每个slave只能有一个master;
  (2) 每个slave只能有一个唯一的服务器ID;
  (3) 每个master可以有很多slave;
  (4) 如果你设置log_slave_updates,slave可以是其它slave的master,从而扩散master的更新。

MySQL不支持多主服务器复制(Multimaster Replication)——即一个slave可以有多个master。但是,通过一些简单的组合,我们却可以建立灵活而强大的复制体系结构。
1、单一master和多slave
  由一个master和一个slave组成复制系统是最简单的情况。Slave之间并不相互通信,只能与master进行通信。
  在实际应用场景中,MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式,主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因为只要Master和Slave的压力不是太大(尤其是Slave端压力)的话,异步复制的延时一般都很少很少。尤其是自从Slave端的复制方式改成两个线程处理之后,更是减小了Slave端的延时问题。而带来的效益是,对于数据实时性要求不是特别Critical的应用,只需要通过廉价的pcserver来扩展Slave的数量,将读压力分散到多台Slave的机器上面,即可通过分散单台数据库服务器的读压力来解决数据库端的读性能瓶颈,毕竟在大多数数据库应用系统中的读压力还是要比写压力大很多。这在很大程度上解决了目前很多中小型网站的数据库压力瓶颈问题,甚至有些大型网站也在使用类似方案解决数据库瓶颈。
如下:

如果写操作较少,而读操作很时,可以采取这种结构。你可以将读操作分布到其它的slave,从而减小master的压力。但是,当slave增加到一定数量时,slave对master的负载以及网络带宽都会成为一个严重的问题。
这种结构虽然简单,但是,它却非常灵活,足够满足大多数应用需求。一些建议:
  (1)    不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存储引擎);
  (2)    用一个slave作为备用master,只进行复制;
  (3)    用一个远程的slave,用于灾难恢复;

2、主动模式的Master-Master(Master-Master in Active-Active Mode)
Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。这样,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。

  可能有些读者朋友会有一个担心,这样搭建复制环境之后,难道不会造成两台MySQL之间的循环复制么?实际上MySQL自己早就想到了这一点,所以在MySQL的BinaryLog中记录了当前MySQL的server-id,而且这个参数也是我们搭建MySQLReplication的时候必须明确指定,而且Master和Slave的server-id参数值比需要不一致才能使MySQLReplication搭建成功。一旦有了server-id的值之后,MySQL就很容易判断某个变更是从哪一个MySQLServer最初产生的,所以就很容易避免出现循环复制的情况。而且,如果我们不打开记录Slave的BinaryLog的选项(--log-slave-update)的时候,MySQL根本就不会记录复制过程中的变更到BinaryLog中,就更不用担心可能会出现循环复制的情形了。

如下:
        
主动的Master-Master复制有一些特殊的用处。例如,地理上分布的两个部分都需要自己的可写的数据副本。这种结构最大的问题就是更新冲突。假设一个表只有一行(一列)的数据,其值为1,如果两个服务器分别同时执行如下语句:
  在第一个服务器上执行:
    mysql> UPDATE tbl SET col=col + 1;
  在第二个服务器上执行:
    mysql> UPDATE tbl SET col=col * 2;
那么结果是多少呢?一台服务器是4,另一个服务器是3,但是,这并不会产生错误。
实际上,MySQL并不支持其它一些DBMS支持的多主服务器复制(Multimaster Replication),这是MySQL的复制功能很大的一个限制(多主服务器的难点在于解决更新冲突),但是,如果你实在有这种需求,你可以采用MySQL Cluster,以及将Cluster和Replication结合起来,可以建立强大的高性能的数据库平台。但是,可以通过其它一些方式来模拟这种多主服务器的复制。

3、主动-被动模式的Master-Master(Master-Master in Active-Passive Mode)
这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统。它的不同点在于其中一个服务只能进行只读操作。

如图:

多级联复制架构 Master –Slaves - Slaves
  在有些应用场景中,可能读写压力差别比较大,读压力特别的大,一个Master可能需要上10台甚至更多的Slave才能够支撑注读的压力。这时候,Master就会比较吃力了,因为仅仅连上来的SlaveIO线程就比较多了,这样写的压力稍微大一点的时候,Master端因为复制就会消耗较多的资源,很容易造成复制的延时。
  遇到这种情况如何解决呢?这时候我们就可以利用MySQL可以在Slave端记录复制所产生变更的BinaryLog信息的功能,也就是打开—log-slave-update选项。然后,通过二级(或者是更多级别)复制来减少Master端因为复制所带来的压力。也就是说,我们首先通过少数几台MySQL从Master来进行复制,这几台机器我们姑且称之为第一级Slave集群,然后其他的Slave再从第一级Slave集群来进行复制。从第一级Slave进行复制的Slave,我称之为第二级Slave集群。如果有需要,我们可以继续往下增加更多层次的复制。这样,我们很容易就控制了每一台MySQL上面所附属Slave的数量。这种架构我称之为Master-Slaves-Slaves架构。这种多层级联复制的架构,很容易就解决了Master端因为附属Slave太多而成为瓶颈的风险。下图展示了多层级联复制的Replication架构。

当然,如果条件允许,我更倾向于建议大家通过拆分成多个Replication集群来解决。
  上述瓶颈问题。毕竟Slave并没有减少写的量,所有Slave实际上仍然还是应用了所有的数据变更操作,没有减少任何写IO。相反,Slave越多,整个集群的写IO总量也就会越多,我们没有非常明显的感觉,仅仅只是因为分散到了多台机器上面,所以不是很容易表现出来。
  此外,增加复制的级联层次,同一个变更传到最底层的Slave所需要经过的MySQL也会更多,同样可能造成延时较长的风险。
  而如果我们通过分拆集群的方式来解决的话,可能就会要好很多了,当然,分拆集群也需要更复杂的技术和更复杂的应用系统架构。

时间: 2024-10-28 21:54:03

mysql主从服务器复制操作的相关文章

mysql主从服务器复制原理

在实际企业应用环境当中,单台mysql数据库是不足以满足日后业务需求的.譬如服务器发生故障,没有备份服务器来提供服务的话,业务就得停止.介于这种情况,我们来学习一下mysql主从复制. 将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服

2-18,19 搭建MySQL主从服务器并并通过mysql-proxy实现读写分离

MySQL主从服务器 实现方式: MySQL  REPLICATION Replication可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave) 默认情况下这种情况属于异步复制,无需维持长连接 通过配置,可以复制所有库或者几个库,甚至库中的一些表 它是MySQL内建的,自带 Replication的原理 主服务器master将数据库的改变写入二进制日志文件,从服务器slave同步这些二进制日志,并生成中继日志,从服务器根据中继日志,执行这些改变 DML:S

搭建mysql主从服务器

搭建mysql主从服务器: //注:注释掉my.cn文件中的skip-federated字段[[email protected] ]# /bin/cp -r /usr/local/mysql/share/mysql/my-huge.cnf  /etc/my.cnf 配置主服务器:修改my.cnf文件server-id=1 //每个数据库服务器都要指定唯一一个server-id log-bin=mysql-bin //mysql进行主从复制时通过二进制日志文件来进行的,所以必须开启mysql日志功

MySQL主从延迟复制实践及生产故障案例恢复实践

1.1 MySQL主从延迟复制介绍 从MySQL5.6开始支持了主从延迟复制,这个功能主要解决的问题是,当主库有逻辑的数据删除或错误更新后,所有的从库都会进行错误的更新,从而导致所有的数据库数据异常,即使有定时的备份数据可以用于数据恢复,特别是数据库数据量很大时,恢复时间会很长,再恢复期间数据库数据被删或错误数据影响正常的访问体验. 而延迟复制就可以较好的解决这个问题.例如,可以设定某一个从库和主库的更新延迟1小时,这样主库数据出问题以后,1个小时以内发现,可以对这个从库进行无害恢复处理,使之依

Ubutun 14.10下mysql 主从同步详细操作

一.相关介绍 1 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库:主数据库一般是实时的业务数据库,从数据库的作用和使用场合一般有几个: 一是作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作: 二是可在从数据库作备份.数据统计等工作,这样不影响主数据库的性能:2 读写分离,是指读与写分别使用不同的数据库,当然一般是在不同服务器上的:在同一台服务器上的读写环境,估计只是用来测试吧. 一般读写的数据库环境配置为,一个写入的数据库,一个或多个读的数据库,各个数据库分别

mysql 主从的复制的原理及操作步骤

数据库读法约定: 主库: master 从库: slave mysql 主从同步的原理: #主从是异步模式,且是由从库找主库进行同步: 1.主库开启IO线程:    开启binlog: #binlog记录用户的增删改 从库开启IO线程:    开启SQL线程: 2.主库授权从库同步的帐号密码: 3.备份主库数据且导入从库: 4.在从库change master to 导入用于同步主库的ip.port.user.等信息. CHANGE MASTER TO          MASTER_HOST=

mysql主从数据库复制

Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收从那时起发生的

mysql主从服务器的配置

使用mysql主从复制的好处有: 1.采用主从服务器这种架构,稳定性得以提升.如果主服务器发生故障,我们可以使用从服务器来提供服务. 2.在主从服务器上分开处理用户的请求,可以提升数据处理效率. 3.将主服务器上的数据复制到从服务器上,保护数据免受意外的损失. 环境描述: 新企业要搭建架构为主从复制的mysql数据库. 主服务器(mysql-master):IP地址:192.168.48.128,mysql已安装,没有用户数据. 从服务器(mysql-slave):IP地址:192.168.48

MySQL主从服务器的原理和设置

一 主从配置的原理     mysql的Replication是一个异步的复制过程,从一个mysql instance(Master)复制到另一个mysql instance(Slave), 在master与slave之间的整个复制过程主要由三个线程完成,分别为Master端得IO线程和Slave端得IO线程和Sql线程.整 个过程如下:     1 Slave上的IO线程连接上Master,并请求从指定日志的指定位置之后的日志内容     2 Master收到来自Slave的IO线程请求后,通