Cluster aufbauen mit Slony-I

Alle anderen Fragen und Probleme zur Installation.
Novice
Neuer Benutzer
Beiträge: 13
Registriert: Di 12. Jul 2016, 15:28

Cluster aufbauen mit Slony-I

Beitrag von Novice » Mo 25. Jul 2016, 09:28

Hallo,

ich habe PostgreSQL 9.3 für Windows installiert und gleich im Anschluss über den Application Stack Builder Slony-I for PostgreSQL 9.3 (32 bit) v. 2.2.3-1.
Zunächst hat pgAdmin die Slony Skripte nicht gefunden. Über den Process Monitor habe ich herausgefunden, dass pgAdmin die Skripte nicht im "share" Ordner sucht, sondern in "bin". Zudem hatten die von pgAdmin gesuchten Skripte andere Namen als die installierten. Dieses Problem wurde im Internet auch von anderen geschildert, die nach umbenennung der Dateien dann aber keine Probleme mehr hatten. Ich habe also die Namen der Dateien geändert (slony1_base.2.2.5.sql -> slony1_base.2.2.0.sql; slony1_base.v83.2.2.5.sql ->slony1_base.v83.sql; slony1_base.v84.2.2.5.sql ->slony1_base.sql; slony1_funcs.2.2.5.sql->slony1_funcs.2.2.0.sql; slony1_funcs.v83.2.2.5.sql->slony1_funcs.v83.sql; slony1_funcs.v84.2.2.5.sql->slony1_funcs.sql) und nun werden sie gefunden. Wenn ich den ersten Cluster erstellen möchte, kommt jedoch die Fehlermeldung:

Fehler: Typ vactables existiert bereits

Kann mir jemand einen Tipp geben, was ich falsch mache? Ich habe auch schon pgAdmin separat neu installiert und auch slony-I, das hat nicht geholfen, danach habe ich PostgreSQL 9.3 neu installiert. Auch bei Installation von PostgreSQL 9.4 und 9.5 treten genau dieselben Probleme auf. Jetzt ist nach Löschen aller alten Sachen wieder eien saubere neue Version 9.3 installiert und die oben genannte Slony-I version über den stack Builder. Wenn ich die Dateien so umbenenne, wie sie von pgAdmin gesucht werden, kann ich kein Cluster erstellen, was ich jedoch brauche, da ein backup, dass ich wiederherstellen möchte, verlangt, dass der Knotenpunkt für die Schemata festgelegt wurde.


In SQL sieht der Fehler so aus:
CREATE SCHEMA _pgbench;

-- ----------------------------------------------------------------------
-- slony1_base.v84.sql
--
-- Version 8.3 specific parts of the basic replication schema.
--
-- Copyright (c) 2007-2009, PostgreSQL Global Development Group
-- Author: Jan Wieck, Afilias USA INC.
--
--
-- ----------------------------------------------------------------------

create type _pgbench.vactables as (nspname name, relname name);

comment on type _pgbench.vactables is 'used as return type for SRF function TablesToVacuum';


-- ----------------------------------------------------------------------
-- slony1_base.v83.sql
--
-- Version 8.3 specific parts of the basic replication schema.
--
-- Copyright (c) 2007-2009, PostgreSQL Global Development Group
-- Author: Jan Wieck, Afilias USA INC.
--
--
-- ----------------------------------------------------------------------

create type _pgbench.vactables as (nspname name, relname name);

comment on type _pgbench.vactables is 'used as return type for SRF function TablesToVacuum';


-- ----------------------------------------------------------------------
-- slony1_funcs.v84.sql
--
-- Version 8.4 specific part of the replication support functions.
--
-- Copyright (c) 2007-2009, PostgreSQL Global Development Group
-- Author: Jan Wieck, Afilias USA INC.
--
--
-- ----------------------------------------------------------------------

-- ----------------------------------------------------------------------
-- FUNCTION ShouldSlonyVacuumTable (nspname, tabname)
--
-- Returns 't' if the table needs to be vacuumed by Slony-I
-- Returns 'f' if autovac handles the table, so Slony-I should not
-- or if the table is not needful altogether
-- ----------------------------------------------------------------------
create or replace function _pgbench.ShouldSlonyVacuumTable (i_nspname name, i_tblname name) returns boolean as
$$
declare
c_table oid;
c_namespace oid;
c_enabled boolean;
v_dummy int4;
begin
if not exists (select 1 from pg_catalog.pg_class c, pg_catalog.pg_namespace n
where c.relname = i_tblname and n.nspname = i_nspname and c.relnamespace = n.oid) then
return 'f'::boolean; -- if table does not exist, then don't vacuum
end if;
select 1 into v_dummy from "pg_catalog".pg_settings where name = 'autovacuum' and setting = 'on';
if not found then
return 't'::boolean; -- If autovac is turned off, then we gotta vacuum
end if;

select into c_namespace oid from "pg_catalog".pg_namespace where nspname = i_nspname;
if not found then
raise exception 'Slony-I: namespace % does not exist', i_nspname;
end if;
select into c_table oid from "pg_catalog".pg_class where relname = i_tblname and relnamespace = c_namespace;
if not found then
raise warning 'Slony-I: table % does not exist in namespace %/%', i_tblname, c_namespace, i_nspname;
return 'f'::boolean;
end if;

-- So, the table is legit; try to look it up for autovacuum policy
if exists (select 1 from pg_class where 'autovacuum_enabled=off' = any (reloptions) and oid = c_table) then
return 't'::boolean; -- Autovac is turned on, but this table is disabled
end if;

return 'f'::boolean;

end;$$ language plpgsql;

comment on function _pgbench.ShouldSlonyVacuumTable (i_nspname name, i_tblname name) is
'returns false if autovacuum handles vacuuming of the table, or if the table does not exist; returns true if Slony-I should manage it';

create or replace function _pgbench.TruncateOnlyTable (name) returns void as
$$
begin
execute 'truncate only '|| _pgbench.slon_quote_input($1);
end;
$$
LANGUAGE plpgsql;

comment on function _pgbench.TruncateOnlyTable(name) is
'Calls TRUNCATE ONLY, syntax supported in version >= 8.4';

create or replace function _pgbench.alterTableAddTruncateTrigger (i_fqtable text, i_tabid integer) returns integer as $$
begin
execute 'create trigger "_pgbench_truncatetrigger" ' ||
' before truncate on ' || i_fqtable || ' for each statement execute procedure ' ||
'_pgbench.log_truncate(' || i_tabid || ');';
execute 'create trigger "_pgbench_truncatedeny" ' ||
' before truncate on ' || i_fqtable || ' for each statement execute procedure ' ||
'_pgbench.deny_truncate();';
return 1;
end
$$ language plpgsql;

comment on function _pgbench.alterTableAddTruncateTrigger (i_fqtable text, i_tabid integer) is
'function to add TRUNCATE TRIGGER';

create or replace function _pgbench.alterTableDropTruncateTrigger (i_fqtable text, i_tabid integer) returns integer as $$
begin
execute 'drop trigger "_pgbench_truncatetrigger" ' ||
' on ' || i_fqtable || ';';
execute 'drop trigger "_pgbench_truncatedeny" ' ||
' on ' || i_fqtable || ';';
return 1;
end
$$ language plpgsql;

comment on function _pgbench.alterTableDropTruncateTrigger (i_fqtable text, i_tabid integer) is
'function to drop TRUNCATE TRIGGER';

create or replace function _pgbench.alterTableConfigureTruncateTrigger(i_fqname text, i_log_stat text, i_deny_stat text) returns integer as $$
begin
execute 'alter table ' || i_fqname || ' ' || i_log_stat ||
' trigger "_pgbench_truncatetrigger";';
execute 'alter table ' || i_fqname || ' ' || i_deny_stat ||
' trigger "_pgbench_truncatedeny";';
return 1;
end $$ language plpgsql;

comment on function _pgbench.alterTableConfigureTruncateTrigger(i_fqname text, i_log_stat text, i_deny_stat text) is
'Configure the truncate triggers according to origin status.';

create or replace function _pgbench.upgradeSchemaAddTruncateTriggers () returns integer as $$
begin

--- Add truncate triggers
begin
perform _pgbench.alterTableAddTruncateTrigger(_pgbench.slon_quote_brute(tab_nspname) || '.' || _pgbench.slon_quote_brute(tab_relname), tab_id)
from _pgbench.sl_table
where 2 <> (select count(*) from pg_catalog.pg_trigger,
pg_catalog.pg_class, pg_catalog.pg_namespace where
pg_trigger.tgrelid=pg_class.oid
AND pg_class.relnamespace=pg_namespace.oid
AND
pg_namespace.nspname = tab_nspname and tgname in ('_pgbench_truncatedeny', '_pgbench_truncatetrigger') and
pg_class.relname = tab_relname
);

exception when unique_violation then
raise warning 'upgradeSchemaAddTruncateTriggers() - uniqueness violation';
raise warning 'likely due to truncate triggers existing partially';
raise exception 'upgradeSchemaAddTruncateTriggers() - failure - [%][%]', SQLSTATE, SQLERRM;
end;

-- Activate truncate triggers for replica
perform _pgbench.alterTableConfigureTruncateTrigger(_pgbench.slon_quote_brute(tab_nspname) || '.' || _pgbench.slon_quote_brute(tab_relname)
,'disable','enable')
from _pgbench.sl_table
where tab_set not in (select set_id from _pgbench.sl_set where set_origin = _pgbench.getLocalNodeId('_pgbench'))
and exists (select 1 from pg_catalog.pg_trigger
where pg_trigger.tgname like '_pgbench_truncatetrigger' and pg_trigger.tgenabled = 'O'
and pg_trigger.tgrelid=tab_reloid )
and exists (select 1 from pg_catalog.pg_trigger
where pg_trigger.tgname like '_pgbench_truncatedeny' and pg_trigger.tgenabled = 'D'
and pg_trigger.tgrelid=tab_reloid);

-- Activate truncate triggers for origin
perform _pgbench.alterTableConfigureTruncateTrigger(_pgbench.slon_quote_brute(tab_nspname) || '.' || _pgbench.slon_quote_brute(tab_relname)
,'enable','disable')
from _pgbench.sl_table
where tab_set in (select set_id from _pgbench.sl_set where set_origin = _pgbench.getLocalNodeId('_pgbench'))
and exists (select 1 from pg_catalog.pg_trigger
where pg_trigger.tgname like '_pgbench_truncatetrigger' and pg_trigger.tgenabled = 'D'
and pg_trigger.tgrelid=tab_reloid )
and exists (select 1 from pg_catalog.pg_trigger
where pg_trigger.tgname like '_pgbench_truncatedeny' and pg_trigger.tgenabled = 'O'
and pg_trigger.tgrelid=tab_reloid);

return 1;
end
$$ language plpgsql;

comment on function _pgbench.upgradeSchemaAddTruncateTriggers () is
'Add ON TRUNCATE triggers to replicated tables.';

-- ----------------------------------------------------------------------
-- slony1_funcs.v83.sql
--
-- Version 8.3 specific part of the replication support functions.
--
-- Copyright (c) 2007-2009, PostgreSQL Global Development Group
-- Author: Jan Wieck, Afilias USA INC.
--
--
-- ----------------------------------------------------------------------

-- ----------------------------------------------------------------------
-- FUNCTION ShouldSlonyVacuumTable (nspname, tabname)
--
-- Returns 't' if the table needs to be vacuumed by Slony-I
-- Returns 'f' if autovac handles the table, so Slony-I should not
-- or if the table is not needful altogether
-- ----------------------------------------------------------------------
create or replace function _pgbench.ShouldSlonyVacuumTable (i_nspname name, i_tblname name) returns boolean as
$$
declare
c_table oid;
c_namespace oid;
c_enabled boolean;
v_dummy int4;
begin
if not exists (select 1 from pg_catalog.pg_class c, pg_catalog.pg_namespace n
where c.relname = i_tblname and n.nspname = i_nspname and c.relnamespace = n.oid) then
return 'f'::boolean; -- if table does not exist, then don't vacuum
end if;
select 1 into v_dummy from "pg_catalog".pg_settings where name = 'autovacuum' and setting = 'on';
if not found then
return 't'::boolean; -- If autovac is turned off, then we gotta vacuum
end if;

select into c_namespace oid from "pg_catalog".pg_namespace where nspname = i_nspname;
if not found then
raise exception 'Slony-I: namespace % does not exist', i_nspname;
end if;
select into c_table oid from "pg_catalog".pg_class where relname = i_tblname and relnamespace = c_namespace;
if not found then
raise warning 'Slony-I: table % does not exist in namespace %/%', i_tblname, c_namespace, i_nspname;
return 'f'::boolean;
end if;

-- So, the table is legit; try to look it up for autovacuum policy
if exists (select 1 from pg_catalog.pg_autovacuum where vacrelid = c_table and enabled = 'f') then
return 't'::boolean; -- Autovac is turned on, but this table is disabled
end if;

return 'f'::boolean;

end;$$ language plpgsql;

comment on function _pgbench.ShouldSlonyVacuumTable (i_nspname name, i_tblname name) is
'returns false if autovacuum handles vacuuming of the table, or if the table does not exist; returns true if Slony-I should manage it';

create or replace function _pgbench.TruncateOnlyTable (name) returns void as
$$
begin
execute 'truncate '|| _pgbench.slon_quote_input($1);
end;
$$
LANGUAGE plpgsql;

comment on function _pgbench.TruncateOnlyTable(name) is
'Calls TRUNCATE with out specifying ONLY, syntax supported in version 8.3';

create or replace function _pgbench.alterTableAddTruncateTrigger (i_fqtable text, i_tabid integer) returns integer as $$
begin
return 0;
end
$$ language plpgsql;

comment on function _pgbench.alterTableAddTruncateTrigger (i_fqtable text, i_tabid integer) is
'function to add TRUNCATE TRIGGER';

create or replace function _pgbench.alterTableDropTruncateTrigger (i_fqtable text, i_tabid integer) returns integer as $$
begin
return 0;
end
$$ language plpgsql;

comment on function _pgbench.alterTableDropTruncateTrigger (i_fqtable text, i_tabid integer) is
'function to drop TRUNCATE TRIGGER';

create or replace function _pgbench.alterTableConfigureTruncateTrigger(i_fqname text, i_log_stat text, i_deny_stat text) returns integer as $$
begin
return 0;
end $$ language plpgsql;

comment on function _pgbench.alterTableConfigureTruncateTrigger(i_fqname text, i_log_stat text, i_deny_stat text) is
'disable deny access, enable log trigger on origin.

NOOP on PostgreSQL 8.3 because it does not support triggers ON TRUNCATE';

create or replace function _pgbench.upgradeSchemaAddTruncateTriggers () returns integer as $$
begin
raise warning 'This node is running PostgreSQL 8.3 - cannot apply TRUNCATE triggers';
return 0;
end
$$ language plpgsql;

comment on function _pgbench.upgradeSchemaAddTruncateTriggers () is
'Add ON TRUNCATE triggers to replicated tables. Not supported on PG 8.3, so a NOOP in this case.';


SELECT _pgbench.initializelocalnode(1, 'Master Node');
SELECT _pgbench.enablenode(1);

-- Create admin node
SELECT _pgbench.storeNode(99, 'Admin Node', false);
SELECT _pgbench.storepath(1, 99, 'host=localhost port=5432 dbname=postgres', 0);

akretschmer
Erfahrener Benutzer
Beiträge: 7677
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Cluster aufbauen mit Slony-I

Beitrag von akretschmer » Mo 25. Jul 2016, 09:39

Deine Fehlermeldungen deuten auf Version 8.3 hin, was schon seit etlichen Jahren klinisch tot ist.

Was genau hast Du vor zu erreichen? Für neue Projekte würde ich ganz schlicht und einfach von Slony abraten, da gibt es mit Streaming Replication seit 9.0 eine deutlich bessere Replikation. Und wenn Du mit 9.4 / 9.5 unterwegs bist UND eine logische Replikation suchst, dann mit pg_logical.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Novice
Neuer Benutzer
Beiträge: 13
Registriert: Di 12. Jul 2016, 15:28

Re: Cluster aufbauen mit Slony-I

Beitrag von Novice » Mo 25. Jul 2016, 10:23

Ich brauche eine PostgreSQL Datenbank um dann backups aus einer anderen PostgreSQL Datenbank zu laden und die Daten dann mit R auszuwerten. Wenn ich das config backup wiederherstellen möchte (über pgAdmin) kommt die folgende
Fehlermeldung:
"Schemaknoten für das Objekt nicht gefunden TABLE DATA behaviors [Eigentümer: robindb]"

Also bin ich davon ausgegangen, dass ich erst mit Slony ein Cluster erstellen muss. Installiert ist definitiv 9.3 und Slony ist die einzige Replikation solution, die über den Stack builder angeboten wird, auch bei 9.5. Streaming Replikation finde ich nicht zum simplen download. Gehe ich richtig in der Annahme, dass pg_logical direkt mit PostgreSQL installiert werden würde? Allerdings waren die Problem nach download von Version 9.4 oder 9.5 von dieser Website
genau dieselben wie oben für 9.3 geschildert.

akretschmer
Erfahrener Benutzer
Beiträge: 7677
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Cluster aufbauen mit Slony-I

Beitrag von akretschmer » Mo 25. Jul 2016, 10:58

Du brauchst keine Replikation, wenn Du 'nur' Backups in die DB laden willst. Slony ist eine Replikationslösung, bei der für jede zu replizierende Tabelle u.a. TRIGGER zu erstellen sind. Das ist alles recht hoher Aufwand. Streaming Replication dagegen ist sein Version 9.0 fest eingebaut, das ist kein externe solution. Aber, noch einmal, nur um einen Dump einzuspielen braucht Du weder Slony noch Streamin Replication und auch nicht pg_logical. Ach ja: es gibt neben der Community-Version von PostgreSQL (https://www.postgresql.org/download/) auch noch eine Version von EDB. Das ist was anderes - vereinfach gesagt.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Novice
Neuer Benutzer
Beiträge: 13
Registriert: Di 12. Jul 2016, 15:28

Re: Cluster aufbauen mit Slony-I

Beitrag von Novice » Mo 25. Jul 2016, 11:16

Hallo Andreas,

also pg-logical ist im data Ordner der 9.5 Version enthalten. Aber: wenn ich die von Dir gepostete Website aufrufe und dann auf windows klicke lande ich später automatisch bei der Version von EDB. Gibt es für Windows noch andere Möglichkeiten?

akretschmer
Erfahrener Benutzer
Beiträge: 7677
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Cluster aufbauen mit Slony-I

Beitrag von akretschmer » Mo 25. Jul 2016, 11:23

dann ist es das wohl. pg_logical brauchst du nicht. Das läuft übrigens auch (noch) nicht unter Windows.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Novice
Neuer Benutzer
Beiträge: 13
Registriert: Di 12. Jul 2016, 15:28

Re: Cluster aufbauen mit Slony-I

Beitrag von Novice » Mo 25. Jul 2016, 11:28

Wie kann ich denn die Fehlermeldung:

Schemaknoten für das Objekt nicht gefunden TABLE DATA behaviors [Eigentümer: robindb]

umschiffen? Was ist dafür zu tun?

akretschmer
Erfahrener Benutzer
Beiträge: 7677
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Cluster aufbauen mit Slony-I

Beitrag von akretschmer » Mo 25. Jul 2016, 11:32

mir sagt diese Fehlermeldung nix. Bis Du sicher, daß die von PostgreSQL kommt? Was genau steht im Serverlog?
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Novice
Neuer Benutzer
Beiträge: 13
Registriert: Di 12. Jul 2016, 15:28

Re: Cluster aufbauen mit Slony-I

Beitrag von Novice » Mo 25. Jul 2016, 11:44

Meinst Du das mit Serverlog? Sorry, für mich ist das alles völliges Neuland....
C:\Program Files\PostgreSQL\9.5\bin\pg_restore.exe --host localhost --port 5433 --username "postgres" --dbname "postgres" --no-password --list "F:\dbdumps\finov215_tst_config.backup"
;
; Archive created at 2016-03-01 05:17:46
; dbname: finov215_tst
; TOC Entries: 34
; Compression: -1
; Dump Version: 1.12-0
; Format: CUSTOM
; Integer: 4 bytes
; Offset: 8 bytes
; Dumped from database version: 9.3.9
; Dumped by pg_dump version: 9.3.9
;
;
; Selected TOC Entries:
;
4526; 0 21495 TABLE DATA config behaviors robindb
4531; 0 0 SEQUENCE SET config behaviors_id_seq robindb
4508; 0 21323 TABLE DATA config configurationitem robindb
4532; 0 0 SEQUENCE SET config configurationitem_id_seq robindb
4506; 0 21312 TABLE DATA config configurationsystemcomponent robindb
4533; 0 0 SEQUENCE SET config configurationsystemcomponent_id_seq robindb
4534; 0 0 SEQUENCE SET config dbmanagement_id_seq robindb
4535; 0 0 SEQUENCE SET config dbmanagementlog_id_seq robindb
4517; 0 21412 TABLE DATA config dbmanagementschema robindb
4536; 0 0 SEQUENCE SET config dbmanagementschema_id_seq robindb
4524; 0 21484 TABLE DATA config deterrencemeans robindb
4537; 0 0 SEQUENCE SET config deterrencemeans_id_seq robindb
4504; 0 21281 TABLE DATA config gridanalysis robindb
4538; 0 0 SEQUENCE SET config gridanalysis_id_seq robindb
4514; 0 21380 TABLE DATA config species robindb
4539; 0 0 SEQUENCE SET config species_id_seq robindb
4496; 0 21220 TABLE DATA config users robindb
4498; 0 21233 TABLE DATA config user_fieldapp_permissions robindb
4540; 0 0 SEQUENCE SET config user_fieldapp_permissions_id_seq robindb
4500; 0 21248 TABLE DATA config user_reportviewer_permissions robindb
4541; 0 0 SEQUENCE SET config user_reportviewer_permissions_id_seq robindb
4502; 0 21267 TABLE DATA config user_visualiser_permissions robindb
4542; 0 0 SEQUENCE SET config user_visualiser_permissions_id_seq robindb
4512; 0 21358 TABLE DATA config userpreferenceitem robindb
4543; 0 0 SEQUENCE SET config userpreferenceitem_id_seq robindb
4510; 0 21345 TABLE DATA config userpreferenceset robindb
4544; 0 0 SEQUENCE SET config userpreferenceset_id_seq robindb
4545; 0 0 SEQUENCE SET config users_id_seq robindb
4522; 0 21472 TABLE DATA config windmill robindb
4546; 0 0 SEQUENCE SET config windmill_id_seq robindb
4520; 0 21454 TABLE DATA config windmillshutdownruleset robindb
4547; 0 0 SEQUENCE SET config windmillshutdownruleset_id_seq robindb

Prozess beendete mit Exitcode 0.

akretschmer
Erfahrener Benutzer
Beiträge: 7677
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Cluster aufbauen mit Slony-I

Beitrag von akretschmer » Mo 25. Jul 2016, 11:55

Nein, das Serverlog enthält das Log des Servers, was Du zeigst ist das TOC (Table Of Contents) eines Dumps, welcher am 1. März diesen Jahres mit einer 9.3.9 - DB im Custom-Format erstellt wurde.

Warum erzeugst Du so ein Listfile, was hast Du damit vor?
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Antworten