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, and I am also a naturalized Swedish citizen. I am a former Oracle ACE and, to keep up with academic research, I am a Computer Scientist with an MSc in Data Science and another MSc in Software Engineering. I have over ten years of experience working with companies such as IBM, Epico Tech, and Playtech across three different countries (Brazil, Hungary, and Sweden), and I have joined projects remotely in many others. I am super excited to share my interests in Databases, Cybersecurity, Cloud, Data Science, Data Engineering, Big Data, AI, Programming, Software Engineering, and data in general.
(Continue reading)
E qual seria esse metodo ?