« 上一篇下一篇 »

复制实现级别

 MySQL的复制可以是基于一条语句或一条记录的,你可以在MySQL配置参数中设定复制级别,不同复制级别设置会影响到Master端的Binary Log记录成不同的形式。

    1、Row Level

    Binary Log会记录成每一行数据被修改的形式,然后在Slave端再对相同的数据进行修改。

    优点:在Row Level模式下,Binary Log可以不记录执行的Query语句的上下文相关信息,只需要记录哪一条记录被修改了,修改成什么样了。所以Row Level的日志内容会非常清楚地记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题。

    缺点:Row Level下,当所有的执行语句记录到Binary Log时,都将被记录成每条记录被修改的形式,这样可能会产生大量的日志内容。

    2、Statement Level

    每一条会修改数据的Query都会记录到Master的Binary Log中。Slave在复制的时候,SQL线程会解析成和原来Master端执行过的相同的Query,并在此执行。

    优点:Statement Level首先是解决了Row Level的缺点,不需要记录每一行数据的变化,减少Binary Log日志量,节约了IO成本,提高了性能。因为它只需要记录在Master上所执行的语句的细节,以及执行语句时上下文的信息。

    缺点:由于它记录的是执行语句,为了让这些语句在Slave端也能正确执行,那么它还必须记录每条语句在执行时的一些相关信息,即上下文信息,以保证多有的语句在Slave端被执行的时候能够得到和在Master端执行时相同的结果。另外,由于MySQL现在发展比较快,很多新功能不断加入,使得MySQL复制遇到了不小的挑战,复制时涉及的内容越复杂,就越容易出现Bug。在Statement Level下,目前已经发现的就有不少情况会造成MySQL的复制出现问题,主要是在修改数据时使用了某些特定的函数或功能后出现。

    3、Mixed Level

    在Mixed模式下,MySQL会根据执行的每一条具体的Query语句来区分对待记录的日志形式,也就是在Statement 和Row之间选择一种。处除了MySQL认为通过Statement方式可能造成复制过程中Master与Slave之间产生不一致数据时,它会选择Row模式来记录变更之外,都会使用Statement模式来记录。

« 上一篇下一篇 »