AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-8215

RBarryYoung's questions

Martin Hope
RBarryYoung
Asked: 2017-03-31 13:29:51 +0800 CST

Outer Join suprimindo o uso do índice?

  • 7

Eu tenho um programa cliente que está executando uma consulta em uma exibição que une uma tabela a outra externa. O desempenho é ruim e tenho tentado ajustá-lo adicionando o índice correto. A consulta em questão está apenas usando a segunda tabela, então eu tenho testado diretamente nessa tabela.

Encontrei (vários) índices que funcionaram bem para a consulta na tabela, mas quando mudei para usar o modo de exibição, eles pararam de usar quaisquer índices e apenas fizeram verificações completas em ambas as tabelas. Como essas tabelas são grandes (2-3 milhões de linhas cada), isso é muito lento.

Para simplesmente testar, alterei a consulta para ignorar o e apenas incorporar a junção externa na própria consulta. Isso reproduziu com sucesso o problema, mas deixou o mistério de por que a junção externa não usaria os índices.

Aqui está a tabela, com todos os índices que adicionei durante o teste:

  CREATE TABLE TEST_DATA 
   (ID NUMBER(11,0)  PRIMARY KEY, 
    FORMATTED_RESULT VARCHAR2(255 BYTE), 
    F_RESULT NUMBER, 
    IDNUM NUMBER(11,0), 
    IDNUM_DESCRIPTION VARCHAR2(128 BYTE), 
    LAB_NUMBER NUMBER(11,0), 
    SEQ_NUMBER NUMBER(11,0),
    ORDERNO NUMBER(11,0),
    SUPPL_FORMATTED_RESULT VARCHAR2(255 BYTE), 
    SUPPL_IDNUM NUMBER(11,0), 
    SUPPL_IDNUM_DESCRIPTION VARCHAR2(128 BYTE), 
    SUPPL_UNIT VARCHAR2(16 BYTE)
   ) ;

  CREATE UNIQUE INDEX TEST_LN_SQN_ORDER ON TEST_DATA (LAB_NUMBER, SEQ_NUMBER, ORDERNO) ;
  CREATE INDEX TEST_LN_SQN ON TEST_DATA (LAB_NUMBER, SEQ_NUMBER) ;
  CREATE INDEX TD_CUIDD_CUFR ON TEST_DATA (UPPER(COALESCE(SUPPL_IDNUM_DESCRIPTION,IDNUM_DESCRIPTION)), UPPER(COALESCE(SUPPL_FORMATTED_RESULT,FORMATTED_RESULT))) ;
  CREATE INDEX TD_UFR_IDN ON TEST_DATA (UPPER(FORMATTED_RESULT), IDNUM) ;
  CREATE INDEX TD_UIDD_UFR ON TEST_DATA (UPPER(IDNUM_DESCRIPTION), UPPER(FORMATTED_RESULT)) ;
  CREATE INDEX TD_CUFR_CIDN_SN_LN ON TEST_DATA (UPPER(COALESCE(SUPPL_FORMATTED_RESULT,FORMATTED_RESULT)), COALESCE(SUPPL_IDNUM,IDNUM), SEQ_NUMBER, LAB_NUMBER) ;
  CREATE INDEX TD_SN_LN_CUFR_CIDN ON TEST_DATA (SEQ_NUMBER, LAB_NUMBER, UPPER(COALESCE(SUPPL_FORMATTED_RESULT,FORMATTED_RESULT)), COALESCE(SUPPL_IDNUM,IDNUM)) ;
  CREATE INDEX TD_CUFR_CIDN ON TEST_DATA (UPPER(COALESCE(SUPPL_FORMATTED_RESULT,FORMATTED_RESULT)), COALESCE(SUPPL_IDNUM,IDNUM)) ;

Aqui está a outra tabela (aquela que realmente não usamos para esta consulta)

  CREATE TABLE REQUEST_INFO 
   (NUMBER(11,0) PRIMARY KEY, 
    CHARGE_CODE VARCHAR2(32 BYTE), 
    LAB_NUMBER NUMBER(11,0), 
    SEQ_NUMBER NUMBER(11,0)
   ) ;

  CREATE INDEX RI_LN_SN ON REQUEST_INFO (LAB_NUMBER, SEQ_NUMBER) ;
  CREATE INDEX RI_SN_LN ON REQUEST_INFO (SEQ_NUMBER, LAB_NUMBER) ;

Então, primeiro, aqui está a consulta diretamente na tabela única, que usa com sucesso um dos índices.

-- GOOD, Uses index : TD_CUFR_CIDN_SN_LN
select td.LAB_NUMBER 
from test_DATA td 
where UPPER(COALESCE(SUPPL_FORMATTED_RESULT,FORMATTED_RESULT))='491(10)376'
  and COALESCE(TD.SUPPL_IDNUM, TD.IDNUM)=40549 
;

Agora aqui está a consulta usando ambas as tabelas com uma junção interna . Isso também usa os índices e é executado rapidamente.

-- GOOD, Uses indexes : TD_CUFR_CIDN_SN_LN AND RI_SN_LN
select TD.LAB_NUMBER  
from REQUEST_INFO RI 
JOIN TEST_DATA TD ON  TD.LAB_NUMBER = RI.LAB_NUMBER AND TD.SEQ_NUMBER = RI.SEQ_NUMBER 
where UPPER(COALESCE(TD.SUPPL_FORMATTED_RESULT,TD.FORMATTED_RESULT))='491(10)376'
  and COALESCE(TD.SUPPL_IDNUM, TD.IDNUM)=40549 

E aqui está a mesma consulta com um Left Outer Join, como está escrito na exibição. Isso NÃO usa nenhum dos índices e é executado muito lentamente.

-- BAD, does not use indexes
select TD.LAB_NUMBER 
from REQUEST_INFO RI 
LEFT JOIN TEST_DATA TD ON  TD.LAB_NUMBER = RI.LAB_NUMBER AND TD.SEQ_NUMBER = RI.SEQ_NUMBER 
where UPPER(COALESCE(TD.SUPPL_FORMATTED_RESULT,TD.FORMATTED_RESULT))='491(10)376'
  and COALESCE(TD.SUPPL_IDNUM, TD.IDNUM)=40549 
;

Agora, antes que alguém diga: essa consulta é logicamente idêntica à anterior. Isso ocorre porque a cláusula WHERE está filtrando as colunas da tabela externa (TD), que efetivamente/logicamente transforma uma junção externa em uma junção interna (é por isso que importa se as condições ocorrem na cláusula ON versus a cláusula WHERE).

Agora, só para aumentar a estranheza, decidi ver o que aconteceria se eu deixasse a coerção externa para interna mais explícita:

-- GOOD, Uses indexes : TD_CUFR_CIDN_SN_LN AND RI_SN_LN
select TD.LAB_NUMBER 
from REQUEST_INFO RI 
LEFT JOIN TEST_DATA TD ON  TD.LAB_NUMBER = RI.LAB_NUMBER AND TD.SEQ_NUMBER = RI.SEQ_NUMBER 
where UPPER(COALESCE(TD.SUPPL_FORMATTED_RESULT,TD.FORMATTED_RESULT))='491(10)376'
  and COALESCE(TD.SUPPL_IDNUM, TD.IDNUM)=40549 
and TD.LAB_NUMBER IS NOT NULL
;

Incrivelmente, isso funcionou!

Portanto, a questão aqui é: 1) POR QUE a Oracle não descobre isso sozinha?

E 2) Existe alguma configuração ou índice, etc. que eu possa criar que fará com que o Oracle descubra isso corretamente e use os índices?

Considerações adicionais:

  • A exibição é usada por uma variedade de outras consultas e clientes, portanto, não posso simplesmente alterá-la para uma junção interna para essa consulta.

  • O cliente está gerando a consulta, então é difícil/quase impossível alterar a consulta com condições de casos especiais peculiares como: " Use esta visualização para esses dados, a menos que você precise apenas dessas colunas desta tabela, use view ", ou " quando você precisar dessas colunas e apenas essas colunas desta tabela, adicione um 'IS NOT NULL' à cláusula WHERE "

Quaisquer sugestões ou insights serão bem-vindos.


ATUALIZAÇÃO: Acabei de testar no Oracle 11g também, obtive exatamente os mesmos resultados lá.


Por solicitação, aqui está a saída do Plano de Explicação, primeiro a versão boa, onde ele usa índices:

Rows      Plan                                       COST    Predicates
        3 SELECT STATEMENT                                 8 
        3  HASH JOIN                                       8 Access:TD.LAB_NUMBER=RI.LAB_NUMBER AND TD.SEQ_NUMBER=RI.SEQ_NUMBER
        3   NESTED LOOPS                                   8 
             STATISTICS COLLECTOR
        3     INDEX RANGE SCAN TD_CUFR_CIDN_SN_LN          4 Access:UPPER(COALESCE(SUPPL_FORMATTED_RESULT,FORMATTED_RESULT))='491(10)376' AND COALESCE(SUPPL_IDNUM,IDNUM)=40549, Filter:TD.LAB_NUMBER IS NOT NULL
        1    INDEX RANGE SCAN RI_SN_LN                     2 Access:TD.SEQ_NUMBER=RI.SEQ_NUMBER AND TD.LAB_NUMBER=RI.LAB_NUMBER
        1   INDEX FAST FULL SCAN RI_SN_LN                  2

E agora a versão ruim:

Rows      Plan                                       COST    Predicates
 31939030 SELECT STATEMENT                            910972
           FILTER                                             Filter:UPPER(COALESCE(SUPPL_FORMATTED_RESULT,FORMATTED_RESULT))='491(10)376' AND COALESCE(SUPPL_IDNUM,IDNUM)=40549
 31939030   HASH JOIN OUTER                           910972 Access:TD.LAB_NUMBER(+)=RI.LAB_NUMBER AND TD.SEQ_NUMBER(+)=RI.SEQ_NUMBER
  6213479    TABLE ACCESS FULL REQUEST_INFO            58276
 56276228    TABLE ACCESS FULL TEST_DATA              409612
oracle performance
  • 2 respostas
  • 7200 Views
Martin Hope
RBarryYoung
Asked: 2016-05-14 10:08:25 +0800 CST

ANALISAR TABELA..VALIDAR ESTRUTURA é executado para sempre

  • 7

Portanto, como mencionei antes, sou um DBA/Consultor do SQL Server que está ajudando um cliente com seus bancos de dados Oracle. Principalmente, consegui descobrir o que preciso e resolver as coisas com a ajuda do documento e do Google, mas atualmente estou tentando lidar com algo que parece inescrutável.

Um dos bancos de dados é um banco de dados Oracle 10g LIMS que existe (e atualizado) há pelo menos 10 anos (talvez 20). É um aplicativo crítico, mas eles têm tido vários problemas de confiabilidade com ele nos últimos dois anos. Para tentar entender o que realmente há de errado com ele e o que podemos fazer a respeito, pedimos ao provedor de hospedagem/MS que fizesse uma cópia física dele em outro servidor (idêntico). (Tenho certeza de que o provedor interpretou isso como "backup e restauração do RMAN").

A ideia é que eu poderia fazer qualquer análise, investigação, tentativa de reparo e usar qualquer ferramenta que quisesse sem nenhum perigo de afetar a produção. Até agora tudo bem. Executei DBVerify ( dbv) em todos os arquivos de dados, sem problemas.

Então corri ANALYZE TABLE .. VALIDATE STRUCTURE CASCADE ONLINE;em todas as tabelas do banco de dados. Para duas dessas tabelas, o comando demorou muito mais do que as outras 2500 tabelas (combinadas), então as cancelei e deixei as outras terminarem, o que fizeram sem problemas e sem erros relatados, etc.

Essas duas tabelas também são as maiores tabelas de dados de aplicativos. Então eu começo com a maior tabela (23GB, 36M linhas) e decido analisá-la por partes (sem o CASCADE), primeiro a própria tabela e depois os índices. A tabela termina em 30-60 minutos (não me lembro exatamente), mas a ANALYZE INDEX .. VALIDATE STRUCTURE ONLINE;do primeiro índice nunca termina.

Decidi deixá-lo funcionar por um tempo e ver se encontrava uma maneira de monitorar seu progresso. Pesquisando no Google, encontro muitas reivindicações (antigas) de que ANALYZE TABLE pode ser monitorado v$session_longops, mas olhando para ele nunca mostrou nada do meu comando e cheguei à conclusão de que isso deve funcionar apenas para a função de coleta de estatísticas, não para a função de validação. Depois de tentar várias coisas, acabei descobrindo que, olhando a v$sessionlinha do comando em execução, poderia usar as colunas P1* e P2* para rastrear qual arquivo e bloco estava sendo lido.

Isso me mostrou que ele estava realmente lendo os arquivos de dados esperados e estava lendo diferentes blocos deles. Isso e o fato de que a utilização do disco no servidor era de 100% enquanto o comando estava sendo executado (e nada mais) me convenceu de que ele realmente estava fazendo algo e não estava bloqueado/bloqueado/travado. Então eu apenas deixei correr.

Já se passaram mais de 3 dias (+72 horas) e não mostra sinais de terminar e estou meio perdido aqui.

Informação adicional:

DDL da tabela:

-- Unable to render TABLE DDL for object O$LIMS.N__RESULTS with DBMS_METADATA attempting internal generator.
CREATE TABLE O$LIMS.N__RESULTS 
(
  SAMPLE_ID NUMBER(10, 0) NOT NULL 
, SUBMISSION_ID NUMBER(10, 0) NOT NULL 
, RESULT_ID NUMBER(10, 0) NOT NULL 
, RESULT_VERSION NUMBER(3, 0) NOT NULL 
, TASK_ID NUMBER(10, 0) NOT NULL 
, TASK_REPETITION NUMBER(3, 0) NOT NULL 
, TASK_VERSION NUMBER(3, 0) NOT NULL 
, REQUIRED VARCHAR2(1 BYTE) NOT NULL 
, METHOD_DATAGROUP VARCHAR2(40 BYTE) NOT NULL 
, COMPONENT VARCHAR2(40 BYTE) NOT NULL 
, MEASURE VARCHAR2(40 BYTE) NOT NULL 
, UNITS VARCHAR2(40 BYTE) NOT NULL 
, STATUS VARCHAR2(20 BYTE) NOT NULL 
, PLANNED_RESULT VARCHAR2(3 BYTE) NOT NULL 
, RESULT_ORIGIN VARCHAR2(1 BYTE) NOT NULL 
, CONDITION VARCHAR2(20 BYTE) NOT NULL 
, CONDITION_LEVEL VARCHAR2(20 BYTE) 
, VALUE_TYPE VARCHAR2(20 BYTE) NOT NULL 
, NUMBER_VALUE NUMBER 
, TEXT_VALUE VARCHAR2(80 BYTE) 
, TIME_VALUE DATE 
, REASON VARCHAR2(40 BYTE) 
, INLIMIT VARCHAR2(3 BYTE) 
, INDETECTION VARCHAR2(3 BYTE) 
, INSPEC VARCHAR2(3 BYTE) 
, ENTRY_USERID VARCHAR2(20 BYTE) 
, ENTRY_DATE DATE 
, SPEC_ID NUMBER(10, 0) 
, SPEC_VERSION NUMBER(3, 0) 
, DETECTION_ID NUMBER(10, 0) 
, DETECTION_VERSION NUMBER(3, 0) 
, LIMIT_ID NUMBER(10, 0) 
, LIMIT_VERSION NUMBER(3, 0) 
, CUSTOMER_DATAGROUP VARCHAR2(40 BYTE) 
, ANALYST VARCHAR2(20 BYTE) 
, REPORT VARCHAR2(3 BYTE) 
, TIMESTAMP DATE 
, USERSTAMP VARCHAR2(20 BYTE) 
, MEASURE_LINK O$LIMS.N_UT_MEASURE 
, RESULT_PLAN_LIST_LINK O$LIMS.N_UT_RESULT_PLAN_LIST 
, TEXT O$LIMS.N_TT_TEXT 
, ATTRIBUTES O$LIMS.N_TT_ATTRIBUTES 
, SEQUENCE NUMBER(4, 0) 
, CONSTRAINT N_C_RESULTS_1 PRIMARY KEY 
  (
    RESULT_ID 
  , RESULT_VERSION 
  )
  USING INDEX 
  (
      CREATE UNIQUE INDEX O$LIMS.N_C_RESULTS_1 ON O$LIMS.N__RESULTS (RESULT_ID ASC, RESULT_VERSION ASC) 
      LOGGING 
      TABLESPACE "SQLLIMS_INDEX" 
      PCTFREE 10 
      INITRANS 2 
      STORAGE 
      ( 
        INITIAL 311296 
        NEXT 1048576 
        MINEXTENTS 1 
        MAXEXTENTS UNLIMITED 
        BUFFER_POOL DEFAULT 
      ) 
      NOPARALLEL 
  )
  ENABLE 
) 
LOGGING 
TABLESPACE "SQLLIMS_RESULTS" 
PCTFREE 25 
INITRANS 1 
STORAGE 
( 
  INITIAL 566231040 
  NEXT 1048576 
  MINEXTENTS 1 
  MAXEXTENTS UNLIMITED 
  BUFFER_POOL DEFAULT 
) 
NOCOMPRESS 
NOPARALLEL 
NESTED TABLE TEXT STORE AS RESULT_TEXT RETURN AS VALUE  
NESTED TABLE ATTRIBUTES STORE AS RESULT_ATTRIBUTES RETURN AS VALUE

O DDL do índice atualmente sendo analisado:

-- Unable to render INDEX DDL for object O$LIMS.SYS_C0010496 with DBMS_METADATA attempting internal generator.
CREATE UNIQUE INDEX O$LIMS.SYS_C0010496 ON O$LIMS.N__RESULTS (ATTRIBUTES ASC) 
LOGGING 
TABLESPACE "SQLLIMS_RESULTS" 
PCTFREE 10 
INITRANS 2 
STORAGE 
( 
  INITIAL 65536 
  NEXT 1048576 
  MINEXTENTS 1 
  MAXEXTENTS UNLIMITED 
  BUFFER_POOL DEFAULT 
) 
NOPARALLEL

Minhas perguntas:

  1. É razoável que o ANALYZE INDEX demore tanto quando o ANALYZE TABLE levou no máximo 1 hora?

  2. Quais são minhas opções neste momento? Supondo que eu elimine isso, como posso prosseguir com a verificação de corrupção (lógica), etc.? Existe algo que eu possa fazer para que esse comando seja concluído em um tempo razoável ou existe alguma outra ferramenta ou abordagem que eu possa usar?


Versão, etc. informações:

  • Host: servidor Windows 2003, sp2
  • Versão do Oracle: 10g r2 ps3 10.2.0.4.0
  • Compatibilidade: 10.2.0.3.0

Aqui estão os parâmetros SGA relevantes (eu acho):

  • sga_target: 7012876288 (6688M)
  • sga_max_size: 10015997952 (9552M)
  • db_block_size: 8192
  • db_cache_size: 2885681152 (2752M)
  • db_*k_cache_size: todos são zero
oracle performance
  • 2 respostas
  • 3959 Views
Martin Hope
RBarryYoung
Asked: 2016-02-27 12:44:29 +0800 CST

Como encontrar a versão instalada e a versão do Oracle de um programa?

  • 4

Preciso determinar a partir de um programa qual versão do Oracle está instalada em cada um dos Oracle Homes em um servidor. Como pode não haver nenhum banco de dados criado no Home ainda, preciso ser capaz de fazer isso fora do banco de dados (ou seja, sem conectar ao banco de dados). Além disso, seria altamente preferível poder fazer isso a partir de um programa remoto.

Isso é de um programa do Windows executando .Net (C#, se isso for importante).

No momento, estou lendo chaves de registro remotas (usando esta técnica: https://stackoverflow.com/questions/1566547/how-to-read-remote-registry-keys ), para encontrar todos os Oracle Homes de acordo com este método . Isso funciona bem, no entanto, examinei essas chaves e não vejo nenhuma informação sobre a versão/lançamento exato.

O próprio nome de um Oracle Home é claro que 1) não é um indicador confiável e 2) não tem a versão/liberação exata (por exemplo, "10.2.0.4.0"). Basicamente, estou procurando uma maneira de descobrir o que o Oracle Universal Installer informa no botão Produtos Instalados.


Devo esclarecer, todos os servidores estarão executando o Windows 2003-2008.

oracle automation
  • 2 respostas
  • 10962 Views
Martin Hope
RBarryYoung
Asked: 2015-12-21 13:42:40 +0800 CST

Por que "Como SYSDBA" não funciona no SQL Developer?

  • 4

Sou um desenvolvedor/consultor DBA do SQL Server que está ajudando um cliente que recentemente perdeu seu DBA Oracle. Eu desenvolvi no Oracle, mas não muito trabalho de DBA, e não em ambientes multi-homed como este.

O problema: consigo conectar usando "SYS As SYSDBA" do SQL Plus, mas não do SQL Developer no mesmo sistema. No entanto, posso me conectar usando "sistema" com SQL Plus ou SQL Developer.

Detalhes:

Neste servidor, na minha conta de administrador do Windows (também inserida como administrador do servidor no Oracle Admin Asst.), este comando do DOS funciona:

D:\Oracle\app\product\11.2.0\dbhome_1\BIN>sqlplus /@MyDb as sysdba

e, Selecione * de V$INSTANCE mostra que está em MyDb e que tanto a ferramenta quanto o db são 11.2.0.3

Assim como este:

D:\Oracle\app\product\11.2.0\dbhome_1\BIN>sqlplus sys/<pwd>@MyDb as sysdba

(TAMBÉM: inserir a senha errada também funciona (!))

Usando a opção do menu Iniciar do SQL-Plus do mesmo (servidor, conta e casa), estes também funcionam:

Enter user-name: /@MyDb as sysdba
Enter user-name: sys/<pwd>@MyDb as sysdba

Selecione * de V$INSTANCE mostra que está em MyDb e que a ferramenta e o db são 11.2.0.3

Tentativa de acessar o MyDb do mesmo com o SQL Developer, obtém sucesso para o nome de usuário do "sistema", mas falha para "sys" "as sysdba" com "ORA-01031: privilégios insuficientes". No entanto, isso funciona ao conectar-se a outros bancos de dados em outros servidores.

Eu pesquisei isso, e a maior parte da ajuda postada para isso parece ser destinada a casos em que nenhuma conexão pode ser feita, o que não é o caso aqui. Apenas para evitar alguns deles:

  • O problema não é que a rede não esteja configurada, porque o SQL Developer funciona para "sistema" local e remotamente.
  • O problema não é que o banco de dados/instância não foi iniciado, porque, novamente, funciona para "sistema"
  • Não é que estou me conectando ao banco de dados errado, verifiquei se havia "sistema"
  • AFAIK, não é que estou usando a sintaxe errada no SQL Developer para conectar a um banco de dados "As SYSDBA" porque funciona quando me conecto a outros servidores em outros bancos de dados.

Minha intuição é que ou

  1. há alguma configuração que diz " não permitir SYSDBA por meio de uma conexão de rede " ou
  2. há algum problema de configuração/autorização no ouvinte de rede Oracle que o está impedindo de verificar minha conta de administrador do Windows e, além disso, a senha sys não é o que me foi dito e, finalmente, o Oracle está dando uma mensagem de erro obtusa para isso.

Qualquer ajuda ou orientação sobre isso seria muito apreciada.


OK, então usando as instruções de @BalasPapp, consegui encontrar mais o seguinte:

  • Esse banco de dados é atendido pelo segundo Oracle 11g home chamado OraDb11g_home3 direcionado para D:\Oracle\app\product\11.2.0\dbhome_1D:\Oracle\app\product\11.2.0\dbhome_1.
  • Os serviços do Windows não mostraram parâmetros de inicialização para ele (exceto o nome do banco de dados, é claro).
  • o comando show parameter remote_login_passwordfilemostra um valor de " EXCLUSIVE ".

Conteúdo do Listener.ora:

# listener.ora Network Configuration File: D:\Oracle\app\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = D:\Oracle\app\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:D:\Oracle\app\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = <SERVERNAME>.<networkname>.local)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

ADR_BASE_LISTENER = D:\Oracle\app

Conteúdo do sqlnet.ora:

# This file is actually generated by netca. But if customers choose to 
# install "Software Only", this file wont exist and without the native 
# authentication, they will not be able to connect to the database on NT.

SQLNET.AUTHENTICATION_SERVICES = (NTS)

A saída de lsnrctl status:

D:\Oracle\app\product\11.2.0\dbhome_1\BIN>lsnrctl status

LSNRCTL for 64-bit Windows: Version 11.2.0.3.0 - Production on 23-DEC-2015 12:03:55

Copyright (c) 1991, 2011, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<SERVERNAME>.<networkname>.local)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 64-bit Windows: Version 11.2.0.3.0 - Production
Start Date                02-DEC-2015 16:25:41
Uptime                    20 days 19 hr. 38 min. 17 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   D:\Oracle\app\product\11.2.0\dbhome_1\network\admin\listener.ora
Listener Log File         D:\Oracle\app\diag\tnslsnr\<SERVERNAME>\listener\alert\log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=<SERVERNAME>.<networkname>.local)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "<DBNAME>" has 1 instance(s).
  Instance "<DBNAME>", status READY, has 1 handler(s) for this service...
The command completed successfully

D:\Oracle\app\product\11.2.0\dbhome_1\BIN>

Parâmetros ao conectar do SQL Developer:

Username:  system (or sys)
Password:  <...>
Connection 
  Type:    Basic
  Role:    Default (or SYSDBA)
Hostname:  localhost
Port:      1521
SID (or Service name, both work/fail the same):
           <dbname>

(Neither OS Authentication nor Kerberos is set)

Funciona para "sistema, padrão", falha para "sys, SYSDBA" com "privilégios insuficientes". Eu tentei muitas combinações de configurações de Autenticação do SO e Keberos, sem sucesso.

Finalmente, estes são os dois únicos .oraarquivos no /databasediretório:

SNCF<DBNAME>.ORA           (18MB)
SPFILE<DBNAME>.ORA         (4kb)

Ambos parecem ser arquivos binários no bloco de notas.

TAMBÉM: select * from v$pwfile_usersnão retorna nenhuma linha.

oracle oracle-11g
  • 1 respostas
  • 20166 Views
Martin Hope
RBarryYoung
Asked: 2015-10-28 08:00:56 +0800 CST

Como posso obter contagens de linhas individuais como o SSMS?

  • 9

Eu tenho um programa c# cliente que está executando procedimentos armazenados via ExectueNonQuery, incluindo captura de PRINTsaída de erro e com eventos InfoMessage. Funciona bem, mas notei algo estranho.

Quando executo um procedimento armazenado do SSMS, ele exibe o número de linhas para cada instrução SQL individual executada na guia Mensagens (como se viesse das InfoMessages). No entanto, meu programa nunca vê essas mensagens, embora capture todas as outras saídas. Em vez disso, ele apenas retorna as linhas afetadas no resultado da função ExecuteNonQuery, que é a soma de todas as contagens de linhas individuais (o que é meio inútil).

Por exemplo, este procedimento:

use [tempdb]
go

SELECT  * 
INTO    MyCols
FROM    sys.columns
go

CREATE PROC foo As

    UPDATE  MyCols
    SET     name = name + N''
-- SSMS shows (662 row(s) affected)

    UPDATE  MyCols
    SET     name = name + N''
    WHERE   name like '%x%'
-- SSMS shows (59 row(s) affected)

PRINT 'bar'
-- both SSMS and ExecuteNonQuery get this

-- ExecuteNonQuery returns 721 rows affected
GO

Quando o fooproc é executado, o SSMS exibe as contagens de linhas de 662 e 59, mas ExecuteNonQueryretorna apenas o total de 721.

Então, como posso obter as mesmas informações que o SSMS está recebendo?


Só para deixar claro aqui: não estou interessado em como alterar os procedimentos armazenados para adicionar PRINT @@ROWCOUNTs após cada instrução SQL. Eu sei como fazer isso e não é uma opção na maioria das vezes por vários motivos.

Estou perguntando como fazer o que o SSMS está fazendo aqui. Posso alterar o código do cliente o quanto quiser neste ponto (por enquanto, pelo menos) e gostaria de fazer isso direito.

sql-server sql-server-2008-r2
  • 2 respostas
  • 771 Views
Martin Hope
RBarryYoung
Asked: 2014-09-17 08:41:52 +0800 CST

RESTORE falhando com o erro 32 do SO, arquivo sendo usado por outro processo

  • 4

Estou escrevendo um conjunto de procedimentos para (parcialmente) automatizar a implantação de banco de dados para um cliente, que geralmente funciona bem, mas às vezes um comando RESTORE está falhando com o erro 32 do sistema operacional, sobre um arquivo que está sendo usado por outro processo (detalhes abaixo).

Eu pesquisei isso extensivamente, mas encontrei pouco que se aplica ao meu caso específico. Suspeito que há algo que estou ignorando, mas simplesmente não consigo encontrá-lo.

Aqui está o comando:

RESTORE DATABASE [NBBC_Logistics] FROM DISK = '\\wpdboardq01\Shares\DbCopy\DevBackups\NBBC_Logistics_140916112310.bak' 
    WITH FILE=1, NOUNLOAD, STATS=10,
     MOVE 'NBBC_Logistics' TO 'D:\MSSQL2K12\MSSQL11.MSSQLSERVER\MSSQL\DATA\NBBC_Logistics.mdf',
     MOVE 'NBBC_Logistics_log' TO 'D:\MSSQL2K12\MSSQL11.MSSQLSERVER\MSSQL\DATA\NBBC_Logistics_log.ldf',
     REPLACE 
    ;

Isso resulta na seguinte mensagem de erro:

Msg 3634, Level 16, State 1, Line 11
The operating system returned the error '32(The process cannot access the file because it is being used by another process.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'D:\MSSQL2K12\MSSQL11.DEV\MSSQL\DATA\NBBC_Logistics_log.ldf'.
Msg 3156, Level 16, State 8, Line 11
File 'NBCC_Logistics_Model2_log' cannot be restored to 'D:\MSSQL2K12\MSSQL11.DEV\MSSQL\DATA\NBBC_Logistics_log.ldf'. Use WITH MOVE to identify a valid location for the file.
Msg 3119, Level 16, State 1, Line 11
Problems were identified while planning for the RESTORE statement. Previous messages provide details.
Msg 3013, Level 16, State 1, Line 11
RESTORE DATABASE is terminating abnormally.

Algumas coisas a serem observadas:

  1. Isso só acontece em algumas das Instâncias SQL de recebimento, a maioria delas está executando comandos muito semelhantes sem nenhum problema.

  2. A instância que está falhando é aquela em que há várias instâncias SQL na mesma caixa (DEV e QA) e está tentando restaurar um backup de banco de dados do DEV para a versão QA do mesmo banco de dados.

  3. Outros bancos de dados nesta mesma instância podem executar seu comando RESTORE correspondente sem problemas.

  4. Pode ser relevante que os nomes dos arquivos lógicos de origem (mostrados no erro) sejam diferentes dos existentes nos BDs (nomeados no comando), no entanto, acredito que tenha casos em que isso funcione.

  5. Além disso, observe com atenção que o caminho do arquivo relatado pelo erro NÃO é o que estou especificando no MOVE, mas sim o caminho do arquivo original (que ainda possui os arquivos de banco de dados originais em uso pela instância DEV).

Portanto, parece que ele está tentando primeiro RESTAURAR os arquivos de banco de dados para seus locais de caminho originais e só então MOVÊ-los para o caminho que eu indicar. Isso está em contraste com o que o documento diz que faz, e obviamente seria totalmente impraticável em geral, já que alguém RESTAURANDO uma cópia do banco de dados não tem controle sobre onde os arquivos originais estavam e não poderia garantir que esses caminhos existiam e já não estavam em uso .

Qualquer ajuda seria muito apreciada.


Apenas para evitar algumas das respostas automáticas que não se aplicam:

  • O banco de dados de destino não está sendo usado por mim ou por qualquer outra pessoa.
  • Nem aparece emsp_lock
  • O comando especifica REPLACE, ele deve substituir o banco de dados existente
  • Os arquivos especificados não são abertos por nenhum outro processo do Windows
  • no entanto, o arquivo mencionado no erro é aberto pela outra instância Sql na caixa
  • o local do arquivo BAK em um compartilhamento não tem nada a ver com isso, copiá-lo localmente não altera nada, nem renomeá-lo.
  • os arquivos db e os caminhos especificados são os corretos para o banco de dados de destino
sql-server sql-server-2012
  • 3 respostas
  • 27236 Views
Martin Hope
RBarryYoung
Asked: 2014-04-23 07:36:09 +0800 CST

Corrigindo um arquivo de log corrompido em uma pequena janela de tempo de inatividade

  • 2

Estou trabalhando com um cliente que está recebendo o seguinte erro de seus backups de log de um de seus bancos de dados do SharePoint:

Backup detected log corruption in database FOOPORTAL_SP2010_Config. Context is FirstSector. 
  LogFile: 2 'D:\MSSQL2K8\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FOOPORTAL_SP2010_Config_log.LDF' 
  VLF SeqNo: x864 VLFBase: x172d0000 LogBlockOffset: x176b1800 
  SectorStatus: 2 LogBlock.StartLsn.SeqNo: x771 LogBlock.StartLsn.Blk: x1f0c 
  Size: x400 PrevSize: x200

Eu entendo que isso é indicativo de problemas com o HW do disco e/ou subsistema IO, e estamos buscando isso com o provedor de hospedagem. Especificamente, este parece ser um "ponto ruim" no disco, porque é relatado consistentemente para o arquivo de log deste banco de dados, mas nenhum outro erro foi relatado para os outros 6 backups de log do banco de dados nas últimas semanas, nem para qualquer um dos mais de 20 outros backups de dados completos do banco de dados.

Meu problema imediato é que o cliente está funcionando dessa forma há várias semanas, porque este é um serviço obrigatório 24 horas por dia, 7 dias por semana, e eles não conseguiram me fornecer uma janela de serviço de tempo de inatividade para corrigir esse problema até (de repente) esta noite, por 2 horas . Infelizmente, corrupção de banco de dados e esse tipo de trabalho administrativo não é minha especialidade no SQL Server, e não tenho certeza de qual é a melhor/mais segura/mais confiável maneira de proceder.

Meu plano provisório agora é:

  1. Faça um backup completo do banco de dados assim que a janela de inatividade começar (os backups completos funcionaram sem erros durante isso)
  2. Desanexe o banco de dados antigo
  3. Exclua os arquivos de dados para o espaço
  4. Renomeie o arquivo de log (ainda mantendo-o)
  5. Restaure uma nova cópia do banco de dados do novo backup da etapa 1.

Minhas preocupações/ansiedade sobre isso são:

  • Isso deve funcionar? Ou existe uma abordagem mais segura/confiável?
  • Eu só tenho 2 horas, então existe uma abordagem mais eficiente em termos de tempo?

Quaisquer outras sugestões são bem-vindas.

sql-server sql-server-2008-r2
  • 1 respostas
  • 13668 Views
Martin Hope
RBarryYoung
Asked: 2014-03-28 11:10:17 +0800 CST

Trabalho do plano de manutenção sendo executado em horários adicionais não programados?

  • 2

Eu tenho uma situação que me deixou realmente coçando a cabeça. Esta é uma instância do SQL Server 2008r2, usada como servidor de banco de dados para um serviço corporativo substancial do SharePoint. Como minha empresa está fornecendo o suporte de banco de dados para ele, uma das coisas que fiz foi configurar alguns planos de manutenção para cuidar das coisas normais, incluindo backups completos noturnos de todos os bancos de dados às 19h.

Tudo isso funciona bem, exceto que ocasionalmente também funciona no início da manhã.

Até agora, isso aconteceu três vezes, uma vez há 11 dias às 2h47, uma vez há 4 dias às 3h43 e uma vez há 2 dias às 3h49. Não consigo encontrar nenhuma razão para que ele esteja sendo executado nesses horários aleatórios esporádicos.

Isso está causando problemas significativos para nós, pois de manhã cedo é quando o provedor de hospedagem do servidor executa seus trabalhos de backup e manutenção. Sua execução leva muito mais tempo do que o normal e estão enviando alertas e outros avisos para isso, longos tempos de IO e vários erros que parecem ser causados ​​por conflitos com o espelhamento e backups SAN/NAS do host.

Resumindo o que já verifiquei:

  1. Este é o trabalho do SQL Agent executando um tempo extra não programado e NÃO apenas o plano de manutenção sendo executado duas vezes no mesmo trabalho.

  2. Isso não parece ser um clone de VM desse nó com um SQL Agent executando uma duplicata desse trabalho no SQL Server real. Concluo isso porque as execuções estão aparecendo no log do nosso SQL Agent. (se isso não for definitivo, deixe-me saber como verificar)

  3. Este não é o caso de o trabalho ficar parado por um longo tempo. O trabalho regular é executado e concluído no horário agendado esperado todos os dias (19h).

  4. Nem o servidor nem a instância do SQL Server foram reiniciados durante o último mês.

  5. O trabalho do SQL Server em questão tem apenas um agendamento, definido para 19h todos os dias.

  6. O Plano de Manutenção possui apenas um subplano, que apresenta exatamente o mesmo cronograma do Trabalho.

Qualquer ajuda muito apreciada.


Por sugestão de Aaron, adicionei o seguinte Execute SQL como a primeira tarefa no subplano:

IF (DATEPART(HOUR, GETDATE()) > 2) AND (DATEPART(HOUR, GETDATE()) < 6)
    RAISERROR('Job Running at the Wrong Time!', 16, 1) WITH LOG
sql-server sql-server-2008-r2
  • 2 respostas
  • 2851 Views
Martin Hope
RBarryYoung
Asked: 2013-10-12 06:39:36 +0800 CST

O que é necessário para usar o Oracle Performance Manager para monitorar o SQL Server?

  • 3

Estou trabalhando com um cliente que possui várias instâncias de servidor SQL Server e Oracle DBMS. Meu cliente gostaria de configurar a coleta de dados de desempenho, monitoramento e alerta para todos os seus bancos de dados. Minha força está no SQL Server e conheço muitos produtos/ferramentas para fazer isso lá, mas parece haver muito poucas opções para uma ferramenta ou produto que possa fazer Oracle e SQL Server ao mesmo tempo.

Uma opção sugerida é o Oracle Performance Manager, que aparentemente também pode monitorar o SQL Server. Eu tenho tentado ler sobre isso, mas há muitos documentos por aí e não estou muito familiarizado com seu contexto implícito (o(s) pacote(s) de produtos Oracle), então estou tendo problemas para filtrá-lo nas partes que eu preciso agora fazer uma recomendação ao meu cliente.

Aqui estão as coisas que estou tentando descobrir:

  1. O Oracle Performance Manager atende a alguma/todas essas funções de desempenho para bancos de dados Oracle?:

    uma. Coleta de dados de desempenho (ou seja, retidos em um banco de dados)

    b. Monitoramento de desempenho (visualizações ao vivo do desempenho)

    c. Alerta de desempenho (notificação ao vivo de limites configuráveis ​​excedidos)

    d. Relatório de desempenho (isso seria bom, mas não necessário, sei como escrever um relatório de tabelas de dados, mesmo no Oracle)

  2. O que o Oracle Performance Manager pode atender para bancos de dados SQL Server?

  3. Que produto(s) Oracle específico(s) meu cliente precisa ter ou comprar para obter essas funções?

  4. Existem outros requisitos ou restrições que devemos conhecer?

Qualquer ajuda sobre isso é muito apreciada.

sql-server oracle
  • 1 respostas
  • 737 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve