代码改变世界

Oracle Dmp文件简单信息收集

2020-08-26 15:22  那个,我  阅读(415)  评论(0编辑  收藏  举报

dmpinfo.sh

用来简单收集dmp文件包含的信息。请自行验证。

#!/bin/bash
# dmpinfo.sh
# Oracle Dmp文件简单信息收集
# 20200825 CYM
# 20201123 收集dmp表空间信息

# 判断参数$1存在
if [ x$1 != x ]; then
	# 打印文件名
	echo "导出文件: $1"
	filetype=$(strings $1 | head -3 | grep SYS_EXPORT)
	# EXPDP 文件信息收集
	if [ z$filetype != z ]; then
		ln=$(strings $1 | head -3 | awk '/SYS_EXPORT/{print NR}')
		echo "导出命令: expdp"
		ln11=$(strings $1 | head -$ln | tail -1 | cut -d '.' -f1)
		echo "登录用户:" $ln11
		ln2=$(strings $1 | head -$((ln + 1)) | tail -1)
		echo "导出操作系统: $ln2"
		ln3=$(strings $1 | head -$((ln + 2)) | tail -1)
		echo "导出实例名: $ln3"
		ln4=$(strings $1 | head -$((ln + 3)) | tail -1)
		echo "导出字符集: $ln4"
		ln5=$(strings $1 | head -$((ln + 4)) | tail -1)
		echo "导出版本: $ln5"
		ln12=$(strings $1 | head -$ln | tail -1 | awk -F '.' '{print $2}' | awk -F '_' '{print $3}')
		echo "导出级别:" $ln12
		# 如果是SCHEMA级别导出,则输出导出的SCHEMAS
		if [ $ln12 = SCHEMA ]; then
			echo ---------------------
			echo SCHEMAS=$(strings $1 | grep 'IN (' | sed 's/.*IN \(.*\)/\1/g')
			echo ---------------------
		fi
	else
		# EXP 文件信息收集
		echo "导出命令: exp"
		ln1=$(strings $1 | head -1)
		echo "EXP 版本:" $ln1
		# 用户判断
		ln2=$(strings $1 | head -2 | tail -1)
		echo "登录用户: ${ln2:1}"
		if [ ${ln2:0:1} = "U" ]; then
			echo "特殊权限: 无"
		elif [ ${ln2:0:1} = "D" ]; then
			echo "特殊权限: exp_full_database 或 DBA"
		fi
		#表空间判断
		echo 表空间:`strings $1 | grep ' TABLESPACE ' |sed -r 's/.*"(.+)".*/\1/'|sort|uniq`
		
        # 导出对象判断
		ln3=$(strings $1 | head -3 | tail -1)
		if [ $ln3 = "RTABLES" ]; then
			echo "导出级别: TABLES"
			# 输出包含的表
			echo ---------------------
			echo "TABLES=$(strings $1 | grep -i 'CREATE TABLE' | awk '{print $3}' | sort | uniq | awk BEGIN{RS=EOF}'{gsub(/\n/,",");print}')"
			echo ---------------------
		elif [ $ln3 = "RUSERS" ]; then
			echo "导出级别: OWNERS"
			# 输出包含的OWNERS
			echo ---------------------
			OWNERS=$(strings $1 | head -500 | grep '^CONNECT ' | sort | uniq | awk '{print $2}' | awk BEGIN{RS=EOF}'{gsub(/\n/,",");print}')
			if [ ! $OWNERS ]; then
				echo "OWNERS=${ln2:1}"
			else
				echo "OWNERS=$OWNERS"
			fi
			echo ---------------------
		elif [ $ln3 = "RENTIRE" ]; then
			echo "导出级别: FULL=Y"
		fi
	fi
else
	echo ""
	echo "Usage: $0 filename"
	echo "说明:1.脚本不主动判断是否Oracle导出文件"
	echo "     2.不支持多文件信息同时收集"
fi

效果大概如下:

  • EXP 表级导出
[oracle@oracle ~]$ ./dmpinfo.sh scott_tables.dmp
导出文件: scott_tables.dmp
导出命令: exp
EXP 版本: TEXPORT:V11.02.00
导出用户: SYSTEM
特殊权限: exp_full_database 或 DBA
导出级别: TABLES
---------------------
TABLES="DEPT","EMP"
---------------------
  • EXP 用户级导出
[oracle@oracle ~]$ ./dmpinfo.sh cym.dmp              
导出文件: cym.dmp
导出命令: exp
EXP 版本: TEXPORT:V11.02.00
导出用户: CYM
特殊权限: 无
导出级别: OWNERS
---------------------
OWNERS=CYM
---------------------
  • EXPDP 表级导出
[oracle@oracle ~]$ ./dmpinfo.sh expdp_tables.dmp             
导出文件: expdp_tables.dmp
导出命令: expdp
导出用户: "SYSTEM"
导出操作系统: x86_64/Linux 2.4.xx
导出实例名: orcl
导出字符集: AL32UTF8
导出版本: 11.02.00.04.00
导出级别: TABLE
  • EXPDP 用户级导出
[oracle@oracle ~]$ ./dmpinfo.sh expdp_schemas.dmp 
导出文件: expdp_schemas.dmp
导出命令: expdp
导出用户: "SYSTEM"
导出操作系统: x86_64/Linux 2.4.xx
导出实例名: orcl
导出字符集: AL32UTF8
导出版本: 11.02.00.04.00
导出级别: SCHEMA
---------------------
SCHEMAS=('CYM','SCOTT')
---------------------