• Oracle表或分区导出脚本


    有兴趣的同学可以帮我测试一下脚本,有什么问题请回复,以便我继续改进!

    脚本用途:在Oracle10g或以上版本中导出指定表或指定分区,并压缩导出文件。

    脚本使用前提:

         1. 数据库必须支持expdp,因为脚本调用的是expdp

         2. 需要先在数据库里建立一个名为EXPDPDIR的目录,并把读写权限授予public或system

    脚本使用说明:

       1. 脚本可以直接执行,也适合放在cronjob中

       2. expdp使用system用户导出,如果需要使用其它用户导出,需要修改脚本中的ORA_USER设置。system用户密码需要根据实际环境修改PASSWD。

         3. Oracle的环境变量ORACLE_HOME,PATH和ORACLE_SID需要根据实际环境修改

         4. DUMP_DIR参数需要与数据库目录EXPDPDIR的设置保持一致

       

    #!/usr/bin/bash
    ######################################################################
    ##  Environment. change as needed
    ######################################################################
    export ORACLE_HOME="/app/oracle/product/10.2"
    export PATH=${ORACLE_HOME}/bin:$PATH
    export ORACLE_SID="ora10g"

    ######################################################################
    ##  Parameters, change as needed
    ######################################################################
    LOGDIR="/app/oracle/log"
    ## Expdp directory,the same directory as created in database
    DUMP_DIR="/app/oracle/datapump"
    ORA_DUMPDIR="EXPDPDIR"
    ## Expdp user
    ORA_USER="SYSTEM"
    ## Password for expdp user
    PASSWD="SYSTEM"
    CURRDATE=$(/usr/bin/date '+%Y%m%d')

    ######################################################################
    ## Get commands path
    ######################################################################                                              
    EXPDP=${ORACLE_HOME}/bin/expdp
    GZIP=/usr/bin/gzip
    GREP=/usr/bin/grep
    SQLPLUS=${ORACLE_HOME}/bin/sqlplus
    TOUCH=/usr/bin/touch
    RM=/usr/bin/rm

    ######################################################################
    ##  Funcations
    ######################################################################

    ######################################################################
    ## display Copyright information
    ######################################################################
    printInfo() {
        echo "Script to export table or partition."
        echo "Copyright (C) 2011-2012  Yu jun / ERG-Beijing Ltd."
    }

    ######################################################################
    ## display help
    ######################################################################
    printHelp()
    {
      echo
      echo "The purpose of the script is to export table or partion from a"
      echo "give schema using datapump and compress the export file. The "
      echo "script use \"system\" to export table, you need to change the"
      echo "user's password as needed(The password is in the script)."
      echo "Prerequisite: "
      echo "  1. The version of the Oracle must be 10g or above."
      echo "  2. You need create a directory named \"EXPDPDIR\" in database "
      echo "     and give read and write permission to system or public."
      echo
      echo "Usage: $(basename $0) -u <Owner> -t <Table> [-p <Partition>]"
      echo
      echo " -u Table owner."
      echo " -t Table name."
      echo " -p Patition name. If do not use -p options,the whole table will"
      echo "    be exported."
      echo
      echo "Example : $(basename $0) -u scott -t emp -p p1"
      echo "This will export partion p1 from table scott.emp then"
      echo "compress the export file."
      echo
      echo "Exit Values: "
      echo "             96    Can not create lock file"
      echo "             97    Another instance is running"
      echo "             98    Bad user to run the script"
      echo "             99    Bad options"
      echo "             100   Export file exist"
      echo "             101   Expdp fail"
      echo "             102   Export file compress fail"
      echo "             103   Exit with trap signal"
      echo
    }

    ######################################################################
    ## Checks command line options (pass $@ as parameter)
    ######################################################################
    # Checks command line options (pass $@ as parameter).
    checkOptions() {
        if [ $# -eq 0 ]; then
            printInfo
            printHelp
            exit 99
        fi

        while getopts u:t:p: OPT $@; do
                case $OPT in
                    u) # table owner
                       OWNER=$OPTARG
                       ;;
                    t) # table name
                       TAB_NAME=$OPTARG
                       ;;
                    p) # partition name
                       PART_NAME=$OPTARG
                       ;;
                    ?) printInfo
                       printHelp
                       exit 99
                       ;;
                esac
        done
        if [ -z $OWNER ] || [ -z ${TAB_NAME} ]; then
            printInfo
            printHelp
            exit 99
        fi
        if [ -z $PART_NAME ]; then
          LOGFILE=$LOGDIR"/expdp_"$OWNER"_"${TAB_NAME}".log"
        else
          LOGFILE=$LOGDIR"/expdp_"$OWNER"_"${TAB_NAME}"_"${PART_NAME}".log"
        fi
    }

    ######################################################################
    ## lock the script against parallel run
    ######################################################################
    lock() {
      ## lockfile name
      if [ -z ${PART_NAME} ] ; then
        LOCKF="/tmp/expdp_"${OWNER}"_"${TAB_NAME}".lck"
      else
        LOCKF="/tmp/expdp_"${OWNER}"_"${TAB_NAME}"_"${PART_NAME}".lck"   
      fi

      ## create lock file
      if [ -f $LOCKF ]; then
        echo "$(date)  [Error] : Another instance of the script is running."
        exit 97
      fi
      $TOUCH $LOCKF
      if [ $? -ne 0 ]; then
        echo "$(date)  [Error] : Can not create lock file." 
        exit 96
      fi
    }

    ######################################################################
    ## Export data from database and compresss the dumpfile
    ######################################################################
    expdp_comp_tab()
    {
      ####################################################################
      ## Function:
      ##    Export data from oracle and compress the dump file
      ##
      ## Prerequisite:
      ##    Create a directory on database for datapump and grant read
      ##    and write permission to public.
      ##
      ## Input Values:
      ##    NULL
      ## Output: (two files)
      ##    1. Export file, located on DataPummp Directory with name
      ##       owner_table_partition.dmp
      ##    2. Log file, located on DataPummp Directory with name
      ##       owner_table_partition.log
      ####################################################################
      ## for expdp parameter "tables"
      if [ -z ${PART_NAME} ] ; then
        EXP_TAB_PART=${OWNER}"."${TAB_NAME}
      else
        EXP_TAB_PART=${OWNER}"."${TAB_NAME}":"${PART_NAME}   
      fi
      ## for expdp parameter "dumpfile"
      if [ -z ${PART_NAME} ] ; then
        DUMP_FILE_NAME=${OWNER}"_"${TAB_NAME}"_"$CURRDATE".dmp"
      else
        DUMP_FILE_NAME=${OWNER}"_"${TAB_NAME}"_"${PART_NAME}"_"$CURRDATE".dmp"
      fi
      ## for expdp parameter "logfile"
      if [ -z ${PART_NAME} ] ; then
        DUMP_LOG_NAME=${OWNER}"_"${TAB_NAME}"_"$CURRDATE".log"
      else
        DUMP_LOG_NAME=${OWNER}"_"${TAB_NAME}"_"${PART_NAME}"_"$CURRDATE".log"
      fi
      ## the compressed dumpfile name
      COMP_DUMP_FILE=${DUMP_FILE_NAME}".gz"
      ## the full dumpfile name
      FULL_DUMP_FILE=${DUMP_DIR}"/"${DUMP_FILE_NAME}
      ## the full logfile name
      FULL_DUMP_LOG=${DUMP_DIR}"/"${DUMP_LOG_NAME}
      ## the full compressed dumpfile name
      FULL_COMP_DUMP=${DUMP_DIR}"/"${COMP_DUMP_FILE}
      if [ -f ${FULL_DUMP_FILE} ] ; then     ## Dumpfile exists
        echo "$(date)  [Error] : Dumpfile ${FULL_DUMP_FILE} exist!" ## Give a warning
        return 100
      elif [ -f ${FULL_COMP_DUMP} ] ; then
        echo "$(date)  [Error] : Dumpfile ${FULL_COMP_DUMP} exist!" ## Give a warning
        return 100      
      fi
      ## Export a given table or partition
      $EXPDP ${ORA_USER}/${PASSWD} directory=${ORA_DUMPDIR} dumpfile=${DUMP_FILE_NAME} logfile=${DUMP_LOG_NAME} tables=${EXP_TAB_PART} > /dev/null 2>&1
      ## If expdp succeed or not, using datapump logfile for judgement
      ## not using exit code because of oracle bug 
      MESG=$($GREP "successfully completed" ${FULL_DUMP_LOG})
      if [ $? -eq 0 ] ; then
        echo "$(date)  [Info] : Expdp successfully completed for table ${EXP_TAB_PART}!"
      else
        echo "$(date)  [Error] : Expdp failed for table ${EXP_TAB_PART}!"
        echo "          Please check logfile ${FULL_DUMP_LOG}!"
        return 101
      fi
      ## Compress the dump file
      ERROR=$($GZIP ${FULL_DUMP_FILE} 2>&1)
      if [ $? -eq 0 ] ; then
        echo "$(date)  [Info] : Compress successfully completed for file ${FULL_DUMP_FILE}!"
      else
        echo "$(date)  [Error] : Compress failed for file ${FULL_DUMP_FILE}!"
        echo "Error Messages:"
        echo "*** : "$ERROR
        return 102
      fi 
    }

    ######################################################################
    ## Main Program
    ######################################################################
    ##  Check command line options
    checkOptions $@

    ## Output to logfile, if want to send output to screen, comment out the following line
    #exec 1>>$LOGFILE 2>&1

    ## Script start
    echo ==== Script $0 started on $(date) ====

    ##  The script need to be run as user "oracle"
    CUSER=$(id |cut -d "(" -f2 | cut -d ")" -f1)
    if [ "$CUSER" != "oracle" ] ; then
      echo "$(date)  [Error] : The script need to be run as user \"oracle\""
      exit 98
    fi

    ## lock the script against parallel run
    lock

    ## trap signal
    trap '$RM $LOCKF' 0
    trap 'exit 103' 1 2 3 15

    ## Export table partition and compress the dump file
    expdp_comp_tab

    ## Check the result
    REXP=$?

    if [ "$REXP" = "0" ]; then
      LOGMSG="Script $0 ended successfully"
    else
      LOGMSG="Script $0 ended in error"
    fi
    echo ==== $LOGMSG on $(date) ====
    echo

    ## exit
    exit $REXP

  • 相关阅读:
    简单数学问题
    MFC 注册表编程
    Windows多线程端口扫描
    MFC Socket双向通信
    凯撒加密
    单片机滤波
    大数素性检验
    大数加法乘法
    Unsafe Code
    委托
  • 原文地址:https://www.cnblogs.com/cqubityj/p/2319734.html
Copyright © 2020-2023  润新知