oracle19c之导入、导出及脚本
记录一下oracle两种常用的导入导出方式:exp、imp;spool、SQL*Loader及其脚本。
一、exp与imp导入导出
1、exp导出操作
exp c##sl/123456 buffer=64000 file=./full.sql full=y --导出整个数据库 exp c##sl/123456 buffer=64000 file=./sl.sql owner=c##sl --导出用户c##sl下的对象 exp c##sl/123456 buffer=64000 file=./book.sql tables=book --导出book表
exp c##sl/123456 buffer=64000 file=./book.sql tables=book,book2; --导出book、book2表
2、imp导入操作
exp c##sl/123456 buffer=64000 file=./book.sql tables=book drop table book; imp c##sl/123456 buffer=64000 file=./book.sql tables=book --需要先删除表,再导入,否则报错
exp c##sl/123456 buffer=64000 file=./book.sql tables=book
imp c##sl/123456 buffer=64000 ignore=y file=./book.sql tables=book --只会导入主键不冲突的数据,冲突的忽略
exp c##sl/123456 buffer=64000 file=./sl.sql owner=c##sl
imp c##sl/123456 buffer=64000 ignore=y file=./sl.sql full=y --导入sl.sql中的全部文件
imp c##sl/123456 buffer=64000 ignore=y file=./sl.sql tables=book,book2 --导入sl.sql中的表book、与book2
说明:tables指定导入或导出的表;full=y表示导入或导出全部;ignore=y表示跳过主键冲突执行
二、spool、SQL*Loader导入导出
准备表与数据
CREATE TABLE book( id varchar2(10) NOT NULL, name varchar2(50) DEFAULT NULL, author varchar2(20) DEFAULT NULL, price decimal(10,0) DEFAULT NULL, update_time date DEFAULT NULL, create_time date DEFAULT NULL, is_deleted varchar2(1) DEFAULT NULL, PRIMARY KEY (id) ); insert into book values ('1','c##','sl',23.4,to_date('2011-11-11 11:11:11','YYYY-MM-DD HH24:MI:SS'), to_date('2011-11-11 11:11:14','YYYY-MM-DD HH24:MI:SS'),1);
insert into book values ('2','c##','sl',23.4,to_date('2011-11-11 11:11:11','YYYY-MM-DD HH24:MI:SS'), to_date('2011-11-11 11:11:14','YYYY-MM-DD HH24:MI:SS'),1);
insert into book values ('3','c##','sl',23.4,to_date('2011-11-11 11:11:11','YYYY-MM-DD HH24:MI:SS'), to_date('2011-11-11 11:11:14','YYYY-MM-DD HH24:MI:SS'),1);
1、spool导出操作
创建sql文件book_spoolout.sql
set echo off set heading off set feedback off set pagesize 0 set linesize 1000 spool book.dat select id||','||name||','||author||','||price||','||to_char(update_time,'YYYY-MM-DD hh24:mi:ss')||','|| to_char(create_time,'YYYY-MM-DD hh24:mi:ss')||','||is_deleted from book; spool off
登录sqlplus,执行@导出文件
[root@localhost tmp]# sqlplus c##sl/123456
SQL> @book_spoolout.sql;
导出数据文件book.dat如下:
1,c##,sl,23,2011-11-11 11:11:11,2011-11-11 11:11:14,1 2,c##,sl,23,2011-11-11 11:11:11,2011-11-11 11:11:14,1 3,c##,sl,23,2011-11-11 11:11:11,2011-11-11 11:11:14,1
说明:
a、这里导出字段以逗号分隔;
b、这里登录数据库目录与sql文件、导出文件目录一致;
c、如果导出目录没有写权限,会报错“无法创建 SPOOL 文件 "book.dat"当前未假脱机”,注意赋权;
d、要把控制文件写入文件中保存,如果直接复制到sqlplus中执行,导出的文件中首尾行含有其他命令或sql语句;
2、SQL*Loader导入操作
创建控制文件book.ctl
load data infile book.dat into table book truncate fields terminated by "," ( ID, NAME, AUTHOR, PRICE, UPDATE_TIME DATE "YYYY-MM-DD HH24:MI:SS", CREATE_TIME DATE "YYYY-MM-DD HH24:MI:SS", IS_DELETED )
执行导入命令,将上面的book.dat导入数据库
sqlldr userid=c##sl/123456 control=book.ctl data=book.dat
注意:
a、这里的控制文件与数据文件在同一目录下
b、truncate是删除原表数据,还有insert、append、replace等
c、fields terminated by是字段分隔符
三、脚本
可以看到spool、sql loader的导入导出还是挺复杂的,下面整理出通用性更强的脚本
1、导出
准备表与数据
CREATE TABLE music( id varchar2(10) NOT NULL, name varchar2(50) DEFAULT NULL, author varchar2(20) DEFAULT NULL, price decimal(10,2) DEFAULT NULL, update_time varchar2(19) DEFAULT NULL, create_time varchar2(19) DEFAULT NULL, is_deleted varchar2(1) DEFAULT NULL, PRIMARY KEY (id) ); insert into music values ('1','你好你好','sl',23.4,'2011-11-11 11:11:11','2011-11-11 11:11:14','1'); insert into music values ('2','你好你好','sl',23.4,'2011-11-11 11:11:11','2011-11-11 11:11:14','1'); insert into music values ('3','你好你好','sl',23.4,'2011-11-11 11:11:11','2011-11-11 11:11:14','1');
创建脚本oracleout省略。。。
执行示例,导出music表的数据到music.dat文件,以|!?|分隔字段,以@#$结束一行
./oracleout music /usr/local/myroom/temp/music.dat c##sl/123456 -f'|!?|' -r'@#$'
2、导入
创建脚本oraclein省略。。。
执行脚本,导入数据
./oraclein music /usr/local/myroom/temp/music.dat c##sl/123456 -f'|!?|' -r'@#$'
说明:对导入脚本中dbms_output.put_line('infile ${DATANAME} '|| '"str ''${ROW}\n''" ');的解析
load data的str属性表示数据的换行符,比如
load data infile music.dat "str '!!\n'" into table ... ... 表示数据文件中以!!换行,如下:
3^^你好你好^^sl^^23.4^^2011-11-11 11:11:11^^2011-11-11 11:11:14^^1!! 2^^你好你好^^sl^^23.4^^2011-11-11 11:11:11^^2011-11-11 11:11:14^^1!! 1^^你好你好^^sl^^23.4^^2011-11-11 11:11:11^^2011-11-11 11:11:14^^1!!
a、"\n"是自带的换行符,因为数据手动换行了,所以str后面除了指定的换行符"!!"还有"\n"
b、有些文件中手动的换行符不是"\n"而是"\r\n",这时对应语句改为......"str '!!\r\n'"......
c、str后面还可以跟X+转成raw类型的字符,下面的语句执行效果相同。
dbms_output.put_line('infile book.dat '|| '"str ''@#$\n''" ');
dbms_output.put_line('infile book.dat '|| '"str X''4023240A''" ');
select utl_raw.cast_to_raw('@#$') from dual查询结果是402324,0A代表换行。(查询结果也可能原样输出,跟数据库字符集有关)