对于数据量比较大的项目首选的数据库一般是Oracle,正是因为数据量比较大,所以有的时候需要转移数据的时候就更加的复杂。这篇文章我根据自己的经验,从把Oracle的数据导出到txt文件,在导入到数据全面介绍怎样快速的导入导出数据。
首先说这里我们的数据库的用户名和密码都是oracle,这个用户下存在一张用户的表(user),对应的有两个字段,分别是uname和uid。
对于导出数据,使用的是spool方法,下面是脚本,名字是spool.sh
#!/bin/sh
if [ $# -ne 2 ]; then
echo "usage:$0 sqlfile outfile";
exit 1;
fi
sqlfile=$1;
outfile=$2;
sqlplus oracle/oracle << EOF
spool $outfile
set pages 9999
set heading off
set echo off
set feedback off
@$sqlfile
spool off
exit
!
如果我们要导出user表中的数据,我们需要建立一个导出的文件,如user.sql,这里我是用的是"^"作为分隔符,这个可以根据自己的喜好进行选择,一般这样分隔符不会出现在字段的内容那个里就行。
set termout off
set echo off
set feedback off
set linesize 5000
set colsep "^"
set heading off
set verify off
set pagesize 0
set trimout on
set trimspool on
select uname||'^'||uid from user;
下一步就是执行命令,首先需要spool.sh这文件要具有当前用户的执行的权限,对于Linux来说,赋予文件的执行权限一般是使用chmod,一般我会使用
chmod 777 spool.sh
这样这个用户就具有了执行这个文件的权限,我这种方式属于简单粗暴的方式,我们也可以更详细的给这个文件赋予不同的权限。然后执行如下的命令就可以导出数据了,因为是比较简单的命令所以我就不多说
nohup ./spool.sh user.sql /home/user.txt >> user.log &
执行问以后你可以"ps -ef|grep sql"确定当前的命令确实在执行中,当导出完成后事自动的退出。
下面说一说怎样导入数据,先要准备两个文件分别是user.lst.crl和user.lst.shell,对应的内容如下
user.lst.crl:说明一下,如果我们是想要完全的覆盖表中的数据的时候,可以把"append"换成"replace",是否使用"trim"也是根据情况定的
load data infile '/home/user.txt'
append into table user
fields terminated by '^'
(
uname "trim(:uname)",
uid
)
user.lst.shell:这个的“sed '1,5d'”是删除文件的1到5行,"error"是在我们碰到多少条异常的情况后会停止执行导入数据的操作
sed '1,5d' /home/user.txt
sqlldr oracle/oracle control=/home/user.lst.crl errors=10000 log=/home/user.lst.log
同样的user.lst.shell需要在当前的用户下,该用户具有可执行的权限,然后执行
nohup ./user.lst.shell & 就行了,同样的道理,你可以"ps"一下确定当前的任务是否在正常的执行,或者看一下日志也行。