半同步模式其实是作为MySQL5.5的一个plugin实现的,master和slave使用不同的plugin。默认情况下没有安装该plugin,官方提供的MySQL Server RPM包默认安装后,会在/usr/lib(64)/mysql/plugin/下面找到该插件。安装完插件之后,还需要手动设置系统参数以开启半同步复制模式。 ------------------------------------------------------------------------------------------------------------------------------------------------------------------ Master 服务器: vi my.cnf [mysqld] log-bin=NEW_NAME server-id=1 #配一个唯一的ID编号,1至32。 #设置要进行或不要进行主从复制的数据库名,同时也要在 Slave 上设定。 binlog-do-db=数据库名 binlog-ignore-db=数据库名 安装插件 mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so'; 删除插件是:uninstall plugin PLUGIN_NAME; mysql>show status; Rpl_semi_sync_master_clients 0 ##表示有多少slave设置了半同步模式。 Rpl_semi_sync_master_no_tx 0 ##表示没有成功接收slave回执的提交次数 Rpl_semi_sync_master_status OFF ##表示当前是异步模式还是半同步模式,设成ON状态,set global rpl_semi_sync_master_enabled=1; mysql> SET GLOBAL rpl_semi_sync_master_timeout=1000; (1s, 默认是 10s) mysql> grant replication slave on *.* to NEW_NAME@Slave服务器IP identified by '**'; mysql> flush tables with read lock; mysql> show master status; #记下现在的日志文件位置。 显示: saturn-bin.002 106 Slave服务器: vi my.cnf [mysqld] server-id=2 #也是要唯一。 #设置要进行或不要进行主从复制的数据库名,同时也要在 Master 上设定。 replicate-do-db=数据库名 replicate-ignore-db=数据库名 安装插件 mysql>install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’; mysql> change master to master_host='Master服务器IP',master_user='授权用户(不可以是root)',master_password='',master_log_file='saturn-bin.002',master_log_pos=106; 设置rpl_semi_sync_slave_enabled =ON,重启才生效 mysql>slave stop;slave start 检查设置没有问题后,Master服务器:mysql> unlock tables; mysql>show master status \G #查看Master状态 mysql>show slave status \G #查看Slave状态 ------------------------------------------------------------------------------------------------------------------------------------------------------------------ 问题处理记录: 1、Slave服务器宕机,导致Slave服务器启动后 show slave status \G 后提示错误 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'binlog truncated in the middle of event' 解决: Master: show master status \G #记录 Master 以下信息 File: mysql-MasterSlave.000006 Position: 174367 Slave: slave stop; reset slave; change master to master_host='192.168.1.126',master_user='USER',master_password='PW',master_log_file='mysql-MasterSlave.000006',master_log_pos=174367; 提示:从 Mysql 5.5 开始 Mysql 加入半同步复制,取消了 load data from master 之类的用法,MySQL Slave/Master实例在异常终止恢复之后,MySQL Slave可以处理未完成的或丢弃Master写如log失败数据,从而重新从master上获取源数据,同样,Master 实例重启不会使 Slave 丢失数据。 ------------------------------------------------------------------------------------------------------------------------------------------------------------------ Master 同步线程状态 以下列出了master的 Binlog Dump 线程 State 字段中最常见的几种状态。如果在master上没有 Binlog Dump 线程,那么同步就没有在运行。也就是说,没有slave连接上来。 Sending binlog event to slave 事件是由二进制日志构成,一个事件通常由更新语句加上其他信息。线程读取到一个事件并正发送到slave上。 Finished reading one binlog; switching to next binlog 读取完了一个二进制日志,正切换到下一个。 Has sent all binlog to slave; waiting for binlog to be updated 已经读取完全部未完成更新日志,并且全部都发送到slave了。它处于空闲状态,正等待在master上执行新的更新操作以在二进制日志中产生新的事件,然后读取它们。 Waiting to finalize termination 当前线程停止了,这个时间很短。 Slave的线程状态 以下列出了slave的I/O线程 State 字段中最常见的几种状态。从MySQL 4.1.1开始,这个状态在执行 SHOW SLAVE STATUS 语句结果的 Slave_IO_State 字段也会出现。这意味着可以只执行 SHOW SLAVE STATUS 语句就能了解到更多的信息。 Connecting to master 该线程证尝试连接到master上。 Checking master version 确定连接到master后出现的一个短暂的状态。 Registering slave on master 确定连接到master后出现的一个短暂的状态。 Requesting binlog dump 确定连接到master后出现的一个短暂的状态。该线程向master发送一个请求,告诉它要请求的二进制文件以及开始位置。 Waiting to reconnect after a failed binlog dump request 如果二进制日志转储(binary log dump)请求失败了(由于连接断开),该线程在休眠时进入这个状态,并定期重连。重连的时间间隔由 --master-connect-retry 选项来指定。 Reconnecting after a failed binlog dump request 该线程正尝试重连到master。 Waiting for master to send event 已经连接到master,正等待它发送二进制日志。如果master闲置时,这个状态可能会持续较长时间,如果它等待超过 slave_read_timeout 秒,就会发生超时。这时,它就会考虑断开连接,然后尝试重连。 Queueing master event to the relay log 已经读取到一个事件,正把它拷贝到中继日志中以备SQL线程处理。 Waiting to reconnect after a failed master event read 读日志时发生错误(由于连接断开)。该线程在重连之前休眠 master-connect-retry 秒。 Reconnecting after a failed master event read 正尝试重连到master。当连接确定后,状态就变成 Waiting for master to send event。 Waiting for the slave SQL thread to free enough relay log space relay_log_space_limit 的值非零,中继日志的大小总和超过这个值了。I/O线程等待SQL线程先处理中继日志然后删除它们以释放足够的空间。 Waiting for slave mutex on exit 当前线程停止了,这个时间很短。 Reading event from the relay log 从中继日志里读到一个事件以备执行。 Has read all relay log; waiting for the slave I/O thread to update it 已经处理完中继日志中的全部事件了,正等待I/O线程写入更新的日志。 Waiting for slave mutex on exit 当前线程停止了,这个时间很短。 ------------------------------------------------------------------------------------------------------------------------------------------------------------------ 附 Last_SQL_Errno 错误代码说明: 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1010:不能删除数据目录导致删除数据库失败 1011:删除数据库文件失败 1012:不能读取系统表中的记录 1020:记录已被其他用户修改 1021:硬盘剩余空间不足,请加大硬盘可用空间 1022:关键字重复,更改记录失败 1023:关闭时发生错误 1024:读文件错误 1025:更改名字时发生错误 1026:写文件错误 1032:记录不存在 1036:数据表是只读的,不能对它进行修改 1037:系统内存不足,请重启数据库或重启服务器 1038:用于排序的内存不足,请增大排序缓冲区 1040:已到达数据库的最大连接数,请加大数据库可用连接数 1041:系统内存不足 1042:无效的主机名 1043:无效连接 1044:当前用户没有访问数据库的权限 1045:不能连接数据库,用户名或密码错误 1048:字段不能为空 1049:数据库不存在 1050:数据表已存在 1051:数据表不存在 1054:字段不存在 1065:无效的SQL语句,SQL语句为空 1081:不能建立Socket连接 1114:数据表已满,不能容纳任何记录 1116:打开的数据表太多 1129:数据库出现异常,请重启数据库 1130:连接数据库失败,没有连接数据库的权限 1133:数据库用户不存在 1141:当前用户无权访问数据库 1142:当前用户无权访问数据表 1143:当前用户无权访问数据表中的字段 1146:数据表不存在 1147:未定义用户对数据表的访问权限 1149:SQL语句语法错误 1158:网络错误,出现读错误,请检查网络连接状况 1159:网络错误,读超时,请检查网络连接状况 1160:网络错误,出现写错误,请检查网络连接状况 1161:网络错误,写超时,请检查网络连接状况 1062:字段值重复,入库失败 1169:字段值重复,更新记录失败 1177:打开数据表失败 1180:提交事务失败 1181:回滚事务失败 1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库 1205:加锁超时 1211:当前用户没有创建用户的权限 1216:外键约束检查失败,更新子表记录失败 1217:外键约束检查失败,删除或修改主表记录失败 1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器 1227:权限不足,您无权进行此操作 1235:MySQL版本过低,不具有本功能 转载请保留固定链接: https://linuxeye.com/database/1615.html |