逻辑备份:
exp/imp已经很好用了,但是唯一的确定是速度太慢,如果1张表的数据有个百千万的,常常导入导出就长时间停在这个表这,但是从Oracle 10g开始提供了称为数据泵新的工具expdp/impdp,它为Oracle数据提供高速并行及大数据的迁移。 imp/exp可以在客户端调用,但是expdp/impdp只能在服务端,因为在使用expdp/impdp以前需要在数据库中创建一个Directory
exp help=y (帮助文档) 导出 客户端工作
imp help=y 导入
expdp 服务器工作
impdp
实验:交互式(逻辑备份)
exp (回车后输入用户和密码)
Username:scott
Password:tiger
Enter array fetch buffer size: 4096 > 1000000
Export file: expdat.dmp > /home/oracle/scott.dump
(2)U(sers), or (3)T(ables): (2)U > T (选择 用户 表)
Export table data (yes/no): yes > yes
Export table data (yes/no): yes > yes (是否导出表数据)
Compress extents (yes/no): yes > no (是否压缩)
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > dept (导出emp表)
. . exporting table DEPT 4 rows exported
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
Export terminated successfully with warnings.
创建用户,授予dba权限
create user king identified by king;
grant dba to king;
grant resource,connect to king;
imp king/king file='/home/oracle/scott.dump'
imp
Import file: expdat.dmp > /home/oracle/scott.dump
Enter insert buffer size (minimum is 8192) 30720> 100000
List contents of import file only (yes/no): no > y
Import entire export file (yes/no): no > y
. importing SCOTT's objects into KING
Import terminated successfully without warnings.
登录king 查看是否导入
非交互式
导出/导入一张表(用户之间)
exp userid=scott/tiger tables=emp file=/home/oracle/emp2.dump buffer=1000000 log=/home/oracle/emp2.log
imp userid=sing/sing full=y file=/home/oracle/emp2.dump buffer=1000000 log=/home/oracle/emp2.log
导出sys用户的表,通过转义符 sqlplus / as sysdba
exp \"/ as sysdba \" file=/home/oracle/sys.dmp tables='(wrm$_database_instance,wrm$_snapshot)'
导出/导入用户所有表(用户之间)
exp userid=scott/tiger owner=scott file=/home/oracle/scottuser.dmp buffer=10000000 log=/home/oracle/scottuser.log
imp userid=sing/sing fromuser=scott touser=sing file=/home/oracle/scottuser.dmp buffer=10000000 log=/home/oracle/scottuser.log
导出表空间
exp userid=system/redhat tablespaces=users file=/home/oracle/tp1.dmp buffer=1000000 log=/home/oracle/tp1.log
-------------------------------------------------
实验2个库, a库迁移到b库 (表空间不同也可以迁移)
a库 用户test1 表空间test1
b库 用户test2 表空间test2
a库
create tablespace test1 datafile '/opt/app/oracle/oradata/sytong1/test1.dbf' size 20m;
create user test1 identified by test1 default tablespace test1 ;
grant select on sys.dba_objects to test1;
grant connect,resource to test1;
create table test1.dba_obj tablespace test1 as select * from dba_objects;
exp userid=system/redhat owner=test1 file=/home/oracle/test1.dmp buffer=1000000 log=/home/oracle/test1.log
b库
create tablespace test2 datafile '/opt/app/oracle/oradata/sytong1/test2.dbf' size 20m;
create user test2 identified by test2 default tablespace test2 ;
grant connect,resource to test1;
imp userid=system/redhat fromuser=test1 touser=test2 file=/home/oracle/test1.dmp buffer=1000000 log=/home/oracle/test1.log
-------------------------------------------
通过parfile文件导出:
$ vi exp1.pa
userid=system/redhat
owner=scott
file=/home/oracle/1.dmp
buffer=1000000
feedback=1 (每一行打印 1000 每1000打印)
log=/home/oracle/1.log
$ exp parfile=exp1.pa
通过parfile文件导入:
$ vi imp1.pa
userid=system/redhat
fromuser=scott
touser=test1
ignore=y
commit=y
file=/home/oracle/2.dmp
buffer=1000000
log=/home/oracle/2.dmp
$ imp parfile=imp1.pa
=============================================
逻辑备份 数据泵
exp/imp已经很好用了,但是唯一的确定是速度太慢,如果1张表的数据有个百千万的,常常导入导出就长时间停在这个表这,但是从Oracle 10g开始提供了称为数据泵新的工具expdp/impdp,它为Oracle数据提供高速并行及大数据的迁移。
imp/exp可以在客户端调用,但是expdp/impdp只能在服务端,因为在使用expdp/impdp以前需要在数据库中创建一个Directory
create directory dump_test as '/u01/oracle10g';
grant read, write on directory dump_test to piner
然后就可以开始导入导出
expdp piner/piner directory=dump_test dumpfile=user.dmp 导出用户的数据
expdp piner/piner directory=dump_test dumpfile=table.dmp tables=test1,test2 导出表数据
impdp piner/piner directory=dump_test dumpfile=user.dmp 导入该用户数据
impdp piner/piner directory=dump_test dumpfile=table.dmp 导出表数据
$ expdp help=y (帮助)
> desc dba_directories;
1.通过命令导出
$ mkdir -p /opt/app/oracle/expdp
> create directory up_test as '/opt/app/oracle/expdp';
> grant read,write on directory up_test to system; (授权system读写权限)
$ expdp system/redhat dumpfile=scott.dmp directory=up_test schemas=scott (通过system导出scott用户)
impdp system/redhat directory=up_test dumpfile=scott.dmp remap_schema=scott:up
2.通过parfile文件导出
[oracle@stu132 ~]$vi expdp1.pa
userid=scott/tiger
directory=up_test
tables=emp
dumpfile=emp.dmp
logfile=emp.log
$ expdp parfile=expdp1.pa
3.导入
创建用户,把备份的emp.dmp导入
> create user impdp identified by impdp;
> grant connect,resource to impdp;
> grant read,write on directory up_test to impdp;
导入emp表
$ impdp impdp/impdp directory=up_test dumpfile=emp.dmp
补充:如果1台服务器2个库
创建目录名不同,路径相同
create directory up_test as '/opt/app/oracle/expdp'
create directory up_test2 as '/opt/app/oracle/expdp'
***system导出scott用户,导入scott用户映射到up (up用户自动创建)
$ expdp system/redhat dumpfile=scott2.dmp directory=up_test schemas=scott (通过system导出scott用户)
$ impdp system/redhat directory=up_test dumpfile=scott2.dmp remap_schema=scott:up (remap映射)
***导入scott用户(之前 删除scott,exp由system/redhat导出)
$drop user scott cascade
$grant read,write on directory up_test to system;
$impdp system/redhat directory=up_test dumpfile=scott.dmp schemas=scott
***实验:2个库通过db link,导入导出
132$ create directory up_test as '/opt/app/oracle/expdp'
133$ create directory up_test2 as '/opt/app/oracle/expdp'
132$ cat /opt/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora (服务器名zzg)
133配置网络,服务指向132 sytong1
创建database link
133$ create public database link dblink1 connect to system identified by redhat using 'ZZG';
133$ select * from up.emp@up_link; (通过网络查询另外一个库的表)
通过database link 导出132 up用户所有表
133$ expdp system/redhat schemas=up directory=up_test2 dumpfile=scott132.dmp network_link=dblink1;
133$ impdp system/redhat schemas=up directory=up_test2 dumpfile=scott132.dmp
up用户导入后会自动建立,需修改下密码
133> alter user up account unlock identified by up;
133> conn up/up;
133> select * from tab; (查看表是否全部导入)
====================================
三.使用示例
3.1 数据导出:
1 将数据库SampleDB完全导出,用户名system 密码manager 导出到E:/SampleDB.dmp中
exp system/manager@TestDB file=E:/sampleDB.dmp full=y
2 将数据库中system用户与sys用户的表导出
exp system/manager@TestDB file=E:/sampleDB.dmp owner=(system,sys)
3 将数据库中的表 TableA,TableB 导出
exp system/manager@TestDB file=E:/sampleDB.dmp tables=(TableA,TableB)
4 将数据库中的表tableA中的字段filed1 值为 "王五" 的数据导出
exp system/manager@TestDB file=E:/sampleDB.dmp tables=(tableA) query=' where filed1='王五'
如果想对dmp文件进行压缩,可以在上面命令后面 加上 compress=y 来实现。
3.2 数据的导入
1 将备份数据库文件中的数据导入指定的数据库SampleDB 中,如果 SampleDB 已存在该表,则不再导入;
imp system/manager@TEST file=E:/sampleDB.dmp full=y ignore=y
2 将d:/daochu.dmp中的表table1 导入
imp system/manager@TEST file=E:/sampleDB.dmp tables=(table1)
3. 导入一个完整数据库
imp system/manager file=bible_db log=dible_db full=y ignore=y
4. 导入一个或一组指定用户所属的全部表、索引和其他对象
imp system/manager file=seapark log=seapark fromuser=seapark imp
system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)
5. 将一个用户所属的数据导入另一个用户
imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy
imp system/manager file=tank log=tank fromuser=(seapark,amy)
touser=(seapark1, amy1)
6. 导入一个表
imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)
7. 从多个文件导入
imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)
log=paycheck, filesize=1G full=y
8. 使用参数文件
imp system/manager parfile=bible_tables.par
bible_tables.par参数文件:
#Import the sample tables used for the Oracle8i Database Administrator's
Bible. fromuser=seapark touser=seapark_copy file=seapark log=seapark_import
参数文件示例见附录
9. 增量导入
imp system./manager inctype= RECTORE FULL=Y FILE=A
不少情况下要先将表彻底删除,然后导入。