MySQL主从复制的配置

一、原理

将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

注意:更新数据时只能在主服务器上操作,否则会导致主从服务器的数据不一致

二、主服务器的配置

  1. 配置主配置文件

    #vim /etc/my.cnf

    [server]

    port = 3306

    socket = /tmp/mysql.sock

    [mysqld]

    user = mysql

    innodb_buffer_pool_size = 128M

    log_bin = master-log           \\注意开启二进制日志功能

    max_binlog_size = 64M

    binlog_format = mixed           \\row(行)、statement(语句,在日志中可看到操作的语句)

    basedir = /usr/local/mysql

    datadir = /database/mydata

    port = 3306

    server_id = 1                   \\slave主机上的id应为2

    socket = /tmp/mysql.sock

    log_error = /database/mydata/server1.err 

    character_set_server = utf8

    explicit_defaults_for_timestamp = on

    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

  2. 数据库初始化

    #./scripts/mysql_install_db --user=mysql --datadir=/database/mydata

  3. 给从服务器授权

    mysql> grant replication slave on *.* to 'repuser'@'10.0.10.1' identified by '123123';

    mysql> flush privileges;

    mysql> show master status\G

三、从服务器的配置

  1. 配置主配置文件

    #vim /etc/my.cnf

    [client]

    port = 3306

    socket = /tmp/mysql.sock

    [mysqld]

    user = mysql

    innodb_buffer_pool_size = 128M

    log_bin = slave-log

    max_binlog_size = 64M

    log_slave_updates = on               \\开启更新

    binlog_format = mixed

    relay_log = relay-bin                \\中继日志

    basedir = /usr/local/mysql

    datadir = /database/mydata

    port = 3306

    server_id = 2

    socket = /tmp/mysql.sock

    log_error = /database/mydata/server1.err

    character_set_server = utf8

    explicit_defaults_for_timestamp = on

    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

  2. 数据库初始化

    # ./scripts/mysql_install_db --user=mysql --datadir=/database/mydata 

  3. 设置从服务器相关信息

    mysql> change master to master_host='10.0.10.1',master_user='repuser',master_password='123123',master_log_file='master-log.000003',master_log_pos=409,master_port=3306;

    mysql> start slave;

    mysql> show slave status\G

    mysql> stop slave;

四、对二进制日志的相关操作

   # mysqlbinlog master-log.000001       \\查看此日志的内容

   # mysqlbinlog --start-datetime='2015-07-13 7:10:0' master-log.000003

   # mysqlbinlog --start-datetime='2015-07-13 7:10:0' --stop-datetime='2015-07-13 7:33:0' master-log.000003

   # mysqlbinlog --start-position=330 master-log.000003

   # mysqlbinlog --start-position=330 --stop-position=1100 master-log.000003

   # mysqlbinlog --start-position=330 --stop-position=1100 master-log.000003 | mysql -u root \\恢复指定二进制日志的内容


   mysql> show master logs;        mysql> show binary logs;       \\查看日志

   mysql> show binlog events in 'master-log.000003' limit 20;       

   mysql> show binlog events in 'master-log.000003' from 409 limit 10;

   

   mysql> purge master logs to 'master-log.000002';  \\删除指定编号之前的日志

   mysql> purge master logs before '2015-07-22 08:00:00';

   

   mysql> flush logs;         \\刷新日志

五、其他

   设置忽略的数据库---只复制某些特定的数据

   1.主服务器设置

   binlog_do_db = zz           \\记录二进制日志的数据库

   binlog_ignore_db = test       \\不记录二进制日志的数据库

   binlog_ignore_db = teach

   2.从服务器设置

   replicate_do_db = zz       \\设置默认进行二进制日志复制的数据库

   replicate_ignore_db = test    \\不进行二进制日志复制的数据库

   replicate_ignore_db = teach

   replicate_ignore_db = mysql

   replicate_ignore_db = information_schema

   replicate_do_table = zz.stu         \\设置进行更新的表

   replicate_ignore_table = zz.class   \\不进行更新的表

   3.从服务器建议设置

   replicate_ignore_db = test            \\不进行二进制日志复制的数据库

   replicate_ignore_db = mysql

   replicate_ignore_db = information_schema

   replicate_wild_do_table = zz.stu    \\复制指定的数据库或表的二进制日志

   replicate_wild_do_table = zz.%

   replicate_wild_ignore_table = zz.class \\不复制指定的数据库或表的二进制日志


另:双主复制---更新操作可以在任意一条主机上进行

第一台服务器设置

    auto_increment_increment = 2  \\数据表记录的自增量,一般等于服务器的数量

    auto_increment_offset = 1     \\数据表记录每次的递增量,第一台为1,第二台为2,...

    sync_binlog = 0               \\二进制日志写入磁盘的方式( 同步1 or 不同步0 )

    replicate_same_server_id = 0  \\防止mysql循环更新

    mysql> grant replication slave on *.* to 'repuser'@'10.0.10.1' identified by '123123';

    mysql> flush privileges;

第二台服务器设置

    mysql> change master to master_host='10.0.10.1',master_user='repuser',master_password='123123',master_auto_position=1;

    mysql> start slave;