Durante a execução de uma tentativa de desfragmentação de dados de uma tabela que continha um BLOB (um tipo de LOB), obtive o seguinte erro “ORA-10635: Invalid segment or tablespace type”. Durante a análise para verificar o erro, peguei o DDL da tabela verifiquei que possuía SECUREFILE. Sendo assim, não sendo possível o uso de SHRINK SPACE, somente efetuando um shrink no securefile LOB usando Online Redefinition (DBMS_REDEFINITION) [Doc ID 1394613.1].
É importante mencionar que o erro “ORA-10635: Invalid segment or tablespace type” também é comum quando a tabela possui a compressão habilitada (campo Compression na DBA_TABLES) ou quando o metódo de armazenamento da tablespace não é automático, não sendo ASSM.
Sendo assim, estarei postando a tentativa de execução e alguns métodos de análises para este erro:
- Tentativa de execução da desfragmentação da tabela:
SQL> ALTER TABLE BRUNORS.TBS ENABLE ROW MOVEMENT; Table altered. SQL> COMMIT; Commit complete. SQL> ALTER TABLE BRUNORS.TBS MODIFY LOB (TESTE1) (SHRINK SPACE); ALTER TABLE BRUNORS.TBS MODIFY LOB (TESTE1) (SHRINK SPACE) * ERROR at line 1: ORA-10635: Invalid segment or tablespace type
- Verificação do nome da tablespace no qual o objeto reside:
SQL> select owner, table_name, tablespace_name from dba_tables where table_name='TBS'; OWNER -------------------------------------------------------------------------------- TABLE_NAME -------------------------------------------------------------------------------- TABLESPACE_NAME -------------------------------------------------------------------------------- BRUNORS TBS TABLESPACE_TBS
- Verificação do método de armazenamento da tablespace: Note que está automático.
SQL> select TABLESPACE_NAME, segment_space_management from dba_tablespaces where TABLESPACE_NAME='TABLESPACE_TBS'; TABLESPACE_NAME -------------------------------------------------------------------------------- SEGMENT_SPACE_MANA ------------------ TABLESPACE_TBS AUTO
- Verificando se a tabela possui compressão habilitada: Repare que não.
SQL> SELECT TABLE_NAME, COLUMN_NAME,COMPRESSION,SEGMENT_NAME FROM DBA_LOBS WHERE TABLE_NAME='TBS'; TABLE_NAME -------------------------------------------------------------------------------- COLUMN_NAME -------------------------------------------------------------------------------- COMPRESSION ------------------ SEGMENT_NAME -------------------------------------------------------------------------------- TBS TEST1 NO SYS_LOB0000093429C00008$$
Neste ponto já tinha verificado dois fatores comuns para o erro ORA-10635, quando decidir verificar o DDL da tabela e encontrei que a mesma possuía SECUREFILE , impossibilitando a execução via SHRINK SPACE. Com isso, para se obter o DDL de uma tabela, pode-se usar a DBMS_METADATA como no exemplo abaixo:
- Obtendo o DDL de uma tabela:
SQL> select dbms_metadata.get_ddl('TABLE','TBS','BRUNORS') from dual; DBMS_METADATA.GET_DDL('TABLE','TBS','BRUNORS') -------------------------------------------------------------------------------- CREATE TABLE "BRUNORS"."TBS" ( "TESTID" NVARCHAR2(60) NOT NULL ENABLE, "TESTT" NUMBER(40,0) NOT NULL ENABLE, "TEST1" BLOB, CONSTRAINT "PK_DBBRUNO" PRIMARY KEY ("TESTID", "TESTT") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "TABLESPACE_TBS" ENABLE) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "TABLESPACE_TBS" LOB ("TEST1") STORE AS SECUREFILE ( TABLESPACE "TABLESPACE_TBS" ENABLE STORAGE IN ROW CHUNK 8192 NOCACHE LOGGING NOCOMPRESS KEEP_DUPLICATES STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHEDEFAULT)) ENABLE ROW MOVEMENT
E foi assim que decidir seguir outro metódo de desfragmentação de um LOB…
Hi! I am Bruno, a Brazilian born and bred. Former Oracle ACE, Computer Scientist, MSc in Data Science, over ten years of experience in companies such as IBM, Epico Tech, and Playtech based in three different countries (Brazil, Hungary, and Sweden) and joined projects remotely in many others. I am super excited to show you my interest in Databases, Cloud, Data Science, Data Engineering, Bigdata, AI, Programming, Software Engineering, and data in general.
(Continue reading)
E qual seria esse metodo ?