- Este tópico contém 8 respostas, 2 vozes e foi atualizado pela última vez 7 anos, 4 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
4 de agosto de 2017 às 4:18 pm #108891marcoParticipante
Senhores, tenho uma rotina de implementação, de exportação de bases modelo para os clientes,
Exp v
Zipar o Arquivo na proc V
Porém estou quebrando a cabeça na chamada de uma outra procedure no quesito abrir um bat para transferir o arquivo do data_pump_dir para este caminho do FTP.Permissões :
GRANT READ,WRITE ON DIRECTORY MODEL_HIS_PEP_DIR TO dbcad;
GRANT CREATE JOB TO dbcad;
GRANT CREATE EXTERNAL JOB TO dbcad;
GRANT MANAGE SCHEDULER TO dbcad;
GRANT SCHEDULER_ADMIN TO dbcad;
GRANT EXECUTE ON DBMS_SCHEDULER TO dbcad;Lá pelas tantas ele se mostra assim o codigo.
CREATE OR REPLACE PROCEDURE sp_exp_modelo_teste_2 (pVersao varchar2) IS
hand number := null; — ID do processo de datapump job
job_state VARCHAR2(30) := ”; — Status do job de exportação
dump_file_name varchar2(100); — Nome do arquivo .DMP que irá ser criado
log_file_name varchar2(100); — Nome do arquivo .LOG que irá ser criado
v_nome_base_dmp varchar2(30); —
v_nome_base_log varchar2(30); —BEGIN
job_state:= ‘COMPLETED’;
dump_file_name:=’BASE_MODELO_.dmp’;if job_state=’COMPLETED’ then
— aqui chama o bat para enviar para o ftp e excluir na origem os arquivos
— Implementar excluir arquivos antigos depois de 1 semana.
begin
dbms_scheduler.create_job(job_name => ‘JOB_DUMP_MODELO’,
job_type => ‘EXECUTABLE’,
job_action => ‘D:appadminDBSAUDE2model_his_pepcopy.bat’,
number_of_arguments => 2,
auto_drop => TRUE,
enabled => FALSE);dbms_scheduler.set_job_argument_value(‘JOB_DUMP_MODELO’,1,pVersao);
dbms_scheduler.set_job_argument_value(‘JOB_DUMP_MODELO’,2,dump_file_name);
DBMS_SCHEDULER.set_attribute (‘JOB_DUMP_MODELO’,’CREDENTIAL_NAME’,’SYSADMIN’);
dbms_scheduler.enable (‘JOB_DUMP_MODELO’);
end;
end if;
END sp_exp_modelo_teste_2;Erros:
select * from dba_scheduler_job_run_details where job_name=’JOB_DUMP_MODELO’EXTERNAL_LOG_ID=”job_3853642_381501″,
ORA-27369: o trabalho do tipo EXECUTABLE falhou com código de saída: The extended attributes are inconsistent.Alguém tem alguma ideia sobre?
4 de agosto de 2017 às 6:08 pm #108892José Laurindo ChiappaModeradorColega, embora não tenha como debugar pra vc seu código (passou de uma dúzia de linhas já tá fora dos 5 minutos que dedico a respostas gerais aqui no fórum – PLEASE dá pra gente uma versão ** ultra-resumida ** do seu código, completa com os CREATE TABLEs e com o SHELL/.BAT SCRIPT que vc quer executar mas Também severamente Resumido que a gente pode tentar reproduzir aqui), mas VIA DE REGRA se o shell/.BAT script executa blz manualmente mas dá falha ao ser executado é um dos problemas abaixo :
==> permissões do account Windows que roda o executável do Oracle : ENTENDA que os binários do RDBMS Oracle rodam (no Windows, como é seu caso imagino julgando pelo ‘D:appadmin….’ do seu argumento) *** NÂO RODA *** com o mesmo usuário Windows com o qual vc logou na máquina e tá testando o shell script/.BAT manualmente, mas sim como um SERVIÇO WINDOWS, e esse serviço Tanto pode logar no WIndows como o usuário Administrador do sistema QUANTO com uma conta criada especificamente pra isso QUANTO com uma conta tipo ANONYMOUS, ie, sem privilégio algum de logar no Windows, só de rodar serviços mesmo…
ou
==> pode haver issue de conexão no tal ftp que vc cita, https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:614839700346614309 é uma ref onde a falha era chave de autenticação
ou
==> pode ser questão de Permissão no próprio arquivo do script, https://dbatricksworld.com/ora-27369-job-of-type-executable-failed-with-exit-code-inputoutput-error-ora-06512/ é um exemplo no Linux mas o conceito é Similar no Windows, apenas com a ressalva de que OUTROS comandos/procedimentos são necessários pra checar permissões de diretórios/arquivos no Windows
ou
==> faltam variáveis de ambiente : *** ÓBVIO ***, o job vai rodar em uma OUTRA sessão do sistema operacional, então variáveis como PATH, ORACLE_HOME, ORACLE_SID, etc, normalmente Não Vão estar setadas, veja http://www.databaseusers.com/article/9451513/Connecting+back+to+database+with+job_type+%3D+executable como refs
ou
==> vc está usando algum programa que fica esperando por INPUT DO USUÁRIO dentro do .BAT que tenta executar : nem preciso dizer, a conexão no WIndows que o scheduler job vai criar é *** TOTAL E COMPLETAMENTE NÃO-INTERATIVA ****!!! https://stackoverflow.com/questions/19710126/run-exe-from-dbms-scheduler registra um exemplo onde o sujeito chamava o calc.exe , que é INTERATIVO (ie, fica esperando o usuário clickar/informar números a calcular), CLARO que isso Não Funciona….
TEM QUE SER um programa absoluta e completamente controlado pro ARGUMENTOS DE LINHA DE COMANDO e que NÂO EXIBA NADA NA TELA, não peça por Clicks de usuário, enfim , sem NENHUMA INTERATIVIDADE ….==> uma Grande possibilidade : como Todos Nós Sabemos, nos Windows mais recentes a Microsoft introduziu NOVOS CONTROLES de Segurança, como o UAC, de modo que ** MESMO ** usuários que já estão no grupo de Administradores locais não executam programas com esse privilégio ativo por default… Veja https://social.technet.microsoft.com/Forums/exchange/en-US/cd3e76a5-844d-4e04-9501-f7442eb22f03/task-scheduler-returns-extended-attributes-are-inconsistent?forum=winserver8gen como ref…
[]s
Chiappa
4 de agosto de 2017 às 8:41 pm #108893marcoParticipanteTens razão mil desculpas.
Vamos la então 🙂
1º Etapa:
Exp schemma dos schemmas modelo que tenho no ambiente2º Etapa, que só é chamada se estado do job=ok —- if job_state=’COMPLETED’ then
3º Etapa ainda na mesma PROC:
Zipa o Arquivo de Dump Criado na Etapa 1.4º Etapa:
Cria um JOB com o argumento argumento devido para executar um bat com algumas variaveis.dbms_scheduler.create_job(job_name=> ‘JOB_DUMP_MODELO’,
job_type => ‘EXECUTABLE’,
job_action => ‘D:appadminDBSAUDE2model_his_pepcopy.bat’,
number_of_arguments => 2,
enabled => FALSE);Naquele caminho do windows, tem o arquivo copy.bat
@echo off
Set Local EnableDelayedExpansion
set Version=%1
set Filename=%2
set SourceDir=\10.51.3.41d$appadminDBSAUDE2model_his_pep
set TargetDir=\sftpversoes$PEP%Version%DB
rem set TargetDir=\10.51.2.21c$temprem cópia arquivos para diretório mapeado do TFS
rem copy %SourceDir%*.ZIP% %TargetDir%%Version% /Ycopy %SourceDir%%Filename%.ZIP %TargetDir% /Y
exit 0
5 de agosto de 2017 às 1:11 am #108894José Laurindo ChiappaModeradorColega, ** cadê ** as informações que pedi ?? Por exemplo, deixei claro que o RDBMS Oracle roda sob um SERVIÇO WINDOWS, esse serviço tá logando com *** QUAL *** usuário ??? É o mesmo usuário que vc está logado ?? Se sim, esse usuário é Admin local ? Abrindo um prompt de comando/janela DOS com esse usuário e executando na mão passando os dois parâmetros necessários pro teu .BAT ele roda ok , roda sem erro ????? Sem informações vamos ficar adivinhando aqui até amanhã….
Outra coisa : quando eu recomendei DEBUG , é algo semelhante ao que vc fez, ie, comentar e/ou criar criar uma versão O MAIS SIMPLES POSSÍVEL e testar, se essa versão simples funcionar aí vc vai colocando funcionalidades de volta até encontrar o problema….
POR EXEMPLO, tentou desativar o UAC temporariamente ? E eu vejo que vc estava originalmente tentando acessar um share UNC (reconheço pelas \ no começo do path), e comentou : legal, mas QUE TAL ter também os parâmetros de Source e Target apontando temporariamente pra pastas locais, só pra teste ?? E feito isso, essa versão mais simples dá o mesmo erro ao executar pelo job ?? E executando na mão ??? Isso faz sentido, pois Não É Incomum que o share Windows tenha sido criado DEPOIS que a máquina do RDBMS subiu e o serviço do Oracle foi startado, então nesse momento do startup ele Não Conhecia Ainda essa caminho \10.51.3.41d$nãoseidasquantas … ISSO É DEBUG, é vc começar de algo simples e ir testando, experimentando, ANALISANDO HIPÓTESES até achar o erro… OKDOC ??Passa pra gente a verif que vc fez do usuário que roda o serviço WIndows disparando os binários Oracle, confirmando que ele TEM os privilégios necessários pra fazer a cópia, mostra o erro exato que deu ao rodar essa versão mais simples pelo JOB, fala o que deu quando executou pela mão…
Isso é algo que só VOCÊ pode fazer…[]s
Chiappa
5 de agosto de 2017 às 1:49 am #108896José Laurindo ChiappaModeradorUm exemplinho só pra não ficar no blablablá…
Veja abaixo O meu exemplo de .BAT bem simples pra executar depois pelo SCHEDULER : meu .BAT vai só copiar um arquivo que já existe E PARA O QUAL a conta Windows que executa o serviço Windows do RDBMS Oracle tem direito…==> Tenho um arquivo já presente lá :
C:apporacleadminO11GR2dpdump>dir
O volume na unidade C não tem nome.
O Número de Série do Volume é 340C-E794Pasta de C:apporacleadminO11GR2dpdump
14/06/2017 16:12 .
14/06/2017 16:12 ..
14/06/2017 16:12 119 dp.log
1 arquivo(s) 119 bytes
2 pasta(s) 311.970.865.152 bytes disponíveisC:apporacleadminO11GR2dpdump>
==> crio um .BAT que simplesmente copia esse arquivo desse diretório para um outro diretório ** LOCAL ** (C:apporacleproduct11gR2dbhome no meu caso), que eu não tenho ainda :
C:apporacleadminO11GR2dpdump>dir C:apporacleproduct11gR2dbhometeste.txt
O volume na unidade C não tem nome.
O Número de Série do Volume é 340C-E794Pasta de C:apporacleproduct11gR2dbhome
Arquivo não encontrado
==>> Não mostro aqui porque fiz com o Windows Explorer, que é gráfico, mas eu me ASSEGUREI 100% que as permissões de acesso estão OK, e temporariamente desliguei o UAC.. Eis o .BAT :
C:apporacleadminO11GR2dpdump>type copiar.bat
copy C:apporacleadminO11GR2dpdumpdp.log C:apporacleproduct11gR2dbhometeste.txt
C:apporacleadminO11GR2dpdump>==> OK, executo o .BAT manualmente, numa janela DOS logado como o mesmo usuário Windows que roda o RDBMS, etc :
C:apporacleadminO11GR2dpdump>copiar.bat
C:apporacleadminO11GR2dpdump>copy C:apporacleadminO11GR2dpdumpdp.log C:apporacleproduct11gR2dbhometeste.txt
1 arquivo(s) copiado(s).==> O resultado :
C:apporacleadminO11GR2dpdump>dir C:apporacleproduct11gR2dbhometeste.txt
O volume na unidade C não tem nome.
O Número de Série do Volume é 340C-E794Pasta de C:apporacleproduct11gR2dbhome
14/06/2017 16:12 119 teste.txt
1 arquivo(s) 119 bytes
0 pasta(s) 311.970.762.752 bytes disponíveis==> OK, apago o arquivo gerado pelo meu teste :
C:apporacleadminO11GR2dpdump>del C:apporacleproduct11gR2dbhometeste.txt
==> e crio um JOB no SCHEDULER pra executar o .BAT :
C:apporacleadminO11GR2dpdump>sqlplus sys/oracle as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Sex Ago 4 18:42:21 2017
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> BEGIN
2 DBMS_SCHEDULER.CREATE_JOB (
3 JOB_NAME=> ‘myjob’,
4 JOB_TYPE=> ‘executable’,
5 JOB_ACTION=> ‘c:windowssystem32cmd.exe /c C:apporacleadminO11GR2dpdumpcopiar.bat > nul’,
6 ENABLED=> TRUE,
7 AUTO_DROP=>TRUE);
8 END;
9 /Procedimento PL/SQL concluído com sucesso.
SQL>
===>>> OK, como não passei dados de schedulagem ele roda na hora e uma vez só… Vamos ver o resultado ?
SQL> exit
Desconectado de Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options==> Ó o resultado, arquivo copiado com sucesso :
C:apporacleadminO11GR2dpdump>dir C:apporacleproduct11gR2dbhometeste.txt
O volume na unidade C não tem nome.
O Número de Série do Volume é 340C-E794Pasta de C:apporacleproduct11gR2dbhome
14/06/2017 16:12 119 teste.txt
1 arquivo(s) 119 bytes
0 pasta(s) 311.970.635.776 bytes disponíveisC:apporacleadminO11GR2dpdump>
==>> O ponto *** CRUCIAL ** é aquele que eu Já TINHA DITO na minha PRIMEIRA RESPOSTA : um job de banco *** Não É Interativo ***, então vc tem que assegurar que NENHUMA resposta é exigida…. E outra coisa : vc TEM que mimetizar ** TUDO ** o que foi feito na execução manual sim sim ?? O “c:windowssystem32cmd.exe” no começo é JUSTAMENTE ISSO, estou ABRINDO um prompt de comando, que nem tive que fazer pra executar o .BAT na mão, sacou ???
Faça um teste deste tipo e depois vai sofisticando, ie, vai colocando Argumentos pra origem e destino (mas ainda na máquina local), depois que essa versão um pouco mais sofisticada foi bem aí sim vc testa com UNC/máquina remota…. OKDOC ???
[]s
Chiappa
8 de agosto de 2017 às 8:21 pm #108904marcoParticipanteUma ultima pergunta.
Nos meus testes aqui é possivel passar uma “variavel” do JOB e ele ser incorporado no .BAT?
Porque pelo que entendi, a copia pode ser chamada, tal como teu teste foi.
Só que me surgiu uma necessidade de:
Tenho uma arvore de versões aqui
1.5.3.0
1.6.4.0
1.7.0.0> No FTP a organização esta por pasta de cada versão.
> No Oracle Directories, ele esta criando perfeitamente a copia zipada do que passei como parametro la na procedure.É mais facil fazer via shell script que ele pegue o nome e mande para a respectiva pasta no FTP?
Ou Dá para incluir isso no script:?9 de agosto de 2017 às 12:48 am #108905José Laurindo ChiappaModeradorBlz ? Então, vc pode passar argumentos tantos na linha de comando do programa a ser chamado pelo scheduler job quanto pode usar as colunas de parâmetros do CREATE JOB (veja no manual Oracle “Database PL/SQL Packages and Types Reference” o capítulo sobre a package DBMS_SCHEDULER para refs) mas normalmente esses parâmetros são FIXOS, construídos quando da criação do JOB…
O que vc quer ao que entendo seria passar valores para ser usados como parâmetros quando o job executar : isso até poderia ser feito criando um PROGRAM que retorna o valor (veja https://community.oracle.com/thread/3971491 para exemplo), mas sinceramente há alternativas mais simples…Uma das outras alternativas seria simplesmente vc CRIAR o .BAT script programaticamente, via UTL_FILE – ele é um arquivo de texto, afinal, e uma procedure tem ** TODO ** o necessário para manipular arquivos-texto via UTL_FILE… Essa é uma alternativa Muito mais Simples de programar, acho eu : afinal, pelo que entendi a procedure Já Tem na mão todo o necessário…
Outra alternativa se a anterior não for viável seria vc fazer a procedure passar prum arquivo-texto os parâmetros que vc quer e aí o .BAT script simplesmente lê esse arquivo e constrói os comandos na hora…
Importante : como eu disse e creio que vc sabe, ** tudo ** que vc chama num JOB ** tem ** que ser absolutamente Não Interativo, ok ? Para atender a essa necessidade, normalmente os clients de FTP permitem TANTO que vc digite o que quer QUANTO permite que vc passe como argumento um arquivo de comandos, que ele vai abrir e executar os comandos um por um : http://www.jscape.com/blog/using-windows-ftp-scripts-to-automate-file-transfers é um exemplo de arquivo de comandos fixo , e https://www.howtogeek.com/howto/windows/how-to-automate-ftp-uploads-from-the-windows-command-line/ é um exemplo onde o arquivo de comandos a serem executados é construído dinamicamente pelo .BAT…
A minha idéia é que vc programe teu .BAT para abrir o arquivo gerado pela procedure com o nome da pasta que vc quer fazer CD, e depois o .BAT monta dinamicamente o arquivo de comandos a ser executado pela opção -s incorporando a informação que leu do arquivo gerado pela procedure…[]s
Chiappa
9 de agosto de 2017 às 5:29 pm #108906marcoParticipanteBha meu caro, te agradeço mesmo o apoio. É incrivel que quanto mais se estuda, mais coisas tem a se estudar.
Conversei com o cara que manja de powershell aqui e seguiremos a estrategia abaixo:
Assumi que a minha proc esta ok, quando passo o parametro da versão e assim ele faz o exp, com base nessa versão, depois zipa o .DMP.´
Após isso, sera feito uma chamada no agendador de tarefas que corre a pasta, pega o nome e manda para a respectiva pasta do FTP.Anotei tudo que disseste e vou estudar meu caro. 🙂
10 de agosto de 2017 às 1:11 am #108909José Laurindo ChiappaModeradorHmm : com esse “corre a pasta” eu imagino que vc quis dizer que o .BAT chamado pelo Agendador de Tarefas do Windows vai (usando comando FOR, provavelmente) percorrer a lista de arquivos presentes, e processa de acordo …
Sim, algo do tipo pode funcionar, mas torno a indicar que imho seria Muuuito Mais Simples a própria procedure PL/SQL já criar o .BAT (que, repito, é um simples arquivo-texto) que já contenha os comandos necessários…. Mas vai do gosto do freguês…[]s
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.