2010-12-23

Oracle8i, PostgreSQL, JBoss синхронизация по ночам...

Все довольно банально, но довольно необходимо :)
Есть рабочая база данных на Oracle8i(крутится на rhel3u6), и не менее рабочая БД PostgreSQL 8.2.17(крутится на sles11sp1), вместе с которой живет JBoss. И вся эта трахомиудия является одним программным комплексом, с которым работает почти 1000 человек. Нужно сделать идентичную тестовую среду обновляемую с рабочих серверов еженощно, где программисты могут творить любой беспредел...
Итак...


Тестовый сервер называется MARS, сервер oracle8i называется ADONIS, сервер PostgreSQL+JBoss называется P01.

=========================================
=== MARS
=========================================

Первым делом на тестовом сервере MARS разворачиваем rhel3u6, oracle8i, postgresql 8.2.17, jboss 4.0.1, а потом ваяем набор скриптов:

Эти скрипты касаются Oracle8i:

/u02/scheduler/syncmain/1_shut.sh

#!/bin/bash

cd /u02/scheduler/syncmain
chown oracle:oinstall /u02/scheduler/syncmain -R
su - oracle -c "cd /u02/scheduler/syncmain; ./shutmain.sh"
rm -v /u02/oradata/main/*

/u02/scheduler/syncmain/shutmain.sh

#!/bin/bash

export ORACLE_SID=main
svrmgrl < shutdb.sql

/u02/scheduler/syncmain/shutdb.sql

connect internal
shutdown abort

/u02/scheduler/syncmain/2_start.sh

#!/bin/bash

cd /u02/scheduler/syncmain
chown oracle:oinstall /u02/scheduler/syncmain -R
chown oracle:oinstall /u02/oradata -R
rm /u02/arch/main/*
su - oracle -c "cd /u02/scheduler/syncmain; ./startmain.sh"
su - oracle -c "cd /u02/scheduler/syncmain; ./userpass.sh"

/u02/scheduler/syncmain/startmain.sh

#!/bin/bash

export ORACLE_SID=main
svrmgrl < style="font-weight:bold;">/u02/scheduler/syncmain/startdb.sql

connect internal
startup

/u02/scheduler/syncmain/userpass.sh

#!/bin/bash

export ORACLE_SID=main
sqlplus /nolog @userpass.sql

/u02/scheduler/syncmain/userpass.sql

connect internal
spool userpass4exec.sql
set heading off
set linesize 10000
set trimspool on
set pagesize 0
set feedback off
SELECT 'alter user '||username||' identified by '||username||';'
FROM dba_users
ORDER BY username
/
spool off
@userpass4exec.sql
exit

Эти скрипты касаются PostgreSQL+JBoss:

/u02/scheduler/syncpgsql/1_shut.sh

#!/bin/bash

cd /u02/scheduler/syncpgsql
chown postgres:postgres /u02/scheduler/syncpgsql
/opt/jboss/bin/shutdown.sh
/etc/init.d/pgsql-8.2 stop
/etc/init.d/pgsql-8.2 start

/u02/scheduler/syncpgsql/2_start.sh

#!/bin/bash

cd /u02/scheduler/syncpgsql
mkdir ear
umount ear
umount ear
umount ear
umount ear
umount ear
umount ear
umount ear
umount ear
umount ear
mount 10.77.11.18:/opt/jboss/server/default/deploy ear
/opt/jboss/bin/shutdown.sh
rm /opt/jboss/server/default/deploy/energy.ear
cp -v ear/energy.ear /opt/jboss/server/default/deploy/
chown jboss:jboss /opt/jboss/server/default/deploy/energy.ear
umount ear
umount ear
umount ear
umount ear
umount ear
umount ear
umount ear
umount ear
umount ear
/opt/jboss/bin/run.sh

CRON(/var/spool/cron/root) выглядит следующим образом:


# oracle MAIN sync
00 22 * * * /u02/scheduler/syncmain/1_shut.sh
00 06 * * * /u02/scheduler/syncmain/2_start.sh

# JBoss + PostgreSQL sync
00 22 * * * /u02/scheduler/syncpgsql/1_shut.sh
00 05 * * * /u02/scheduler/syncpgsql/2_start.sh

=========================================
=== ADONIS
=========================================


На этом сервере выполняется достаточно много задач по обслуживанию БД, поэтому необходимые нам по синхронизации задания мы прилепили к стандартным сервисным.

/u02/scheduler/task_orabackup.sh

#!/bin/bash

######################
# backup oracle main #
######################

cd /u02/scheduler/backup/oracle/main
./main.sh

############################
# MAIN from ADONIS to MARS #
############################

cd /u02/scheduler/sync/mars
./syncmars.sh

/u02/scheduler/task_orastat.sh

#!/bin/bash

#######################
# oracle analyze main #
#######################

cd /u02/scheduler/orastat/main
./main.sh

############################
# MAIN from ADONIS to MARS #
############################

cd /u02/scheduler/sync/mars
./syncmars.sh

/u02/scheduler/sync/mars/syncmars.sh

#!/bin/bash

cd /u02/scheduler/sync/mars
mkdir mars
umount mars
umount mars
umount mars
umount mars
umount mars
umount mars
umount mars
umount mars
su - oracle -c "cd /u02/scheduler/sync/mars; ./shutmain.sh"
mount 10.77.11.15:/u02/oradata/main mars -rw
cp -v /u02/oradata/main/* mars
umount mars
umount mars
umount mars
umount mars
umount mars
umount mars
umount mars
umount mars
su - oracle -c "cd /u02/scheduler/sync/mars; ./startmain.sh"

/u02/scheduler/sync/mars/shutmain.sh

#!/bin/bash

export ORACLE_SID=main
svrmgrl < style="font-weight:bold;">/u02/scheduler/sync/mars/shutdb.sql

connect internal
shutdown immediate
startup
shutdown normal

/u02/scheduler/sync/mars/startmain.sh

#!/bin/bash

export ORACLE_SID=main
svrmgrl < style="font-weight:bold;">/u02/scheduler/sync/mars/startdb.sql

connect internal
startup

CRON(/var/spool/cron/root) выглядит следующим образом:


00 22 * * 1,3,5 /u02/scheduler/task_pgbackup.sh
00 22 * * 1,3,5 /u02/scheduler/task_orabackup.sh
00 22 * * 2,4,6,7 /u02/scheduler/task_pgstat.sh
00 22 * * 2,4,6,7 /u02/scheduler/task_orastat.sh

=========================================
=== P01
=========================================


/u02/scheduler/syncmars/syncpgsql.sh

#!/bin/bash

cd /u02/scheduler/syncmars
su - postgres -c "cd /u02/scheduler/syncmars; pg_dump -v -C -F c -b -f pgsql.oblbase.p01.backup "oblbase""
su - postgres -c "cd /u02/scheduler/syncmars; psql -f rdbmars.sql -L rdbmars.log -h 10.77.11.15 postgres postgres"
su - postgres -c "cd /u02/scheduler/syncmars; pg_restore -d oblbase -h 10.77.11.15 -U postgres -v -F c pgsql.oblbase.p01.backup"
rm pgsql.oblbase.p01.backup
su - postgres -c "psql -d oblbase -c "vacuum" -h 10.77.11.15 postgres"
su - postgres -c "psql -d oblbase -c "analyze" -h 10.77.11.15 postgres"
su - postgres -c "psql -d postgres -c "vacuum" -h 10.77.11.15 postgres"
su - postgres -c "psql -d postgres -c "analyze" -h 10.77.11.15 postgres"

/u02/scheduler/syncmars/rdbmars.sql

DROP DATABASE oblbase;

CREATE DATABASE oblbase WITH OWNER = oblbase
ENCODING = 'UTF8' TABLESPACE = oblbase CONNECTION LIMIT = -1;

CRON(/var/spool/cron/tabs/root) выглядит следующим образом:


# sync PostgreSQL to MARS
00 23 * * * /u02/scheduler/syncmars/syncpgsql.sh


Читать далее