пятница, 13 марта 2015 г.

importdp.sh - вариант без FROM_USERNAME

Формат команды
./import.sh <ИМЯ НОВОЙ СХЕМЫ> <ФАЙЛ ДАМПА>
Данная редакция скрипта "самостоятельно узнаёт" "старое" имя схемы, которое скрывается в параметре OWNER_NAME в файле дампа.
Может работать только с дампами, содержащими лишь одну схему!
Перед импортом создает схему с предустановленным в параметре NEW_SCHEMA_PASSWD паролем.

cat importdp.sh
#!/bin/sh

# Set the parameters first
# -------------------------------------
# system user name
SYSTEM=<DBA_USERNAME>
# system user password
PASSWD=<DBA_PASSWORD>

# Instance name (if any)
URL=@<ORACLE_SID>

# New schema password
NEW_SCHEMA_PASSWD=<NEW_SCHEMA_PASSWD>

# Set the ORACLE_HOME variable to find an "imp" utility
# ORACLE_HOME=/usr/oracle
# -------------------------------------

help() {
  echo "-------------------------------------"
  echo "Logical Database restore utility v0.1"
  echo "-------------------------------------"
  echo "USAGE:"
  echo "./importdp.sh <TO_USERNAME> <FILE_NAME>"
  echo 
  echo "EXAMPLE:"
  echo "./importdp.sh LNXTEST23 lnx.dmp"
}

if [ $# -eq 0 ] ; then
  help;
  exit 1;
fi

TO_USERNAME=$1
FILENAME=$2
LOGFILE="restore_$TO_USERNAME.log"

if [ "$FILENAME" == "" ] ; then
  FILENAME="expdat.dmp";
fi  

if [ "$TO_USERNAME" == "" ] ; then
  TO_USERNAME=$FROM_USERNAME;
fi  

if [ "$ORACLE_HOME" != "" ] ; then
  CMD="$ORACLE_HOME/bin/impdp";
else
  CMD="impdp";  
fi  

if [ ! -f $FILENAME ] ; then
  echo "ERROR:"
  echo "File $FILENAME does not exist."; 
  exit 1;
fi

# block_150312_2116(begin)
# d.aryshtaev@bftcom.com, 13.03.2015 02:31 IRKT
# Проверка наличия новой схемы (импорт будет выполнен только в случае, если новой схемы в экземпляре Oracle нет):
daScr=/tmp/imp_150312_2100.sql
echo SET PAGESIZE 0\;>$daScr
echo select count\(\*\) from dba_users where username=upper\(\'$TO_USERNAME\'\)\;>>$daScr
echo exit\;>>$daScr
daUsrCnt=`sqlplus -S / as sysdba @$daScr`
if [ $daUsrCnt == 0 ]; then
  # block_150312_2116_A(begin)
  # Создаем схему до импорта, чтобы сразу же задать ей пароль [потому что мы ленимся :-) ]:
  echo create user $TO_USERNAME identified by $NEW_SCHEMA_PASSWD\;>$daScr
  echo grant connect\,resource to $TO_USERNAME\;>>$daScr
  echo grant select on v_\$locked_object to $TO_USERNAME\;>>$daScr
  echo GRANT SELECT ANY DICTIONARY TO $TO_USERNAME\;>>$daScr
  echo exit \;>>$daScr
  sqlplus -S / as sysdba @$daScr

  # block_150312_2116_B(begin)
  # Вытаскиваем OWNER_NAME из дампа и запоминаем значение в переменной FROM_USERNAME:
  daDDLfile=tmp_ddl_`date +%y%m%d_%H%M%S`.txt
  $CMD $SYSTEM/$PASSWD$URL SILENT=ALL NOLOGFILE=Y DIRECTORY=BACKUP_DIR DUMPFILE=$FILENAME SQLFILE=$daDDLfile
  daStrFromDDL=`cat $daDDLfile|grep "CREATE USER"`
  rm $daDDLfile
  FROM_USERNAME=${daStrFromDDL:14:$(expr `expr index "${daStrFromDDL:14}" \"` - 1)}
  # block_150312_2116_B(end)
  # block_150312_2116_A(end)

echo "-----------------------------------------"
echo "Restoring from $FROM_USERNAME to $TO_USERNAME using dump $FILENAME ..."
echo "-----------------------------------------"

export NLS_DATE_FORMAT="YYYY-MM-DD" 
export NLS_TIMESTAMP_FORMAT="YYYY-MM-DD HH24:MI:SS"

$CMD $SYSTEM/$PASSWD$URL SCHEMAS=$FROM_USERNAME DIRECTORY=BACKUP_DIR REMAP_SCHEMA=$FROM_USERNAME:$TO_USERNAME TRANSFORM=OID:N DUMPFILE=$FILENAME LOGFILE=$LOGFILE
else
  # Если новая схема уже существует, то сообщаем об этом пользователю и не выполняем импорт:
  echo Schema $TO_USERNAME already exists.
fi
rm $daScr
# block_150312_2116(end)

Комментариев нет:

Архив