2009-09-14

Проверка установленных perl модулей

В моей нелегкой борьбе с bucardo затрахала проблема проверки наличия установленных модулей perl, и их версий. Порылся и нашел, как процесс упростить. Создаем файлик mod4ek.pl с содержимым как написано тут:


http://help.hc.ru/print/205/

или тут

http://help.hc.ru/entry/205/

Даем на него права на исполнение.
Ну а потом вот так его выполняем:

./mod4ek.pl > mod4ek.html

Интересующая нас информация будет в файле mod4ek.html

Ну или по простому, чтоб не заморачиваться с html. Создаем mod4eknohtml.pl с таким содержимым:

#!/usr/bin/perl
use ExtUtils::Installed;
my $instmod = ExtUtils::Installed->new();
foreach my $module ($instmod->modules())
{ my $version = $instmod->version($module) || "-"; print "$module --> $version \r\n"; }

И поступаем с ним точно так же, как с mod4ek.pl


Читать далее

Настройка bucardo 4.x.x попытка 1 (пока удачная)

Итак, после выхода 4-й версии bucardo, будем спрыгивать на неё. Посмотрел changelog, много вкусного. Так что считаю, что смена версии оправдана.
В который раз жалею, что данный проект не собирается в rpm варианте и не обновляется через репозитарии SUSE.

Сервер bucardo: 22.22.11.71

Делать все будем с нуля. И начнем с того, что выкосим сушествующую версию 3.0.9.

alexsf@shaman:~> ssh alexsf@22.22.11.71
alexsf@bucardik:~> sudo -s
bucardik:/home/alexsf # su - root
bucardik:~ # /etc/init.d/bucardo_stop
bucardik:~ # su - postgres
postgres@bucardik:~> psql -h 22.22.11.71 -U bucardo bucardo
bucardo=# DELETE FROM bucardo.sync;
bucardo=# DELETE FROM bucardo.herdmap;
bucardo=# DELETE FROM bucardo.herd;
bucardo=# DELETE FROM bucardo.goat;
bucardo=# DELETE FROM bucardo.dbmap;
bucardo=# DELETE FROM bucardo.dbgroup;
bucardo=# DELETE FROM bucardo.db;
bucardo=# \q
postgres@bucardik:~> psql -h 22.22.25.2 -U postgres UTF8_sk
UTF8_sk=# DROP SCHEMA bucardo CASCADE;
UTF8_sk=# \q
postgres@bucardik:~> psql -h 22.22.50.2 -U postgres ntres
ntres=# DROP SCHEMA bucardo CASCADE;
ntres=# \q
postgres@bucardik:~> psql -h 22.22.11.71 -U postgres postgres
postgres=# DROP DATABASE bucardo;
postgres=# \q
postgres@bucardik:~> exit

При этом оставляем пользователя БД bucardo (CREATE ROLE bucardo LOGIN SUPERUSER INHERIT NOCREATEDB NOCREATEROLE;), БД bucardo(CREATE DATABASE bucardo WITH ENCODING='UTF8' OWNER=bucardo
CONNECTION LIMIT=-1 TABLESPACE=bucardo;) и табличное пространство bucardo (CREATE TABLESPACE bucardo OWNER bucardo LOCATION '/u02/pgdata/bucardo';), ну и локального пользователя bucardo (bucardo:x:1001:100:Bucardo Replication:/home/bucardo:/bin/bash)

Кроме того, у нас уже проставлена толпа perl модулей. Их тоже пока не трогаем.

Ну а теперь получаем свежую версию bucardo и начинаем танцы с бубном :).

bucardik:~ # mkdir /opt/bucardo; cd /opt
bucardik:/opt # wget -c "http://bucardo.org/downloads/Bucardo-4.0.1.tar.gz"
bucardik:/opt # wget -c "http://bucardo.org/downloads/DBIx-Safe-1.2.5.tar.gz"
bucardik:/opt # tar -xvzf Bucardo-4.0.1.tar.gz
bucardik:/opt # tar -xvzf DBIx-Safe-1.2.5.tar.gz
bucardik:/opt # cd DBIx-Safe-1.2.5/
bucardik:/opt/DBIx-Safe-1.2.5 # perl Makefile.PL
bucardik:/opt/DBIx-Safe-1.2.5 # make
bucardik:/opt/DBIx-Safe-1.2.5 # make test
bucardik:/opt/DBIx-Safe-1.2.5 # make install

Теперь ради приличия проверим, устраивают ли нас версии установленных perl модулей. И видим:

Надо "DBD::Pg, at least version 2.0.0", установлено "1.49"

Вытягиваем и ставим.
bucardik:/opt/bucardo/DBIx-Safe-1.2.5 # cd ..
bucardik:/opt # wget -c "http://search.cpan.org/CPAN/authors/id/T/TU/TURNSTEP/DBD-Pg-2.15.1.tar.gz"
bucardik:/opt # tar -xvzf DBD-Pg-2.15.1.tar.gz
bucardik:/opt # cd DBD-Pg-2.15.1/
bucardik:/opt/DBD-Pg-2.15.1 # perl Makefile.PL

И получаем, что версия DBI 1.51 не канает. Нужна 1.52

bucardik:/opt/DBD-Pg-2.15.1 # cd ..
bucardik:/opt # wget -c "http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.52.tar.gz"
bucardik:/opt # tar -xvzf DBI-1.52.tar.gz
bucardik:/opt # cd DBI-1.52
bucardik:/opt/DBI-1.52 # perl Makefile.PL
bucardik:/opt/DBI-1.52 # make
bucardik:/opt/DBI-1.52 # make test
bucardik:/opt/DBI-1.52 # make install
bucardik:/opt/DBI-1.52 # cd ../DBD-Pg-2.15.1
bucardik:/opt/DBD-Pg-2.15.1 # perl Makefile.PL
bucardik:/opt/DBD-Pg-2.15.1 # make
bucardik:/opt/DBD-Pg-2.15.1 # make test
bucardik:/opt/DBD-Pg-2.15.1 # make install

Так. Теперь собственно bucardo. Дока щас там весьма размазанная на сайте. Будем разбираться.

Создаем файл /etc/bucardorc со следующим содержимым:

dbport=5432
dbhost=22.22.11.71
dbname=bucardo
dbuser=bucardo
dbpass=bucardo

Затем:

bucardik:/opt/DBD-Pg-2.15.1 # cd ../Bucardo-4.0.1/
bucardik:/opt/Bucardo-4.0.1 # perl Makefile.PL
bucardik:/opt/Bucardo-4.0.1 # make
bucardik:/opt/Bucardo-4.0.1 # make test
bucardik:/opt/Bucardo-4.0.1 # make install
bucardik:/opt/Bucardo-4.0.1 # cd /opt
bucardik:/opt # ln -s Bucardo-4.0.1 bucardo

Малёко приберемся для порядку, а то у нас в /opt всякого хламу насобиралось...

bucardik:/opt # mkdir bucardo.install
bucardik:/opt # mv Bucardo-4.0.1.tar.gz bucardo.install/
bucardik:/opt # mv DBD-Pg-2.15.1* bucardo.install/
bucardik:/opt # mv DBI* bucardo.install/

Проверим, что работает скрипт /opt/bucardo/bucardo_ctl

bucardik:/opt # /opt/bucardo/bucardo_ctl --version
bucardik:/opt # /opt/bucardo/bucardo_ctl --help
bucardik:/opt # man bucardo_ctl
bucardik:/opt # whereis bucardo_ctl
bucardik:/opt # bucardo_ctl --version

Ух ты, сколько всего интересного... Самое интересное, что корректно прописаны маны bucardo, и bucardo_ctl прописался в /usr/bin. Им и будем пользоваться. Ну будем считать, что установку bucardo закончили.

Теперь настройка...

bucardik:/opt # bucardo_ctl install

И после того, как нас спрашивает пароль на пользователя bucardo, какого-то хрена получаем ошибку авторизации... Возможно виноваты настройки pg_hba.conf... самое интересное, что объекты БД создаются. Вопрос только в том, до конца ли... Как вариант, поставить версию bucardo поновее. Там в git уже 4.0.2 есть. И bucardo_ctl по размеру существенно отличается...

Ну вот, пока думал, появилась версия 4.0.3. Пробуем...

bucardik:/opt # wget -c "http://bucardo.org/downloads/Bucardo-4.0.3.tar.gz"
bucardik:/opt # tar -xvzf Bucardo-4.0.3.tar.gz
bucardik:/opt # cd Bucardo-4.0.3/
bucardik:/opt/Bucardo-4.0.3 # make
bucardik:/opt/Bucardo-4.0.3 # make test
bucardik:/opt/Bucardo-4.0.3 # make install
bucardik:/opt/Bucardo-4.0.3 # cd ..
bucardik:/opt # mv Bucardo-4.0.3.tar.gz bucardo.install/
bucardik:/opt # ln -s Bucardo-4.0.3 bucardo
bucardik:/opt # bucardo_ctl install

Получаем следующий вывод:

Current connection settings:
1. Host: 22.22.11.71
2. Port: 5432
3. User: postgres
4. Database: postgres
5. PID directory: /var/run/bucardo

Это при том, что в bucardorc прописаны совершенно другие настройки. Да что за блядство такое??? Ладно, проверим установку ничего не меняя... И получаем ту же ошибку...
Так... Изменим подробности логирования postgres, чтобы попытаться получить более подробную информацию о том, почему не получается подключиться к БД. В /var/lib/pgsql/data/postgresql.conf добавляем:

log_min_messages = INFO
log_error_verbosity = VERBOSE
log_min_error_statement = INFO
log_connections = on
log_disconnections = on
log_statement = all

и перезапускаем postgres. Пытаемся снова bucardo_ctl install, смотрим логи, и ничего толкового не видим. Кроме одной вещи - объекты под пользователем bucardo создаются, потом bucardo отключается, пытается опять подключиться и не может. Может пароль пользователя меняется??? отключим подробное логирование и перезапустим postgres.

Попробуем сделать тест установки bucardo более совершенным и проверить, а не вываливаются ли там какие-нибудь ошибки...

Как всегда, все гениально просто!!! В pg_hba.conf делаем бешеную настройку на время установки. Потом вертаем в зад. А настройка такая:

local all all trust
host all all 127.0.0.1/32 trust
host all all 0.0.0.0/0 trust

После этого:

bucardik:/opt # bucardo_ctl install

И радуемся, потому что всё получилось :)

Поднастроим малеько:

bucardik:/opt # bucardo_ctl set log_conflict_file=/var/log/bucardo/bucardo_conflict.log
bucardik:/opt # bucardo_ctl set reason_file=/var/log/bucardo/bucardo.restart.reason.log
bucardik:/opt # bucardo_ctl set warning_file=/var/log/bucardo/bucardo.warning.log

Пробуем добавить Скадовск:


bucardik:/opt/Bucardo-4.0.3 # cd ../bucardo
bucardik:/opt/bucardo # bucardo_ctl add database allres name=res host=22.22.11.71 user=res pass=somepass
bucardik:/opt/bucardo # bucardo_ctl add database skres name=UTF8_sk host=22.22.25.3 user=res pass=somepass
bucardik:/opt/bucardo # bucardo_ctl add dbgroup master
bucardik:/opt/bucardo # bucardo_ctl add dbgroup slave

И тут я понял, что напутал. Как теперь удалить то, что я добавил?

Пока то да сё, разные проблемы, вышла очередная версия bucardo 4.1.2. Обновимся.

bucardik:/opt/bucardo # cd ..
bucardik:/opt # wget -c "http://bucardo.org/downloads/Bucardo-4.1.2.tar.gz"
bucardik:/opt # tar -xvzf Bucardo-4.1.2.tar.gz
bucardik:/opt # su - postgres
postgres@bucardik:~> psql
postgres=# drop database bucardo;
postgres=# CREATE DATABASE bucardo WITH ENCODING='UTF8' OWNER=bucardo
postgres-# CONNECTION LIMIT=-1 TABLESPACE=bucardo;
postgres=# \q
postgres@bucardik:~> exit
bucardik:/opt # rm bucardo
bucardik:/opt # ln -s Bucardo-4.1.2 bucardo
bucardik:/opt # mv Bucardo-4.1.2.tar.gz bucardo.install/
bucardik:/opt # cd bucardo
bucardik:/opt/bucardo # perl Makefile.PL
bucardik:/opt/bucardo # make
bucardik:/opt/bucardo # make install
bucardik:/opt/bucardo # bucardo_ctl --version

Видим, что версия 4.1.2. Гуд. Теперь устанавливаем БД bucardo. Для этого, как раньше, меняем в pg_hba.conf все на trust, и...

bucardik:/opt/bucardo # /etc/init.d/postgresql reload
bucardik:/opt/bucardo # bucardo_ctl install

Потом в pg_hba.conf вертаем всё в зад, и...

bucardik:/opt/bucardo # /etc/init.d/postgresql reload

Немного настраиваем глобальные параметры:

bucardik:/opt/bucardo # bucardo_ctl set default_email_from=bucardo@co.ksoe.com.ua
bucardik:/opt/bucardo # bucardo_ctl set default_email_to=fa@co.ksoe.com.ua
bucardik:/opt/bucardo # bucardo_ctl set default_email_host=22.22.11.51

Ну и наконец-то пробуем добавить Скадовск:

bucardik:/opt/bucardo # bucardo_ctl add database res name=allres host=22.22.11.71 user=res pass=somepasswd
bucardik:/opt/bucardo # bucardo_ctl add database UTF8_sk name=skres host=22.22.25.2 user=res pass=jsdgfj
bucardik:/opt/bucardo # bucardo_ctl add dbgroup master
bucardik:/opt/bucardo # bucardo_ctl add dbgroup slave

Пришел с утра на работу, и опять новая версия, 4.2.0 Ур-р-р-р-а-а-а-а!!! Вперед!!!!

bucardik:/opt/bucardo # cd ..
bucardik:/opt # wget -c "http://bucardo.org/downloads/Bucardo-4.2.0.tar.gz"
bucardik:/opt # tar -xvzf Bucardo-4.2.0.tar.gz
bucardik:/opt # bucardo_ctl stop "for upgrade"
bucardik:/opt # cd Bucardo-4.2.0/
bucardik:/opt/Bucardo-4.2.0 # perl Makefile.PL
bucardik:/opt/Bucardo-4.2.0 # make
bucardik:/opt/Bucardo-4.2.0 # make install
bucardik:/opt/Bucardo-4.2.0 # cd ..; rm bucardo
bucardik:/opt # ln -s Bucardo-4.2.0 bucardo
bucardik:/opt # mv Bucardo-4.2.0.tar.gz bucardo.install/

Тут не забываем поменять pg_hba.conf

bucardik:/opt # bucardo_ctl upgrade
bucardik:/opt # bucardo_ctl validate all

А после этого не забываем вернуть pg_hba.conf на место.

И несмотря на то, что мы вроде в процессе не получили ни одной ошибки, при выводе bucardo_ctl show all нам показывает версию 4.1.2... Ну че за херня??? Будем надеяться, что просто девелоперы провтыкали при обновлении изменить версию bucardo_config? Отправил баг по этому поводу на bucardo.org. Посмотрим, как они отреагируют...

Так, Скадовск. Делаем заново... Для начала всё вычищаем:

bucardik:/opt # su - postgres
postgres@bucardik:~> psql -h 22.22.11.71 bucardo bucardo
bucardo=# delete from sync;
bucardo=# delete from herdmap;
bucardo=# delete from herd;
bucardo=# delete from goat;
bucardo=# delete from db;
bucardo=# \q
postgres@bucardik:~> postgres@bucardik:~> psql -h 22.22.11.71 res res
res=# drop schema res cascade;
res=# create schema res authorization res;
res=# \q
postgres@bucardik:~> mv work work.old
postgres@bucardik:~> mkdir work; cd work

Вроде всё вычистили. Теперь настраиваем Скадовск...

postgres@bucardik:~/work> pg_dump -h 22.22.25.2 -p 5432 -U postgres -F p -s -s -v -f "skres_schema.sql" -n 'res' "UTF8_sk"
postgres@bucardik:~/work> psql -f skres_schema.sql -h 22.22.11.71 -U res res
postgres@bucardik:~/work> psql -h 22.22.11.71 -U res res
res=# \o drop_constr.sql \t
res=# SELECT 'ALTER TABLE res.'||t.tablename||' DROP CONSTRAINT '||con.conname||';'
res-# FROM pg_constraint con, pg_class cl, pg_tables t, information_schema.constraint_column_usage cc
res-# WHERE t.schemaname = 'res'
res-# AND t.tablename = cl.relname
res-# AND con.contype = 'c'
res-# AND con.conrelid = cl.oid
res-# AND cc.constraint_name = con.conname
res-# ORDER BY con.conname;
res=# \o drop_rule.sql
res=# SELECT 'DROP RULE '||rulename||' ON '||tablename||';'
res-# FROM pg_rules
res-# WHERE schemaname = 'res'
res-# ORDER BY tablename, rulename;
res=# \o drop_rule_constr.log
res=# \i drop_constr.sql
res=# \i drop_rule.sql
res=# \q
postgres@bucardik:~/work> exit
bucardik:/opt # bucardo_ctl add database UTF8_sk name=skres host=22.22.25.2 user=res pass=password
bucardik:/opt # bucardo_ctl add database res name=allres host=22.22.11.71 user=res pass=password
bucardik:/opt # bucardo_ctl add all tables db=skres --herd=skres_herd --verbose
bucardik:/opt # psql -h 22.22.11.71 bucardo bucardo
bucardo=# DELETE FROM bucardo.herdmap
bucardo-# WHERE goat IN (SELECT id
bucardo(# FROM bucardo.goat WHERE tablename IN
bucardo(# ('rp_abon','log','dual','billsqlreport'));
bucardo=# DELETE FROM bucardo.goat
bucardo-# WHERE tablename IN
bucardo-# ('rp_abon','log','dual','billsqlreport');
bucardo=# \q
bucardik:/opt # su - postgres
postgres@bucardik:~> cd work
postgres@bucardik:~/work> ssh root@22.22.25.2
linux01:~ # su - postgres -c "cd /files/ftp; pg_dump -C -F c -b -f pgsql.UTF8_sk "UTF8_sk""; exit
postgres@bucardik:~/work> exit
bucardik:/opt # bucardo_ctl add sync skres_sync type=pushdelta source=skres_herd targetdb=allres --verbose
bucardik:/opt # su - postgres
postgres@bucardik:~> cd work
postgres@bucardik:~/work> wget --no-proxy -c --ftp-user=sit --ftp-password=? ftp://22.22.25.2/ftp/pgsql.UTF8_sk
postgres@bucardik:~/work> psql -h 22.22.11.71 -U res res
res=# \o drop_fk.sql \t
res=# SELECT 'ALTER TABLE res.'||t.tablename
res-# ||' DROP CONSTRAINT '||con.conname||';'
res-# FROM pg_constraint con, pg_class cl, pg_tables t,
res-# information_schema.constraint_column_usage cc
res-# WHERE t.schemaname = 'res'
res-# AND t.tablename = cl.relname
res-# AND con.contype = 'f'
res-# AND con.conrelid = cl.oid
res-# AND cc.constraint_name = con.conname
res-# ORDER BY t.tablename, con.conname;
res=# \o drop_fk.log
res=# \i drop_fk.sql \q
postgres@bucardik:~/work> pg_restore -h 22.22.11.71 -U res -d res -a -v "pgsql.UTF8_sk"
postgres@bucardik:~/work> grep FOREIGN -B 1 skres_schema.sql > restore_fk.sql
postgres@bucardik:~/work> psql -h 22.22.11.71 -U res res
res=# \i restore_fk.sql \q
postgres@bucardik:~/work> exit
bucardik:/opt # bucardo_ctl start "first start"

Проверяем, и видим, что замечательно работает!!!! Ура, товарищи!!!
Ну а пока мы тут занимались Скадовском, разработчики не дремлют, и успели выпустить версию 4.2.1. Обновимся, товарищи, ибо в актуальности наша сила!!! Тем более, что нам нужно провести тест обновления софта при настроеной репликации!!!

bucardik:/opt # wget -c "http://bucardo.org/downloads/Bucardo-4.2.1.tar.gz"
bucardik:/opt # tar -xvzf Bucardo-4.2.1.tar.gz
bucardik:/opt # bucardo_ctl stop "for upgrade from 4.2.0 to 4.2.1"
bucardik:/opt # cd Bucardo-4.2.1/
bucardik:/opt/Bucardo-4.2.1 # perl Makefile.PL
bucardik:/opt/Bucardo-4.2.1 # make
bucardik:/opt/Bucardo-4.2.1 # make install
bucardik:/opt/Bucardo-4.2.1 # bucardo_ctl --version
bucardik:/opt/Bucardo-4.2.1 # cd ..; rm bucardo
bucardik:/opt # ln -s Bucardo-4.2.1 bucardo
bucardik:/opt # mv Bucardo-4.2.1.tar.gz bucardo.install/
Меняем pg_hba.conf на trust
bucardik:/opt # bucardo_ctl upgrade
bucardik:/opt # bucardo_ctl upgrade
bucardik:/opt # bucardo_ctl upgrade
Меняем pg_hba.conf на password
bucardik:/opt # bucardo_ctl validate all
bucardik:/opt # bucardo_ctl start "after upgrade from 4.2.0 to 4.2.1"

Проверяем и радуемся, репликация бегает нормально.
Теперь нужно поменять пароль на пользователя res, создать пользователя только на чтение. Приступим.

bucardik:/opt # bucardo_ctl stop "for change some password"
bucardik:/opt # psql -h 22.22.11.71 postgres postgres
postgres=# alter role res password 'frr';
postgres=# \q
bucardik:/opt # psql -h 22.22.11.71 bucardo bucardo
bucardo=# UPDATE bucardo.db SET dbpass='frr' WHERE name='allres';
bucardo=# \q
bucardik:/opt # bucardo_ctl start "after change password for db allres"

bucardik:/opt # psql -h 22.22.11.71 postgres postgres
postgres=# CREATE ROLE res_read LOGIN PASSWORD 'res_read';
postgres=# \q
bucardik:/opt # su - postgres
postgres@bucardik:~> cd work
postgres@bucardik:~/work> psql -h 22.22.11.71 -U res res
res=# \o grant_table.sql \t
res=# SELECT 'GRANT SELECT, REFERENCES ON TABLE '
res-# ||schemaname||'.'||tablename||' TO res_read;'
res-# FROM pg_tables
res-# WHERE schemaname = 'res';
res=# \o grant_view.sql
res=# SELECT 'GRANT SELECT, REFERENCES ON TABLE '
res-# ||schemaname||'.'||viewname||' TO res_read;'
res-# FROM pg_views
res-# WHERE schemaname = 'res';
res=# \o grants.log
res=# \i grant_table.sql
res=# \i grant_view.sql
res=# GRANT USAGE ON SCHEMA res TO res_read;
res=# \q
postgres@bucardik:~/work> exit
bucardik:/opt #

Обновимся опять до свежей версии 4.2.2:

bucardik:/opt # wget -c "http://bucardo.org/downloads/Bucardo-4.2.2.tar.gz"
bucardik:/opt # tar -xvzf Bucardo-4.2.2.tar.gz
bucardik:/opt # bucardo_ctl stop "for upgrade from 4.2.1 to 4.2.2"
bucardik:/opt # cd Bucardo-4.2.2/
bucardik:/opt/Bucardo-4.2.2 # perl Makefile.PL
bucardik:/opt/Bucardo-4.2.2 # make
bucardik:/opt/Bucardo-4.2.2 # make install
bucardik:/opt/Bucardo-4.2.2 # bucardo_ctl --version
bucardik:/opt/Bucardo-4.2.2 # cd ..; rm bucardo
bucardik:/opt # ln -s Bucardo-4.2.2 bucardo
bucardik:/opt # mv Bucardo-4.2.2.tar.gz bucardo.install/
Меняем pg_hba.conf на trust
bucardik:/opt # bucardo_ctl upgrade
bucardik:/opt # bucardo_ctl upgrade
bucardik:/opt # bucardo_ctl upgrade
Меняем pg_hba.conf на password
bucardik:/opt # bucardo_ctl validate all
bucardik:/opt # bucardo_ctl start "after upgrade from 4.2.1 to 4.2.2"

Проверили, всё работает.

Теперь добавляем Новотроицк.

bucardik:/opt # bucardo_ctl stop "for add ntres"
bucardik:/opt # bucardo_ctl add database ntres name=ntres host=22.22.50.2 user=res pass=sss
bucardik:/opt # su - postgres
postgres@bucardik:~> cd work
postgres@bucardik:~/work> psql -h 22.22.11.71 res bucardo
res=# \o add_ntres_tables.sh \t
res=# select 'bucardo_ctl add table res.'||tablename
res-# ||' db=ntres --herd=ntres_herd --verbose'
res-# from pg_tables
res-# where tablename in
res-# (select table_name from information_schema.columns
res(# where column_name='domain_info')
res-# and tablename not like 'tmp%'
res-# and tablename not in
res-# ('rp_abon','log','dual','billsqlreport',
res(# 'tmpcounter','tmpmol',
res(# 'encustomertype','enelement',
res(# 'enelement2recordpoint','enelement2shema',
res(# 'enelementtype','enfeeder','enpost',
res(# 'enshema','ensubstation','ensubstationowner',
res(# 'ensubstationtype','enswitch',
res(# 'enswitchhistory','enswitchreason')
res-# order by tablename;
res=# \q
postgres@bucardik:~/work> exit
bucardik:/opt # bash < /var/lib/pgsql/work/add_ntres_tables.sh
bucardik:/opt # ssh root@22.22.50.2
linux01:~ # su - postgres -c "cd /files; pg_dump -C -F c -b -f pgsql.ntres "ntres""; exit
bucardik:/opt # psql -h 22.22.11.71 bucardo bucardo
bucardo=# INSERT INTO bucardo.herdmap (herd, goat)
bucardo-# SELECT 'ntres_herd', id
bucardo-# FROM goat WHERE db = 'ntres';
bucardo=# \q
bucardik:/opt # bucardo_ctl add sync ntres_sync type=pushdelta source=ntres_herd targetdb=allres --verbose
bucardik:/opt # su - postgres
postgres@bucardik:~> cd work
postgres@bucardik:~/work> wget --no-proxy -c --ftp-user=sit --ftp-password=? ftp://22.22.50.2/pgsql.ntres
postgres@bucardik:~/work> pg_dump -h 22.22.11.71 -p 5432 -U res -F p -s -s -v -f "allres_schema.sql" -n 'res' "res"
postgres@bucardik:~/work> psql -h 22.22.11.71 -U res res
res=# \o drop_fk_4_ntres_load.sql \t
res=# SELECT 'ALTER TABLE res.'||t.tablename
res-# ||' DROP CONSTRAINT '||con.conname||';'
res-# FROM pg_constraint con, pg_class cl, pg_tables t,
res-# information_schema.constraint_column_usage cc
res-# WHERE t.schemaname = 'res'
res-# AND t.tablename = cl.relname
res-# AND con.contype = 'f'
res-# AND con.conrelid = cl.oid
res-# AND cc.constraint_name = con.conname
res-# ORDER BY t.tablename, con.conname;
res=# \o drop_fk_4_ntres_load.log \t
res=# \i drop_fk_4_ntres_load.sql
res=# \q
postgres@bucardik:~/work> psql -h 22.22.11.71 bucardo bucardo
bucardo=# \o restore_ntres_tables.sh \t
bucardo=# SELECT 'pg_restore -h 22.22.11.71 -U res -d res -a -t '
bucardo-# ||tablename||' -v "pgsql.ntres"'
bucardo-# FROM goat
bucardo-# WHERE db='ntres'
bucardo-# ORDER BY tablename;
bucardo=# \q
Меняем pg_hba.conf на trust
postgres@bucardik:~/work> bash < restore_ntres_tables.sh
Меняем pg_hba.conf на password
postgres@bucardik:~/work> grep FOREIGN -B 1 allres_schema.sql > restore_fk_allres.sql
postgres@bucardik:~/work> psql -h 22.22.11.71 -U res res
res=# \i restore_fk_allres.sql \q
Тут повылазил ряд ошибок при восстановлении. Так что пока выносим FK, и запускаем репликацию без них.
postgres@bucardik:~/work> psql -h 22.22.11.71 -U res res
res=# \i drop_fk_4_ntres_load.sql \q
postgres@bucardik:~/work> exit
bucardik:/opt # bucardo_ctl start "After ntres added"

Обновляемся до версии 4.3.0

bucardik:/opt # bucardo_ctl stop "upgrade 4.2.2 -> 4.3.0"
bucardik:/opt # wget -c "http://bucardo.org/downloads/Bucardo-4.3.0.tar.gz"
bucardik:/opt # tar -xvzf Bucardo-4.3.0.tar.gz
bucardik:/opt # cd Bucardo-4.3.0/
bucardik:/opt/Bucardo-4.3.0 # perl Makefile.PL
bucardik:/opt/Bucardo-4.3.0 # make
bucardik:/opt/Bucardo-4.3.0 # make install
bucardik:/opt/Bucardo-4.3.0 # bucardo_ctl --version
bucardik:/opt/Bucardo-4.3.0 # cd ..; rm bucardo
bucardik:/opt # ln -s Bucardo-4.3.0 bucardo
bucardik:/opt # mv Bucardo-4.3.0.tar.gz bucardo.install/
Меняем pg_hba.conf на trust
bucardik:/opt # /etc/init.d/postgresql reload
bucardik:/opt # bucardo_ctl upgrade
bucardik:/opt # bucardo_ctl upgrade
Меняем pg_hba.conf на password
bucardik:/opt # /etc/init.d/postgresql reload
bucardik:/opt # bucardo_ctl validate all
bucardik:/opt # bucardo_ctl start "after upgrade 4.2.2 -> 4.3.0"

Добавляем Цюрупинск:
Этот район у нас немного особенный. Ну во=первых он не расшит, так что никаких диапазонов на PK нету. Просто этот РЭС был первым. Ну и domain_info = 'root'.

bucardik:/opt # bucardo_ctl stop "for add crres"
bucardik:/opt # bucardo_ctl add database crres name=crres host=22.22.33.2 user=res pass=???
bucardik:/opt # bucardo_ctl add herd crres_herd
bucardik:/opt # su - postgres
postgres@bucardik:~> cd work
postgres@bucardik:~/work> psql -h 22.22.11.71 res bucardo
res=# \o add_crres_tables.sh \t
res=# select 'bucardo_ctl add table res.'||tablename
res-# ||' db=crres --herd=crres_herd --verbose'
res-# from pg_tables
res-# where tablename in
res-# (select table_name from information_schema.columns
res(# where column_name='domain_info')
res-# and tablename not like 'tmp%'
res-# and tablename not in
res-# ('rp_abon','log','dual','billsqlreport',
res(# 'tmpcounter','tmpmol',
res(# 'encustomertype','enelement',
res(# 'enelement2recordpoint','enelement2shema',
res(# 'enelementtype','enfeeder','enpost',
res(# 'enshema','ensubstation','ensubstationowner',
res(# 'ensubstationtype','enswitch',
res(# 'enswitchhistory','enswitchreason')
res-# order by tablename;
res=# \q
postgres@bucardik:~/work> exit
bucardik:/opt # bash < /var/lib/pgsql/work/add_crres_tables.sh
bucardik:/opt # psql -h 22.22.11.71 bucardo bucardo
bucardo=# INSERT INTO bucardo.herdmap (herd, goat)
bucardo-# SELECT 'crres_herd', id
bucardo-# FROM goat WHERE db = 'crres';
bucardo=# \q
bucardik:/opt # ssh root@22.22.33.2
linux01:~ # su - postgres -c "cd /files/postgres; pg_dump -C -F c -b -f pgsql.crres "crres""; exit
bucardik:/opt # bucardo_ctl add sync crres_sync type=pushdelta source=crres_herd targetdb=allres --verbose
bucardik:/opt # su - postgres
postgres@bucardik:~> cd work
postgres@bucardik:~/work> wget --limit-rate=20000 --no-proxy -c --ftp-user=sit --ftp-password=? ftp://22.22.33.2/postgres/pgsql.crres
postgres@bucardik:~/work> psql -h 22.22.11.71 bucardo bucardo
bucardo=# \o restore_crres_tables.sh \t
bucardo=# SELECT 'pg_restore -h 22.22.11.71 -U res -d res -a -t '
bucardo-# ||tablename||' -v "pgsql.crres"'
bucardo-# FROM goat
bucardo-# WHERE db='crres'
bucardo-# ORDER BY tablename;
bucardo=# \q
Меняем pg_hba.conf на trust
postgres@bucardik:~/work> bash < restore_crres_tables.sh
postgres@bucardik:~/work> exit
bucardik:/opt # bucardo_ctl start "After crres added"

ВНИМАНИЕ!!! после каждого запуска bucardo с новым sync внимательно вычитываем логи, т.к. 99,999% вероятность, что сразу нихрена не заработает!!! А почему - сюрприз будет при вычитывании логов :)

Обновляемся до версии 4.4.0

bucardik:/opt # bucardo_ctl stop "upgrade 4.3.0 -> 4.4.0"
bucardik:/opt # wget -c "http://bucardo.org/downloads/Bucardo-4.4.0.tar.gz"
bucardik:/opt # tar -xvzf Bucardo-4.4.0.tar.gz
bucardik:/opt # cd Bucardo-4.4.0/
bucardik:/opt/Bucardo-4.4.0 # perl Makefile.PL
bucardik:/opt/Bucardo-4.4.0 # make
bucardik:/opt/Bucardo-4.4.0 # make install
bucardik:/opt/Bucardo-4.4.0 # bucardo_ctl --version
bucardik:/opt/Bucardo-4.4.0 # cd ..; rm bucardo
bucardik:/opt # ln -s Bucardo-4.4.0 bucardo
bucardik:/opt # mv Bucardo-4.4.0.tar.gz bucardo.install/
Меняем pg_hba.conf на trust
bucardik:/opt # /etc/init.d/postgresql reload
bucardik:/opt # bucardo_ctl upgrade
bucardik:/opt # bucardo_ctl upgrade
Меняем pg_hba.conf на password
bucardik:/opt # /etc/init.d/postgresql reload
bucardik:/opt # bucardo_ctl validate all
bucardik:/opt # bucardo_ctl start "after upgrade 4.3.0 -> 4.4.0"

Добавляем Белозерку:

bucardik:/opt # bucardo_ctl stop "for add bzres"

###############################

Во время заливки баз повылазили всякие нарушения целостности. Я из на этапе заливки отключил, но потом их нужно будет восстановить. Список, что нужно восстановить:

1.

FK все.

2.

CREATE UNIQUE INDEX u_cntrinvnmbr
ON res.countergen
USING btree
(invnumber);

###############################

Проверка валидности первичных ключей и доменной информации

res=# \o check_pk_code.sql \t
Показываются только записи.
### select
res=# \o check_pk_code.log \t
Режим "только записи" выключен.
res=# \i check_pk_code.sql

select 'SELECT '||ccu.column_name
||' AS "'||ccu.table_name||'.'||ccu.column_name||'.'||ccu.constraint_name
||'", domain_info'
||' FROM '||ccu.table_name
||' WHERE '||ccu.column_name||' < 80000000 OR domain_info != ''root.sk'';'
from pg_constraint pc, information_schema.constraint_column_usage ccu
where pc.contype = 'p'
and ccu.constraint_name=pc.conname
and ccu.table_name in
(select table_name from information_schema.columns
where column_name='domain_info')
and ccu.table_name not in ('rp_abon','log','dual','billsqlreport',
'tmpcounter','tmpmol','tmpcounter2counter','tmpnomenklature',
'encustomertype','enelement',
'enelement2recordpoint','enelement2shema','enelementtype','enfeeder','enpost',
'enshema','ensubstation','ensubstationowner','ensubstationtype','enswitch',
'enswitchhistory','enswitchreason')
order by ccu.table_name, ccu.column_name, ccu.constraint_name;


Читать далее

2009-09-11

Bucardo 4.0.1

Да здравствует УРА!!!
Возрадуемся други, ибо вышла новая версия bucardo, Так что будем делать прыжок с 3.0.9 на 4.0.1, благо я неуспел внедрить продакшн. А те полтора калеки, которых пихнули, лучше переделать сейчас, чем когда калек будет 18-20 штук.

Читать далее