首页 > mysql > Mysql主从同步复制总结

Mysql主从同步复制总结

2009年9月19日 admin 发表评论 阅读评论

  经过这两天实验和查资料,对Mysql的同步复制有了一定了解。把相关的结论记下来。

建议:在同步之前,2台Mysql的数据库 数据要一致,就是先把要备份的数据库导入到从slave服务器上。这样可以避免同步出错。

在已经正常同步的情况下:

  下面内容参考了(imysql.cn),测试是亲自操作的。
  如果master当机或者slave连接断开,slave会定期尝试连接到master上直到能重连并且等待更新。重试的时间间隔由 –master-connect-retry 选项来控制,它的默认值是60秒。

每个slave都记录了它关闭时的日志位置。msater是不知道有多少个slave连接上来或者哪个slave从什么时候开始更新。

###测试 主############

mysql> select * from demo;
+—————————–+
| title                       |
+—————————–+
| duliang                     |
| 杜亮                        |
| 解决同步故障                |
| 午饭后查看同步正常          |
| 主正常,从重启              |
| master boot,slave boot      |
| s server stop,master insert |
+—————————–+
7 rows in set (0.00 sec)

mysql> show master status;
+—————–+———-+————–+——————+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————–+———-+————–+——————+
| mysqllog.000010 |      337 | gb           |                  |
+—————–+———-+————–+——————+
1 row in set (0.00 sec)

###测试 从############

mysql> show slave status\G;
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.1.10
                Master_User: root
                Master_Port: 3308
              Connect_Retry: 60
            Master_Log_File: mysqllog.000010
        Read_Master_Log_Pos: 337
             Relay_Log_File: 共享服务器-relay-bin.000023
              Relay_Log_Pos: 234
      Relay_Master_Log_File: mysqllog.000010
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: gb
        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: 337
            Relay_Log_Space: 234
            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)

ERROR:
No query specified

mysql> select * from demo;
+—————————–+
| title                       |
+—————————–+
| duliang                     |
| 杜亮                        |
| 解决同步故障                |
| 午饭后查看同步正常          |
| 主正常,从重启              |
| master boot,slave boot      |
| s server stop,master insert |
+—————————–+
7 rows in set (0.00 sec)

mysql>

####结束###############

相关问答 请参考 http://www.imysql.cn/node/61

问: master还在运行中,如何在不停止它的情况下配置slave?
答: 需要设计几个选项参数。如果已经有了master的备份并且记录了数据快照二进制日志文件名以及偏移位置(运行 SHOW MASTER STATUS 查看结果),执行以下步骤:
确定slave指定了一个唯一的服务器编号。
在slave上执行如下语句,把一些选项值改成实际值:
mysql> CHANGE MASTER TO
    ->     MASTER_HOST=’master_host_name’,
    ->     MASTER_USER=’master_user_name’,
    ->     MASTER_PASSWORD=’master_pass’,
    ->     MASTER_LOG_FILE=’recorded_log_file_name’,
    ->     MASTER_LOG_POS=recorded_log_position; 
在slave上执行  SLAVE  START语句。

问:是否slave总是需要连接到master?
答:不,非必需。slave可以好几小时甚至几天关闭或者不连接master,然后重连再取得更新操作日志。例如,可以在拨号链接上设置一个mater/slave关系,拨号可能只是零星的不定期的连接。这种做法隐含的是,在任何指定的时间里,除非使用特殊的度量标准,否则slave不能保证总是能和master保持同步。在未来,有个选项可以阻止master,除非至少有一个slave在同步中。

问:怎么知道比master晚了多少?也就是说,怎么知道slave最后同步的时间?
答:如果slave是4.1.1或者更高,只需查看 SHOW SLAVE STATUS 结果中的 Seconds_Behind_Master 字段。对于老版本,可以用以下办法。如果在slave上执行 SHOW PROCESSLIST 语句结果显示SQL线程(对MySQL 3.23则是slave线程)正在运行,这就意味着该线程至少从master读取一个更新操作事件。详情请看”6.3 Replication Implementation Details”。

当SQL线程执行一个master上读取的更新操作事件时,它把自己的时间改成事件的时间(这也就是 TIMESTAMP 也要同步的原因)。在SHOW PROCESSLIST 结果中的 Time 字段中,slave的SQL线程显示的秒数就是最后一次同步的时间戳和slave本机的实际时间相差秒数。可以根据这个值来判断最后同步的时间。注意,如果slave已经从master断开好几个小时了,然后重新连接,就能看到slave的
SHOW PROCESSLIST 结果中的SQL线程的Time 字段的值类似3600。这是因为slave正在执行一个小时前的语句。

分类: mysql 标签:
  1. hugone99
    2009年9月20日22:40 | #1

    您好,我在你这里看到了mysql乱码问题的解决,我有的是mysql5.1.36,集合在WAMPSERVER2.0中,在my.ini里没有找到网上说的:mysqld –default-character-set这个口令,请问怎么解决这个乱码问题啊?

  2. admin
    2009年9月21日09:11 | #2

    1、首先,得确定你的程序的编码是什么GB2312,还是UTF-8
    2、查看建立的数据库 及 表的字符集
    3、在你写的程序中,数据库连接类加上SET NAMES ‘GBK’,如果你的数据库编码是UTF-8则:SET NAMES ‘UTF8′

    注你说的:在my.ini里没有找到网上说的:mysqld –default-character-set这个口令
    答:这个是mysql命令行,在my.ini里是没有的。应该是这个选取项:default-character-set=gbk,gbk是我mysql服务器的字符集。
    php服务器,我都是单独安装的,在安装mysql的时候,可以设定字符集,我的my.ini里:default-character-set=gbk如:
    [client]
    port=3308
    [mysql]
    default-character-set=gbk

  1. 2010年2月22日17:01 | #1