【问题标题】:way to migrate a table form one db to other db on different servers automatically?将表从一个数据库自动迁移到不同服务器上的其他数据库的方法?
【发布时间】:2013-01-23 13:33:01
【问题描述】:

我有一个拥有用户成员资格并使用 postgresql 的系统,现在我正在开发另一个迷你电子商务应用程序,它将使用与 postgresql 用户应用程序相同的用户凭据。当新用户注册 postgresql 用户应用时,从 postgres 到电子商务网站的数据将自动更新。

请注意:将为两个不同的数据库使用 2 个不同的数据库 应用程序,但两个应用程序上的用户表相同。不会有任何迹象 在电子商务应用程序上注册或注册。 原始(主数据库)肯定是 postgresql 8.4,但另一个可能是 mysql 或类似的 postgresql 尚未真正决定,因为电子商务应用程序可能在 php 中,而主应用程序在 grails(java) 中

【问题讨论】:

  • 出于好奇,另一个数据库是什么?
  • 那么,两个数据库都将是 postgresql 吗?正确的?如果有,它们的版本是什么?
  • 我已在问题中的注释中添加了信息。谢谢

标签: database postgresql e-commerce


【解决方案1】:

第一个也是显而易见的解决方案是使用dblink,假设两台服务器都是 postgres。

但是您可以编写自己的部分复制守护进程。下面是一个将表users复制到SQlite数据库的简单示例。

我们在 postgres usersdb 数据库中有表 users

create table users (
    id serial primary key,
    name text);

用户创建日志表:

create table users_log (
    id serial primary key,
    action text);

在表users上创建触发器:

create or replace function users_trigger ()
returns trigger language plpgsql as $$
declare
    newaction text;
begin
    if (TG_OP = 'UPDATE') then
        newaction:= 'update users set 
        name = '''||new.name||''' where id = '||old.id::text;
    elsif (TG_OP = 'INSERT') then
        newaction:= 'insert into users values 
        ('||new.id::text||', '''||new.name||''')';
    elsif (TG_OP = 'DELETE') then
        newaction:= 'delete from users where id = '||old.id::text;
    end if;
    insert into users_log (action) values (newaction);
    return null;
end; $$;

create trigger users_trigger
  after insert or update or delete
  on users
  for each row
  execute procedure users_trigger();

在其中创建SQlite3数据库users.db和表users

create table users (
    id integer primary key,
    name text);

守护程序脚本每 2 秒检查一次 users_log。如果有新的操作,那么脚本会在 SQlite 数据库中一一生成并从 users_log 中删除:

<?php
$postgres = new PDO('pgsql:host=localhost port=5432 dbname=usersdb');
$sqlite = new PDO('sqlite:users.db'); 

$sql = 'select * from users_log order by id limit 1';
while (true) {
    sleep(2);
    while ($row = $postgres->query($sql)->fetch()) {
        $sqlite->query($row[1]);
        echo $row[1]. "\n";
        $postgres->query("delete from users_log where id = $row[0]");
    }
}
?>

为简单起见,脚本绝对是极简的,应该配备必要的异常处理。

【讨论】:

  • 只是一个简短的评论。这应该可以工作,并且类似于我将修改后的数据从一个“主”数据库拉到数据的“应用程序”副本所做的工作。虽然不是 OP 的解决方案,因为他使用的是 PostgreSQL 8.4,但我觉得我的解决方案更强大一些,因为它基于此处的审计触发器解决方案。 wiki.postgresql.org/wiki/Audit_trigger_91plus。对于其他未来的读者,这允许使用 hstore,以便您可以轻松查看“更新”语句的哪些字段已更改,或者查看您是否关心更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2023-03-29
  • 2016-01-20
  • 2012-11-15
  • 2016-07-19
相关资源
最近更新 更多