【MySql】主从复制

MySQL支持单向、异步复制,复制过程中一个Linux服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新。

为什么使用主从复制?
1、主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。
2、通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。但是不要同时在主从服务器上进行更新,这样可能引起冲突。
3、使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。主服务器创建一个线程将二进制日志中的内容发送到从服务器。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,从服务器使用此线程读取中继日志并执行日志中包含的更新。SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。
默认中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪中继日志索引文件来识别目前正使用的中继日志。默认中继日志索引文件名为host_name-relay-bin.index。在默认情况,这些文件在从服务器的数据目录中被创建。中继日志与二进制日志的格式相同,并且可以用MySQLbinlog读取。当SQL线程执行完中继日志中的所有事件后,中继日志将会被自动删除。
从服务器在数据目录中另外创建两个状态文件--master.info和relay-log.info。状态文件保存在硬盘上,从服务器关闭时不会丢失。
下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。
rac3 主库:10.250.7.241
rac4 备库:10.250.7.220
具体配置步骤:
1 修改主库和备库的my.cnf文件
主库my.cnf 与master-slave 相关的配置
server-id       = 1
log-bin         = master-bin
log-bin-index   = master-log-bin.index
log-error       = master-error.log
binlog_format   = mixed
relay-log       = slave-relay.log
relay-log-info-file = slave-relay-log.info
relay-log-index = slave-relay-log.index
备库my.cnf 与master-slave 相关的配置
server-id       = 2
log-bin         = master-bin
log-bin-index   = master-log-bin.index
log-error       = master-error.log
#中继日志名。默认名为host_name-relay-bin.nnnnnn,其中host_name是从服务器主机的名,nnnnnn表示中继日志在编号序列中创建。
relay-log       = slave-relay.log
relay-log-info-file = slave-relay-log.info
relay-log-index = slave-relay-log.index

#启用从库日志,这样可以进行链式复制
log-slave-updates
#从库是否只读,0表示可读写,1表示只读
read-only=1
#只复制某个表
replicate-do-table=tablename
#只复制某些表(可用匹配符)
replicate-wild-do-table=tablename%
#只复制某个库
replicate-do-db=dbname
#只复制某些库
replicte-wild-do-db=dbname%
#不复制某个表
replicate-ignore-table=tablename
#不复制某些表
replicate-wild-ignore-table=tablename%
#不复制某个库
replicate-ignore-db=dbname
#复制完的sql语句是否立即从中继日志中清除,1表示立即清除
relay-log-purge=1
#从服务器主机,用于show slave hosts生成从库清单
report-host=hostname
2 在主库进行建立复制帐号,允许备库rac4能够读取复制主库的数据。
mysql> GRANT  REPLICATION  SLAVE  ON *.* TO 'rep'@'10.250.7.220 '  IDENTIFIED  BY 'rep123';
Query OK, 0 rows affected (0.03 sec)
mysql> GRANT  REPLICATION  CLIENT ON *.* TO 'rep'@'10.250.7.220 ';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT  SUPER  ON *.* TO 'rep'@'10.250.7.220 ';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT  RELOAD  ON *.* TO 'rep'@'10.250.7.220 ';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT  SELECT  ON *.* TO 'rep'@'10.250.7.220 ';
Query OK, 0 rows affected (0.00 sec)
mysql> flush  privileges;
Query OK, 0 rows affected (0.00 sec)
3 锁住主库的table,清空所有表和块写入语句,制作主库的一致性快照,以便备份数据文件到从库进行初始化。
mysql>  FLUSH  TABLES  WITH  READ  LOCK;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW  MASTER  STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      822 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.13 sec)
4 保持锁表的客户端程序不退出,在另一个窗口对主服务器数据目录做快照。
[root@rac3 mysql]# tar zcvf data.tar.gz  ./data
拷贝主库的数据文件到备库上。
5 在rac4上,启动从库:
mysql> CHANGE  MASTER  TO  MASTER_HOST='10.250.7.241',
    -> MASTER_USER ='rep',
    -> MASTER_PASSWORD ='rep123',
    -> MASTER_LOG_FILE ='master-bin.000001',
    -> MASTER_LOG_POS =822;
启动slave 复制
mysql>  START SLAVE;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.250.7.241
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 65041
               Relay_Log_File: slave-relay.000002
                Relay_Log_Pos: 64473
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes  --这两项都为yes的时候,表明slave正常运行。
            Slave_SQL_Running: Yes 

在主库上执行:

mysql>  UNLOCK  TABLES;

Query OK, 0 rows affected (0.00 sec)
6 验证:
在主库:
mysql> use  yang;
Database changed
mysql> show  tables;
Empty set (0.00 sec)
mysql> create table yang as select * from test.t1;
mysql> show  tables;
+----------------+
| Tables_in_yang |
+----------------+
| yang           |
+----------------+
在备库验证:
mysql> use  yang;
Database changed
mysql> show  tables;
+----------------+
| Tables_in_yang |
+----------------+
| yang           |
+----------------+
mysql> select count(1) from yang;
+----------+
| count(1) |
+----------+
|     1000 |
+----------+
主库执行:

mysql>  insert  into  yang   select * from  test.sbtest;
Query OK, 1000000 rows affected (19.83 sec)
Records: 1000000  Duplicates: 0  Warnings: 0
查看备库的show processlist,可以查看主库写表yang的时候,备库的进程的状态变化,
等待主库传送日志--解析日志,执行dml语句--继续等待主库日志的更新,这种方式和Oracle Streams的本质思想是一致的。
mysql> show   processlist;
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
| Id | User        | Host      | db   | Command | Time  | State                                                                       | Info             |
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
|  2 | system user |           | NULL | Connect | 88440 | Waiting for master to send event                                            | NULL             |
|  3 | system user |           | NULL | Connect |    90 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
|  8 | root        | localhost | yang | Query   |     0 | NULL                                                                        | show processlist |
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
mysql> show processlist;
+----+-------------+-----------+------+---------+-------+----------------------------------+---------------------------------------------+
| Id | User        | Host      | db   | Command | Time  | State                            | Info                                        |
+----+-------------+-----------+------+---------+-------+----------------------------------+---------------------------------------------+
|  2 | system user |           | NULL | Connect | 88445 | Waiting for master to send event | NULL                                        |
|  3 | system user |           | yang | Connect |    24 | Sending data                     | insert into yang  select * from test.sbtest |
|  8 | root        | localhost | yang | Query   |     0 | NULL                             | show processlist                            |
+----+-------------+-----------+------+---------+-------+----------------------------------+---------------------------------------------+
3 rows in set (0.00 sec)
mysql> show processlist;
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
| Id | User        | Host      | db   | Command | Time  | State                                                                       | Info             |
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
|  2 | system user |           | NULL | Connect | 88459 | Waiting for master to send event                                            | NULL             |
|  3 | system user |           | NULL | Connect |    38 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
|  8 | root        | localhost | yang | Query   |     0 | NULL                                                                        | show processlist |
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
mysql> select count(1) from yang;                
+----------+
| count(1) |
+----------+
|  1002000 |
+----------+
参考文章:
http://www.ningoo.net/html/2007/mysql_replication_configuration.html
http://www.oklinux.cn/html/sql/other/20080316/49421.html
http://www.cnblogs.com/rootq/archive/2008/11/11/1331267.html

时间: 2024-09-17 18:56:59

【MySql】主从复制的相关文章

Centos 6.3下mysql主从复制笔记

MySQL主从复制结构是基于mysql bin-log日志基础上从库通过打开IO进程收到主库的bin-log日志增量信息,并保存到本地relay log,而后再通过打开MYSQL进程从relay log上获取的增量信息并翻译成SQL语句后写到从数据库. 主从复制结构实际上可以实现两个功能 1.从库充当主库的数据库备份实例 2.读写分离主库负责正常读写数据从库只负责读数据 实际生产环境因为很多应用实际读数据库的次数远大于写数据库的次数所以在项目开发初期编写程序时做一个判断对所有读的操作全部推到从库

MySQL主从复制的延迟监测

主从复制延迟的监测,我以前的做法是通过比较show slave status\G中的两个变量的差值(Read_Master_Log_Pos,Exec_Master_Log_Pos),将差值设置为一个自己认为合理的范围,Seconds_Behind_Master 没有适用过,今天做一次解析: Seconds_Behind_Master 是通过比较 SQL THREAD 接受 events事件的时间戳(timestamp) 与IO THREAD  执行事件 events时间戳的差值--秒数来确定sl

mysql dba系统学习(18)mysql主从复制的实现

mysql主从复制的实现 1.MySQL复制的实现原理 MySQL支持单向.双向复制.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入一个二进制日志文件中,并创建一个索引文件以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,日志文件会通知主服务器,从服务器在日志中读取的最后一次成功更新的位置.接着,从服务器在上次成功更新的位置处开始进入更新操作.更新完成后从服务器开始进入等待状态,等待主服务器后续的更新.需要注意

高可用架构-- MySQL主从复制的配置

环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6.26.tar.gz 主节点IP:192.168.1.205     主机名:edu-mysql-01 从节点IP:192.168.1.206     主机名:edu-mysql-02 主机配置:4核CPU.4G内存   依赖课程 <高可用架构篇--第13节--MySQL源码编译安装(CentOS-6.6+MySQL-5.6)>   MySQL主从复制官方文档 http://dev.

MySQL主从复制报错slave have equal MySQL server UUIDs

最近在部署MySQL主从复制架构的时候,碰到了"Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;  these UUIDs must be different for replication to work." 这个错误提示.即主从架构中使用了相同的UUID.检查server_id系统变量,已经是不同的设置,那原因是

数据库-关于mysql主从复制的问题

问题描述 关于mysql主从复制的问题 最近在学习mysql主从复制的东西,配置什么基本都完成了,在最后第二部复制数据库文件的时候出现了问题.我停止了主从服务器的服务,将data文件夹整个复制到了从服务器中,但是主从服务器的引擎不同,主服务器my.ini中default-storage-engine=INNODB,从服务器的为MyISAM.进行复制后开启服务,但是从服务器只有数据库,库内不存在任何表.使用front查看时连mysql数据库下也是空.求教应该怎么处理. ![图片说明](http:/

关于mysql主从复制自增长列

问题描述 关于mysql主从复制自增长列 现有两台mysql服务器A和B A:auto_increment_offset = 2 auto_increment_increment = 2 binlog_format="STATEMENT" B:auto_increment_offset = 1 auto_increment_increment = 2 A和B都有如下表,建表语句如下: test | CREATE TABLE test (id int(11) NOT NULL AUTO_

MySQL主从复制中常见的3个错误及填坑方案

一.问题描述    主从复制错误一直是MySQL DBA一直填不完的坑,如鲠在喉,也有人说mysql主从复制不稳定云云,其实MySQL复制比我们想象中要坚强得多,而绝大部分DBA却认为只要跳过错误继续复制就好啦,接下来不发生错误就好了,其实跳过错误就会有数据不一致的风险,数据不一致可能还会越来越严重,而我就复制错误中反复出现的1045.1032和1062错误引起的数据库主从不一致的的现象进行深入分析及给出一套完善的解决方案.   (1) [ERROR]1452:无法在外键的表插入参考主键没有的数

MySQL 主从复制详解(详细)

目录: MySQL 主从原理 MySQL 主从配置 MySQL 主从一致性检查 MySQL 主从错误处理 参考链接 一.mysql主从原理 1. 基本介绍 MySQL 内建的复制功能是构建大型,高性能应用程序的基础.将 MySQL 的 数亿分布到到多个系统上去,这种分步的机制,是通过将 MySQL 的某一台主机的数据复制到其它主机( Slave )上,并重新执行一遍来实现的.复制过程中一个服务器充当服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志,并维护文件的一个索引以跟

关于mysql主从复制的概述与分类(转)

一.概述: 按照MySQL的同步复制特点,大体上可以分为三种类别: 1.异步复制: 2.半同步复制: 3.完全同步的复制: -------------------------------------------------------------------------------------------------- (一).异步复制: 1.概念 mysql的异步复制在业界中的叫法有很多,比如:AB复制.主从同步.mysql replication等等.说白了就是master和slave结构.