db_expdp_data_v1.sh導數腳本分享
2025-08-06 22:44 瀟湘隱者 閱讀(32) 評論(0) 收藏 舉報腳本介紹
在日常運維工作中,經常會有使用數據泵導數的需求.遇到這種需求,經常需要手寫一個導數的腳本或者去找一個導數腳本的例子進行修改. 這樣重復的工作,雖然沒有很復雜,突然有一天意識到應該避免這樣重復、瑣碎、繁雜的工作. 工作就要提升效率與自動化,可以優化的流程和方法,盡量優化,能簡單的盡量簡單.哪怕簡潔一點點。于是有了這樣一個腳本.
腳本變量
DUMP_DIR 設置數據泵的導出的路徑. 根據實際情況調整
DB_USER 訪問數據庫的賬號,可以不設置(如果啟用操作系統認證方式),默認不設置
DB_PASSWORD DB_USER指定賬戶的密碼,可以不設置(如果啟用操作系統認證方式),默認不設置
PARALLEL_NUM expdp的并行度
LOG_FILE 此變量賦值在usage函數的后面進行重新賦值..
上面變量除了DUMP_DIR需要設置外,其它變量幾乎不用設置.當然每個人的實際環境可能有所不同.根據實際情況進行調整.
腳本參數
腳本有三個參數:
./db_expdp_data_v1.sh <ORACLE_SID>|<PDB_NAME> <DUMP_DIR> [<SCHEMA_NAME>]
-
第一個參數指定<ORACLE_SID>或<PDB_NAME>.
因為在筆者手頭維護的環境絕大部分是ORACLE 19c的多租戶環境,有些環境甚至是多實例環境. 有些是非多租戶環境. 當你使用<PDB_NAME>時就導出PDB的數據. -
第二個參數指定<DIR_NAME>
指定DIRECTORY_NAME, 如下所示,腳本中會在指定的數據庫或PDB_NAME中創建一個名字為<DIR_NAME>的目錄
# 創建DUMP DIRECTORY目錄
# sqlplus -s "${DB_USER}/${DB_PASSWORD}@DB_NAME" << EOF
sqlplus -s "/ as sysdba" <<EOF
CREATE OR REPLACE DIRECTORY ${DIR_NAME} AS '${DUMP_DIR}';
EOF
- 第三個參數為可選參數, 如果未指定的話,則導出整個數據庫,而不是按SCHEMA_NAME導數.
腳本源碼
#!/sbin/sh
####!/bin/bash
#########################################################################################
# #
# This script uses expdp to export the whole database or pdb database #
# #
#########################################################################################
# #
# ScriptName : db_expdp_data_v1.sh #
# Author : 瀟湘隱者 #
# CreateDate : 2025-01-27 #
# Email : kerry2008code@qq.com #
#***************************************************************************************#
# 變量配置 #
#---------------------------------------------------------------------------------------#
# DUMP_DIR 設置數據泵的導出的路徑 #
# DB_USER 訪問數據庫的賬號,可以不設置(如果啟用操作系統認證方式),默認不設置 #
# DB_PASSWORD DB_USER指定賬戶的密碼 #
# PARALLEL_NUM expdp的并行度 #
# LOG_FILE 此變量賦值在usage函數的后面進行賦值. #
# COMPRESSION_WAY 導出壓縮的方式 #
#---------------------------------------------------------------------------------------#
# 參數說明 #
#---------------------------------------------------------------------------------------#
# $1 <ORACLE_SID>|<PDB_NAME> #
# $2 <DIR_NAME> mandatory parameter #
# $3 <SCHEME_ANME,SCHEME_ANME> 可選參數 #
# #
#---------------------------------------------------------------------------------------#
# Usage: #
# ./db_expdp_data_v1.sh <ORACLE_SID> <DUMP_DIR> <SCHEMA_NAME> #
# Example: #
# ./db_expdp_data_v1.sh gsp DP #
# 多租戶環境, 可以這么做: #
# 例如,需要導出gspprod這個PDB數據庫,那么可以執行下面命令: #
# ./db_expdp_data_v1.sh gspprod DP #
# 導出gspprod這個數據庫下的gspdata這個SCHEMA下的數據 #
# ./db_expdp_data_v1.sh gspprod DP gspdata #
#***************************************************************************************#
# Version Modified Date Description #
#***************************************************************************************#
# V.1.0 2025-01-27 創建此腳本 #
# V.1.1 2025-02-10 增加變量判斷數據庫版本 #
# V.1.2 2025-04-06 增加按SCHEMA_NAME導出數據 #
#---------------------------------------------------------------------------------------#
#注意事項: #
# 1. 此腳本適用于多實例環境,第一個參數可以指定ORACLE_SID或PDB NAME #
# 2. 在使用前,請檢查/設定變量ORACLE_HOME,DUMP_DIR, 如果數據庫使用系統認證方式登錄 #
# 則無須設置變量DB_USER,DB_PASSWORD #
# 3. 注意根據實際情況調整函數create_dump_dir中登錄數據庫的方式 #
# 4. 注意根據實際情況調整函數expdp_dump_file中鏈接數據庫的方式 #
# 5. 此腳本在HP-UX和Linx(RHEL)是適用的,但是不能保證所有平臺都OK,使用前請測試驗證 #
#########################################################################################
# 注意,如果環境變量有設置ORACLE_HOME,此處可以不用指定ORACLE_HOME.在多實例,多數據庫環境最好指定.
#export ORACLE_HOME=/opt/oracle19c/product/19.3.0/db_1
DUMP_DIR=/db_backup/dp_dump
DB_USER="*****"
DB_PASSWORD="*****"
DB_NAME="******"
PARALLEL_NUM=4
EXP_DATE=$(date +%Y%m%d_%H%M)
COMPRESSION_WAY='DATA_ONLY' # DATA_ONLY,METADATA_ONLY,ALL,NONE
DB_VERSION='E' # E表示企業版, S表示標準版 O表示其它
LOG_FILE='${DUMP_DIR}/expdp_${DB_NAME}_${EXP_DATE}.log'
SCHEMA_NAME=''
usage()
{
echo "Usage: `basename $0` <ORACLE_SID>|<PDB_NAME> [<SCHEMA_NAME>] "
echo "eg: `basename $0` gsp dp test1,test2,test3"
echo "eg: `basename $0` gsp dp"
exit 1
}
if [ $# -eq 2 ]; then
DB_NAME=$1
DIR_NAME=$2
LOG_FILE=${DUMP_DIR}/expdp_${DB_NAME}_${EXP_DATE}.log
elif [ $# -eq 3 ]; then
DB_NAME=$1
DIR_NAME=$2
SCHEMA_NAME=$3
LOG_FILE=${DUMP_DIR}/expdp_${DB_NAME}_${EXP_DATE}.log
else
echo "The number of script parameters is incorrect"
usage
fi
check_env()
{
if [ ! -d "${DUMP_DIR}" ];then
echo "the path ${DUMP_DIR} did not exist, please check it"
exit 1
fi
DB_EXIST=`ps -ef | grep ora_pmon_${DB_NAME} | grep -v grep | wc -l`
if [ $DB_EXIST = 1 ];then
#多實例環境下,有些環境,需要指定ORACLE_SID
export ORACLE_SID=${DB_NAME}
else
#如果多租戶環境,這個是PDB
#IS_PDB_EXIST=`sqlplus -s ${DB_USER}/${DB_PASSWORD} <<EOF
IS_PDB_EXIST=`sqlplus -s "/ as sysdba" <<EOF
SET HEADING OFF
SELECT COUNT(*) VALUE FROM CDB_PDBS WHERE PDB_NAME=UPPER('${DB_NAME}');
EOF`
if [ $IS_PDB_EXIST -eq 1 ];then
export ORACLE_PDB_SID=${DB_NAME}
else
echo "the pdb ${DB_NAME} does not exist, please check it"
exit 1
fi
fi
# 查詢數據庫版本信息
#VERSION_INFO=$(sqlplus -silent $ORA_USER/$ORA_PASSWORD as sysdba <<EOF
VERSION_INFO=$(sqlplus -s " / as sysdba " <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT banner FROM v\$version WHERE rownum = 1;
EXIT;
EOF
)
# 檢查是否為企業版
if [[ $VERSION_INFO =~ "Enterprise Edition" ]]; then
DB_VERSION='E'
elif [[ $VERSION_INFO =~ "Standard Edition" ]]; then
DB_VERSION='S'
else
DB_VERSION='O'
fi
#判斷schema是否存在,此處暫不實現,由執行腳本的人控制.
}
create_dump_dir()
{
# 創建DUMP DIRECTORY目錄
# sqlplus -s "${DB_USER}/${DB_PASSWORD}@DB_NAME" << EOF
sqlplus -s "/ as sysdba" <<EOF
CREATE OR REPLACE DIRECTORY ${DIR_NAME} AS '${DUMP_DIR}';
EOF
SQL_STATUS=$?
if [ $SQL_STATUS -ne 0 ]; then
echo "create dump directory failed, please check it!"
exit 1
else
echo "create dump directory succesful."
fi
}
expdp_dump_file()
{
if [ ${DB_VERSION} == "E" ]; then
if [ -z $SCHEMA_NAME ]; then
#系統認證方式
EXP_CMD=`$ORACLE_HOME/bin/expdp \'/ as sysdba \' directory=${DIR_NAME} full=y dumpfile=${DB_NAME}_${EXP_DATE}_%U.dmp filesize=8G parallel=${PARALLEL_NUM} logfile=${DB_NAME}_${EXP_DATE}.log COMPRESSION=${COMPRESSION_WAY}`
#非系統認證方式
#EXP_CMD=`$ORACLE_HOME/bin/expdp ${DB_USER}/${DB_PASSWORD}@${DB_NAME} directory=${DIR_NAME} full=y dumpfile=${DB_NAME}_${EXP_DATE}_%U.dmp filesize=8G parallel=${PARALLEL_NUM} logfile=${DB_NAME}_${EXP_DATE}.log COMPRESSION=ALL`
else
#系統認證方式
EXP_CMD=`$ORACLE_HOME/bin/expdp \'/ as sysdba \' directory=${DIR_NAME} schemas=${SCHEMA_NAME} dumpfile=${DB_NAME}_${EXP_DATE}_%U.dmp filesize=8G parallel=${PARALLEL_NUM} logfile=${DB_NAME}_SCHEMA_${EXP_DATE}.log COMPRESSION=${COMPRESSION_WAY}`
#非系統認證方式
#EXP_CMD=`$ORACLE_HOME/bin/expdp ${DB_USER}/${DB_PASSWORD}@${DB_NAME} directory=${DIR_NAME} schema=${SCHEMA_NAME} dumpfile=${DB_NAME}_${EXP_DATE}_%U.dmp filesize=8G parallel=${PARALLEL_NUM} logfile=${DB_NAME}_SCHEMA_${EXP_DATE}.log COMPRESSION=${COMPRESSION_WAY}`
fi
else
if [ -z $SCHEMA_NAME ]; then
#系統認證方式
EXP_CMD=`$ORACLE_HOME/bin/expdp \'/ as sysdba \' directory=${DIR_NAME} full=y dumpfile=${DB_NAME}_${EXP_DATE}.dmp filesize=8G logfile=${DB_NAME}_${EXP_DATE}.log`
#非系統認證方式
#EXP_CMD=`$ORACLE_HOME/bin/expdp ${DB_USER}/${DB_PASSWORD}@${DB_NAME} directory=${DIR_NAME} full=y dumpfile=${DB_NAME}_${EXP_DATE}.dmp filesize=8G logfile=${DB_NAME}_${EXP_DATE}.log`
else
#系統認證方式
EXP_CMD=`$ORACLE_HOME/bin/expdp \'/ as sysdba \' directory=${DIR_NAME} schemas=${SCHEMA_NAME} dumpfile=${DB_NAME}_${EXP_DATE}.dmp filesize=8G logfile=${DB_NAME}_SCHEMA_${EXP_DATE}.log `
#非系統認證方式
#EXP_CMD=`$ORACLE_HOME/bin/expdp ${DB_USER}/${DB_PASSWORD}@${DB_NAME} directory=${DIR_NAME} schema=${SCHEMA_NAME} dumpfile=${DB_NAME}_${EXP_DATE}.dmp filesize=8G logfile=${DB_NAME}_SCHEMA_${EXP_DATE}.log`
fi
fi
echo "The export command:\n"
$EXP_CMD
if [ $? -eq 0 ]; then
echo "The data export was successful using expdp!"
else
echo "The data export was failed using expdp"
fi
}
main()
{
check_env
create_dump_dir
expdp_dump_file
}
# 執行主函數
main 2>&1 | tee ${LOG_FILE}
PS:有個讓人頭痛的問題,微信公眾號展示的代碼在格式上會部分亂掉,本人的代碼其實并沒有這么凌亂(如下部分截圖所示)。

掃描上面二維碼關注我
如果你真心覺得文章寫得不錯,而且對你有所幫助,那就不妨幫忙“推薦"一下,您的“推薦”和”打賞“將是我最大的寫作動力!
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.
浙公網安備 33010602011771號