Pular para o conteúdo
  • Este tópico contém 8 respostas, 2 vozes e foi atualizado pela última vez 7 anos, 4 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #108891
    marco
    Participante

      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?

      #108892
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Colega, 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

        #108893
        marco
        Participante

          Tens razão mil desculpas.

          Vamos la então 🙂

          1º Etapa:
          Exp schemma dos schemmas modelo que tenho no ambiente

          2º 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$temp

          rem cópia arquivos para diretório mapeado do TFS
          rem copy %SourceDir%*.ZIP% %TargetDir%%Version% /Y

          copy %SourceDir%%Filename%.ZIP %TargetDir% /Y

          exit 0

          #108894
          Avatar photoJosé Laurindo Chiappa
          Moderador

            Colega, ** 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

            #108896
            Avatar photoJosé Laurindo Chiappa
            Moderador

              Um 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-E794

              Pasta 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íveis

              C: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-E794

              Pasta 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-E794

              Pasta 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 options

              SQL> 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-E794

              Pasta 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íveis

              C: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

              #108904
              marco
              Participante

                Uma 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:?

                #108905
                Avatar photoJosé Laurindo Chiappa
                Moderador

                  Blz ? 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

                  #108906
                  marco
                  Participante

                    Bha 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. 🙂

                    #108909
                    Avatar photoJosé Laurindo Chiappa
                    Moderador

                      Hmm : 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

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.
                    plugins premium WordPress