Estou usando o contêiner Free Oracle 23c Docker (Veja aqui) para ajudar a provisionar um ambiente de desenvolvimento.
Como parte da configuração do ambiente, estou colocando scripts e SQL para /docker-entrypoint-initdb.d/startup
usar a configuração em meu arquivo docker-compose.yml.
Um desses scripts é configurar o parâmetro COMPATIBILITY ( ALTER SYSTEM SET COMPATIBLE = '19.0.0' SCOPE=SPFILE;
), que, após configurá-lo, requer a reinicialização do banco de dados.
Em uma instalação de banco de dados de servidor, eu executaria meu SQL para definir a compatibilidade, seguido de algo como o seguinte:
echo -e "shutdown immediate \n startup mount" | sqlplus -s / as sysdba
para reiniciar o banco de dados.
No entanto, quando faço isso no contêiner docker (seja automaticamente, conforme descrito acima, ou conectando-me manualmente ao sqlplus no contêiner e executando os mesmos comandos), depois que o banco de dados for reiniciado, o lister voltará com uma conexão bloqueada, e não consigo mais me conectar ao banco de dados.
docker exec -ti app_db_1 lsnrctl status
dá o seguinte:
LSNRCTL para Linux: versão 23.0.0.0.0 - lançamento do desenvolvedor em 14 de setembro de 2023 08:27:40
Direitos autorais (c) 1991, 2023, Oracle. Todos os direitos reservados.
Conectando-se a (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_FREE))) STATUS do LISTENER ------------------------ Alias LISTENER Versão TNSLSNR para Linux: Versão 23.0.0.0.0 - Data de início de lançamento do desenvolvedor
14-SEP-2023 08:27:37 Tempo de atividade 0 dias 0 horas. 0 minutos. 2 segundos Nível de rastreamento desativado Segurança ATIVADO: Autenticação do SO local SNMP DESLIGADO Serviço padrão Arquivo de
parâmetros do ouvinte GRATUITO
/opt/oracle/product/23c/dbhomeFree/network/admin/listener.ora Arquivo de log do ouvinte
/opt/oracle/diag/tnslsnr/854ac05c3c0f /listener/alert/log.xml Resumo dos terminais de escuta...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_FREE)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0) (PORT=1521))) Resumo dos serviços... O serviço "FREE" possui 1 instância(s). Instância "FREE", status BLOCKED, possui 1 manipulador(es) para este serviço... O serviço "PLSExtProc" possui 1 instância(s). Instância "PLSExtProc", status UNKNOWN, possui 1 manipulador(es) para este serviço... O comando foi concluído com sucesso
observe a Instance "FREE", status BLOCKED
seção da saída.
Como posso reiniciar o banco de dados programaticamente dentro do contêiner sem que isso aconteça?
ATUALIZAÇÃO - fazer login e executar a reinicialização interativamente mostra o seguinte:
ORA-00201: arquivo de controle versão 23.0.0.0.0 incompatível com ORACLE versão 19.0.0.0.0 ORA-00202: arquivo de controle: '/opt/oracle/oradata/FREE/control01.ctl'
Antes de reiniciar, lsnrctl status
retorna isto:
LSNRCTL para Linux: versão 23.0.0.0.0 - lançamento do desenvolvedor em 14 de setembro de 2023 08:32:57
Direitos autorais (c) 1991, 2023, Oracle. Todos os direitos reservados.
Conectando-se a (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_FREE))) STATUS do LISTENER ------------------------ Alias LISTENER Versão TNSLSNR para Linux: Versão 23.0.0.0.0 - Data de início de lançamento do desenvolvedor
14-SEP-2023 08:32:46 Tempo de atividade 0 dias 0 horas. 0 minutos. 10 seg. Nível de rastreamento desativado Segurança ATIVADO: Autenticação do SO local SNMP DESLIGADO Serviço padrão
Arquivo de parâmetros do ouvinte GRATUITO
/opt/oracle/product/23c/dbhomeFree/network/admin/listener.ora Arquivo de log do ouvinte
/opt/oracle/diag/tnslsnr/05cf8b8b6d41 /listener/alert/log.xml Resumo dos terminais de escuta...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_FREE)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0) (PORT=1521))) Resumo dos serviços... O serviço "FREE" possui 1 instância(s). Instância "FREE", status READY, possui 1 manipulador(es) para este serviço... O serviço "PLSExtProc" possui 1 instância(s). Instância "PLSExtProc", status UNKNOWN, possui 1 manipulador(es) para este serviço... O comando foi concluído com sucesso
Responder1
Você não pode definir o compatibility
parâmetro mais baixo, apenas mais alto; então isso estava fazendo com que o banco de dados não iniciasse; e, portanto, o ouvinte será bloqueado