LOB-part2-data load and lob storage change

加载数据到LOB中,oracle推荐采用bulk load的方式进行加载,方法包括SQL*Loader和Oracle数据泵Data pump。

对使用SQL*Loader进行加载数据,主要有2种方式,一种是从primary data file中加载,一种是从使用LOGFILEs的secondary data file中加载。

当使用SQLLoader进行数据加载的时候需要注意以下问题:
1. 在使用SQL
Loader conventional path loads的时候,加载某个特定的LOB并不会造成包含这个LOB的记录不能入库,而是这条记录的LOB是empty的。
对于SQLLoader direct-path加载,LOB可能会被清空或者TRUNCATE掉。这种加载方式下LOBs是被分成片传输到服务器上进行加载,如果加载过程中出现了错误,这个LOB碎片文件是被丢弃掉的,所以LOB的剩余部分是没有被加载进数据库的,换句话说如果整个LOB文件在第一个piece的时候就发生了错误,那么整个LOB列可能是empty或者truncated的。
2. 当从LOBFILEs中加载的时候需要指定field的最大长度,这个最大的长度指定之后Oracle会将其作为一个hint来优化内存的使用,所以这个最大长度的设定不要低估实际的最大长度是很重要的。
3. 当使用SQL
Loader direct-path load的时候,加载LOBs会消耗大量的内存,如果加载过程中遇到SQLLoader700(out of memory),那么可能是Oracle在内部加载的过程中每次批量处理了很多记录,但是这些记录已经超过了操作系统或者进程的资源设置,这个时候需要设置ROWS选项来使加载程序每次读取相对少量的记录。
4. 在加载包含XML数据的时候推荐使用LOBFILEs,至于是使用直接路径加载还是传统的加载主要取决于你是否在加载的时候确保了XML文件的有效。
5. SQL
Loader不会创建表,所以在加载的时候表是必须要存在数据库中的。

对于Data pump进行加载的方式和语法可以查看Data pump数据泵加载的语法。

对表的LOB字段进行更换表空间
env 11.2.0.4 demo

SQL> create table test_lob(id number,description clob) tablespace lob_test;

Table created.

SQL> insert into test_lob values(1,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');

1 row created.

SQL> commit;

Commit complete.

SQL> select tablespace_name from dba_segments where segment_name = 'TEST_LOB';

TABLESPACE_NAME
------------------------------------------------------------------------------------------
LOB_TEST


SQL> select table_name,column_name,segment_name,tablespace_name,index_name from user_lobs;

TABLE_NAME                     COLUMN_NAME                    SEGMENT_NAME                   TABLESPACE_NAME                INDEX_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------ -----------------------------
TEST_LOB                       DESCRIPTION                    SYS_LOB0000134655C00002$$      LOB_TEST                       SYS_IL0000134655C00002$$


SQL> alter table test_lob move tablespace users;

Table altered.

SQL>
SQL>
SQL> select tablespace_name from dba_segments where segment_name = 'TEST_LOB';

TABLESPACE_NAME
------------------------------
USERS

SQL> select table_name,column_name,segment_name,tablespace_name,index_name from user_lobs;

TABLE_NAME                     COLUMN_NAME                    SEGMENT_NAME                   TABLESPACE_NAME                INDEX_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------ ----------------------------------------
TEST_LOB                       DESCRIPTION                    SYS_LOB0000134655C00002$$      LOB_TEST                       SYS_IL0000134655C00002$$

SQL> alter table test_lob move tablespace users lob(description) store as (tablespace users);

Table altered.

SQL> select table_name,column_name,segment_name,tablespace_name,index_name from user_lobs;

TABLE_NAME                     COLUMN_NAME                    SEGMENT_NAME                   TABLESPACE_NAME                INDEX_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------ ----------------------------------------
TEST_LOB                       DESCRIPTION                    SYS_LOB0000134655C00002$$      USERS                          SYS_IL0000134655C00002$$

此条目发表在Uncategorized分类目录。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s