数据泵使用笔记与相关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的内容,可为单行或多行