Scripts:查询控制文件的信息dba_controlfile_records.sql

本文提供了一种查询Oracle数据库控制文件记录的方法,包括记录类型、大小、分配和使用情况等详细信息,有助于管理员更好地理解控制文件的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- +----------------------------------------------------------------------------+
-- |                          Jeffrey M. Hunter                                 |
-- |                      jhunter@idevelopment.info                             |
-- |                         www.idevelopment.info                              |
-- |----------------------------------------------------------------------------|
-- |      Copyright (c) 1998-2012 Jeffrey M. Hunter. All rights reserved.       |
-- |----------------------------------------------------------------------------|
-- | DATABASE : Oracle                                                          |
-- | FILE     : dba_controlfile_records.sql                                     |
-- | CLASS    : Database Administration                                         |
-- | PURPOSE  : Query information information about the control file record     |
-- |            sections.                                                       |
-- | NOTE     : As with any code, ensure to test this script in a development   |
-- |            environment before attempting to run it in production.          |
-- +----------------------------------------------------------------------------+


SET TERMOUT OFF;
COLUMN current_instance NEW_VALUE current_instance NOPRINT;
SELECT rpad(instance_name, 17) current_instance FROM v$instance;
SET TERMOUT ON;


PROMPT 
PROMPT +------------------------------------------------------------------------+
PROMPT | Report   : Control File Records                                        |
PROMPT | Instance : &current_instance                                           |
PROMPT +------------------------------------------------------------------------+


SET ECHO        OFF
SET FEEDBACK    6
SET HEADING     ON
SET LINESIZE    180
SET PAGESIZE    50000
SET TERMOUT     ON
SET TIMING      OFF
SET TRIMOUT     ON
SET TRIMSPOOL   ON
SET VERIFY      OFF


CLEAR COLUMNS
CLEAR BREAKS
CLEAR COMPUTES


COLUMN type           FORMAT           a30   HEADING "Record Section Type"
COLUMN record_size    FORMAT       999,999   HEADING "Record Size|(in bytes)"
COLUMN records_total  FORMAT       999,999   HEADING "Records Allocated"
COLUMN bytes_alloc    FORMAT   999,999,999   HEADING "Bytes Allocated"
COLUMN records_used   FORMAT       999,999   HEADING "Records Used"
COLUMN bytes_used     FORMAT   999,999,999   HEADING "Bytes Used"
COLUMN pct_used       FORMAT           B999  HEADING "% Used"
COLUMN first_index                           HEADING "First Index"
COLUMN last_index                            HEADING "Last Index"
COLUMN last_recid                            HEADING "Last RecID"


BREAK ON report


COMPUTE sum OF records_total ON report
COMPUTE sum OF bytes_alloc   ON report
COMPUTE sum OF records_used  ON report
COMPUTE sum OF bytes_used    ON report
COMPUTE avg OF pct_used      ON report


SELECT
    type
  , record_size
  , records_total
  , (records_total * record_size) bytes_alloc
  , records_used
  , (records_used * record_size) bytes_used
  , NVL(records_used/records_total * 100, 0) pct_used
  , first_index
  , last_index
  , last_recid
FROM v$controlfile_record_section
ORDER BY type
/

<think>好的,我现在需要解决用户在达梦数据库(DM Database)中执行多个SQL脚本时遇到的相对路径问题。用户提到在Linux系统中使用start命令执行脚本,但遇到了找不到路径的情况。让我仔细分析这个问题,并找到解决方案。 首先,用户当前的脚本配置是这样的: start ./xt_init_table_01_dm.sql start ./xt_init_table_02_dm.sql start ./pd_init_table_dm.sql start ./ckd_init_table_dm.sql start ./app_init_table_dm.sql start ./crrt_init_table_dm.sql 问题在于这些相对路径无法正确找到SQL脚本文件。相对路径的问题通常与当前工作目录有关。用户可能是在不同的目录下执行主脚本,导致相对路径指向不正确的位置。例如,如果用户在主脚本所在的目录之外执行,那么“./”会指向该目录,而不是脚本所在的目录。 接下来,我需要考虑达梦数据库的DIsql工具在Linux中的行为。DIsql的start命令(或者@符号)用于执行外部SQL脚本。此时,相对路径的解析是基于DIsql当前的工作目录,而不是主脚本所在的目录。如果用户在启动DIsql时所在的目录与脚本所在目录不同,相对路径就会失效。 可能的解决方案包括: 1. 使用绝对路径:将相对路径替换为绝对路径,确保无论从哪个目录执行,都能正确找到文件。 2. 调整工作目录:在调用DIsql之前,先切换到脚本所在的目录,或者在主脚本中使用命令切换目录。 3. 使用DIsql的路径处理功能:检查DIsql是否有设置默认路径的参数或配置,可以指定脚本的搜索路径。 4. 在主脚本中动态获取当前路径:通过脚本获取主脚本所在的路径,并基于该路径构建其他脚本的路径。这可能需要使用shell脚本或批处理命令来辅助。 此外,还需要考虑用户是否有权限访问这些路径,以及脚本文件是否存在、名称是否正确等问题。但用户的问题明确是路径问题,所以可以暂时排除其他因素。 例如,用户可能在/home/user/scripts/目录下存放了所有SQL脚本,而主脚本是在/home/user/目录下执行的,此时相对路径./scripts/...可能更合适。但用户使用的是./,即当前目录,所以如果执行目录不对,就会找不到。 验证每个解决方案的可行性: - 绝对路径:直接有效,但缺乏灵活性,尤其是在不同环境中部署时可能需要修改路径。 - 调整工作目录:在shell脚本中先cd到脚本目录,再执行DIsql,这样可以保持相对路径的有效性。 - DIsql的路径设置:需要查阅达梦的文档,看是否有类似SQLPATH的环境变量或配置参数,允许设置脚本的搜索路径。 - 动态获取路径:在shell脚本中获取脚本所在路径,然后传递给DIsql命令,可能需要结合dirname和realpath等命令。 此外,用户可能希望保持脚本的灵活性,避免硬编码绝对路径。因此,使用动态获取路径的方法可能更合适,但需要一定的shell脚本编写。 可能的步骤: 1. 编写一个shell脚本,首先切换到SQL脚本所在的目录,然后启动DIsql并执行主脚本。 2. 在主脚本中使用绝对路径引用其他脚本。 3. 或者,在DIsql中使用动态路径,例如通过变量替换。 例如,shell脚本的内容可能如下: ```bash #!/bin/bash SCRIPT_DIR=$(cd $(dirname "$0") && pwd) cd "$SCRIPT_DIR" disql user/password@host:port -i main_script.sql ``` 这样,无论从哪里执行该shell脚本,都会切换到脚本所在的目录,然后执行main_script.sql,其中main_script.sql中的start命令使用相对路径即可正确找到。 另一个方法是修改主脚本中的路径,使用绝对路径: start /path/to/scripts/xt_init_table_01_dm.sql ... 但这样在部署到不同环境时需要修改路径,不够灵活。 或者,在达梦的DIsql中,是否有类似Oracle的@?语法,表示相对于当前脚本的路径?需要查阅达梦的文档,如果支持的话,可以使用类似的方法。 如果达梦不支持,那么可能需要结合shell脚本来动态处理路径。 另外,用户是否在DIsql中正确指定了脚本路径?例如,是否在启动DIsql时使用了正确的目录,或者在脚本中使用相对路径时,是否考虑了DIsql的工作目录。 总结,核心问题在于相对路径的解析基准目录是否正确。解决方案包括使用绝对路径、调整工作目录或利用脚本动态确定路径。</think>在达梦数据库(DM Database)的 `DIsql` 工具中,若通过 `start` 命令执行多个 SQL 脚本时因**相对路径失效**导致文件找不到,可通过以下方法解决: --- ### **1. 明确路径基准规则** `DIsql` 中 `start` 命令的路径解析基于**当前工作目录**(即启动 `DIsql` 时的路径),而非脚本自身所在目录。 **示例**: - 若在 `/home/user` 目录下启动 `DIsql`,执行 `start ./a.sql`,则实际查找路径为 `/home/user/a.sql`。 - 若脚本文件实际存放在 `/home/user/scripts/`,需确保路径基准正确。 --- ### **2. 解决方案** #### **(1) 使用绝对路径(推荐)** 直接指定脚本的完整绝对路径,避免依赖工作目录: ```sql start /opt/dm_scripts/xt_init_table_01_dm.sql; start /opt/dm_scripts/xt_init_table_02_dm.sql; -- 其他脚本同理 ``` #### **(2) 通过 Shell 脚本统一切换目录** 在 Linux 中编写 Shell 脚本,**先切换目录再执行 SQL 主脚本**: ```bash #!/bin/bash # 进入脚本所在目录 cd "$(dirname "$0")" || exit # 启动 DIsql 并执行主脚本(假设主脚本为 main.sql) disql sysdba/SYSDBA@localhost:5236 -i main.sql ``` 主脚本 `main.sql` 中保持原有相对路径: ```sql start ./xt_init_table_01_dm.sql; start ./xt_init_table_02_dm.sql; -- 其他脚本 ``` #### **(3) 动态拼接路径(需 SQL 脚本支持)** 若需在 SQL 脚本内动态获取路径,可结合 `HOST` 命令调用系统指令: ```sql -- 获取当前脚本所在路径(需通过外部变量传递) host 'export DM_SCRIPT_DIR=/opt/dm_scripts'; start &DM_SCRIPT_DIR/xt_init_table_01_dm.sql; ``` **注意**:达梦的变量传递需提前配置环境变量或通过参数传入。 #### **(4) 配置 `dm_svc.conf` 默认路径(可选)** 修改达梦客户端配置文件 `dm_svc.conf`,添加默认搜索路径: ```ini [SQL_SCRIPTS] PATH = /opt/dm_scripts ``` 在 SQL 脚本中直接引用文件名(需达梦版本支持路径配置): ```sql start xt_init_table_01_dm.sql; -- 自动从配置路径查找 ``` --- ### **3. 验证路径是否存在** 通过 Linux 命令检查文件路径是否有效: ```bash # 列出所有脚本是否可访问 ls -l /opt/dm_scripts/xt_init_table_*.sql # 或从 DIsql 中调用系统命令验证 host 'ls -l ./'; ``` --- ### **对比方案总结** | **方法** | **优点** | **缺点** | |------------------------|------------------------------|------------------------------| | 绝对路径 | 路径明确,直接生效 | 硬编码路径,灵活性差 | | Shell 脚本切换目录 | 兼容性好,路径动态适应 | 需额外维护 Shell 脚本 | | 动态拼接路径 | 灵活性强 | 依赖环境变量,复杂度高 | | 配置文件默认路径 | 一劳永逸 | 需达梦版本支持,配置门槛高 | --- ### **操作示例** 假设所有 SQL 脚本存放于 `/opt/dm_scripts`,通过 Shell 脚本统一执行: ```bash # run_dm_scripts.sh #!/bin/bash cd /opt/dm_scripts disql sysdba/SYSDBA@localhost:5236 <<EOF start ./xt_init_table_01_dm.sql; start ./xt_init_table_02_dm.sql; -- 其他脚本 exit; EOF ``` 赋予执行权限后运行: ```bash chmod +x run_dm_scripts.sh ./run_dm_scripts.sh ``` --- ### **常见错误排查** 1. **权限问题**:确保 `disql` 用户对脚本文件有读取权限。 2. **路径拼写错误**:检查大小写及特殊字符(Linux 路径区分大小写)。 3. **文件编码**:确认 SQL 脚本为 UTF-8 或无 BOM 格式,避免解析错误。 通过上述方法,可彻底解决达梦数据库在 Linux 中因相对路径导致的脚本执行问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值