使用php在不同的数据库中同步相同的表

时间:2009-11-18 21:34:10

标签: php mysql

我正在尝试设置一个PHP脚本来从数据库A读取一些MySQL表,然后将它们插入到数据库B和C中。这是一个非常简单的场景 - 被复制的表甚至可以被清空或删除在将值插入其中之前。所有数据库都在同一台服务器上,我不需要保留旧数据,只需覆盖它即可。

我唯一不能做的就是表复制;我的托管设置不允许。

我尝试了几种方法,并在SO和其他地方阅读了几个问题和答案,但我找不到答案 - 我的问题可能太简单了!这是我想要从cron作业或手动调用的东西,可能每天最多一次。它甚至不必非常有效。

谢谢,我感谢您提供的任何帮助 - 如果我的搜索模式很弱,即使链接到以前的问题,答案也会很棒。

3 个答案:

答案 0 :(得分:2)

我认为您甚至不必使用PHP来完成这项工作。

如果数据库位于同一个MySQL实例下,您只需使用跨数据库查询从一个表中选择数据并将其放入另一个表中。例如,包括您想要事先清除表格:

TRUNCATE TABLE DatabaseA.Table1;
INSERT INTO DatabaseA.Table1A SELECT 
       ColumnFoo, ColumnBar, ColumnBaz 
       FROM DatabaseB.Table1B;

您可以将其写入PHP脚本,然后cron可以调用它。任何其他带有MySQL适配器的脚本语言都可能正常工作。

通过将数据加载到脚本中然后缩减回数据库来执行此操作将涉及比必要更多的网络带宽,存储和处理。

最后一点,如果您稍后开始使用其他数据库,请记住并非所有数据库都支持跨数据库查询(我知道至少PostgreSQL不支持)。

答案 1 :(得分:2)

你可以这样做:

首先,创建3个表。

  • A =数据库A中的表
  • B =数据库B中的表
  • C =任何数据库中的表,但必须是一个......

(假设C在数据库A中)

TRUNCATE TABLE DatabaseA.C;
INSERT INTO DatabaseA.C SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseB.B;
INSERT INTO DatabaseA.C SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseA.A;
TRUNCATE TABLE DatabaseA.A;
TRUNCATE TABLE DatabaseB.B;
INSERT INTO DatabaseA.A SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseA.C;
INSERT INTO DatabaseB.B SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseA.C;

现在,您已让两个数据库彼此同步,并且没有数据丢失。

如果我理解正确同步这个词,就意味着安全地从两个数据库中获取数据并将它们混合在一起...

当然可能存在ID和内容的问题,但如果数据库索引率也同步,那么它可能就是这样做了......

请查看此链接:About Data Overwrite and Identical Keys

答案 2 :(得分:1)

有几种解决方案。

  • 设置表复制。 MySQL的这个功能是用于分布式数据,但应该将数据库工作到数据库(虽然我还没有尝试过)。

  • 定期删除表并重新创建:

    use b;
    drop table table;
    create table table as
     select *
     from a.table;

    use c; drop table table; create table table as select * from a.table;

    这假定a包含主。