Close Menu
  • Home
  • Databases
    • Oracle
      • ASM
      • Data Guard
      • RAC
  • Performance
  • Tools
  • Troubleshooting
  • Python
  • Shell Script
Search

Oracle RAC 12.2 no VMware Workstation — Post 3: Instalação do Grid Infrastructure

2026-04-05 Oracle By Henrique

Oracle RAC 12.2 no VMware Workstation — Post 1: Configuração do VMware e Openfiler

2026-04-05 Oracle By Henrique

Oracle RAC 12.2 no VMware Workstation – Post 2: Configuração do Oracle Linux e iSCSI

2026-04-05 Oracle By Henrique
YouTube LinkedIn RSS
  • Sobre
  • Contato
  • Legal
    • Aviso Legal
    • Política de Cookies
    • Política de Privacidade
    • Termos de Uso
  • RSS
  • Português
    • Inglês
Execute StepExecute Step
YouTube LinkedIn RSS
  • Home
  • Databases
    • Oracle
      • ASM
      • Data Guard
      • RAC
  • Performance
  • Tools
  • Troubleshooting
  • Python
  • Shell Script
Execute StepExecute Step
Home » Resetando Sequences no Oracle: RESTART e o Método Clássico
Oracle Oracle Troubleshooting

Resetando Sequences no Oracle: RESTART e o Método Clássico

HenriqueBy Henrique2026-03-3111 Mins Read
Share
Facebook Twitter LinkedIn Pinterest Email Telegram WhatsApp

This post is also available in: English (Inglês)

Você precisa recriar um ambiente de testes, desfazer uma carga de dados ou simplesmente reiniciar a numeração de uma sequence. Qualquer que seja o motivo, resetar uma sequence no Oracle é uma operação comum — e que tem dois caminhos bem diferentes dependendo da versão do seu banco.

Este post mostra os dois métodos, explica o impacto do CACHE, como verificar dependências antes de agir, e como resetar para um valor específico (não só para 1).


Antes de Resetar: Verifique as Dependências

Resetar uma sequence vinculada a uma chave primária pode gerar conflitos de unicidade. Antes de qualquer coisa, verifique:

-- Sequences usadas como DEFAULT em colunas
SELECT
    t.owner,
    t.table_name,
    t.column_name,
    t.data_default
FROM dba_tab_columns t
WHERE UPPER(t.data_default) LIKE '%SEQ%'
  AND t.owner = 'SEU_SCHEMA';

-- Identity columns vinculadas a sequences internas
SELECT
    owner,
    table_name,
    column_name,
    identity_column,
    default_on_null
FROM dba_tab_columns
WHERE identity_column = 'YES'
  AND owner = 'SEU_SCHEMA';

Se a sequence alimenta uma coluna com dados existentes na tabela, resetar para 1 vai colidir com os registros já inseridos. Nesse caso, resetar para um valor maior que o MAX atual é a saída correta.


Método Moderno: ALTER SEQUENCE … RESTART (Oracle 18c/19c+)

⚠️ Atenção: A cláusula RESTART foi introduzida originalmente para uso interno da Oracle. Ela aparece na documentação oficial do Oracle 19c, mas use com consciência em produção — teste no seu ambiente antes.

A partir do Oracle 18c/19c, você pode reiniciar uma sequence diretamente:

-- Reinicia para o valor inicial (START WITH original)
ALTER SEQUENCE esquema.nome_sequence RESTART;

-- Reinicia para um valor específico
ALTER SEQUENCE esquema.nome_sequence RESTART START WITH 1000;

O RESTART sem parâmetro volta ao START WITH original da sequence. Se quiser um valor diferente, use RESTART START WITH .

Para zerar o efeito do CACHE junto com o restart (evitar gaps por valores pré-alocados perdidos):

ALTER SEQUENCE esquema.nome_sequence RESTART START WITH 1 NOCACHE;
-- Depois, se quiser reativar o cache:
ALTER SEQUENCE esquema.nome_sequence CACHE 20;

Método Clássico: INCREMENT BY Negativo (Oracle 12c e anteriores)

Este é o método que funciona em qualquer versão. Como o MINVALUE padrão de uma sequence é 1, não é possível simplesmente aplicar um INCREMENT BY negativo igual ao NEXTVAL atual — o Oracle rejeitaria com ORA-08004, pois o resultado passaria pelo 0. A solução é baixar o MINVALUE para 0 temporariamente.

-- 1. Descubra o valor atual
SELECT esquema.nome_sequence.NEXTVAL FROM dual;
-- Resultado exemplo: 27

-- 2. Baixe o MINVALUE para 0 e aplique o incremento negativo
ALTER SEQUENCE esquema.nome_sequence MINVALUE 0 INCREMENT BY -27 NOCACHE;

-- 3. Consuma um NEXTVAL para efetivar o recuo
SELECT esquema.nome_sequence.NEXTVAL FROM dual;
-- Retorna: 0

-- 4. Restaure o incremento (MINVALUE ainda está em 0 — não altere junto)
ALTER SEQUENCE esquema.nome_sequence INCREMENT BY 1;

-- 5. Confirme: próximo NEXTVAL é 1
SELECT esquema.nome_sequence.NEXTVAL FROM dual;
-- Retorna: 1

-- 6. Agora restaure o MINVALUE
ALTER SEQUENCE esquema.nome_sequence MINVALUE 1;

Atenção ao CACHE: Se a sequence tem CACHE ativo, os valores pré-alocados na SGA são perdidos em caso de restart do banco ou flush do cache — gerando gaps na numeração. Use NOCACHE durante o reset para ter previsibilidade no valor resultante e reative depois se necessário.

Ordem importa: Não tente restaurar INCREMENT BY 1 e MINVALUE 1 no mesmo comando enquanto o valor atual for 0 — o Oracle rejeita com ORA-04007. Restaure o INCREMENT BY primeiro, consuma o NEXTVAL (que entrega 1), e só então ajuste o MINVALUE.

Para resetar para um valor específico (ex: 5000), a fórmula é valor_alvo - NEXTVAL_atual:

-- NEXTVAL atual: 27, alvo: 5000
-- 5000 - 27 = 4973
ALTER SEQUENCE esquema.nome_sequence MINVALUE 0 INCREMENT BY 4973 NOCACHE;
SELECT esquema.nome_sequence.NEXTVAL FROM dual;
ALTER SEQUENCE esquema.nome_sequence INCREMENT BY 1;

Identity Columns: Caso Especial

Se a coluna usa GENERATED AS IDENTITY (introduzido no Oracle 12c), ela tem uma sequence interna gerenciada pelo próprio Oracle. O ALTER SEQUENCE direto não se aplica — use:

ALTER TABLE esquema.tabela
  MODIFY (coluna GENERATED AS IDENTITY (START WITH 1));

Ou para um valor específico:

ALTER TABLE esquema.tabela
  MODIFY (coluna GENERATED AS IDENTITY (START WITH 5000));

Cenário Completo de Lab

Setup

CREATE TABLE lab_pedidos (
    id     NUMBER PRIMARY KEY,
    descr  VARCHAR2(100)
);

CREATE SEQUENCE lab_seq START WITH 1 INCREMENT BY 1 CACHE 20;

Popula dados iniciais

INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido A');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido B');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido C');
COMMIT;

SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 4

Método Moderno — RESTART (19c+)

ALTER SEQUENCE lab_seq RESTART START WITH 1 NOCACHE;

SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 1

SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 2

SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 3

O RESTART entrega exatamente o valor definido no START WITH, sem surpresas.


Método Clássico — INCREMENT BY Negativo

Para demonstrar o método clássico, continue inserindo dados a partir do estado atual (NEXTVAL = 3 após o teste acima) até acumular um volume maior:

INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido D');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido E');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido F');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido G');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido H');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido I');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido J');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido K');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido L');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido M');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido N');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido O');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido P');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido Q');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido R');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido S');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido T');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido U');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido V');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido W');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido X');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido Y');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido Z');
COMMIT;

SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 27

Agora o reset:

-- 1. Verifique o NEXTVAL atual
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 27

-- 2. Baixe o MINVALUE para 0 e aplique o incremento negativo
ALTER SEQUENCE lab_seq MINVALUE 0 INCREMENT BY -27 NOCACHE;

-- 3. Consuma um NEXTVAL para efetivar o recuo
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 0

-- 4. Restaure o INCREMENT BY
ALTER SEQUENCE lab_seq INCREMENT BY 1;

-- 5. Confirme o reset
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 1

-- 6. Restaure o MINVALUE
ALTER SEQUENCE lab_seq MINVALUE 1;

Limpeza

DROP SEQUENCE lab_seq;
DROP TABLE lab_pedidos;

Erros Conhecidos

ORA-08004: sequence NEXTVAL goes below MINVALUE and cannot be instantiated

Ocorre quando o INCREMENT BY negativo levaria o NEXTVAL abaixo do MINVALUE da sequence (padrão: 1). Aplicar INCREMENT BY -27 com NEXTVAL em 27 tentaria pousar em 0, violando o MINVALUE.

Solução: Baixe o MINVALUE para 0 antes de aplicar o incremento negativo:

ALTER SEQUENCE lab_seq MINVALUE 0 INCREMENT BY -27 NOCACHE;
SELECT lab_seq.NEXTVAL FROM dual; -- Retorna: 0
ALTER SEQUENCE lab_seq INCREMENT BY 1;
ALTER SEQUENCE lab_seq MINVALUE 1;

ORA-04007: MINVALUE cannot be made to exceed the current value

Ocorre quando você tenta restaurar MINVALUE 1 enquanto o valor atual da sequence é 0. O Oracle não permite que o MINVALUE seja maior que o valor corrente.

Solução: Restaure o INCREMENT BY 1 primeiro e consuma um NEXTVAL (que entrega 1) antes de ajustar o MINVALUE:

-- ERRADO — falha com ORA-04007:
ALTER SEQUENCE lab_seq INCREMENT BY 1 MINVALUE 1;

-- CORRETO — faça em etapas:
ALTER SEQUENCE lab_seq INCREMENT BY 1;
SELECT lab_seq.NEXTVAL FROM dual; -- Retorna: 1
ALTER SEQUENCE lab_seq MINVALUE 1;

Resumo Rápido

-- Moderno (19c+): restart simples
ALTER SEQUENCE esquema.seq RESTART;

-- Moderno (19c+): restart para valor específico
ALTER SEQUENCE esquema.seq RESTART START WITH 1000;

-- Clássico: substitua X pelo NEXTVAL atual
ALTER SEQUENCE esquema.seq MINVALUE 0 INCREMENT BY -X NOCACHE;
SELECT esquema.seq.NEXTVAL FROM dual;   -- Retorna: 0
ALTER SEQUENCE esquema.seq INCREMENT BY 1;
SELECT esquema.seq.NEXTVAL FROM dual;   -- Retorna: 1
ALTER SEQUENCE esquema.seq MINVALUE 1;

-- Identity column
ALTER TABLE esquema.tabela
  MODIFY (coluna GENERATED AS IDENTITY (START WITH 1));

Referências

  • Oracle 19c — ALTER SEQUENCE
  • Oracle 12c — Identity Columns

alter-sequence how-to identity-column lab oracle-sequence
Share. Facebook Twitter Pinterest LinkedIn Tumblr Email WhatsApp
Previous ArticleOPATCHAUTO-72115 — Sessão Anterior Não Completada no Out-of-Place Patching
Next Article ORA-12547 — TNS:lost contact ao conectar com sqlplus

Related Posts

Oracle

ORA-01031 — Privilégio Insuficiente ao Criar Coluna IDENTITY

2026-04-03
Read More
Oracle

ORA-12547 — TNS:lost contact ao conectar com sqlplus

2026-04-03
Read More
Oracle

OPATCHAUTO-72115 — Sessão Anterior Não Completada no Out-of-Place Patching

2026-03-30
Read More
Add A Comment
Leave A Reply Cancel Reply

Demo
Follow Me
  • Email
  • GitHub
  • LinkedIn
  • RSS
  • YouTube

INS-06006 – Passwordless SSH Connectivity Not Set Up

2026-02-2614 Views

Limpeza da biblioteca de software OEM: Purge seguro e controle de crescimento de swlib

2026-02-215 Views

ORA-29548 – Como corrigir o erro “Java System Class Reported” no Oracle Database

2026-03-053 Views
Demo
Tags
alter-sequence asm chrony compatible-asm cv-assume-distid database-vault datapatch disk-group dvsys enterprise manager grid-infrastructure how-to identity-column ins-08101 inventory java lab ntp oem oem-13c opatchauto opatchauto-72083 ora-01400 ora-15221 ora-29548 oracle oracle-rac oracle-sequence patch de dados patching prvg-01017 rhel-8 runcluvfy software-library storage troubleshooting
Execute Step
YouTube LinkedIn RSS
  • Home
  • Sobre
  • Contato
  • RSS
  • Português
    • English (Inglês)
© 2026 ExecuteStep. Designed by ThemeSphere.

Type above and press Enter to search. Press Esc to cancel.

Ad Blocker Enabled!
Ad Blocker Enabled!
Our website is made possible by displaying online advertisements to our visitors. Please support us by disabling your Ad Blocker.