创建复制账号
mysql > grant replication slave, replication client on *.*
to 'repl'@'172.18.%' identified by 'password';
- 在主备库都创建该账号,把账户限制在本地网络。
- 为了方便才以后能交换主备库的角色。
配置主库和备库
主库
在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_Running
、Slave_SQL_Running
等情况:
mysql > show slave status\G
错误分析
从库不能重放行为
- 开启复制后才会重放主库的所有行为,因为此时的行为才会被记录到复制日志中,所以开启复制后的创建数据库、 建表操作,CRUD操作才能在从库重放。
- 而配置复制前在主库建立的数据库,由于没有记录日志,所以从库没有该数据库,也没有该表,虽然记录了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
小结
以上的配置为数据库还没有数据时的配置,若主库在配置复制前已经有数据了,有一些其他的配置可供使用,这里先不详述。