该函数对于控制主从同步很有用处。它会持续封锁,直到从设备阅读和应用主机记录中所有补充资料到指定的位置。返回值是其为到达指定位置而必须等待的记录事件的数目。若从设备SQL线程没有被启动、从设备主机信息尚未初始化、参数不正确或出现任何错误,则该函数返回 NULL。若超时时间被超过,则返回-1。若在MASTER_POS_WAIT() 等待期间,从设备SQL线程中止,则该函数返回 NULL。若从设备由指定位置通过,则函数会立即返回结果。
假如已经指定了一个超时时间值,当 超时时间 秒数经过后MASTER_POS_WAIT()会停止等待。超时时间 必须大于 0;一个为零或为负值的 超时时间 表示没有超市时间。
该函数主要有两种应用情况:
1、在主从切换时,通常做法是
a、停止master的写入
b、在主库上show master status来查看主库binlog的pos
c、在slave上检查是否到达该点
利用MASTER_POS_WAIT函数,可以在上面的b步骤中调用该函数,直至执行到指定点
2、在应用程序中主库提交完后,如果对从库的时实同步要求比较高的话,可以在应用程序中连接从库调用MASTER_POS_WAIT阻塞等待,直至主库更新至从库。当然这样会影响客户端提交的延时。
MASTER_POS_WAIT的实现逻辑
用户调用该函数后,根据传入参数调用pthread_cond_timedwait或pthread_cond_wait。 SQL_THREAD线程每次apply完一个事件后会触发更新relay info, 并通知上面等待的线程。因为可能有多个用户等待,因此用广播方式。