数据库复制的原理: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二进制日志的完整性。



https://blog.51cto.com/danhanwen/1542690