mysql主从复制常见问题
mysql下载后的初次使用1.mysql主从备份基本原理
mysql⽀持单向、异步复制,复制过程中⼀个服务器充当主服务器,⽽⼀个或多个其它服务器充当从服务器。mysql复制基于主服务器在⼆进制⽇志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进⾏复制,必须在主服务器上启⽤⼆进制⽇志。每个从服务器从主服务器接收主服务器已经记录到的⼆进制⽇志,获取⽇志信息更新。通过设置
在Master上的binlog,使其处于打开状态;Slave通过⼀个I/O线程从Master上读取binlog,然后传输到Slave的中继⽇志中,然后使⽤SQL线程读取中继⽇志,并应⽤到⾃⾝数据库中,从⽽实现主从数据同步功能。
前提:mysql数据库主从数据库的版本最好⼀样,⼩版本编码不⼀样也可以,⽐如:5.7.20备份到5.7.11。
2.主数据库迁移
在做数据库主从备份之前,⾸先要确定需要备份的具体数据库,若该数据库为新建数据库,只有表结构,可导出主数据库的sql脚本,导⼊到从数据库中执⾏,使主数据库与从数据库的结构相同。
若该数据库已经存在存储信息,则需要锁定主数据库,暂时不让任何程序操作数据库,导出主数据库sql脚本,从数据库执⾏sql脚本,保证在做主从备份之前,主从数据库的结构,存储信息⼀致。也可采⽤Navicat Premium等数据库管理⼯具,直接做数据传输操作。如图:
3.windows环境下主从备份操作
<1>主数据库master配置
1.打开mysql数据库的基础配置⽂件,可在服务中查看mysql启⽤的配置⽂件信息,若发现在服务器中没有该配置⽂件,请设置服务器把隐藏的⽂件也展⽰出来。参考截图如下:
2.打开my.ini配置⽂件,设置主数据库的参数信息,主要设置字段为server-id,log_bin,binlog_do_db ,其他字段参考参数定义⾃⾏设置,配置⽂件中相关参数定义如下:
参数意义
server-id 数据库唯⼀ID ,⼀组主从中此标识号不能重复。其中1 代表主数据库(源) 2代表辅数据库(⽬的)log_bin
开启bin-log ,并指定⽂件⽬录和⽂件名前缀binlog_do_db
需要同步的数据库名字,可以是多个,之间⽤分号分割binlog_ignore_db 不需要同步的数据库名字max_binlog_size
每个bin-log 最⼤⼤⼩,当此⼤⼩等于500M 时会⾃动⽣成⼀个新的⽇志⽂件。⼀条记录不会写在2个⽇志⽂件中,所以有时⽇志⽂件会超过此⼤⼩。binlog_cache_size ⽇志缓存⼤⼩
binlog-do-db
需要同步的数据库名字,如果是多个,就以此格式在写⼀⾏即可。binlog-ignore-db
不需要同步的数据库名字,如果是多个,就以此格式在写⼀⾏即可。expire_logs_day
设置bin-log ⽇志⽂件保存的天数,此参数mysql5.0以下版本不⽀持。binlog_format bin-log ⽇志⽂件格式,设置为MIXED 可以防⽌主键重复。参数
意义3.
主服务器创建允许从服务器同步数据的账户:
4.重启mysql 服务,查看master 状态,查看命令:
show master status;
<2>从数据库slave 配置
1.打开从服务器的my.ini 配置,设置从数据库参数信息,设置字段信息server-id,binlog_do_db  。slave 库上建议把⼀些重要的选项开启,例如设置为read only 、
relay_log_recovery 、sync_master_info 、sync_relay_log_info 、sync_relay_log 这些重要选项开启。
2.停⽌slave 服务,指令为:stop slave;
3.
配置从服务器,开启同步模式,关键参数如下:
在设置同步模式时,需要保证主从服务器所在的⽹络是相通的,配置的⽂件⽇志名称,索引位置与主服务器查询的信息⼀致。
4.启动slave 服务,指令为:start slave;
5.重启mysql 服务,查看从数据库同步状态,查看指令为:show slave status;当查询的Slave_IO_Running: Yes ,Slave_SQL_Running: Yes 时,表⽰同步状态正常,主从配置成
功。
4.linux 环境下主从备份操作
通过分析mysql 主从备份的原理,它本⾝是基于主数据库的⼆进制⽇志备份的,所以,主从备份本⾝受操作系统的影响较⼩,在linux 环境下⾯配置主从备份与在windows 下⾯配置主从备份操作步骤相同,修改参数也相同。唯⼀不同点是linux 版本数据库的配置⽂件是myf ,⼀般在/etc/myf 下⾯,修改主从数据的配置⽂件信息,重启mysql 数据库服务,即可完成mysql 数据库主从备份。
笔者也亲⾃测试过,windows 版本的mysql 数据库做为主数据库,linux 版本的mysql 数据库做为从数据库,或者调换,均可设置主从备份。
笔者在初次成功配置了mysql 数据库主从备份后,以为⾃此可以万事⽆忧。但未过多久,通过查询指令查看从服务器的同步状态,发现报错了,在⽹上寻求解决办法解决后。发现不多久,⼜会出现其他类型的错误。总之,感觉很棘⼿,也觉得主从备份不可靠,需要⼈经常去查看同步状态,⼀旦出现报错,需要及时⼈为的处理。这样的情况⼀般出现在最初做数据库同步的那⼏天,还有就是主服务器,或者从服务器宕机时间长了的情况。常见错误及解决⽅案如下:
[ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position', Error_code: 1236
解决⽅案:出现1236,出现这种错误⼀般是主从服务器失去连接,出现了宕机的情况。常⽤解决办法,重新查询主服务器的状态,获取新的position 位置,重新设置从服务器的同步信息。设置命令为:change master to master_log_file='',master_log_pos=123;
Last_Errno: 1032, Last_Error: Could not execute Update_rows event on st; Can't find record in 'test', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql                解决⽅案:出现1032,表⽰从数据库上⾯缺少某⼀条数据记录,主数据库
对这条记录⼜做了修改,从数据库在修改时报错。解决⽅案是直接⽤数据库管理⼯具,数据传输模式处理具体异常的数据表,保证主数据与从数据库对应的报错数据表结构信息⼀样。
Last_Errno: 1062,Last_Error: Could not execute Write_rows event on st; Duplicate entry '5' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log                解决⽅案:出现1062,表⽰主键冲突,及从数据库上⾯出现了主数据库上⾯没有的主键信息记录。解决⽅案是直接删除提⽰的从数据库中的异常数据,或者利⽤数据传输模式处理具体异常的数据表。
Last_Errno: 1594,Last_Errno: 1593
解决⽅案:中继⽇志错误,⼀般是服务器宕机引起,解决⽅案和出现错误1236⼀样。在msql 5.5以上版本,可在slave 的配置⽂件myf ⾥要增加⼀个参数
relay_log_recovery=1。
mysql主从复制,经常会遇到错误⽽导致slave端复制中断,这个时候⼀般就需要⼈⼯⼲预,跳过错误才能继续。跳过错误有两种⽅式:
1.跳过指定数量的事务:
mysql>slave stop;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1      #跳过⼀个事务
mysql>slave start
2.修改mysql的配置⽂件,通过slave_skip_errors参数来跳所有错误或指定类型的错误
vi /etc/myf[mysqld]
slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误
slave-skip-errors=all #跳过所有错误
校验主从服务器上⾯的数据是否完全⼀致,可通过⼯具操作。具体操作请参考这篇博⽂。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。