首先,保证主从库的数据库已经安装好,并且版本一致,然后可以开始配置了。
假如我们要同步的数据库叫 homework,在主从库上分别导入homework的数据库文件,可以包含数据,我们用mysql命令导入homework.sql。
grant replication slave on *.* to 'salve'@'10.129.63.203' identified by 'xxx!@#';
grant replication slave on *.* to 'salve'@'10.129.81.111' identified by 'xxx!@#';
2.修改主库的配置文件my.cnf
vim /etc/my.cnf
已经开启的选项,要保证有哦:
log-bin=mysql-bin #主库的bin-log记录,一定要开启,从库会从此文件做数据同步。
(最终安装好后可以在主库看到,两个从库通过Binlog Dump的方式来同步数据)
server-id = 1 #主库的id,默认就好
要打开的选项:
binlog-do-db=homeWorkDB #要同步的数据库,多个的话,按这个格式依次取就好了
binlog-ignore-db=mysql #不希望同步的数据库,mysql是系统数据库,就不要同步了
innodb_flush_log_at_trx_commit=0 #1表示每次提交事务是都flush数据到硬盘,0表示每秒从buffer flush到硬盘一次,1和2每次事务都会写入,1写入文件系统,2写入文件系统缓冲区,0最安全,1的话,普通硬盘效率会很低,raid硬盘的话,差别不大
sync_binlog=0 #0表示多个binlog操作合并后从buffer flush到硬盘,1表示每次事务都从buffer flush到硬盘
为追求性能可以设置成:
innodb_flush_log_at_trx_commit=2
sync_binlog=0
更安全的配置是:
innodb_flush_log_at_trx_commit=1
sync_binlog=1
陷阱(有两种配置情况可能导致主从数据不一致
sync_binlog=1 innodb_flush_log_at_tx_commit=0
当commit时数据写到binlog当时并没有写到redolog 时 系统crash。此时从库已经拿到binglog进行数据重做,但是主库重启后会回滚该事务,此时导致主从数据不一致.
sync_binlog=1 innodb_flush_log_at_tx_commit=2
此时binglog刷盘并在从库重做,但是主库的redolog 只是写到log中,但是写没有刷盘,所以还是主库没有执行事务,但是从库执行了事务导致数据不一致。)
配置好后重启mysql
/etc/init.d/mysqld restart
,登录mysql,查看master状态:
show master status;
配置slave服务器1:
1.修改my.cnf配置文件
#log-bin=mysql-bin #从库可关闭binlog,除非是多主多从需要开启
server-id = 2
陷阱(#master-host、#master-user 等选项,在mysql5.5中都已经去掉,开启的话会导致启动mysql失败)
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
replicate-do-db=homework #要同步的数据库,不写表示复制所有库,还是写上吧
2.修改后重启mysql,并登录mysql
/etc/init.d/mysqld restart
登录进去之后,执行
change master to master_host='10.129.63.234',master_user='salve',master_password='xxx!@#',master_log_file='mysql-bin.000006',master_log_pos=107;
红字部分请在主库上执行show master status;即可看到要同步的log文件和当前同步到的位置。
之后执行
show slave statusG;
看到
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
表示同步已经ok了。
若失败的话,看err的log日志,再找解决办法,实在不行执行
flush slave,保证主从库数据一致后,重新配置从库。
执行slave start;
配置slave服务器2:
另外一个从库执行同样的步骤,只是修改下server-id即可
server-id = 3
然后就完成了,去主库插入一条记录,看看从库是不是可以自动更新。
其他相关操作:
数据不同步时,执行:
slave stop;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
slave start;
从库同步失败的时候:
flush slave;
这样
show slave status;
从库的所有状态都已经清除掉了,可以手动恢复数据一致后重新配置从库。