数据泵使用笔记与相关shell

数据泵特性简介

性质
与RMAN物理备份文件不同,数据泵只是在数据层面的逻辑备份/恢复或者叫导出/导入工具

适用范围
同机异库、异机异库、跨平台导出/导入(windows与linux平台数据互导)

特点
与RMAN对平台、Oracle补丁版本都要求一致不同,数据泵使用更灵活
1直接导出/入全库 full=y
2按用户 schemas=nc50
3表空间 tablespaces=nc_data01
4表 tables=fczl,crm_bd_house
5自定义查询
6也可只导出表结构
7加并行参数进行
8常用的是导全库、按用户、按表、按查询条件等,按表空间的不常用,因为生产环境表空间的数据文件中可能还存有其他表空间的数据
会在导入时会出现依赖其他表空间而失败

基本语法
expdp scott/tiger directory=dump_dir dumpfile=example.dmp
[full=Y/N] -->全库,默认为N
[tablespaces=#] -->指定表空间(导出多个用逗号分割)
[tables=#] -->指定表(导出多个用逗号分割)
[query=#] -->查询结果集
[parallel=#] -->并行
[logfile=#] -->存储命令行中日志内容

impdp scott/tiger directory=dump_dir dumpfile=example.dmp
[full=Y/N] -->全库,默认为N
[tables=#] -->指定表(导出多个用逗号分割)
[query=#] -->查询结果集
[parallel=#] -->并行
[logfile=#] -->存储命令行中日志内容
[remap_tablespace=#1:#2] -->将原表空间#1内容转存到当前库的表空间#2中
[remap_tablespace=#1:#2] -->将要导入对象的原用户#1替换为当前库的用户#2

 

使用步骤
创建磁盘目录(检查空间、权限) -> 数据库中创建目录对象与磁盘目录关联 -> 授权导出/入用户对目录对象的读写权限

1创建磁盘目录
SQL> ho mkdir -p /ora/dump

2创建目录对象与磁盘路径相关联,导入/出文件、日志文件都存储在此路径中
SQL> create directory dump_dir as '/ora/dump';
Directory created.

3授权用户读写权限
SQL> grant read,write on dump_dir to scott;
grant read,write on dump_dir to scott

4查看目录对象
SQL> select directory_name,directory_path from dba_directories;

自动导出并自动恢复到异机的shell示例
#!/bin/bash
cd /home/oracle
cat <<Help
Use for export schema data with expdp tool
Help

#仿c#/java语言定义枚举函数,用于将字符转为数字便于记忆
function enum()
{
declare -i enum_num=0
case $1 in
"get_dumpdir")
enum_num=1
;;
"exec_expdp")
enum_num=2
;;
esac
return $enum_num
}

#自定义函数执行不同情况下的sqlplus
function execsqlplus()
{
enum $1
case $? in
"1")
sqlstat="select directory_path from dba_directories where
directory_name='EXPDP_DUMP';"
;;
"2")
sqlstat="ho expdp scott/tiger directory=expdp_dump dumpfile=scott_schema.dmp schemas=scott"
;;
esac

sqlplus -s / as sysdba > result.log <<EOF
set heading off feedback off
${sqlstat}
EOF
}

execsqlplus get_dumpdir

dumpdir=`cat result.log | grep '^[^$]'`

#检查目录不存在则创建并授权
if [ ! -d $dumpdir ];then
mkdir $dumpdir
chmod 777 $dumpdir
echo "mkdir"
fi

#检查目录写权限
if [ ! -w $dumpdir ];then
chmod +w $dumpdir
fi

#导出前删除原文件
dumpfile="$dumpdir"/scott_schema.dmp
if [ -f $dumpfile ];then
rm -f $dumpfile
fi

#开始导出
execsqlplus exec_expdp

 

 

shell与sqlplus交互情景:
shell中使用sqlplus两种方式:

1直接使用sqlplus命令,适用范围:

a取标量数值(如统计行数)
#!/bin/bash
sqlplus -s / as sysdba <<EOF
col sqlcnt new_value bashcnt #此句为将sqlplus变量与shell变量关联起来
select count(*) sqlcnt from dba_segments; #此时将值赋给sqlcnt,也同时赋给了与其关联的bashcnt
exit bashcnt
EOF

SQL>echo $? --此处的$?即为exit bashcnt的值,这种方式只能是获取数值,因为exit后只通跟正负整数,不能跟小数或字符

b取多行多列数
#!/bin/bash
sqlplus -s / as sysdba > result.log <<EOF
set heading off feedback off
select * from dba_segments;
exit
EOF

通过数据重定向>将结果集的列名信息过滤,只将纯数据写入result.log文件中
再通过读取result.log取出结果集
第一种:
result=`cat result.log | grep ^[^$]` --过滤空行后其他行
for a in $result;do
echo $a
done

第二种
cat result.log | while read line
do
echo $line
done

第三种
declare -i resultcnt
resultcnt=`cat result.log | grep ^[^$] | wc -l` --过滤空行后的总行数

for((i=1;i<=$resultcnt;i++));do
a=`cat result.log | sed -n ''${i}'p'` --在字符串中引用变量:'${i}'或''$i''
echo $a
done

2将sqlplus语句整体包含在``字符中,用在取字符
result=`sqlplus -s / as sysdba <<EOF
select directory_path from dba_directories where directory_name='EXPDP_DUMP';
exit 0
EOF`

echo $result --$result即为directory_path的内容,可为单行或多行

 

posted on 2013-07-03 00:46  doclaim  阅读(402)  评论(0编辑  收藏  举报