LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 数据库 >

Mysql主从复制详解

时间:2012-12-07 10:21来源:未知 编辑:admin 点击:
概述: MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日
概述:
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器
如果你想要设置链式复制服务器,从服务器本身也可以充当主服务器。
 
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。通知新的更新。

使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
 
认识到二进制日志只是一个从启用二进制日志的固定时间点开始的记录非常重要。任何设置的从服务器需要主服务器上的在主服务器上启用二进制日志时的数据库拷贝。如果启动从服务器时,其数据库与主服务器上的启动二进制日志时的状态不相同,从服务器很可能失败。
 
将主服务器的数据拷贝到从服务器的一个途径是使用LOAD DATA FROM MASTER语句。请注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的主服务器上工作。并且,该语句将获得全局读锁定,因此当表正复制到从服务器上时,不可能在主服务器上进行更新。当我们执行表的无锁热备份时,则不再需要全局读锁定。
 
从服务器设置为复制主服务器的数据后,它连接主服务器并等待更新过程。如果主服务器失败,或者从服务器失去与主服务器之间的连接,从服务器保持定期尝试连接,直到它能够继续帧听更新。由--master-connect-retry选项控制重试间隔。 默认为60秒。
 
每个从服务器跟踪复制时间。主服务器不知道有多少个从服务器或在某一时刻有哪些被更新了。
 
MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。
 
下面的例子说明了这3个线程在SHOW PROCESSLIST中的显示。

主服务器上:
mysql> show processlist\G
*************************** 1. row ***************************
     Id: 26
   User: root
   Host: localhost
     db: mysql
Command: Query
   Time: 0
  State: NULL
   Info: show processlist
*************************** 2. row ***************************
     Id: 48
   User: repl
   Host: 192.168.0.7:56009
     db: NULL
Command: Binlog Dump
   Time: 534
  State: Has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL
2 rows in set (0.00 sec)
 
从服务器上:
mysql> show processlist\G
*************************** 1. row ***************************
     Id: 6
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 1973
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 7
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 592
  State: Has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL
*************************** 3. row ***************************
     Id: 8
   User: root
   Host: localhost
     db: test
Command: Query
   Time: 0
  State: NULL
   Info: show processlist
3 rows in set (0.00 sec)
 
请注意Time列的值可以显示从服务器比主服务器滞后多长时间
 
复制传递和状态文件
默认情况,中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪索引文件中目前正使用的中继日志。 默认中继日志索引文件名为host_name-relay-bin.index。默认情况,在从服务器的数据目录中创建这些文件。可以用--relay-log和--relay-log-index服务器选项覆盖 默认文件名。

中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。SQL线程执行完中继日志中的所有事件并且不再需要之后,立即自动删除
 
从属复制服务器在数据目录中另外创建两个小文件。这些状态文件默认名为主master.info和relay-log.info。它们包含SHOW SLAVE STATUS语句的输出所显示的信息.状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。
 
由I/O线程更新master.info文件
SQL线程更新relay-log.info文件

环境:
master: redhat-6.0 mysql-5.0.18
slave  : redhat6.0 mysql-5.0.18
官方建议主从服务器数据库版本一致,
master 配置
确保/etc/my.cnf中有
[mysqld]
 log-bin=mysql-bin
 server-id=1
binlog-do-db=test  #根据自己情况设定
binlog-ignore-db=mysql  #根据自己情况设定

还要有个用户用来复制,要有replication slavef 权限

slave配置
/etc/my.cnf
binlog-do-db=test  #根据自己情况设定
binlog-ignore-db=mysql  #根据自己情况设定
server-id=2

复制步骤:
1.    首先要查看主服务器控制的二进制文件名称和pos值
mysql> show master status\G
*************************** 1. row ***************************
            File: mysql-bin.000002
        Position: 98
    Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
这2个值很重要,由于我是实验环境没有实时数据,这2个值不会变。其他情况下应该使用mysql>flush tables with read lock; 使表只读
备份数据库mysqldump 或者 tar… ,拷贝到从服务器上并解压
mysql>unlock tables;
2.    从服务器上启动服务
/usr/local/mysql/bin/mysqld_safe –user=mysql –skip-slave-start  &
复制选项:
mysql> chage master to
>master_host=’192.168.0.6’,
>master_port=3306,
>master_user=’repl’,
>master_password=’123456’,
>master_log_file= ‘mysql-bin.000002’
>master_log_pos=98;
然后启动复制
  mysql>slave start ;
如果看到下面的值,表示配置成功
     Slave_IO_Running: Yes
     Slave_SQL_Running: Yes  

可是我的情况是
Slave_IO_Running: NO
这说明根本没有从主服务器上或得二进制文件
在网上找了半天,大多数内容都是一样的,只好自己找原因了,在数据库上层目录中有些日志文件,从中找到了解决办法(这个日志slave.site.err)
110603  1:22:46 [ERROR] Slave I/O thread: error connecting to master 'repl@192.168.0.6:3306': Error: 'Host '192.168.0.7' is not allo
wed to connect to this MySQL server'  errno: 1130  retry-time: 60  retries: 86400
问题是主服务器不允许192.168.0.7这个主机连接
解决办法
mysql> update user set  host=’192.168.0.7 ’ where user=’repl’;
mysql>flush privileges;
从服务器上执行复制
mysql>slave start ;
mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: rhel6-test.site
                Master_User: repl
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000002
        Read_Master_Log_Pos: 98
             Relay_Log_File: slave-relay-bin.000003
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000002
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 98
            Relay_Log_Space: 235
            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: 0
1 row in set (0.00 sec)
单向复制配置成功
更详细的说明请查看官方文档: http://dev.mysql.com/doc/refman/5.1/zh/index.html

转载请保留固定链接: https://linuxeye.com/database/1012.html

------分隔线----------------------------
标签:mysql主从复制
栏目列表
推荐内容