服务器维护,服务器代维,安全设置,漏洞扫描,入侵检测服务

运维之家

 找回密码
 注册
搜索
查看: 6440|回复: 3

MYSQL数据同步&双向热备

[复制链接]
dirtysea 发表于 2010-4-2 12:43:48 | 显示全部楼层 |阅读模式
1、简要介绍:mysql从3.23.15版本以后提供数据库复制功能。利用该功能可以实现两个数据库同步,主从模式(A->B),互相备份模式(A<=>B)的功能。
mysql数据库同步复制功能的设置都在mysql的配置文件中体现。在linux环境下的配置文件一般在/etc/mysql/my.cnf或者在mysql用户的home目录下的my.cnf,笔者的my.cnf则在/etc/my.cnf;windows环境下则可到mysql安装路径下找到my.ini。

2、下面我们来看看如何配置数据同步(A->B):
(笔者mysql版本 5.0.26)
假设数据库A为主机(将向B提供同步服务,即B中的数据来自A):
A机器:
IP = 192.168.1.101
B机器:
IP = 192.168.1.102

(1).在A机器中有数据库如下:
//数据库A
CREATE DATABASE backup_db;
USE backup_db;
CREATE TABLE `backup_table` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(20) character set utf8 NOT NULL,
  `sex` varchar(2) character set utf8 NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
#A机器的my.cnf(或my.ini)中应该配置:
server-id=1
log-bin=c:\mysqlback #同步事件的日志记录文件
binlog-do-db=backup_db #提供数据同步服务的数据库

(2).在B机器中有数据库如下:
//数据库B
CREATE DATABASE backup_db;
USE backup_db;
CREATE TABLE `backup_table` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(20) character set utf8 NOT NULL,
  `sex` varchar(2) character set utf8 NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
注:数据库A和B的数据库结构一定要相同,否则无法构成同步。
#B机器的my.cnf(或my.ini)中应该配置:
server-id=2
master-host=192.168.1.101 #主机A的地址
master-user=ym #主机A提供给B的用户,该用户中需要包括数据库backup_db的权限
master-password=ym #访问密码
master-port=3306 #端口,主机的MYSQL端口
master-connect-retry=60 #重试间隔60秒
replicate-do-db=backup_db #同步的数据库

#binlog-ignore-db=mysql
#replicate-ignore-db=mysql

(3).完成了以上配置之后,将A的mysql数据的权限给B。
A机器:
mysql>grant file on *.* to ym@192.168.1.102 identified by "ym";


(4).重启AB数据库,后:
B机器:

mysql>slave start;
查看同步配置情况
A机器:

mysql>show master status;
B机器:
mysql>show slave status;

(5).在A中的backup_db.backup_table表中插入一些数据,查看B中的backup_db.backup_table表是否同步了数据改动。如果没有看到同步数据结果,即同步不成功,请查看错误(如下)。
当有错误产生时*.err日志文件(可到mysql安装目录下找),同步的线程退出。当纠正错误后重复步骤(4)。

操作表的相关命令如下:
grant all on *.* to [email=ym@]ym@"%" identified[/email] by "ym";

(测试同步的时候,以下语句一定要先打开相应数据库到里面插入和更新删除等操作,否者同步不了)
use backup_db;
describe backup_table;
insert into backup_table(id,name,sex) value("1","test","ml");
select * from backup_table;



3、实现双向热备(A<=>B):
将以上的(1)-(5)步骤按A-B双向配置即可。






 楼主| dirtysea 发表于 2010-4-5 21:01:27 | 显示全部楼层
一、准备环境
    自己做练习硬件资源少,只能在虚拟器上操作了哈哈!
   
     linux 版本:Red Hat Enterprise Linux Server release 5.1
     mysql 版本:MySQL-server-community-5.0.67-0.rhel5.i386.rpm
                 MySQL-client-community-5.0.67-0.rhel5.i386.rpm
     (PS:mysql的同步机制是基于二进制日志binlog,不同的mysql版本会导致其格式的不同,从而导致不能实现数据同步,因此最好的搭配组合是Master的MySQL版本和Slave的

版本相同或者Slave的版本高于Master的版本,因为mysql是向下兼容的,为此Master的版本不能高于Slave版本,否则有可能不能实现功能;如果要实现双向同步,最好mysql是同

一版本)

     虚拟机版本:VMware6.0

     在虚拟机上安装两个linux系统,并分别安装上mysql(mysql安装在俺博客的mysql安装有详细说明)

   mysql默认安装的文件分别为:
   
  /var/lib/mysql/ (数据库目录,其所创建的数据库文件都在该目录下)

  /usr/share/mysql (mysql相关配置文件)

  /usr/bin (mysql相关命令,如mysql mysqladmin等)

   为了区分系统,给系统命名一下,便于后面的说名:
   
    LinuxA 系统: Ip:192.168.59.123 (Master)

    LinuxB 系统: Ip:192.168.59.124 (Slave)

    关闭LinuxA 和 LinuxB 的防火墙 #service iptables stop (保证系统互相可以ping的通)
   
二、设置单向mysql数据同步(LinuxA(Master)->LinuxB(Slave))

    1、 LinuxA 为 master

        LinuxB 为 slave (同步LinuxA 上mysql上指定的test数据库中的数据);

    由于刚安装的mysql,因此分别在LinuxA 和 LinuxB 的 mysql 上创建相同的数据库如 test(表有 stu , class,teacher),保证两个mysql上的数据库名一致其表名及表的

结构一致,若有一个不同,将导致无法实现同步;
    (PS: 要使数据同步,必须保证数据库名一致其表名及表的结构一致)

    2、在作为master(即LinuxA)的mysql上建立一个账户专门用于slave(即LinuxB)来进行数据同步

       # mysql (默认用户,如设置了root密码,使用mysql -u root -p **mysql)
       mysql>grant file on *.* to backa@'192.168.59.124' identified by 'backa'
       mysql>flush privileges;

      (PS:此backa账户只能通过ip为192.168.59.124的访问)
  
      在LinuxB上测试账户backa是否可以访问LinxuA上的mysql:
      #mysql -u backa -p -h 192.168.59.123(输入密码backa,可以访问说明设置正确)
   
    3、修改 my.cnf 文件
      
     由于刚安装的mysql ,在/etc目录下可能无my.cnf文件,从/user/share/mysql目录中拷贝my-medium.cnf 到/etc并修改成my.cnf (LinuxA 和LinuxB 上一样)
     如 # cp /user/share/mysql/my-medium.cnf  /etc/my.cnf

     修改在LinuxA(Master)上的/etc/my.cnf
     
      log-bin=mysql-bin (日志文件,默认存在/var/lib/mysql下日志文件以mysql-bin为开头)
      #log_bin= /var/log/mysql/mysql-bin.log(也可以自己指定,在此用# 表示注释掉了)
      binlog-do-db =test(需要同步的数据库名,如需同步多个数据库,可以另起行如binlog-do-db =test1 )      
      server-id= 1 (mysql标示)

     修改完后保存退出,并重启mysql 如#service mysql restart (重启正常,表示配置没错误)


     修改在LinxuB(Slave)上的/etc/my.cnf

      server-id= 2 (mysql标示,唯一否则启动会出错误)
      master-host=192.168.59.123 (同步Master的ip地址)
      master-user=backa (同步所需的账号)
      master-password=backa (同步账号的密码)
      master-port=3306 (LinuxA 中mysql的访问端口)
      replicate-do-db=test (所需同步的数据库名,如果是同步多个数据库,可以另起一行如 replicate-do-db=test1)
      #replicate-ignore-db=mysql   (不需要同步的数据库操作)
      #binlog-ignore-db=mysql       (不需要同步的数据库日志操作)
      #replicate-do-table=test.stu (如果只需同步test数据库中的stu表)
      #replicate-do-table=test.teacher(如果只需同步test数据库中的stu表)
      master-connect-retry=60 (主服务器(Master)宕机或连接丢失的情况下,从服务器(slave)线程重新尝试连接主服务器之前睡眠的秒数)

     修改完后保存退出,并重启mysql 如#service mysql restart (重启正常,表示配置没错误)

    4.启动同步

     进到LinuxA(Master)的mysql上:

     mysql>show master status\G (查看master当前状态)
     运行完以上命令显示结果如下:

     
            File: mysql-bin.000001 (当前binlog日志文件)
        Position: 98 (但前binlog日志文件位置)
    Binlog_Do_DB: test (同步数据库)
Binlog_Ignore_DB:     (不需同步的数据,当前为设置)



-------------------------------------------------------------
     进到LinuxB(Slave)的mysql上:
      
     mysql>show slave status\G (查看slave同步状态)

     运行完以上命令显示结果如下:

             Slave_IO_State: Waiting for master to send event (slave 的io线程,获取master的binlog的日志内容,该为其目前的状态)
                Master_Host: 192.168.59.123 (所需同步Master的ip地址)
                Master_User: backa(同步所需的账号)
                Master_Port: 3306(同步所需的mysql端口号)
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000001 (master中的binlong的日志文件,如与master的日志文件名不同则同步失效)
        Read_Master_Log_Pos: 98 (master中的binlong的日志文件的位置,即mysql-bin.000001文件中的第98位置开始同步,若与master上的位置不同则同步失效)
             Relay_Log_File: localhost-relay-bin.000001
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes  (Slave的io线程是否运行)
          Slave_SQL_Running: Yes (slave的sql线程是否运行,需要io线程和sql线程同为yes才有效)
            Replicate_Do_DB: test
        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

   
     如果Slave_IO_State:不为 Waiting for master to send event 表示未现实同步

     
     原因可能很多先列举自己遇到:
        LinuxB日志文件和位置与LinuxA(Master)的当前状态不一致,或者Slave_SQL_Running: No
        解决办法:(在LinuxB的mysql操作)
        mysql>slave stop;(修改前先关闭slave)
        mysql>change master to
             >master_log_file='mysql-bin.000001' , (ps:与LinuxA中的master的日志文件名相同)
             >master_log_pos=98, (ps:与LinuxA中的master的日志文件当前位置相同)
             >master_user='backa' , (如果同步的账户不一致,也可在此修改)
             >master_password='backa'  (如果同步的账户密码不一致,也可在此修改)
             >;

        (PS:如果重新修改/etc/my.cnf 中相关slave的配置信息,重新启动查看 slave的状态还是显示未修改的数据,应为第一次是读取my.cnf,之后就会在/var/lib/mysql/下生成一个master.info 的文件,因此第二次就不会读取my.cnf的内容,而是读取master.info中的内容,为此要想使重新修改的my.cnf生效的话,删除master.info文件,重起mysql

即可)
        mysql>slave start;(重新启动slave)

        mysql>show slave status\G (查看slave状态)

        如果显示的 Slave_IO_State: Waiting for master to send event
                 Slave_IO_Running: Yes  
                Slave_SQL_Running: Yes
        祝贺成功实现单向同步即 linuxA --> linuxB 的同步;
        在LinuxA的mysql上对test的 insert , delete ,update及对表结构的修改等操作 都会同步到 LinuxB的mysql上的test数据库上
        (ps:如果在master上执行如 insert into to stu (uuid(),'yushan') 则同步到 slave上 ,id不同,因为其id是用uuid生成的,所以会不一致,之后对这条数据的

delete 和 update则不会实现同步)

三、双向同步(LinuxA<--->LinuxB)
        
    双向同步最好使用的mysql版本要一致,保证二进制日志binlog的格式相同;双向同步即对任何一方mysql的insert,update,delete,alter等操作都会影响到另一方mysql中

的数据;由于前面已成功设置单向同步,在此基础上,把LinuxB(Slave)的配置 添加到 LinuxA(Master) 上,把LinuxA(Master)的配置添加到LinuxB(Slave)上,然后启动设

置同步的binlong文件及当前位置即可,具体操作如下:

    1、 LinuxA 在原有Master的基础上增加Slave (同步LinuxB 上mysql上指定的test数据库中的数据)

        LinuxB 在原有Slave的基础上增加Mmaster(同步LinuxA 上mysql上指定的test数据库中的数据);
   
    2、在作为master(即LinuxB)的mysql上建立一个账户专门用于slave(即LinuxA)来进行数据同步

       # mysql (默认用户,如设置了root密码,使用mysql -u root -p **mysql)
       mysql>grant file on *.* to backb@'192.168.59.123' identified by 'backb'
       mysql>flush privileges;

      (PS:此backb账户只能通过ip为192.168.59.123的访问)
  
      在LinuxA上测试账户backb是否可以访问LinxuB上的mysql:
      #mysql -u backb -p -h 192.168.59.124(输入密码backb,可以访问说明设置正确)

   
   3、修改 my.cnf 文件

    在LinuxA 上的/etc/my.cnf 文件上添加Slave的配置

      #server-id= 2 (mysql标示,唯一否则启动会出错误,因为原先已有标示为1,在此就可以注释掉,一个mysql只需一个标示即可)
      master-host=192.168.59.124 (同步LinuxB (Master)的ip地址)
      master-user=backb (同步所需的账号)
      master-password=backb (同步账号的密码)
      master-port=3306 (LinuxB 中mysql的访问端口)
      replicate-do-db=test (所需同步的数据库名,如果是同步多个数据库,可以另起一行如 replicate-do-db=test1)
      #replicate-ignore-db=mysql   (不需要同步的数据库操作)
      #binlog-ignore-db=mysql       (不需要同步的数据库日志操作)
      #replicate-do-table=test.stu (如果只需同步test数据库中的stu表)
      #replicate-do-table=test.teacher(如果只需同步test数据库中的stu表)
      master-connect-retry=60 (主服务器(Master)宕机或连接丢失的情况下,从服务器(slave)线程重新尝试连接主服务器之前睡眠的秒数)

    修改完后保存退出,并重启mysql 如#service mysql restart (重启正常,表示配置没错误)

   
    在LinxuB上的/etc/my.cnf文件上添加Master的配置

      #server-id= 1 (mysql标示,唯一否则启动会出错误,因为原先已有标示为2,在此就可以注释掉,一个mysql只需一个标示即可)
      log-bin=mysql-bin (日志文件,默认存在/var/lib/mysql下日志文件以mysql-bin为开头)
      #log_bin= /var/log/mysql/mysql-bin.log(也可以自己指定,在此用# 表示注释掉了)
      binlog-do-db =test(需要同步的数据库名,如需同步多个数据库,可以另起行如binlog-do-db =test1 )

     修改完后保存退出,并重启mysql 如#service mysql restart (重启正常,表示配置没错误)

   4.启动同步

     进到LinuxB(Master)的mysql上:

     mysql>show master status\G (查看master当前状态)
     运行完以上命令显示结果如下:
     
            File: mysql-bin.000003 (当前binlog日志文件)
        Position: 231 (但前binlog日志文件位置)
    Binlog_Do_DB: test (同步数据库)
Binlog_Ignore_DB:     (不需同步的数据,当前为设置)

-------------------------------------------------------------
     进到LinuxA(Slave)的mysql上:
      
     mysql>show slave status\G (查看slave同步状态)

     运行完以上命令显示结果如下:

             Slave_IO_State: Waiting for master to send event (slave 的io线程,获取master的binlog的日志内容,该为其目前的状态)
                Master_Host: 192.168.59.124 (所需同步Master的ip地址)
                Master_User: backb(同步所需的账号)
                Master_Port: 3306(同步所需的mysql端口号)
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000003 (master中的binlong的日志文件,如与master的日志文件名不同则同步失效)
        Read_Master_Log_Pos: 98 (master中的binlong的日志文件的位置,即mysql-bin.000001文件中的第98位置开始同步,若与master上的位置不同则同步失效)
             Relay_Log_File: localhost-relay-bin.000001
              Relay_Log_Pos: 231
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes  (Slave的io线程是否运行)
          Slave_SQL_Running: Yes (slave的sql线程是否运行,需要io线程和sql线程同为yes才有效)
            Replicate_Do_DB: test
        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

     以上显示为正确同步 如果显示的一下数据不是
       Slave_IO_State: Waiting for master to send event
       Slave_IO_Running: Yes  
        Slave_SQL_Running: Yes

     若与以上的三个状态表示不同,则未实现同步;可以采用以上单向同步中的 change master 进行重新设置(ps:防火墙需关闭)

     以上都能正确配置完且显示的状态一致,那么祝贺您成功实现双向同步即 linuxA <--> linuxB 的同步;


  四、 mysql 数据同步相关说明(转载于网络,google一下很多)

  1. 同步机制实现概述

  MySQL同步机制基于master把所有对数据库的更新操作(更新、删除 等)都记录在二进制日志里。因此,想要启用同步机制,在master就必须启用二进制日志。

  每个slave接受来自master上在二进制日志中记录的更新操作,因此在slave上执行了这个操作的一个拷贝。应该非常重要地意识到,二进制日志只是从启用二进制日志开始的

时刻才记录更新操作的。所有的slave必须在启用二进制日志时把master上已经存在的数据拷贝过来。如果运行同步时slave上的数据和master上启用二进制日志时的数据不一致的

话,那么slave同步就会失败。

  2. 同步实现细节

  MySQL同步功能由3个线程(master上1个,slave上2个)来实现。执行 START SLAVE 语句后,slave就创建一个I/O线程。I/O线程连接到master上,并请求master发送二进制日志

中的语句。master创建一个线程来把日志的内容发送到slave上。这个线程在master上执行 SHOW PROCESSLIST 语句后的结果中的 Binlog Dump 线程便是。slave上的I/O线程读取

master的 Binlog Dump 线程发送的语句,并且把它们拷贝到其数据目录下的中继日志(relay logs)中。第三个是SQL线程,salve用它来读取中继日志,然后执行它们来更新数据。

  如上所述,每个mster/slave上都有3个线程。每个master上有多个线程,它为每个slave连接都创建一个线程,每个slave只有I/O和SQL线程。

  在MySQL 4.0.2以前,同步只需2个线程(master和slave各一个)。slave上的I/O和SQL线程合并成一个了,它不使用中继日志。

  slave上使用2个线程的优点是,把读日志和执行分开成2个独立的任务。执行任务如果慢的话,读日志任务不会跟着慢下来。例如,如果 slave停止了一段时间,那么I/O线程

可以在slave启动后很快地从master上读取全部日志,尽管SQL线程可能落后I/O线程好几的小时。如果slave在SQL线程没全部执行完就停止了,不过I/O线程却已经把所有的更新日

志都读取并且保存在本地的中继日志中了,因此在slave再次启动后就会继续执行它们了。这就允许在master上清除二进制日志,因为slave已经无需去master读取更新日志了。

  在mysql中执行 SHOW PROCESSLIST 语句就会告诉我们所关心的master和slave上发生的情况

  在master上,SHOW PROCESSLIST 的结果如下:

  mysql> SHOW PROCESSLIST\G

  *************************** 1. row ***************************

  Id: 21

  User: root

  Host: localhost

  db: mysql

  Command: Query

  Time: 0

  State: NULL

  Info: SHOW PROCESSLIST

  *************************** 2. row (MASTER线程)***************************

  Id: 25

  User: back

  Host: 192.168.1.125:34085

  db: NULL

  Command: Binlog Dump

  Time: 746

  State: Has sent all binlog to slave; waiting for binlog to be updated

  Info: NULL

  2 rows in set (0.01 sec)

  在这里,线程2是为一个slave连接创建的。结果表明所有未完成的更新日志已经都发送到slave了,master正等待新的更新日志发生。

  在slave上,SHOW PROCESSLIST 的结果如下:

  mysql> SHOW PROCESSLIST\G

  *************************** 1. row ***************************

  Id: 2

  User: system user

  Host:

  db: NULL

  Command: Connect

  Time: 70479

  State: Waiting for master to send event

  Info: NULL

  *************************** 2. row (I/O线程) ***************************

  Id: 3

  User: system user

  Host:

  db: NULL

  Command: Connect

  Time: 16971

  State: Has read all relay log; waiting for the slave I/O thread to update it

  Info: NULL

  *************************** 3. row (SQL线程)***************************

  Id: 8

  User: root

  Host: localhost

  db: NULL

  Command: Query

  Time: 0

  State: NULL

  Info: SHOW PROCESSLIST

  3 rows in set (0.00 sec)

  这表明线程2是I/O线程,它正连接到master上;线程3是SQL线程,它执行中继日志中的更新操作。现在,这2个线程都处于空闲状态,正等待新的更新日志。

  注意,Time 字段的值告诉我们slave上的日志比master晚了多久。

  3. Master 同步线程状态

  以下列出了master的 Binlog Dump 线程 State 字段中最常见的几种状态。如果在master上没有 Binlog Dump 线程,那么同步就没有在运行。也就是说,没有slave连接上来



  Sending binlog event to slave

  事件是由二进制日志构成,一个事件通常由更新语句加上其他信息。线程读取到一个事件并正发送到slave上。

  Finished reading one binlog; switching to next binlog

  读取完了一个二进制日志,正切换到下一个。

  Has sent all binlog to slave; waiting for binlog to be updated

  已经读取完全部未完成更新日志,并且全部都发送到slave了。它处于空闲状态,正等待在master上执行新的更新操作以在二进制日志中产生新的事件,然后读取它们。

  Waiting to finalize termination

  当前线程停止了,这个时间很短

  4. Slave的I/O线程状态

  以下列出了slave的I/O线程 State 字段中最常见的几种状态。从MySQL 4.1.1开始,这个状态在执行 SHOW SLAVE STATUS 语句结果的 Slave_IO_State 字段也会出现。这意味

着可以只执行 SHOW SLAVE STATUS 语句就能了解到更多的信息。

  Connecting to master

  该线程证尝试连接到master上。

  Checking master version

  确定连接到master后出现的一个短暂的状态。

  Registering slave on master

  确定连接到master后出现的一个短暂的状态。

  Requesting binlog dump

  确定连接到master后出现的一个短暂的状态。该线程向master发送一个请求,告诉它要请求的二进制文件以及开始位置。

  Waiting to reconnect after a failed binlog dump request

  如果二进制日志转储(binary log dump)请求失败了(由于连接断开),该线程在休眠时**这个状态,并定期重连。重连的时间间隔由

  --master-connect-retry 选项来指定。

  Reconnecting after a failed binlog dump request

  该线程正尝试重连到master。

  Waiting for master to send event

  已经连接到master,正等待它发送二进制日志。如果master闲置时,这个状态可能会持续较长时间,如果它等待超过 slave_read_timeout 秒,就会发生超时。这时,它就会

考虑断开连接,然后尝试重连。

  Queueing master event to the relay log

  已经读取到一个事件,正把它拷贝到中继日志中以备SQL线程处理。

  Waiting to reconnect after a failed master event read

  读日志时发生错误(由于连接断开)。该线程在重连之前休眠 master-connect-retry 秒。

  Reconnecting after a failed master event read

  正尝试重连到master。当连接确定后,状态就变成 Waiting for master to send event。

  Waiting for the slave SQL thread to free enough relay log space

  relay_log_space_limit 的值非零,中继日志的大小总和超过这个值了。I/O线程等待SQL线程先处理中继日志然后删除它们以释放足够的空间。

  Waiting for slave mutex on exit

  当前线程停止了,这个时间很短。

  5. Slave的SQL线程状态

  以下列出了slave的SQL线程 State 字段中最常见的几种状态:

  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

  当前线程停止了,这个时间很短。

  SQL线程的 State 字段有时候也可能是一个SQL语句。这意味着它从中继日志中读取到一个事件了,从中提取出SQL语句,并执行它。  
   
   

  相关mysql数据同步资料的连接:

         http://imysql.cn/node/58
         http://deidara.blog.51cto.com/400447/122039
         http://www.phpx.com/tech/database/2009-01-15/65.html
         http://www.cnscn.org/htm_data/288/0811/17463.html
         http://www.koven.org/archives/203.html
         http://www.cnblogs.com/harryguo/archive/2008/03/10/1099223.html
         http://www.blogjava.net/lzj520/archive/2008/02/27/182485.html
 楼主| dirtysea 发表于 2010-7-11 19:41:34 | 显示全部楼层
mysql-bin.000001文件产生的原因及处理方法
mysql-bin.000001、mysql-bin.000002等文件是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件中,还包括每个语句执行的时间,也会记录进去的。这样做主要有以下两个目的:
1:数据恢复
如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失。
2:主从服务器之间同步数据
主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步。
处理方法分两种情况:
1:只有一个mysql服务器,那么可以简单的注释掉这个选项就行了。
vi /etc/my.cnf把里面的 log-bin 这一行注释掉,重启mysql服务即可。
2:如果你的环境是主从服务器,那么就需要做以下操作了。
A:在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
B:使用SHOW MASTER LOGS获得主服务器上的一系列日志。
C:在所有的从属服务器中判定最早的日志,这个是目标日志,如果所有的从属服务器是更新的,就是清单上的最后一个日志。
D:清理所有的日志,但是不包括目标日志,因为从服务器还要跟它同步。
清理日志方法为:
PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2008-12-19 21:00:00';
如果你确定从服务器已经同步过了,跟主服务器一样了,那么可以直接 RESET MASTER 将这些文件删除。
 楼主| dirtysea 发表于 2010-12-15 16:32:29 | 显示全部楼层
mysql遇到问题: ERROR 1201 (HY000): Could not initialize master info structure


ERROR 1201 (HY000): Could not initialize master info structure ...

处理 vim /etc/my.cnf
加上relay-log=xxx #(relay-log=fb-relay) 即可
可能删除relaylog也行,没有测试.

下面是网上找到的解决办法,备忘记录。
mysql> start slave;
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log

[root@slave ~]# tail /var/log/mysqld.log
090105 11:53:52 [ERROR] Failed to open the relay log '/var/run/mysqld/mysqld-relay-bin.000013' (relay_log_pos 235)
090105 11:53:52 [ERROR] Could not find target log during relay log initialization
...

[root@slave mysql]# ls /var/run/mysqld/
mysqld-relay-bin.000001 mysqld-relay-bin.000003 mysqld-relay-bin.000005 mysqld-relay-bin.index   
mysqld-relay-bin.000002 mysqld-relay-bin.000004 mysqld-relay-bin.000006
[root@slave mysql]# cat master.info
14
mysql-bin.000010
1235
192.168.3.21
slave
29019853
3307
60
0


[root@slave mysql]# cat relay-log.info
/var/run/mysqld/mysqld-relay-bin.000013
235
mysql-bin.000010
1235

3

50703

Resolve solution:

[root@slave ~]# service mysqld stop
[root@slave mysql]# rm -fr master.info
[root@slave mysql]# rm -fr relay-log.info
[root@slave ~]# grep skip-slave-start /etc/my.cnf
skip-slave-start

如果没有grep到,则在my.cnf文件中的[mysqld]里加上一行: skip-slave-start

[root@slave ~]# service mysqld start
[root@master ~]# mysql -uroot -p
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011 |       98 |              |                  |
+------------------+----------+--------------+------------------+
[root@slave ~]# mysql -uroot -p

mysql> change master to
master_log_file='mysql-bin.000011',
master_log_pos=98,
master_host='192.168.3.21',
master_port=3307,
master_user='slave',
master_password='12345678';
Query OK, 0 rows affected (0.02 sec)
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: 192.168.3.21
                Master_User: slave
                Master_Port: 3307
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000011
        Read_Master_Log_Pos: 98
             Relay_Log_File: mysqld-relay-bin.000002
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000011
           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)


您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|运维之家

GMT+8, 2024-4-19 15:43 , Processed in 0.193569 second(s), 14 queries .

Powered by Dirtysea

© 2008-2020 Dirtysea.com.

快速回复 返回顶部 返回列表