Tentando executar o script de configuração slony de exemplo na documentação, mas obtendo o seguinte erro:
postgres$ /tmp/slonik_example.sh
<stdin>:8: PGRES_FATAL_ERROR load '$libdir/slony1_funcs'; - ERROR: could not access file "$libdir/slony1_funcs": No such file or directory
<stdin>:8: Error: the extension for the Slony-I C functions cannot be loaded in database 'dbname=my_primary host=localhost user=warfish password=coalitions'
No entanto, a variável LIBDIR está definida corretamente:
postgres$ ./pg_config
BINDIR = /opt/local/lib/postgresql90/bin
DOCDIR = /opt/local/share/doc/postgresql
HTMLDIR = /opt/local/share/doc/postgresql
INCLUDEDIR = /opt/local/include/postgresql90
PKGINCLUDEDIR = /opt/local/include/postgresql90
INCLUDEDIR-SERVER = /opt/local/include/postgresql90/server
LIBDIR = /opt/local/lib/postgresql90
E a lib está presente:
ls -l /opt/local/lib/postgresql90/slony1_funcs.so
-rwxr-xr-x 1 root admin 34944 Feb 17 16:20 /opt/local/lib/postgresql90/slony1_funcs.so
O roteiro é o seguinte:
cat /tmp/slonik_example.sh
#!/bin/sh
CLUSTERNAME=slony_example;
/opt/local/lib/postgresql90/bin/slonik <<_EOF_
define CLUSTERNAME slony_example;
cluster name = @CLUSTERNAME;
node 1 admin conninfo = 'dbname=my_primary host=localhost user=user1 password=pw';
node 2 admin conninfo = 'dbname=my_rep host=localhost user=user1 password=pw';
#--
# init the first node. Its id MUST be 1. This creates the schema # _$CLUSTERNAME containing all replication system specific database # objects.
#--
init cluster ( id=1, comment='Master Node');
#--
# Slony-I organizes tables into sets. The smallest unit a node can # subscribe is a set. The following commands create one set containing # all 4 pgbench tables. The master or origin of the set is node 1.
#--
create set (id=1, origin=1, comment='All pgbench tables');
set add table (set id=1, origin=1, id=1, fully qualified name='public.pgbench_accounts', comment='accounts table');
set add table (set id=1, origin=1, id=2, fully qualified name='public.pgbench_branches', comment='branches table');
set add table (set id=1, origin=1, id=3, fully qualified name='public.pgbench_tellers', comment='tellers table');
set add table (set id=1, origin=1, id=4, fully qualified name='public.pgbench_history', comment='history table');
#--
# Create the second node (the slave) tell the 2 nodes how to connect to Slony-I 2.1.1 Documentation 10 / 163
# each other and how they should listen for events.
#--
store node (id=2, comment = 'Slave node', event node=1);
store path (server = 1, client = 2, conninfo='dbname=my_primary host=localhost user=user1 password=pw');
store path (server = 2, client = 1, conninfo='dbname=my_rep host=localhost user=user1 password=pw');
_EOF_
Leia no documento que provavelmente a lib não está no lugar correto ou $ libdir não está definido corretamente, mas tudo parece estar no lugar. Estou perdendo algo mais que não conheço?
Na minha situação, esse erro foi causado pelo Slony não estar instalado em todas as máquinas do cluster . Eu tinha o Slony instalado e todas as bibliotecas necessárias no host/mestre principal, mas os clientes precisavam do Slony instalado (ou talvez apenas o arquivo de funções da biblioteca inserido
$libdir
) também.No meu banco de dados slony1_funcs.so está no diretório PKGLIBDIR
PKGLIBDIR = /usr/lib64/pgsql
Encontrei esta informação sobre "PKGLIBDIR vs LIBDIR":
" libdir é para bibliotecas vinculáveis em tempo de compilação, qualquer coisa que você queira passar como -lxxx. Portanto, os locais típicos são /usr/lib, /usr/local/lib ou /usr/local/pgsql/lib. pkglibdir é para bibliotecas dinamicamente carregáveis "