Chinaunix首页 | 论坛 | 博客
  • 博客访问: 216172
  • 博文数量: 55
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1126
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-22 15:15
个人简介

积累经验

文章分类

全部博文(55)

文章存档

2014年(55)

分类: Oracle

2014-01-23 00:41:01

备份
1.逻辑备份 
2.物理备份

逻辑备份:
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

 
不少情况下要先将表彻底删除,然后导入。



阅读(1345) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~