MySQL同步常用管理任务

翻译自MySQL 5.5 Reference Manual

同步设置好并开始运行后,并不需要许多日常管理操作。取决于同步环境,你会希望偶尔、每天甚至更频繁地检查每一从服务器的同步状态。

1 检查同步状态

管理同步过程的最常用任务是确保同步正在运行并且主服务器和从服务器之间没有发生错误。完成这一任务主要通过在每一从服务器上执行SHOW SLAVE STATUS语句:

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master1
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 931
               Relay_Log_File: slave1-relay-bin.000056
                Relay_Log_Pos: 950
        Relay_Master_Log_File: mysql-bin.000004
             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: 931
              Relay_Log_Space: 1365
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids: 0

在这个状态报告中,需要检查的关键字段是:

  • Slave_IO_State:从服务器的当前状态。参考Section 8.12.5.6, “Replication Slave I/O Thread States”Section 8.12.5.7, “Replication Slave SQL Thread States”获取更多信息。
  • Slave_IO_Running:读取主服务器二进制日志的I/O线程是否在运行。除非同步还没开始,或者执行了STOP SLAVE语句,通常你会希望这里的状态是“Yes”。
  • Slave_SQL_Running:执行中继日志中事件的SQL线程是否在运行。就像I/O线程那样,正常情况下应该是“Yes”。
  • Last_IO_Error,Last_SQL_Error:I/O和SQL线程在处理中继日志时所记录的最后一次错误。理想状况下这里应该是空的,表示没有错误。
  • Seconds_Behind_Master:从服务器SQL进程处理主服务器二进制日志时落后主服务器的秒数。一个比较大的数字(或正在增加的数字)表示从服务器无法及时处理主服务器上的事件。
    Seconds_Behind_Master值为0通常可解释为从服务器已经赶上了主服务器,但在某些情况下严格说来这不是真的。例如,主服务器和从服务器的网络连接已断开,但从服务器的I/O线程还没有意识到这一点——也就是说,还没有超出slave_net_timeout指定的时间。
    Seconds_Behind_Master的值也可能暂时性无法准确反映出实际状况。从服务器SQL线程已经追赶上I/O线程的时候,Seconds_Behind_Master显示为0;但当从服务器I/O线程仍然在获取新事件的时候,Seconds_Behind_Master可能会显示一个较大的值,直到SQL线程执行完新的事件。当事件具有旧的时间戳时,这尤其可能发生;在这些情况下,如果在相对段的时间段内多次执行SHOW SLAVE STATUS,你或许会看到这个值在0和相对较大的数值间来来回回变动。

一些成对的字段提供从服务器从主服务器读取事件的进度信息,以及在中继日志中处理这些事件的进度的信息:

  • (Master_Log_file,Read_Master_Log_Pos):主服务器二进制日志的偏移量指出,从服务器的I/O线程已经从那个日志中读取了多少事件。
  • (Relay_Master_Log_File,Exec_Master_Log_Pos):主服务器二进制日志的偏移量指出,从服务器的SQL线程已经从接收到的那个日志中执行了多少事件。
  • (Relay_Log_File,Relay_Log_Pos):从服务器中继日志的偏移量指出,从服务器的SQL线程已经从中继日志中执行了多少事件。这与上一个偏移量相对应,但以从服务器中继日志偏移量表达,而不是主服务器二进制日志偏移量。

在主服务器上,可以通过使用SHOW PROCESSLIST检查当前运行的进程的列表,来检查已连接的从服务器的状态。从服务器连接在Command字段中显示为Binlog Dump:

mysql> SHOW PROCESSLIST \G;
*************************** 4. row ***************************
     Id: 10
   User: root
   Host: slave1:58371
     db: NULL
Command: Binlog Dump
   Time: 777
  State: Has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL

由于是从服务器在驱动着同步过程,这一报告中的信息很少。

以--report-host参数启动的从服务器,连接到主服务器以后,主服务器上使用SHOW SLAVE HOSTS语句可以显示从服务器的基本信息。输出信息包括从服务器的ID,--report-host选项的值,连接所用的端口,以及主服务器ID:

mysql> SHOW SLAVE HOSTS;
+-----------+--------+------+-------------------+-----------+
| Server_id | Host   | Port | Rpl_recovery_rank | Master_id |
+-----------+--------+------+-------------------+-----------+
|        10 | slave1 | 3306 |                 0 |         1 |
+-----------+--------+------+-------------------+-----------+
1 row in set (0.00 sec)

2 在从服务器暂停同步

可在从服务器上使用STOP SLAVESTART SLAVE语句停止及启动同步。

要停止处理从主服务器上获取的二进制日志,使用STOP SLAVE

mysql> STOP SLAVE;

同步停止以后,从服务器的I/O线程不再读取主服务器二进制日志中的事件,也不再把事件写入中继日志,SQL线程也停止从中继日志读取及执行事件。

要重新开始执行,使用START SLAVE语句:

mysql> START SLAVE;

要单独启动某一线程,需给出线程类型:

mysql> START SLAVE IO_THREAD;
mysql> START SLAVE SQL_THREAD;

对一个仅用来同步的从服务器来说,如果你想执行备份或其他任务,可以只停止SQL线程。I/O线程会继续从主服务器读取事件,但这些事件不会被执行。这样当重新启动SQL线程时,从服务器可以容易地赶上主服务器。

只停止I/O线程让SQL线程可以把中继日志中的所有事件执行完。当你既想暂停同步又想让从服务器处理完已经从主服务器收到的事件时,当你既想在从服务器上执行管理任务又想确保它已同步到了某一特定点时,可这样操作。当需要在主服务器执行管理任务时,也可使用这一方案让从服务器暂停接收事件。停止I/O线程但允许执行SQL线程,可确保当重新开始同步以后不会有大量未处理事件需要执行。

点击量:25

发表评论

电子邮件地址不会被公开。 必填项已用*标注

5 + 6 =