基于PL/SQL的数据库备份方法
PL/SQL Developer是Oracle 数据库中用于导入或导出数据库的主要工具,本文主要介绍了利用PL/SQL Developer导入和导出数据库的过程,并对导入或导出时的一些注意事项进行了说明,接下来我们就一一介绍。
导出步骤:
1、tools ->export user object 选择选项,导出.sql 文件。
2、tools ->export tables-> Oracle Export 选择选项导出.dmp 文件。
导入步骤:
注:导入之前最好把以前的表删除,当然导入另外数据库除外。
1、tools->import tables->SQL Inserts 导入.sql 文件。
2、tools->import talbes->Oracle Import然后再导入dmp 文件。
一些说明:
Tools->Export User Objects导出的是建表语句(包括存储结构)。PS :这种方式只能导出属于这个用户的表,其他用户的表不能导出,建议用命令行(exp,imp)导出。
Tools->Export Tables里面包含三种导出方式,三种方式都能导出表结构以及数据,如下:
• Oracle Export
• Sql Insert
• pl/sql developer
第一种是导出为.dmp 的文件格式,.dmp 文件是二进制的,可以跨平台,还能包含权限,效率也很不错,用得最广 。
第二种是导出为.sql 文件的,可用文本编辑器查看,通用性比较好,但效率不如第一种,适合小数据量导入导出。尤其注意的是表中不能有大字段 (blob,clob,long ),如果有,会提示不能导出(提示如下: table contains one or more LONG columns cannot export in sql format,user Pl/sql developer format instead)。
第三种是导出为.pde 格式的,.pde 为Pl/sql developer 自有的文件格式,只能用Pl/sql developer 自己导入导出,不能用编辑器查看。
PS :只有"Oracle Export" 方式导出再导入后,表结构和索引结构没有发生变化,另两种方式都改变了索引类型。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
第1章 导入数据的苦恼
最近,一直再为搭建测试数据库的事情烦恼,主要碰到如下困难:
1、使用oracle dump 方式导出的数据在导入的时候不能随意选择一张表的数据进行导入;一般业务的表的数量都有1000左右,在出现由于某张表数据异常导致的故障时,用dump 文件进行恢复基本不可行或者很费事;
2、表存在外键约束和触发器,使用oracle dump import 方式导入表的时候不能非常简单的禁止触发器和外键,导致大量错误产生,导入的表的数据不全,部分表数据没有导入;
3、当修改了某些表的数据后需要将这些表的数据恢复到测试环境搭建时的数据,import 不能将这些表的数据清空后重新导入。
4、当修改了某些表的字段后需要将这些表的数据恢复到测试环境搭建时的数据,import 不能将这些表重建后重新导入。
那么有没有一个工具能够解决上面我们这位工程师的苦恼呢?
第2章 PL/SQL Developer导入导出工具
PL/SQL Developer位于PLSQL DEV工具的“Tools ”菜单下的“Export tables„”和“Import tables „”下,可以进行数据的导出和导入。
2.1 导出功能介绍
Where clause: 使导出操作支持where 条件,比如你只需要导出每张表的10000条记录,可以在输入框里输入“rownum < 10001”。
Compress file: 选中后支持导出文件的压缩,节省存储空间,但是压缩会占用多余的时间。
Include storage: 导出的文件中包含建表信息,如果需要在导入的时候能支持建表操作,需要选中该项。
2.2 导入功能介绍
Drop tables:支持在导入数据前先删除表,选择该项后,默认选择“Create tables”选项,并且“Truncate tables”和“Delete table”操作变成灰色不可用状态。
Create tables :支持在导入数据前先创建表,比如我们已将建好了用户,这个时候需要导入表而之前又没有执行建表脚本的时候,可以选中此项。
Truncate tables :支持在导入数据前先清空表数据,想恢复表数据到建测试环境的时候可以使用这个选项,该选项和“Delete tables”互斥。
Delete tables :支持在导入数据前删除表数据,这个选项目前还没有发现比较特殊的使用意义,该选项和“Truncate tables”互斥。该选项的导入速度大大慢于“Truncate tables”,一般使用“Truncate tables”。
2.3 如何解决导出clob 和blob 类型数据报错的问题
当表字段中含有clob 和blob 类型数据时,使用PL/SQL Developer导出会报stream read error 的错误,导出操作终止,说明PL/SQL Developer方式导出不支持这种类型,oracle export方式可以支持这种类型。 由于需要导出的表很多,PL/SQL在导出前都要对需要导出的表进行分析,通常都会花费十几分钟的时间,然而由于某张表存在clob 和blob 类型数据时就会异常终止,那之前的操作时间就会浪费,为了导出所有表需要将导出的表进行标记,只导出没有clob 和blob 类型数据的表。我们通常的做法是在导出表的时候用ctrl 或者shift 按键进行手工选择,通过导出的日志记录不能导出的表,然后手工将这些表反选出待导出的表。但是这样操作费时费力,需要通过不停反复的操作,才能知道哪些表不能导出。 下面介绍一下如何使用oracle 系统视图all_tab_columns和PL/SQL在导出表的时候提供的Object selection功能快速导出不包含clob 和blob 的表数据。
1、使用下面的sql 语句拼出Object selection的文件内容。
--不包含clob 和blob 的表 select distinct('TABLE "'||a.OWNER ||'"."'||a.TABLE_NAME||'"') from sys.all_tab_columns a where a.OWNER = 'ICDPUB' and a.TABLE_NAME not in (select t.TABLE_NAME from sys.all_tab_columns t where t.OWNER = 'ICDPUB' and t.DATA_TYPE in ('CLOB','BLOB'))
注意:上面的sql 语句里的ICDPUB 是用户名
2、按照上面的语句的执行结果生成Object selection的文件(后缀是.osf ),文件的内容如下:
PL/SQL Developer Object Selection File 1
TABLE "ICDPUB"."ACTIVE_ALARMS"
TABLE "ICDPUB"."ALLAPPOINT"
TABLE "ICDPUB"."ALLOPTIONVIEW"
TABLE "ICDPUB"."ALLOTCONFIG"
TABLE "ICDPUB"."ALLPAPERAUTHVIEW"
TABLE "ICDPUB"."ALLPAPERVIEW"
TABLE "ICDPUB"."ALLQUESTIONVIEW"
3、在导出表功能的表选择框里单击右键选择“Load Object selection”,选择上一步制作的文件, 完成表的选择。
4、选择合适的参数,进行导出操作。
5、用oracle export方式导出包含clob 和blob 的数据。