Oracle数据导出中避开大字段(oracle不导出大字段)
Oracle数据导出中避开大字段
Oracle是世界上最可信赖的关系型数据库管理系统之一。随着企业数据不断增长,数据的备份和恢复变得非常重要。在数据库备份和恢复期间,目标是尽可能保留完整数据。但是,有时由于某些原因,您可能需要避免导出数据库中的大字段,例如BLOB和CLOB。这是因为大字段可能会消耗大量处理器时间和磁盘空间,导致导出和导入数据的时间和耗费增加。
为了避免导出大字段,以下是一些方法可以帮助您轻松地导出Oracle数据库中的数据而不包括大字段。
1. 使用参数导出
在Oracle的exp和imp工具中,可以通过设置导出参数来设置导出内容。可以使用以下命令来导出数据,而不包括大字段。
exp userid=username/password file=data.dmp tables=table_name query=\"where rownum \
在这个命令中,query子句可以帮助您过滤掉不需要的数据,其中rownum\
2. 使用sqlldr
可以使用sqlldr工具轻松导出Oracle数据库中的数据。使用该工具时,可以从控制文件中过滤掉大字段。以下是示例控制文件。
LOAD DATA
INFILE 'data.csv' BADFILE 'baddata.bad'
DISCARDFILE 'discarddata.dis' APPEND
INTO TABLE table_name WHEN (1:4) \
FIELDS TERMINATED BY ',' (
column1, column2,
... columnN
)
Query使用时,也可以包含WHERE子句允许您使用限制条件来过滤非常大的表。
3. 执行存储过程
如果表很大,而且使用这两种方法都有困难,那么使用存储过程是可以接受的。以下是示例存储过程。
CREATE OR REPLACE PROCEDURE proc_export_large_table(
p_tab IN VARCHAR2, p_file IN VARCHAR2,
p_rows IN NUMBER DEFAULT 0)
AS v_dir VARCHAR2(30) := 'EXPORT_DIR';
v_sql VARCHAR2(2000);BEGIN
-- Check if the directory object exists SELECT COUNT(*)
INTO v_dir FROM all_directories
WHERE directory_name = v_dir;
IF v_dir = 0 THEN DBMS_OUTPUT.PUT_LINE('Directory object ' || v_dir || ' does not exist!');
RETURN; END IF;
-- Check if the export file exists v_sql := 'SELECT COUNT(*) FROM ' || p_tab;
IF p_rows > 0 THEN v_sql := v_sql || ' WHERE ROWNUM \
END IF;
EXECUTE IMMEDIATE 'CREATE TABLE export_tmp ' || v_sql; EXECUTE IMMEDIATE 'ALTER TABLE export_tmp MODIFY (LOB_COLUMN_NAME NULL)';
-- Export the table DBMS_DATAPUMP.OPEN(
operation => 'EXPORT', job_mode => 'SCHEMA',
job_name => 'tmp_export_job', version => 'COMPATIBLE',
export_object=> 'TABLE"', tables => p_tab,
filesize => 512, directory => v_dir,
logfile => p_file);
DBMS_DATAPUMP.ADD_FILE( handle => 'tmp_export_job',
filename => p_file, directory => v_dir,
filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE, reusefile => 1);
DBMS_DATAPUMP.METADATA_FILTER( handle => 'tmp_export_job',
name => 'EXCLUDE_PATH_EXPR', value => 'IN (''TABLE/TABLE_LOBS'')');
DBMS_DATAPUMP.START_JOB('tmp_export_job');
-- Drop the temporary table EXECUTE IMMEDIATE 'DROP TABLE export_tmp PURGE';
DBMS_DATAPUMP.DETACH('tmp_export_job');END;
/
该存储过程使用DBMS_DATAPUMP包来导出表数据到指定的文件。在导出期间,存储过程会过滤掉BLOB和CLOB字段。
总结
在Oracle数据库备份和恢复期间,必须全面备份数据库。但是,在某些场景下,大字段可能会成为导出数据库数据的瓶颈。使用上述方法,您可以轻松地导出数据库中的数据而不包括大字段。如果还有疑问,请参考Oracle官方文档和论坛。