2012-10-19

Bucardo. И снова здравствуйте...

Никуда мы друг от друга не денемся...
Кстати, хотите узнать, кто такой bucardo??? Смотрите:


К чему это я.... А, да, опять репликация :)
Задача простая, как сам bucardo - есть большая БД, из которой делаем две БД - одну полную, одну оперативную. Из оперативной выносим старые данные и настраиваем, чтобы все, изменения, производимые в оперативной реплицировались в полную БД, в которой должны быть вообще все данные. Полная БД работает только на чтение, на ней крутят мегаотчеты по полным и безбашенным периодам, а в перспективе вообще все отчеты, если репликация будет работать красиво :)
Размазывать сопли не буду, ибо статейка пишется после того, как основная работа уже была проделана.Используется PostgreSQL 9.1.6 из rpm пакетов на SLES11 SP2 64bit.

########################################################
### 0. Устанавливаем Bucardo
########################################################

Писать не буду, 300 раз делал... В блоге все есть...

########################################################
### 1. Инициализируем Bucardo
########################################################

bucardo2:~ # su - postgres
postgres@bucardo2:~> psql
psql (9.1.6)
Введите "help", чтобы получить справку.

postgres=# CREATE USER bucardo SUPERUSER;
CREATE ROLE
postgres=# ALTER ROLE bucardo password 'qwerty';
ALTER ROLE
postgres=# CREATE TABLESPACE bucardo OWNER bucardo LOCATION '/u02/pgdata/bucardo';
CREATE TABLESPACE
postgres=# CREATE DATABASE bucardo WITH ENCODING='UTF8' OWNER=bucardo TABLESPACE=bucardo;
CREATE DATABASE
postgres=# \q
postgres@bucardo2:~> psql -U bucardo bucardo
psql (9.1.6)
Введите "help", чтобы получить справку.

bucardo=# CREATE LANGUAGE plperlu;
CREATE LANGUAGE
bucardo=# CREATE LANGUAGE plperl;
CREATE LANGUAGE
bucardo=# CREATE LANGUAGE plpgsql;
ОШИБКА:  язык "plpgsql" уже существует
bucardo=# \q
postgres@bucardo2:~> psql -h 10.77.11.124 oblbase
Пароль:
psql (9.1.6)
Введите "help", чтобы получить справку.

oblbase=# CREATE USER bucardo SUPERUSER;
CREATE ROLE
oblbase=# ALTER ROLE bucardo password 'qwerty';
ALTER ROLE
oblbase=# CREATE LANGUAGE plperlu;
CREATE LANGUAGE
oblbase=# CREATE LANGUAGE plperl;
CREATE LANGUAGE
oblbase=# CREATE LANGUAGE plpgsql;
ОШИБКА:  язык "plpgsql" уже существует
oblbase=# \q
postgres@bucardo2:~> exit
logout
bucardo2:~ # mkdir /var/run/bucardo
bucardo2:~ # mkdir /var/log/bucardo
bucardo2:~ # mkdir /var/log/arhiv/bucardo
bucardo2:~ # bucardo_ctl install
This will install the bucardo database into an existing Postgres cluster.
Postgres must have been compiled with Perl support,
and you must connect as a superuser

We will create a new superuser named 'bucardo',
and make it the owner of a new database named 'bucardo'

Current connection settings:
1. Host:         
2. Port:          5432
3. User:          postgres
4. Database:      postgres
5. PID directory: /var/run/bucardo
Enter a number to change it, P to proceed, or Q to quit: 3

Change the user to: bucardo

Changed user to: bucardo
Current connection settings:
1. Host:         
2. Port:          5432
3. User:          bucardo
4. Database:      postgres
5. PID directory: /var/run/bucardo
Enter a number to change it, P to proceed, or Q to quit: 4

Change the database name to: bucardo

Changed database name to: bucardo
Current connection settings:
1. Host:         
2. Port:          5432
3. User:          bucardo
4. Database:      bucardo
5. PID directory: /var/run/bucardo
Enter a number to change it, P to proceed, or Q to quit: P

Postgres version is: 9.1
Attempting to create and populate the bucardo database and schema
Database creation is complete

Connecting to database 'bucardo' as user 'bucardo'
Updated configuration setting "piddir"
Installation is now complete.

If you see any unexpected errors above, please report them to bucardo-general@bucardo.org

You should probably check over the configuration variables next, by running:
bucardo_ctl show all
Change any setting by using: bucardo_ctl set foo=bar

bucardo2:~ # bucardo_ctl set default_email_from=bucardo_net@qwerty.ua
Set "default_email_from" to "bucardo_net@qwerty"
bucardo2:~ # bucardo_ctl set default_email_to=fa@qwerty
Set "default_email_to" to "fa@qwerty"
bucardo2:~ # bucardo_ctl set log_conflict_file=/var/lob/bucardo_conflict.log
Set "log_conflict_file" to "/var/lob/bucardo_conflict.log"
bucardo2:~ # bucardo_ctl set reason_file=/var/log/bucardo.restart.reason.log
Set "reason_file" to "/var/log/bucardo.restart.reason.log"
bucardo2:~ # bucardo_ctl set warning_file=/var/log/bucardo.warning.log
Set "warning_file" to "/var/log/bucardo.warning.log"

# Кроме того:
# В файл /etc/syslog-ng/syslog-ng.conf добавляем строки:
filter f_bucardo {match('ucardo'); };
filter f_messages { not facility(news, mail) and not filter(f_iptables) and not filter(f_bucardo); };
destination d_bucardo {file(var/log/bucardo/bucardo.log);};
log {source(src);filter(f_bucardo);destination(d_bucardo);};
# после чего перезапускаем syslog
# Создаем файл /etc/logrotate.d/bucardo со следующим содержимым:
/var/log/bucardo/bucardo.log {
notifempty
daily
rotate 99
missingok
compress
dateext
copytruncate
olddir /var/log/arhiv/bucardo
}


########################################################
### 2. Добавляем базы данных, которые участвуют в репликации 
########################################################

bucardo2:~ # bucardo_ctl add database oblbase name=netoper host=10.77.11.124 user=bucardo pass=qwerty
Added database "netoper"
bucardo2:~ # bucardo_ctl add database oblbase name=netfull host=10.77.11.125 user=bucardo pass=qwerty
Added database "netfull"


########################################################
### 3. Добавляем таблицы, но только те, на которых есть PK. 
########################################################
 

bucardo2:~ # mkdir /u02/work/bucardo
bucardo2:~ # chown postgres:postgres /u02/work/bucardo/
bucardo2:~ # su - postgres
postgres@bucardo2:~> cd /u02/work/bucardo/
postgres@bucardo2:/u02/work/bucardo> psql oblbase
psql (9.1.6)
Введите "help", чтобы получить справку.

oblbase=> \o add_tables.sh \t
Выводятся только кортежи.
oblbase=> select 'bucardo_ctl add table '||table_schema||'.'||table_name||' db=netoper herd=netoper_herd'
oblbase-> from pg_constraint p, information_schema.constraint_table_usage i
oblbase-> where contype = 'p'
oblbase->   and i.constraint_name = p.conname
oblbase->   and table_schema not in ('public')
oblbase-> order by table_schema, table_name;
oblbase=> \q
postgres@bucardo2:/u02/work/bucardo> exit
logout
bucardo2:~ # cd /u02/work/bucardo/
bucardo2:/u02/work/bucardo # bash add_tables.sh
Created herd "netoper_herd"
Added table "net.address"
...многа-многа-многа-табличек...
Added table "net.tmesure_unit"


########################################################
### 4. Добавляем SYNC и делаем первый запуск
########################################################
 

bucardo2:/u02/work/bucardo # bucardo_ctl add sync net_sync type=pushdelta source=netoper_herd targetdb=netfull --verbose
Added sync "net_sync"
bucardo2:/u02/work/bucardo # bucardo_ctl start "Urra, the first start..."

После этого смотрим /var/log/bucardo/bucardo.log, и в 99% случаев находим там много жоп.
Исправляем их и запускаемся по новой...



########################################################
### 5. Создаем инициализационный скриптец
########################################################

Создаем файлик /etc/init.d/bucardo со следующим содержимым


#!/bin/sh
. /etc/rc.status
rc_reset
name="bucardo_ctl"
command="/usr/bin/${name}"
CURDT=$(date +%Y-%m-%d.%H.%M.%S)
case "$1" in
    start)
        echo -n "START BUCARDO Replication of PostgreSQL:"
        ${command} --debugfile=0 --sendmail=1 start "Started by init.d script" $CURDT
        rc_status -v
        ;;
    stop)
        echo -n "STOP BUCARDO Replication of PostgreSQL:"
        ${command} --sendmail=1 stop "Stoped by init.d script" $CURDT
        rc_status -v
        ;;
    status)
        ${command} status
        rc_status -v
        ;;
    *)
        echo "Usage: $0 {start|stop|status}"
        exit 1
        ;;
esac
rc_exit

########################################################
### 6. Делаем руками LOGROTATE (ну то есть через ж...)
########################################################

Почему через ж..., да потому что по непонятной мне причине logrotate не обробатывает файлы bucardo, а их вертеть надо каждые 2 часа.

Создаем файлик /u02/scheduler/logrotate/bucardo со следующим содержимым:

#!/bin/bash
/usr/sbin/logrotate -f /etc/logrotate.d/bucardo
CURDTMIN=$(date +%Y%m%d)
CURDTMAX=$(date +%Y%m%d%H%M%S)
mv -v /var/log/arhiv/bucardo/bucardo.log-$CURDTMIN.gz /var/log/arhiv/bucardo/bucardo.log-$CURDTMAX.gz
и в cron добавляем:

0       */2     *       *       *       /u02/scheduler/logrotate/bucardo &> /dev/null

Ну а /etc/logrotate.d/bucardo вот такой:

/var/log/bucardo/bucardo.log {
notifempty
daily
rotate 200
missingok
compress
dateext
copytruncate
olddir /var/log/arhiv/bucardo
}


Читать далее

2012-10-05

Обычная ситуация :(

Человек, летящий на воздушном шаре, обнаружил, что потерялся.
Он спустился немного ниже и заметил на земле женщину. Спустившись еще чуть ниже, он обратился к ней: «Простите, не могли бы Вы помочь? Я договорился с другом встретиться час назад, но не знаю, где сейчас нахожусь».
«Вы находитесь на воздушном шаре в 30 футах от поверхности Земли, между 40 и 41 градусом северной широты и между 59 и 60 градусом западной долготы» - ответила женщина.
М: Вы, должно быть, инженер-программист?
Ж: Да, а как Вы догадались?
М: Вы мне дали абсолютно точный ответ, но я совершено не представляю, что делать с этой информацией и я все еще потерян. Откровенно говоря, Вы мне совершенно ничем не помогли.
Ж: А Вы, наверное, менеджер?
М: Да. А Вы как догадались?
Ж: Вы не знаете, где находитесь и куда направляетесь. Вы поднялись туда, где находитесь, благодаря воздуху. Вы дали обещание, которое не представляете, как выполнять, и ожидаете, что люди, которые находятся ниже вас, решат Ваши проблемы. И наконец, сейчас Вы в том же самом положении, в котором находились до встречи со мной, но почему-то теперь в этом оказалась виновата я"
Читать далее

2012-10-01

PostgreSQL 9.2.1 из исходников

SLES11 SP2 64 bit

p03:~ # cd /u02/install/postgres/
p03:/u02/install/postgres # tar -xvzf postgresql-9.2.1.tar.gz
p03:/u02/install/postgres # cd postgresql-9.2.1/
p03:/u02/install/postgres/postgresql-9.2.1 # mkdir /opt/pgsql-9.2
p03:/u02/install/postgres/postgresql-9.2.1 # chown postgres:postgres /opt/pgsql-9.2/
p03:/u02/install/postgres/postgresql-9.2.1 # ./configure --prefix=/opt/pgsql-9.2 --without-readline --without-zlib
p03:/u02/install/postgres/postgresql-9.2.1 # gmake
p03:/u02/install/postgres/postgresql-9.2.1 # chown postgres:postgres ../postgresql-9.2.1 -R
p03:/u02/install/postgres/postgresql-9.2.1 # su - postgres
postgres@p03:~> cd /u02/install/postgres/postgresql-9.2.1/
postgres@p03:/u02/install/postgres/postgresql-9.2.1> gmake check
postgres@p03:/u02/install/postgres/postgresql-9.2.1> exit
p03:/u02/install/postgres/postgresql-9.2.1 # gmake install
p03:/u02/install/postgres/postgresql-9.2.1 # su - postgres
postgres@p03:~> /opt/pgsql-9.2/bin/initdb -D /opt/pgsql-9.2/data


Читать далее