MySQL复制概述(一)

2016-09-25 14:25:48

原理

master将数据变化记录到bin-log日志中,然后slave服务器通过I/O线程读取master的bin-log日志,并将其写人slave服务器的relay-log日志中,接着sql线程读取relay-log日志,并在slave中执行,从而实现mysql复制。

安装

  • 标准安装步骤
    1.1 建立复制账户,配置主、从服务器的my.cnf
    1.2 复制master数据
    1.3 在slave上应用master数据,并执行同步命令。
    注 本文针对mysql5.5x系列

    mysql> create user 'repl'@'<slave_host>' identified by '<slave_password>';
    mysql> grant replication slave on *.* to  'repl'@'<slave_host>';
    
    master的my.cnf
    [mysqld]
    
    server_id = 100
    log_bin = mysql-bin
    log_bin_index = mysql-bin.index
    sync_binlog = 1
    innodb_flush_log_at_trx_commit = 1
    innodb_support_xa = 1
    

    server_id一定保证唯一
    log_bin如不指定,缺省使用主机名(relay-log同样需要)。

    slave的my.cnf
    [mysqld]
    server_id = 101
    log_bin = mysql-bin
    log_bin_index = mysql-bin.index
    relay-log = mysql-relay-bin
    relay-log-inex = mysql-relay-bin.index
    read_only = 1
    skip_slave_start = 1
    log_slave_updates = 1
    

    复制master数据,并执行同步命令。

    shell>mysqldump --all-databases --master-data=1 > backup.sql
    
    在slave上应用master数据,并执行同步命令。
    shell> mysql < backup.sql
    shell> grep -i "CHANGE MASTER TO" backup.sql
    
    mysql>change master to
        master_host='<master_host>',
        master_user='<slave_user>',
        master_password='<slave_password>',
        master_log_file='<Relay_Master_Log_File>',
        master_log_pos='<Exec_Master_Log_Pos>';
    mysql>start slave;
    mysql>show slave status;
    
  • 从已存在slave上新建slave服务器
    在旧slave上查看日志信息

    mysql>show slave status;
    

    记录下Relay_Master_Log_File&Exec_Master_Log_Pos

    在新slave上执行

    mysql>chang master to
        master_host='<master_host>',
        master_user='<slave_user>',
        master_password='<slave_password>',
        master_log_file='<Relay_Master_Log_File>',
        master_log_pos='<Exec_Master_Log_Pos>';
    mysql>start slave;
    mysql>show slave status;
    
  • 主从复制常见错误

    Error 'Duplicate entry …' for key … on query
    

    最好是找出有问题数据,然后主从复制恢复正常,如果不行,可以在slave上使用sql_slave_skip_counter

    mysql>slave stop;
    mysql>set global sql_slave_skip_counter =1;
    mysql>start slave;
    

    在错误很多的时候,如果手工操作会累成狗的,通常这样可以使用pt-table-checksum和pt-table-sync

  • 工具
    Percona XtraBackup


您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。