导入导出工具expimpexpdpimpdp.docx
《导入导出工具expimpexpdpimpdp.docx》由会员分享,可在线阅读,更多相关《导入导出工具expimpexpdpimpdp.docx(12页珍藏版)》请在冰豆网上搜索。
导入导出工具expimpexpdpimpdp
导入导出工具exp、imp、expdp、impdp
exp和imp是在数据泵之前的逻辑备份工具。
一:
导出工具exp
1.$ORACLE_HOME/bin操作系统下可执行文件
导出工具将数据库中的数据压缩在一个二进制文件
三中模式:
a.表模式:
导出用户所有的表或者指定的表
b.用户模式:
导出用户下的所有内容
c.整个数据库:
导出数据库中的所有对象
c
查看帮助命令
exp help =y
练习
导出前
1)查询数据库的字符集(方法很多只用一种)
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.WE8ISO8859P1
2)设置Linux操作系统的NLS_LANG环境变量
export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
开始导出
使用exp把scott.emp表导出来导出文件名scott.emp
exphelp=y imphelp=y 查看帮助
exp scott/oracle TABLES=emp file=scott.emp
然后删除scott.emp表
sqlplus scott/oracle
drop table emp;
最后使用导出的文件恢复原来的emp表
imp scott/oracle TABLES=emp file=scott.emp
检查是否成功
select count(*) from scott.emp;
例如:
表模式
exp scott/oracle tables=emp file=emp.dmp
导出多张表
exp scott/oracle tables=emp,dept file=ed.dmp
使用sys用户导出
exp tables=scott.emp file=emp1.dmp
username:
sys as sysdba
password:
oracle
或者
exp \'sys/oracle as sysdba\' tables=scott.emp file=emp2.dmp
用户模式
导出用户所有的对象
exp scott/oracle owner=scott file=soctt.dmp
全库导出
exp system/oracle full=y file=full.dmp
指定导出片的大小,限制为1g
exp scott/oracle tables=emp file=emp2.dmp
filesize=1g
参数filesize指定了二进制备份文件的最大字节数
目的是解决某些操作系统下2g物理文件限制以及可以加快压缩和方便刻录光盘等
也可以远程导出到本地
exp system/oracle@orcl tables=scott.emp file=emp168.dmp
导入工具:
imp
1该工具是$ORACLE_HOME/bin下一个可执行文件
2imp将exp生成的二进制文件导入数据库中
只有exp_full_database和dba权限的用户才能
做整个数据库的导入
grant exp_full_database to scott;
3imp操作步骤
先createtable-->insertdata-->createindex-->createtrigger,constriants
例子
练习:
先删除scott.emp表的记录,使用备份文件恢复记录
sqlplus scott/oracle
truncate table emp;
select count(*) from emp;
imp scott/oracle tables=emp file=emp.dmp ignore=y
参数ignore=y表示直接导入数据
检查结果selectcont(*)fromemp;
将某用户的表导入到另一个用户下:
交互式
imp tables=emp file=emp.dmp fromuser=scott touser=hr
输入用户名:
sysassysdba
输入密码:
oracle
非交互式
imp \'sys/oracle as sysdba\' tables=emp file=emp.dmp fromuser=scott touser=hr
约束报错,可以不需要创建约束,加入参数CONSTRAINTS=N
4导入可能出现的问题
a数据对象已经存在
解决方法:
使用参数ignore=y会把exp文件的数据内容直接导入
如果表有唯一关键字约束,不符合条件的不导入
如果表没有唯一关键字约束,将引起重复记录
b数据库对象有主外键约束
不符合主外键约束,数据导入失败
解决方法:
先导入主表,在导入从表
或者先禁用主外键,导入完成后在启用
c权限不够
给予imp_full_database
exp_full_database
d字符集问题
如果字符集不同,导入失败
查看oracleserver端的字符集
select userenv('language') from dual;
查看dump文件字符集
cat scott.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6
0345
select nls_charset_name(to_number('0354','xxxx')) from dual;
查看oracleclient端字符集
echo $NLS_LANG
如果检查结果发现server端和client字符集不一样,修改为同server端相同的字符集
导出的过程转换
在export过程中,源数据库字符集与export用户会话字符集不一致
会发生字符集转换,并在导出文件头部几个字节中存储export用户会话字符集ID号,在这个过程中肯可能发生数据丢失。
要正确导出源数据库数据,要求export过程的用户会话字符集应等于源数据库字符集或是源数据库字符集的超集
导入的过程字符集转换
确定导出数据库字符集环境(通过读取导出文件头获取)
确定session字符集(通过nls_lang获得)
imp读取导出的文件,读取文件集ID于导入进程所在的会话nls_lang比较
如果相同不做转换,不过不同要把数据文件字符集转为session字符集
总结:
先去检查导入文件字符集于导入session使用字符集之间的转换,如果转换不成功,则imp就不能完成
然后导入session字符集与数据库字符集之间转换
fimp,exp版本不能向上兼容
imp可以导入低版本exp生成的文件,
不能导入高版本exp生成的文件
g导入大表(大于80M),存储失败
默认的exp时,compress=y,也就是数据将压缩在一个数据块上
导入时,如果不存在连续一个大数据块,导入失败
导出80m以上大表时,将compress=n
5expimp参数
buffer=4096000(数据缓冲区代销哦啊,以字节为单位,自行调整)
对性能有很大影响
compress=y(将在导出时候合并碎片)
direct=y(以direct方式导出,告诉exp直接读取数据,速度快)
feedback(每x行显示进度)
例如:
将用户的所有内容删除后恢复用户的所有内容
1导出用户所有的对象
expscott/oracleowner=scottfile=soctt.dmp
删除用户dropuserscottcascade;
导入用户必须要先存在
createuserscottidentifiedbyoracle
defaulttablespaceusers
temporarytablespacetemp
quotaunlimitedonusers;
grantconnect,resourcetoscott;
impsystem/oraclefile=scott.dmpfromuser=scotttouser=scottignore=ybuffer=200000
使用脚本完成导出某个用户的所有表
setfeedbackoffheadingoff verifyofftrimspooloff
setpagesize0linesize200
spool/u01/table_scott.sh
select'expscott/oracletables='||table_name||'file=/u01/'||table_name||'.dmp'fromuser_tables;
spooloff
vim/u01/table_scott.sh
#!
/bin/bash
expscott/oracle tables=BTfile=/u01/BT.dmp
expscott/oracle tables=DEPTfile=/u01/DEPT.dmp
expscott/oracle tables=DTfile=/u01/DT.dmp
expscott/oracle tables=EMPfile=/u01/EMP.dmp
expscott/oracle tables=MANAGERfile=/u01/MANAGER.dmp
expscott/oracle tables=SALGRADEfile=/u01/SALGRADE.dmp
给予执行权限
chmodu+x/u01/table_scott.sh
-----------------------------------------------------------------------
Oracle的导出导入是一个很常用的迁移工具。
在Oracle10g中,Oracle推出了数据泵(expdp/impdp).它可以通过使用并行,
从而在效率上要比exp/imp要高。
高速导入导出工具
逻辑备份工具---数据泵
使用专用api导入导出数据,速度快
expdp只能用于服务器端,不能用户客户端
工具目录:
$ORACLE_HOME/bin
可以功过dbms_datapump调用
可提供工具:
expdpimpdp 基于web界面
可提供数据访问方法:
直接路径外部表
作用:
oracle数据库之间导入导出
数据泵是oracledatabase10g的一个组成功能
数据泵优点:
exclude,include和content参数用于选择细粒度级对象和数据
version参数指定要移动的对象的数据库版本
parallel参数指定代表导出作业运行的活动执行服务器的最大线程数
estimate_only参数可估计导出作业占用的空间量(实际上并不执行导出)
使用网络模式可从远程数据库直接导出到转存文件集
在导入过程中,可以更改目标数据文件名、方案和表空间
此外10g还允许您指定在执行数据泵导出时,要从源数据库取样和卸载的数据百分比。
使用compression参数可以指示是否应在导出转存文件中压缩元数据,以便占用更少的磁盘空间。
使用数据泵之前必须创建目录对象,导入到处都在目录对象里
数据库泵是一个服务端工具。
--
expdp HELP=Y
--
对以SYSDBA角色登录的用户,10g数据库不支持进行导出和导入操作。
请注销,之后使用其它角色登录并重试。
1创建datapump使用的一个表
conn system/oracle
create table dp_test as select * from all_users;
select count(*) from dp_test;
2创建oracle目录
mkdir /u01/dp_dir
create directory dp_dir as '/u01/dp_dir';
grant all on directory dp_dir to public;
可以通过dba_directories查看
3使用system账户打开Dbconsole
维护---》导出到文件-->导出类型中选择表-->输入操作系统用户名和口令
4添加--选择表dp_test
5选择目录dp_dir
6完成。
expdp system/oracle dumpfile=expdp01.dmp directory=dp_dir tables=system.dp_test logfile=expdp01.log
一:
导出,导入表
先要创建目录对象
mkdir /u01/backup
create directory dump_dir as '/u01/backup';
grant read ,write on directory dump_dir to scott;
expdp scott/oracle tables=emp directory=dump_dir dumpfile=e1.dmp logfile =e1.log
二导出方案
expdp scott/oracle directory=dump_dir dumpfile=scott.dmp schemas=scott
三导出表空间
expdp system/oracle directory=dump_dir dumpfile=users.dmp tablespaces=users
四导出全库
expdp system/oracle directory=dump_dir dumpfile=full.dmp full=y
五并行导出
设置parallel可以并行导出,导出每个线程创建一个单独的导出文件,因此选项应该拥有和并行线程一样多的文件
通配符%U文件格式full_%U.dmp(full_01,full_02,...)
例如:
expdpsystem/oracledirectory=dump_dirdumpfile=users_%U.dmptablespaces=usersparallel=3
导入impdp
1将emp表从scott用户导入到system用户下
impdp system/oracle directory=dump_dir dumpfile=e1.dmp tables=emp remap_schema=scott:
system
2将soctt方案导入到system用户下
expdp scott/oracle directory=dump_dir dumpfile=scott.dmp schemas=scott
impdp system/oracle directory=dump_dir dumpfile=scott.dmp
remap_schema=scott:
system
3并行导入
expdp system/oracle directory=dump_dir schemas=scott
dumpfile=scott_%U.dmp parallel=3
先删除用户
drop user scott cascade;
然后导入
impdp system/oracle directory=dump_dir schemas=scott dumpfile=scott_%U.dmp parallel=3
对与hrschema
expdp system/oracle directory=dump_dir schemas=hr
dumpfile=hr_%U.dmp parallel=3
先删除用户
drop user scott cascade;
然后导入
impdp system/oracle directory=dump_dir schemas=hr dumpfile=hr_%U.dmp parallel=3
---
数据泵:
可以高速移动数据与元数据的,基于服务器的设备
数据泵具有以下特点
可通过DBMS_DATAPUMP调用PL/SQL程序包调用数据泵基础结构。
因此数据泵可以构建自定义的移动数据实用程序。
可提供工具:
expdp
impdp
基于web界面
数据泵自动确定要使用的数据访问方法
直接路径或外部表。
如果表结构允许
实现思路:
sqlldr的会生成一个日志,日志记录所有操作,会包含创建外部表的语法
执行sqlldr必须有控制文件
借助EM帮我生成控制文件
然后通过控制文件生成日志,在日志文件找出创建外部表的语法,然后copy执行一次,外部表就创建好
效果:
可以通过建立外部表,通过sqlloader去查看外部的文件,外部文件的更新会适时的通过外部表查看。
实现过程:
首先要创建外部表,外部表的语法复杂,所以想办法复制过来
首先使用命令建立目录对象(建议手工建立)
create directory d3 as '/u01/d3';
grant read ,write on directory d3 to public;
把文本文件拷贝到d3里
1.txt内容
1,a
2,b
c,c
4,"d"
目的建立外表去访问文本文件的内容?
sqlldr system/oracle data=a.txt control=1.ctl log=1.log bad=1.bad direct=yes
通过这个语法可以创建日志文件,在日志文件里有创建外部表的语法
这个命令需要控制文件,可以通过em来生成控制文件
data movement-->loaddatafromuserfiles-->一路下去,最后的时候选择控制文件信息保留
然后把控制文件拷贝到d3里
执行如下命令,生成日志文件d3.log
sqlldr system/oracle data=a.txt control=1.ctl log=d3.log bad=1.bad external_table =GENERATE_ONLY
查看d3.log
修改表名,这个表就是外部表
CREATE TABLE "extend1"
(
"A" NUMBER(38),
"B" CHAR(10)
)
ORGANIZATION external
(
TYPE oracle_loader
DEFAULT DIRECTORY D3
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII
BADFILE 'D3':
'1.bad'
LOGFILE 'd3.log_xt'
READSIZE 1048576
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' LDRTRIM
REJECT ROWS WITH ALL NULL FIELDS
(
"A" CHAR(255)
TERMINATED BY "," OPTIONALLY ENCLOSED BY '"',
"B" CHAR(255)
TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
)
)
location
(
'1.txt'
)
)REJECT LIMIT UNLIMITED
可以查看表的内容
select * from "extend1";
修改文本文件1.txt的内容,你会看到表的内容一起在变
案例:
使用外部表访问警告日志文件
对DBA来说,最常见一个例子是可以使用外部表来访问警告日志文件
alert_.log或其他跟踪文件,由于警告日志文件存储在服务器上,有时候如果不能直接访问操作系统文件,则可以通过外部表来访问警告日志文件。
1创建目录
create or replace directory bdump
as '/u01/app/oracle/admin/orcl/bdump'
select * from dba_directories;
2创建及访问外部表
create table alert_log(text varchar2(400))
organization external(
type oracle_loader
default directory bdump
access parameters
(records delimited by newline
nobadfile
nodiscardfile
nologfile
)
location('alert_orcl.log')
)
reject limit unlimited
/
然后就可以访问警告日志了
select * from alert_log where rownum<9;
也可以通过em访问日志
效果是:
在linux系统上有一个文本文件。
里面有数据
在oracle可以查看到数据
当文本文件的数据发生变化的时候,数据库里查看到的内容 也会相应变化。
借助文档是联机丛书
1 conn scott/oracle
create table test (c1 char(20), c2 char(20));
2生成控制文件
cd /u01/waibu
vim a.ctl
LOAD DATA
infile a.txt
APPEND
INTO TABLE SCOTT.TEST
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
C1 ,
C2
)
3执行SQL*ldr命令