mysql主从复制
在应用开发中,为了解决单台mysql服务器负载压力,将两台及更多台mysql服务器设置主从关系,并将数据通过mysql数据日志方式维护数据同步。其中主服务器(master server)作为增删改的服务器,并及时将数据同步到从服务器(slave server),从服务器作为查询服务器(select)。好处是从服务器作为查询服务器,分担主服务器的查询负载压力。同时从服务器也可作为数据备份。
环境说明:centos6.5,主服务器mysql5.5,从服务器mysql6.6。主服务器10.0.0.21,从服务器10.0.0.11。需要保证服务器之间能够ping通,以及mysql防火墙正常访问。
master的配置
在linux系统中,编辑主服务器的mysql配置文件,例如文件所在/etc/my.cnf。配置在[mysqld]节点下,如示例:
log-bin=mysql-bin
server-id=1
binlog-do-db=database1
binlog-do-db=database2
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
expire_logs_days = 5
max_binlog_size = 500M
上面实例中,log-bin=mysql-bin则为开启mysql二进制日志记录;server-id可以取值,需要保证唯一性;binlog-do-db则是指定需要同步的数据库,多个数据库按照上面3、4行类似换行写入,不填写则代表同步全部数据库;binlog-ignore-db则是需要排除的指定数据库,不写则不排除,原理同binlog-do-db;expire_logs_days代表过期后的文件几天内删除;max_binlog_size代表单个日志文件的最大值,超过最大值生成新的日志文件;如果不设置最后两项,则日志文件无限量生长,数据量过大的话会占用服务器磁盘空间。
:wq保存选项,重启数据库,service mysqld restart。
接下来进入mysql命令行,创建用户并授权
mysql>CREATE USER 'slaveuser'@'10.0.0.11' IDENTIFIED BY 'slavepass';
mysql>GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'10.0.0.11';
mysql>flush privileges;
查看主服务器信息
mysql> show master status;
+------------------+----------+-------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+-------------------+------------------+
| mysql-bin.000446 | 7659266 | adserver,copytest | |
+------------------+----------+-------------------+------------------+
1 row in set (0.00 sec)
上面中,file字段表示当前主库的bin-log文件,position表示记录的行数。binlog-do-db表示当前所记录的数据库二进制文件,binlog-ignore-db表示当前排除记录的数据库,表格记录为空,表示没有任何指定排除的数据库。
同步数据库
#在主库导出数据库sql语句,保存在data目录下。
mysqldump -uroot -ppassword database --skip-lock-tables>/data/database.sql
#将database.sql拷贝到从服务器。执行mysql命令
#创建database数据库
CREATE DATABASE database CHARACTER SET utf8 COLLATE utf8_general_ci;
use database;
#使用source命令导入数据到database
source /data/database.sql
slave的配置
配置从库的my.cnf文件,在[mysqld]节点下编辑如下内容。
log-bin=mysql-bin
server-id=2
:wq保存退出。重启mysql服务:service mysqld restart。
进入到mysql命令行模式,操作如下:
mysql> stop slave; #关闭Slave
mysql>set global sql_slave_skip_counter=1; #跳过错误sql,保持同步进行
mysql> change master to master_host='10.0.0.21',master_user='slaveuser',master_password='slavepass',master_log_file='mysql-bin.000446', master_log_pos=0;
mysql> start slave; #开启Slave
在执行show slave status查看当前配置状态:
当slave_io_running和slave_sql_running都为yes时,则表明当前处于正常同步状态。
测试,可以在主库中增加一个测试表,增加或修改数据的同时,查看从库的数据。当数据一致时,则表明当前配置成功;
配置完成后,经过测试。有如下总结:
1、数据的实时同步很快的。几乎没有延迟。
2、每次主服务器重启mysql服务后,都会使用新的binlog日志文件。slave在查看状态时,也会自动使用新的二进制文件进行监听数据。所以不用担心主服务器重启后,每次都要手动更新配置二进制文件。
3、在配置的时候,例如my.cnf文件需要备份,防止修改出错后,及时调整回来。避免出现mysql因为长时间不能正常启动,尤其是在生产环境。
4、如果在数据库导出的时候,数据在不断的增长,而mysql服务器友不能停,所以会出现主从服务器延迟带来的数据差异。为了防止导出过程中延迟带来的数据差异过大,可在导出数据库后,立刻重启master的mysql服务器。在show master status信息,导出数据到slave后,设置slave同步时,填写最新的二进制文件,日志文件起始行填写为0。可最大程度缩小数据差异。
嗯……,困了,整理完毕。晚安😴
------------------------------------------------2018-11-20更新-----------------------------------------
今天因为同事在主库跨库查询另外一个库得sql语句,造成结构更新事件同步执行到了从库,因为从库数据库群与主库数据库群不一致,导致从库更新失败。经过了解,重新布置了一次主从同步,在从库即将开始(start salve操作)前,设置跳过错误事件。如下:
mysql> set global sql_slave_skip_counter=1; #跳过错误sql,保持数据库同步进行