oracle导入导出脚本的问题

zzn007 2012-06-28 04:44:13
我是新手,对oracle不熟悉,原来都是通过imp/exp 做导入导出。现在遇到难题了:

客户那边不允许使用imp/exp 做导入导出,只能使用脚本导入和导出,我这边只有SQLPLUS,使用它只能一个表一个表导出创建表的脚本,而且还带了用户和表空间什么的信息,
有没有可以一次性把表空间下所有表的创建表的脚本生成的?包括关键字、索引和触发器等等的?因为导出时带了这些信息,导入时表空间和用户更换了,就会导入失败的!

2,表里的数据能不能一次性导出脚本的?主要是我们的表非常多,而且之间数据有些关联,插入数据还有先后的,没有什么工具可以一次性生成这些脚本的?然后能保证我导入就可以一次性执行的?

这两个问题很急,老板又催,大侠给个解决方案吧!!!!
...全文
266 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
iqlife 2012-06-29
  • 打赏
  • 举报
回复
TOAD一连接,自动生成,用工具吧,支持导出导入
xiaozhuangfeng 2012-06-29
  • 打赏
  • 举报
回复
对了,上面的那个是内存库的,物理库的只要改下面部分就好:
f_getsql()
{

sqlplus -s ${dbname} >/dev/null <<!
spool sql_temp_$tablename.txt;
select column_name from user_tab_columns where table_name= upper('${tablename}') order by column_id;
spool off;
exit
!
if [ -f sql_temp_$tablename.txt ]; then
cat sql_temp_$tablename.txt|grep -v "COLUMN_NAME" |grep -v " *-" |grep -v " rows selected" |awk '{print $1}' > sql_temp1_$tablename.txt
sed -e '/^[[:space:]]*$/d' sql_temp1_$tablename.txt > sql_temp2_$tablename.txt
else
Sublog "Error :get the column of $tablename failed!"
exit
fi

fields=""
fields2=""
lv_line_num=`cat sql_temp2_$tablename.txt | wc -l`
lv_index=0

while read field
do
lv_index=`expr ${lv_index} + 1`
if [ ${lv_index} -eq ${lv_line_num} ]; then
fields=${fields}${field}"||""'|'"
fields2=${fields2}${field}
else
fields=${fields}${field}"||""'|'""||"
fields2=${fields2}${field}","
fi
done < sql_temp2_$tablename.txt

sql="select "${fields}" from ${tablename} "
echo $sql
echo "---sql"
#rm sql_temp_$tablename.txt sql_temp1_$tablename.txt sql_temp2_$tablename.txt
}
xiaozhuangfeng 2012-06-29
  • 打赏
  • 举报
回复
你可以写一个shell脚本:

#!/usr/bin/ksh
#作者:
######################################################################
#初始化配置信息
######################################################################
func_init(){
workdir=`pwd`
log_path="${workdir}/log"
cfgfile="${workdir}/cfg/baseinf.cfg"
downloadlogfile="${Workdir}/${log_path}/download.log"

src="${workdir}/src"

if [ ! -d ${log_path} ]; then
mkdir -p ${log_path}
fi

echo "" > ${downloadlogfile}

if [ ! -f ${logfile} ]; then
touch ${logfile}
fi

if [ ! -d ${src} ];then
mkdir -p ${src}
fi

rm -rf ${src}/*
}
######################################################################
#DESC : 记录日志
#USAGE: Log "content"
######################################################################

Sublog()
{
echo "[ `date '+%Y%m%d %H:%M:%S'` ] $*" | tee -a ${downloadlogfile}
}
######################################################################
#DESC : 得到配置文件信息
#USAGE:
######################################################################
GetCfg()
{
if [ $# -ne 3 ];then
print "Error!!Get config value failed!!($*)"
return 1
fi

tmpCfgFile="$1"
tmpKey="$2"
tmpValue=`cat ${tmpCfgFile}|grep "${tmpKey}"|grep -v "\["|head -n 1|awk -F "#" '{ print $1 }'|awk -F "=" '{ print $2 }'|tr -d " \t\n\r"`
eval $3="${tmpValue}"
return 0
}

######################################################################
#DESC : 通过给出的表名下载数据库中相同表名的数据
#USAGE:
######################################################################
f_getsql()
{
fields=""
fields2=""
lv_line_num=`cat ${workdir}/cfg/mem_tabStructure/$tablename.unl | wc -l`
lv_index=0

while read field
do
lv_index=`expr ${lv_index} + 1`
if [ ${lv_index} -eq ${lv_line_num} ]; then
fields=${fields}${field}"||""'|'"
fields2=${fields2}${field}
else
fields=${fields}${field}"||""'|'""||"
fields2=${fields2}${field}","
fi
done < ${workdir}/cfg/mem_tabStructure/$tablename.unl

sql="select "${fields}" from ${tablename} "

}

######################################################################
#DESC : 文件下载
#USAGE:
######################################################################
func_manage(){
GetCfg $cfgfile "DBNAME" dbname
GetCfg $cfgfile "DBTYPE" dbtype
GetCfg $cfgfile "TABFILE" tablelist
dbtype=`echo $dbtype|tr "[:upper:]" "[:lower:]"`

Sublog "=== begin download table from ${dbtype} phydb ==="
Sublog "DataBase : ${dbname}"

for tablename in `cat ${workdir}/cfg/$tablelist`
do
Sublog "begin download $tablename..."
f_getsql
sqlplus -s ${dbname} > /dev/null <<!
set serveroutput on
set feedback off
set trims on
set pagesize 0
set timing off
set lin 5000
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
spool src/$tablename.unl
$sql;
spool off
set serveroutput off
!
if [ "$?" -ne 0 ]; then
Sublog "download table ${tablename} failed!!!!!!!!!!!!!!!!!!"
else
Sublog "download table ${tablename} successfully"
fi

Sublog ""
done

}

main(){
#初始化环境
func_init
#处理文件
func_manage

}

main


这是我写过的一个,你只要在baseinf.cfg中配置DBNAME=ocs_mig/ocs_mig@userdb(根据你要的改)
tablelist.list配置你要下载的表名就ok
hupeng213 2012-06-29
  • 打赏
  • 举报
回复
可以考虑使用 oracle sql developer,反正免安装的,拷贝过去就可以用

1、设置导出分隔符
工具--首选项--数据库--卸载/查看DDL选项--带分隔符的格式
左、右定界符由双引号改为单引号

2、导出表格
选择表格(可单一表格, 也可多个表格)--右键点击--卸载(这里中文版翻译有问题,实际为export)
可以生成.sql的文件,这个文件中包括表结构的DDL语句,和数据。
然后打开这个文件,替换掉与用户名和表空间相关的字符,在最后一行加(COMMIT;),就算完成了。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧