mysql主从数据库的问题:到底谁触发谁?
从网上看了很多mysql主从数据库的资料了,心中有个简单的疑问始终没有找到答案,郁闷。如下1:当主库有数据更新后,到底是主库主动通知从库,还是说从库有个定时器,定时的询问...
从网上看了很多mysql主从数据库的资料了,心中有个简单的疑问始终没有找到答案,郁闷。如下
1:当主库有数据更新后,到底是主库主动通知从库, 还是说从库有个定时器,定时的询问主库有没有更新?也就是问:到底是谁通知谁? 谁触发谁?
2:我猜想应该是前者吧,即主库应该主动告诉从库。 否则,如果是后者的话, 肯定会造成很大的延迟和流量的浪费。如果真的是后者的话,怎样解决延迟问题和流量浪费的问题?
3:大致看了mysql自带的主从复制机制,感觉好复杂, 非得这么复杂吗? 我自己想了一个主从复制的方案,非常简单,我知道我作为一个菜鸟,我的方案可能很幼稚,肯定没法和mysql自带的机制比,但是,请告诉我我的方案到底哪里不行,有哪些致命缺陷, 到底哪里幼稚了。 谢谢。
我的想法大致如下:
在主库新建一个表来代替mysql自带的bin log 日志, 即: 修改我的业务代码,把update,insert , delete 等更新的SQL语句存在这个表里。然后从库也建一个相同的表用来同步。然后自己用纯java写一个程序专门用以主从同步。具体流程是:主库执行更新操作 -> 主库把更新的SQL写入表 -> 主服务器php程序发送tcp链接通知我写的java程序有更新 -> java程序把主库的SQL写入从库的SQL表,并在从库执行这些SQL语句。 其间主要用SQL表的自增id来保证数据的写入顺序,即:id 为3的如果执行失败就不能执行 id为4的SQL, 这样貌似可以很好的实现数据的同步。 然后为了避免偶发错误, java程序可以用一个定时器定期的检查同步。 这样既实现了同步,又解决了延迟问题...... 展开
1:当主库有数据更新后,到底是主库主动通知从库, 还是说从库有个定时器,定时的询问主库有没有更新?也就是问:到底是谁通知谁? 谁触发谁?
2:我猜想应该是前者吧,即主库应该主动告诉从库。 否则,如果是后者的话, 肯定会造成很大的延迟和流量的浪费。如果真的是后者的话,怎样解决延迟问题和流量浪费的问题?
3:大致看了mysql自带的主从复制机制,感觉好复杂, 非得这么复杂吗? 我自己想了一个主从复制的方案,非常简单,我知道我作为一个菜鸟,我的方案可能很幼稚,肯定没法和mysql自带的机制比,但是,请告诉我我的方案到底哪里不行,有哪些致命缺陷, 到底哪里幼稚了。 谢谢。
我的想法大致如下:
在主库新建一个表来代替mysql自带的bin log 日志, 即: 修改我的业务代码,把update,insert , delete 等更新的SQL语句存在这个表里。然后从库也建一个相同的表用来同步。然后自己用纯java写一个程序专门用以主从同步。具体流程是:主库执行更新操作 -> 主库把更新的SQL写入表 -> 主服务器php程序发送tcp链接通知我写的java程序有更新 -> java程序把主库的SQL写入从库的SQL表,并在从库执行这些SQL语句。 其间主要用SQL表的自增id来保证数据的写入顺序,即:id 为3的如果执行失败就不能执行 id为4的SQL, 这样貌似可以很好的实现数据的同步。 然后为了避免偶发错误, java程序可以用一个定时器定期的检查同步。 这样既实现了同步,又解决了延迟问题...... 展开
3个回答
展开全部
1,MySQL 使用3 个线程来执行复制功能(其中1 个在主服务器上,另两个在从服务器上。当从服务器发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。主服务器创建一个线程将二进制日志中的内容发送到从服务器。从服务器I/O 线程读取主服务
器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继
日志。第3个线程是SQL 线程,从服务器使用此线程读取中继日志并执行日志中包含的更新。
2,如1所述,主服务器收到从服务器的同步请求后,开始向从服务器发送二进制日志
3,附件的文档可以参考下
注:你使用java程序同步数据,先不说java的效率,仅仅全部sql都同步到从表再顺序执行就有问题,反复查库,插数据,还有数据不一致的问题,如insert into tab values (now())等等;
个人意见,仅供参考
追问
首先非常谢谢。但是还没回答我的第一个问题: 当主库有数据更新时, 到底是主库通知从库,还是从库定时检查主库有没有更新?
追答
主库有数据更新时,主库会将更新记录到本地的二进制日志(binlog)中,然后主库会将新的更新发送给从库的I/O线程,从库接收后写入本地的中继日志
上面说得很清楚了吧
2020-12-07 · MySQL开源数据库领先者
关注
展开全部
1. 在有主键或者唯一键的情况下,Slave 重放 Binlog 并不会去比较检索到的记录的每一列是否和BI相同,因此如果 Slave 和 Master 存在数据不一致,会直接覆盖 Slave 的数据而不会报错。
2. 在没有主键或者唯一键的情况下,Hash Scan / Hash Scan Over Index 的执行效率 在理论上分析高于 Table Scan 和Index Scan 。
3. 在没有主键或者唯一键的情况下,Slave 选择的二级索引是第一个所有的列都在 BI 中存在的索引,不一定是 Master 执行计划所选择的索引。
2. 在没有主键或者唯一键的情况下,Hash Scan / Hash Scan Over Index 的执行效率 在理论上分析高于 Table Scan 和Index Scan 。
3. 在没有主键或者唯一键的情况下,Slave 选择的二级索引是第一个所有的列都在 BI 中存在的索引,不一定是 Master 执行计划所选择的索引。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-02-19
展开全部
貌似在DB中有个东西叫触发器,貌似还有个东西叫事务。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询