数据库复制的原理:master将操作记录到二进制日志binlog,slave的IO线程连接master的dump线程来读取binlog并将其保存至中继日志relaylog,slave的另外一个SQL线程去重放relay-log中的操作来实现和master数据同步。

一、实现环境

    centos

    master:172.16.20.245

    slave:172.16.20.219

    两数据库均是新安装

二、master安装配置

     1master修改配置文件

     #vim /etc/my.cnf

      [mysqld]   

      log-bin = master-bin                   #开启二进制日志

      log-bin-index = master-bin.index       #二进制日志索引

      binlog_format=mixed                    #二进制日志格式,另外两种stament、row

      innodb_file_per_table=1                #为innodb表格开启独立表空间

      sync-binlog = 1                        #用于提高数据安全性

      innodb_flush_log_at_trx_commit=1       #提高innodb复制的一致性

      server-id = 10                         #指定唯一的server-id

     #service mysqld restart

     2创建复制用户

     mysql>grant replication slave on *.* to 'user'@'172.16.20.%' identified by 'password';

     mysql>flush privileges;

     3记录master二进制日志记录位置    

     mysql> show master status;

     +-------------------+----------+--------------+------------------+

     | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

     +-------------------+----------+--------------+------------------+

     | master-bin.000001 |      341 |              |                  |

     +-------------------+----------+--------------+------------------+

     #创建用户记录在二进制日志中,使其position不是107

三、slave安装配置

    1slave修改配置文件

    #vim /etc/my.cnf

    [mysqld]   

    relay-log=relay-log                 #开启中继日志

    relay-log-index=relay-log.index     #中继日志索引

    innodb_file_per_table=1

    read_only=1                         #slave只读设置,保持主从数据同步

    skip-slave-start=1                  #服务器启动时跳过复制,需要手动start slave

    server-id=20                        #指定server-id,与master必须不同

    #service mysqld restart

    2启动复制

    mysql>CHANGE MASTER TO      

    MASTER_HOST='172.16.20.245',

    MASTER_USER='user',

    MASTER_PASSWORD='passwd',

    MASTER_LOG_FILE='master-bin.000001',

    MASTER_LOG_POS=341;

    mysql>start slave;    

    #或者单独START SLAVE IO_Thread;START SLAVE SQL_Thread;来启动这两个线程

    3检查

    mysql>show slave status\G   

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    以上连个进程启动则表示主从复制启动,主从复制安装完成。

四、数据库复制过滤

    master

    [mysqld]

    binlog-do-db=testdb 

    binlog-do-db=mydb

    仅将指定数据库的相关修改操作记入二进制日志,造成主端二进制日志不完整

    binlog-ignore-db=mysql

    将指定数据库的相关修改操作不记入二进制日志,造成主端二进制日志不完整

    slave

    [mysqld]

    replicate_do_db=test

    只复制test数据库

    rpplicate_ignore_db=test

    不复制test数据库    

    支持表级复制 

    replicate_do_table

    replicate_ignore_table

    replicate_wild_do_table   (可支持通配符,% _)

    replicate_wild_ignore_table

    建议:使用复制过滤一般在slave上,这样可以保证master二进制日志的完整性。