Codeigniter - 将mysql表同步到不同服务器上的不同数据库

时间:2014-02-28 10:38:00

标签: php mysql database codeigniter

我在不同的服务器上有两个数据库,我需要保持同步。这两个数据库在我的数据库配置中定义,我正在建立连接:

$DB1 = $this->load->database('master', TRUE);
$DB2 = $this->load->database('live', TRUE);

如何在$ DB1上获取'products'表的全部内容并在$ DB2上同步它 - 我可以在$ DB2上截断表并写入完整数据(不优雅并可能导致实时站点出现问题)或者我可以使用codeigniter正确同步第二个表;按记录基础添加,更新和删除记录中的记录?

我曾尝试过:

$products = $DB1->from('products')->get()->result_array();

$count = count($products);

for($i = 0 ; $i < $count; $i++)
{
     $q = $DB2->from('products')->where('id', $products[$i]['id'])->get();

     if($q->num_rows() > 0)
     {
           [Update the data]
     } 
     else
     {
           [Insert the data]
     }
}

但是这个方法没有考虑从$ DB1中删除的$ DB2上存在的记录?我更喜欢这种更新产品的方法,但不能在现场网站上使用寡居产品。

1 个答案:

答案 0 :(得分:1)

您的问题都可以通过MySQL的复制功能解决。

由于两个数据库都应该是可写的,并且所有更改都应该复制到其他服务器,因此您可能需要设置主 - 主复制。您可以在互联网上找到关于此主题的教程,例如this one

请记住,这不是一个简单的解决方案。能够写入需要同步的两个数据库可能会导致冲突(您在基于脚本的解决方案中也会遇到这种冲突)。您可能希望采取措施确保两个数据库之间的连接松散,如果它们之间的连接断开。您可能还需要设置auto_increment_incrementauto_increment_offsetsee the manual on this topic)来规避自动增量列中可能存在的重复项。

如果您使用上面的自动增量设置,请注意这也“更改”自动增量列的语义。到目前为止,您有一个列,您可以ORDER BY结果集,以便按插入时间顺序排列结果集。如果指定不同的偏移,则无效。一台服务器可能会插入id = 1的行,而其他服务器会插入id = 6的行。表格ORDER BY id的所有查询都需要更改为例如ORDER BY insertion_date insertion_date({{1}}是一列,其中包含该行插入时间的时间戳)。