创建复制账号

mysql > grant replication slave, replication client on *.*
          to 'repl'@'172.18.%' identified by 'password';
  1. 在主备库都创建该账号,把账户限制在本地网络。
  2. 为了方便才以后能交换主备库的角色。

配置主库和备库

主库

my.cnf中增加(修改):

log_bin    = mysql-bin
server_id  = 10         # 千万不要设置为1

可以通过下面指令查看复制log文件和log位置:

mysql > show master status\G;

备库

同样在my.cnf中增加(修改):

log_bin           = mysql-bin                        # 和主库一致
server_id         = 2                                # 要和主库不一样
relay_log         = /var/lib/mysql/mysql-relay-bin   # 配置为绝对路径
log_slave_updates = 1                                # 不开启会出问题
read_only         = 1                                # repl账户只能读

<!--more-->

重启与启动复制

上述配置完需要重启mysql。
启动复制前要让备库知道主库的信息,以便获取和重放其二进制日志。

mysql > change master to master_host='ip',
        master_user='repl',
        master_password='password'
        master_log_file='mysql-bin.000001',
        master_log_pos=0;

启动slave:

mysql > start slave;

查看slave的状态查看slave_IO_RunningSlave_SQL_Running等情况:

mysql > show slave status\G

错误分析

从库不能重放行为

  1. 开启复制后才会重放主库的所有行为,因为此时的行为才会被记录到复制日志中,所以开启复制后的创建数据库、 建表操作,CRUD操作才能在从库重放。
  2. 而配置复制前在主库建立的数据库,由于没有记录日志,所以从库没有该数据库,也没有该表,虽然记录了CRUD 在日志里,但是不能重放。解决办法是手动建库建表。

日志文件和位置错乱

有时候日志文件和位置错乱时,就要通过查看主库的master状态来更新备库的信息。更新信息前要stop slave

mysql > change master to
        master_log_file='mysql-bin.000002',
        master_log_pos=1234;

推荐配置

上述的配置外,在数据完整性的重要性高于性能时,在主库配置

sync_binlog = 1

MySQL每次在提交事务前会将二进制日志同步到磁盘上,能保证服务器崩溃时不会丢失事件。 而在备库中,如果使用的是MySQL5.5版本,并且不介意额外的fsync()导致的性能开销,最好配置:

sync_master_info    = 1
sync_relay_log      = 1
sync_relay_log_info = 1

小结

以上的配置为数据库还没有数据时的配置,若主库在配置复制前已经有数据了,有一些其他的配置可供使用,这里先不详述。