最初の明白な解決策は、両方のサーバーが postgres であると仮定してdblinkを使用することです。
ただし、独自の部分複製デーモンを作成することはできます。以下に、テーブルユーザーを 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.db テーブルを作成します。
create table users (
id integer primary key,
name text);
デーモン スクリプトは、users_log を 2 秒ごとにチェックします。新しいアクションがある場合、スクリプトはそれらを SQlite データベースで 1 つずつ作成し、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]");
}
}
?>
簡単にするために、スクリプトは完全に最小限のものであり、必要な例外処理を装備する必要があります。