AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-8215

RBarryYoung's questions

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

外部联接抑制索引使用?

  • 7

我有一个客户端程序正在执行一个针对将一个表外部连接到另一个表的视图的查询。性能很差,我一直在尝试通过添加正确的索引来调整它。有问题的查询实际上只使用第二个表,所以我一直在直接针对该表进行测试。

我发现(几个)索引可以很好地用于针对表的查询,但是当我将其切换为使用视图时,它们停止使用任何索引,而是对两个表进行了全面扫描。由于这些表很大(每个表 2-3 百万行),因此速度非常慢。

为了简单地测试,我更改了查询以绕过并将外部联接合并到查询本身中。这成功地重现了问题,但留下了为什么外连接不使用索引的谜团。

这是表格,包含我在测试时添加的所有索引:

  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)) ;

这是另一个表(我们并没有真正用于此查询的表)

  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) ;

因此,首先,这是直接针对单个表的查询,它成功使用了其中一个索引。

-- 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 
;

现在这是使用带有内部连接的两个表的查询。这也使用了索引并且运行速度很快。

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

这是与左外连接相同的查询,因为它是在视图中编写的。这不使用任何索引并且运行非常缓慢。

-- 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 
;

现在在任何人说之前:这个查询实际上在逻辑上与前一个相同。这是因为 WHERE 子句对外部表 (TD) 中的列进行过滤,这有效/逻辑地将外部联接转换为内部联接(这就是为什么在 ON 子句与 WHERE 子句中是否出现条件很重要的原因)。

现在,为了增加怪异,我决定看看如果我让从外到内的强制更加明确会发生什么:

-- 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
;

令人难以置信的是,这奏效了!

所以这里的问题是,1) 为什么 Oracle 不自己解决这个问题?

并且 2) 是否有一些设置或索引等我可以创建,让 Oracle 正确地解决这个问题并使用索引?

其他注意事项:

  • 该视图被各种其他查询和客户端使用,所以我不能只将它更改为这个查询的内部联接。

  • 客户端正在生成查询,因此很难/几乎不可能使用古怪的特殊情况来更改查询,例如:“将此视图用于此数据,除非您只需要此表中的这些列,然后使用不同的查看“,或”当您需要这些列并且只需要该表中的这些列时,然后将“IS NOT NULL”添加到 WHERE 子句“

欢迎任何建议或见解。


更新: 我也刚刚在 Oracle 11g 上尝试过,我在那里得到了完全相同的结果。


根据请求,这里是解释计划输出,首先是好的版本,它使用索引:

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

现在是坏版本:

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 个回答
  • 7200 Views
Martin Hope
RBarryYoung
Asked: 2016-05-14 10:08:25 +0800 CST

ANALYZE TABLE..VALIDATE STRUCTURE 永远运行

  • 7

因此,正如我之前提到的,我是一名 SQL Server DBA/顾问,正在帮助客户使用他们的 Oracle 数据库。大多数情况下,我已经能够弄清楚我需要做什么,并在文档和谷歌的帮助下完成工作,但我目前正在尝试处理一些似乎难以理解的事情。

其中一个数据库是 Oracle 10g LIMS 数据库,它已经存在(并升级)了至少 10 年(可能是 20 年)。这是一个关键的应用程序,但在过去的几年里,他们遇到了许多可靠性问题。为了试图弄清它的真正问题以及我们可以做些什么,我们让托管/MS 提供商在另一台(相同的)服务器上制作了它的物理副本。(我很确定提供商将其解释为“RMAN 备份和恢复”)。

我的想法是,然后我可以进行任何分析、调查、修复尝试,并使用我想要的任何工具,而不会有任何影响生产的危险。到目前为止,一切都很好。我对所有数据文件运行了 DBVerify ( dbv),没有问题。

然后我ANALYZE TABLE .. VALIDATE STRUCTURE CASCADE ONLINE;在数据库中的每个表上运行。对于其中两个表,该命令比其他 2500 个表(组合)花费的时间要长得多,所以我取消了它们并让其他表完成,他们这样做没有问题,也没有报告错误等。

事实证明,这两个表也是最大的应用程序数据表。因此,我从最大的表(23GB,36M 行)开始,并决定按部分分析它(没有 CASCADE),首先是表本身,然后是索引。该表在 30-60 分钟内完成(我不记得确切),但ANALYZE INDEX .. VALIDATE STRUCTURE ONLINE;第一个索引永远不会完成。

我决定让它运行一段时间,看看我是否能找到一种方法来监控它的进度。谷歌搜索我发现许多(旧的)声称可以监控 ANALYZE TABLEv$session_longops但查看它从未显示我的命令中的任何内容,我得出的结论是这必须仅适用于 Stats 收集功能,而不是 Validate 功能。在尝试了一堆事情之后,我最终发现通过查看v$session执行命令的行,我可以使用 P1* 和 P2* 列来跟踪正在读取的文件和块。

这向我表明它确实是从预期的数据文件中读取,并且正在从它们中读取不同的块。这一事实以及命令运行时服务器上的磁盘利用率为 100%(仅此而已)的事实使我确信它确实在做某事并且没有被阻塞/锁定/挂起。所以我只是让它运行。

现在已经超过 3 天(+72 小时)并且没有显示完成的迹象,我在这里有点不知所措。

附加信息:

表的 DDL:

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

当前正在分析的索引的 DDL:

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

我的问题:

  1. 当 ANALYZE TABLE 最多只需要 1 小时时, ANALYZE INDEX 需要这么长时间是否合理?

  2. 在这一点上我有什么选择?假设我杀了这个,我该如何继续检查(逻辑)损坏等?我可以做些什么来让这个命令在合理的时间内完成,或者我可以使用其他一些工具或方法吗?


版本等信息:

  • 主机:Windows 2003 服务器,sp2
  • 甲骨文版本:10g r2 ps3 10.2.0.4.0
  • 兼容性:10.2.0.3.0

以下是相关的 SGA 参数(我认为):

  • sga_target: 7012876288 (6688M)
  • sga_max_size: 10015997952 (9552M)
  • db_block_size: 8192
  • db_cache_size: 2885681152 (2752M)
  • db_*k_cache_size:全部为零
oracle performance
  • 2 个回答
  • 3959 Views
Martin Hope
RBarryYoung
Asked: 2016-02-27 12:44:29 +0800 CST

如何从程序中找到Oracle的安装版本和发布?

  • 4

我需要从程序中确定服务器上的每个 Oracle Home 中安装了哪个版本的 Oracle。由于 Home 中可能还没有创建任何数据库,因此我需要能够在数据库之外执行此操作(即,无需连接到数据库)。此外,最好能够从远程程序执行此操作。

这是来自运行 .Net(C#,如果重要的话)的 Windows 程序。

我目前正在读取远程注册表项(使用此技术:https ://stackoverflow.com/questions/1566547/how-to-read-remote-registry-keys ),以根据此方法查找所有 Oracle Homes 。这很好用,但是,我查看了这些键,没有看到有关确切版本/发行版的任何信息。

Oracle Home 本身的名称当然是 1) 不是一个可靠的指标,并且 2) 没有确切的版本/发行版(例如“10.2.0.4.0”)。基本上,我正在寻找一种方法来找出 Oracle Universal Installer 在 Installed Products 按钮中告诉您的内容。


我应该澄清一下,所有服务器都将运行 Windows 2003-2008。

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

为什么 SQL Developer 中的“作为 SYSDBA”不起作用?

  • 4

我是一名 SQL Server 开发人员/DBA 顾问,正在帮助一位最近失去 Oracle DBA 的客户。我在 Oracle 上做过开发,但没有太多 DBA 工作,而且在这样的多宿主环境中也没有。

问题: 我可以使用 SQL Plus 中的“SYS As SYSDBA”进行连接,但不能使用同一系统上的 SQL Developer 进行连接。但是,我可以使用“系统”与 SQL Plus或SQL Developer 进行连接。

细节:

在这台服务器上,在我的 Windows 管理员帐户中(在 Oracle Admin Asst 中也以服务器管理员身份输入),此 DOS 命令有效:

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

并且, Select * from V$INSTANCE 表明它在 MyDb 中,并且 tool 和 db 都是 11.2.0.3

这个也是:

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

(另外:输入错误的密码也可以(!))

使用相同(服务器、帐户和主页)中的 SQL-Plus 开始菜单选项,这些也可以工作:

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

Select * from V$INSTANCE 显示它在 MyDb 中,并且 tool 和 db 都是 11.2.0.3

尝试使用 SQL Developer 访问 MyDb,“system”用户名成功,但“sys”“as sysdba”失败,“ORA-01031:权限不足”。但是,这在连接到其他服务器上的其他数据库时确实有效。

我对此进行了研究,大多数已发布的帮助似乎都是针对根本无法建立连接的情况,而这里并非如此。只是为了避免其中一些:

  • 问题不在于没有设置网络,因为 SQL Developer 在本地和远程都适用于“系统”。
  • 问题不在于数据库/实例没有启动,因为它再次适用于“系统”
  • 不是我连接到错误的数据库,我检查了它的“系统”
  • AFAIK,这并不是说我在 SQL Developer 中使用错误的语法连接到数据库“作为 SYSDBA”,因为当我连接到其他数据库上的其他服务器时它可以工作。

我的直觉是

  1. 有一些设置显示“不允许 SYSDBA 通过网络连接”,或者
  2. Oracle 网络侦听器中存在一些配置/授权问题,阻止它检查我的 Windows 管理员帐户,此外,sys 密码不是我被告知的那样,最后 Oracle 给出了一个迟钝的错误消息。

对此的任何帮助或指导将不胜感激。


好的,所以使用@BalasPapp 的说明,我能够找到更多以下内容:

  • 该数据库由名为 OraDb11g_home3的第二个D:\Oracle\app\product\11.2.0\dbhome_1D:\Oracle\app\product\11.2.0\dbhome_1Oracle 11g 主目录提供服务,路径为.
  • Windows 服务没有显示它的启动参数(当然除了数据库名称)。
  • 该命令show parameter remote_login_passwordfile显示值“ EXCLUSIVE ”。

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

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)

的输出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>

从 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)

适用于“系统,默认”,“sys,SYSDBA”失败,“权限不足”。我也尝试了许多操作系统身份验证和 Keberos 设置的组合,但无济于事。

最后,这些是目录中仅有的两个.ora文件/database:

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

它们似乎都是记事本中的二进制文件。

ALSO:select * from v$pwfile_users不返回任何行。

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

我怎样才能像 SSMS 一样获得单独的行数?

  • 9

我有一个客户端 c# 程序正在通过 执行存储过程,包括使用 InfoMessage 事件ExectueNonQuery捕获和错误输出。PRINT它工作正常,但我注意到一些奇怪的事情。

当我从 SSMS 执行存储过程时,它会显示在“消息”选项卡中执行的每个单独 SQL 语句的行数(就好像它来自 InfoMessages)。但是我的程序从来没有看到这些消息,尽管它确实捕获了所有相同的其他输出。相反,它只返回在 ExecuteNonQuery 函数结果中受影响的行,该结果是所有单个行计数的总和(这有点无用)。

例如,这个过程:

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

当fooproc 运行时,SSMS 显示 662 和 59 的行数,但ExecuteNonQuery只返回总数 721。

那么,我怎样才能获得与 SSMS 相同的信息呢?


在这里要明确一点:我对如何更改存储过程以PRINT @@ROWCOUNT在每个 SQL 语句后添加 s 不感兴趣。我知道该怎么做,但出于各种原因,大多数时候这不是一个选择。

我在问如何做 SSMS 在这里做的事情。我现在可以随心所欲地更改客户端代码(无论如何现在),我想做对。

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

RESTORE 失败并出现 OS 错误 32,文件正被另一个进程使用

  • 4

我正在为客户编写一组(部分)自动化数据库部署的程序,这些程序大部分工作正常,但有时一个 RESTORE 命令失败并出现操作系统错误 32,关于另一个进程正在使用的文件(详情如下)。

我已经对此进行了广泛的搜索,但几乎没有发现适用于我的具体案例。我怀疑有些东西我忽略了,但我似乎找不到它。

这是命令:

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 
    ;

这会导致以下错误消息:

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.

需要注意的一些事项:

  1. 这只发生在一些接收 SQL 实例上,它们中的大多数都在执行非常相似的命令,没有问题。

  2. 失败的实例是在同一个盒子(DEV 和 QA)上有多个 SQL 实例,并且它正在尝试将 DEV 的数据库备份恢复到同一数据库的 QA 版本。

  3. 同一实例中的其他 DB 可以毫无问题地执行其相应的 RESTORE 命令。

  4. 源逻辑文件名(显示在错误中)与数据库现有的文件名(在命令中命名)不同可能是相关的,但是,我相信我有这样的情况。

  5. 另外,请注意,错误报告的文件路径不是我在 MOVE 中指定的,而是原始文件路径(DEV 实例仍在使用原始 DB 文件)。

所以它似乎试图首先将数据库文件恢复到它们的原始路径位置,然后才将它们移动到我告诉它的路径。这与文档所说的相反,显然一般来说是完全不可行的,因为恢复数据库副本的人无法控制原始文件的位置,也无法保证此类路径存在且尚未使用.

任何帮助将不胜感激。


只是为了阻止一些不适用的自动响应:

  • 目标数据库当前未由我或其他任何人使用。
  • 也没有出现在sp_lock
  • 该命令指定REPLACE,它应该覆盖现有的数据库
  • 指定的文件未被任何其他 Windows 进程打开
  • 但是,错误中提到的文件是由盒子上的其他 Sql 实例打开的
  • 共享上的 BAK 文件位置与它无关,在本地复制它不会改变任何东西,也不会重命名它。
  • 指定的 db 文件和路径对于目标数据库是正确的
sql-server sql-server-2012
  • 3 个回答
  • 27236 Views
Martin Hope
RBarryYoung
Asked: 2014-04-23 07:36:09 +0800 CST

在小的停机时间窗口中修复损坏的日志文件

  • 2

我正在与一位客户合作,该客户从其 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

我知道这表明磁盘硬件和/或 IO 子系统存在问题,我们一直在与 Hosting Provider 一起努力。具体来说,这似乎是 /a 磁盘上的一个“坏点”,因为此 DB 的日志文件一直报告它,但过去几周其他 6 个 DB 日志备份没有报告其他错误,也不用于任何 20 多个其他数据库的完整数据备份。

我的直接问题是客户已经以这种方式运行了几个星期,因为这是一项强制性的 24x7 服务,直到今晚(突然)2 小时,他们才能给我一个停机服务窗口来解决这个问题. 不幸的是,数据库损坏和这种管理工作不是我在 SQL Server 中的专长,我不确定最好/最安全/最可靠的方法是什么。

我现在的初步计划是:

  1. 停机时间窗口开始后立即对数据库进行完整备份(在此期间完整备份一直在正常工作)
  2. 分离旧数据库
  3. 删除空间的数据文件
  4. 重命名日志文件(仍然保留它)
  5. 从步骤 1 中的新备份还原数据库的新副本。

我对此的担忧/焦虑是:

  • 这应该工作吗?还是更安全/更可靠的方法?
  • 我只有 2 小时,有没有更省时的方法?

欢迎任何其他建议。

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

维护计划作业在额外的计划外时间运行?

  • 2

我的情况让我非常摸不着头脑。这是一个 SQL Server 2008r2 实例,用作大型企业 SharePoint 服务的数据库服务器。由于我的公司为其提供数据库支持,我所做的其中一件事是设置一些维护计划来处理日常事务,包括在晚上 7 点对所有数据库进行夜间完整备份。

这一切都很好,除了它偶尔也会在清晨的某个时间运行。

到目前为止,这已经发生了 3 次,一次是 11 天前凌晨 2:47,一次是 4 天前凌晨 3:43,一次是两天前凌晨 3:49。我找不到为什么它应该在这些零星的随机时间运行的理由。

这给我们带来了严重的问题,因为清晨是服务器托管提供商运行他们的备份和维护工作的时候。它们的执行时间比正常时间长很多倍,并为此发出警报和其他通知,IO 时间长以及各种错误,这些错误似乎是由于与主机 SAN/NAS 镜像和备份的冲突。

总结一下我已经检查过的内容:

  1. 这是运行额外计划外时间的 SQL 代理作业,而不仅仅是在同一作业中运行两次的维护计划。

  2. 这似乎不是此节点的 VM 克隆,其中 SQL 代理针对真实 SQL Server 运行此作业的副本。我得出这个结论是因为我们的 SQL 代理日志中显示了执行。(如果这不是确定的,请告诉我如何检查)

  3. 这不是 Job 只是运行了很长时间的情况。常规作业在每天的预期预定时间(晚上 7 点)运行并完成。

  4. 服务器和 SQL Server 实例在上个月都没有重新启动。

  5. 有问题的 SQL Server 作业只有一个计划,即设置为每天晚上 7 点。

  6. 维护计划只有一个子计划,它显示与作业完全相同的计划。

非常感谢任何帮助。


在 Aaron 的建议下,我添加了以下 Execute SQL 作为子计划中的第一个任务:

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 个回答
  • 2851 Views
Martin Hope
RBarryYoung
Asked: 2013-10-12 06:39:36 +0800 CST

使用 Oracle Performance Manager 监控 SQL Server 需要什么?

  • 3

我正在与拥有多个 SQL Server 和 Oracle DBMS 服务器实例的客户合作。我的客户想要为其所有数据库设置性能数据收集、监控和警报。我的强项是 SQL Server,我知道有很多产品/工具可以在那里执行此操作,但是似乎很少有一种工具或产品可以同时执行 Oracle 和 SQL Server。

建议的一个选项是 Oracle Performance Manager,它显然也可以监视 SQL Server。我一直在尝试阅读它,但那里有很多文档,我不太熟悉它的隐式上下文(Oracle 产品套件),所以我无法将它过滤到我想要的部分现在需要向我的客户提出建议。

以下是我想弄清楚的事情:

  1. Oracle Performance Manager 是否满足 Oracle 数据库的任何/所有这些性能功能?:

    一个。性能数据收集(即,保留在数据库中)

    b. 性能监控(性能的实时视图)

    C。性能警报(超过可配置阈值的实时通知)

    d. 性能报告(这很好但不是必需的,我知道如何根据数据表编写报告,即使在 Oracle 中也是如此)

  2. Oracle Performance Manager 可以为 SQL Server 数据库完成哪些工作?

  3. 我的客户需要拥有或购买哪些特定的 Oracle 产品才能获得这些功能?

  4. 还有其他我们应该了解的要求或限制吗?

非常感谢对此的任何帮助。

sql-server oracle
  • 1 个回答
  • 737 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve