我在不同的服务器上有两个数据库,我需要保持同步。这两个数据库在我的数据库配置中定义,我正在建立连接:
$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上存在的记录?我更喜欢这种更新产品的方法,但不能在现场网站上使用寡居产品。
答案 0 :(得分:1)
您的问题都可以通过MySQL的复制功能解决。
由于两个数据库都应该是可写的,并且所有更改都应该复制到其他服务器,因此您可能需要设置主 - 主复制。您可以在互联网上找到关于此主题的教程,例如this one。
请记住,这不是一个简单的解决方案。能够写入需要同步的两个数据库可能会导致冲突(您在基于脚本的解决方案中也会遇到这种冲突)。您可能希望采取措施确保两个数据库之间的连接松散,如果它们之间的连接断开。您可能还需要设置auto_increment_increment
和auto_increment_offset
(see the manual on this topic)来规避自动增量列中可能存在的重复项。
如果您使用上面的自动增量设置,请注意这也“更改”自动增量列的语义。到目前为止,您有一个列,您可以ORDER BY
结果集,以便按插入时间顺序排列结果集。如果指定不同的偏移,则无效。一台服务器可能会插入id = 1的行,而其他服务器会插入id = 6的行。表格ORDER BY id
的所有查询都需要更改为例如ORDER BY insertion_date
insertion_date
({{1}}是一列,其中包含该行插入时间的时间戳)。