Como evito que o Oracle grave no arquivo de dados quando inicio o banco de dados?

Como evito que o Oracle grave no arquivo de dados quando inicio o banco de dados?

Estou criando uma imagem Docker para banco de dados Oracle e muitos contêineres diferentes serão gerados a partir da mesma imagem.

Quando inicio a instância Oracle, por algum motivo, alguns bytes são gravados em todos os arquivos de dados ativos. O Docker salva um diff do contêiner na imagem base, e o diff é todo o arquivo que foi alterado, portanto, cada vez que eu inicio um contêiner, mais de 6 GB são gravados no disco apenas para iniciar o banco de dados.

Então, por que o Oracle grava nos arquivos de dados ao iniciar o banco de dados? O comportamento mais lógico seria gravar nos arquivos de dados somente quando os dados fossem alterados e confirmados. Posso fazer algo para mudar isso?

Além do Oracle Linux (que é a base da minha imagem) também tentei isso no Windows e o comportamento é o mesmo, todos os arquivos de dados são gravados.

Tentei definir os espaços de tabela como somente leitura. Isso evita a operação de gravação, porém quando configuro o tablespace para leitura-gravação ele grava imediatamente no arquivo, causando o problema novamente.

Só para deixar claro, preciso que os espaços de tabela sejam graváveis, mas somente quando os dados realmente mudarem.

Responder1

Não há como evitar isso. Além dos dados dos usuários, o Oracle também contém muitos metadados - eles também precisam ser mantidos. Internamente a Oracle mantém um número chamado SCN (System Change Number). Este número aumenta sempre que “algo” muda no banco de dados.

Este número SCN é escrito no cabeçalho de cada arquivo de dados e também em cada arquivo de controle. Ao abrir (iniciar) o banco de dados Oracle verifica se esse número é igual em todos os arquivos. Então assume que os arquivos são consistentes.

Este SCN é incrementado mesmo que não haja carga para o banco de dados. Também há trabalhos em segundo plano, como coleta de estatísticas, que carregam alguma carga. Além disso, os usuários podem criar um gatilho de sistema ON DATABASE STARTUPque executará algum trabalho quando o banco de dados for iniciado.

Geralmente os servidores de banco de dados Oracle não são bons candidatos para virtualização. A equipe com registro em diário da Oracle também faz isso internamente, então você mantém os mesmos dados duas vezes (esses arquivos são chamados de redo-logs de arquivo). Portanto, se você descartar as diferenças do contêiner (somente para arquivos de dados), o Oracle será capaz de sobreviver a isso, porque será capaz de reproduzir transações de redo-logs.

PS: Ao clonar bancos de dados, você também deve considerar alterar o SID do banco de dados para ser exclusivo. Ou pelo menos você deve usar nid para alterar o número exclusivo do banco de dados DBID. Caso contrário, você poderá ter problemas ao restaurar backups de bancos de dados RMAN.

informação relacionada