【问题标题】:Oracle updating database with scripts - automationOracle 使用脚本更新数据库 - 自动化
【发布时间】:2010-07-30 14:42:44
【问题描述】:

我在一家使用大量 Oracle 数据库的公司工作,这些数据库供我们的内部软件使用。数据库随着软件的变化而更新,这些更新被放入 PL/SQL 脚本中。我们的客户仍在运行我们软件的旧版本,因此我们的数据库也有“旧”版本。

现在,当我们升级客户端的软件时,我们现在必须运行自客户端运行的版本以来编写的所有脚本。有时这是很多不同的脚本,仅手动运行它们就需要很多工时。

我想知道是否有某种方法可以自动运行每个升级 PL/SQL 脚本?

编写一个小程序来执行数据库上的脚本是一个可行的选择吗?

还有一个问题是脚本运行时会弹出错误,自动化时如何处理?也许写入日志文件。

如果有任何关于自动运行这些脚本的意见,我们将不胜感激?

【问题讨论】:

    标签: oracle automation scripting


    【解决方案1】:

    SQL*Plus 脚本可以调用其他脚本。

    例如,SQL*Plus 脚本如下:

    @@foo.sql
    @@bar.sql
    @@baz.sql
    

    将从执行 sqlplus 的目录中执行 foo.sql、bar.sql 和 baz.sql ——至少在 *nix 中。在 Windows 上,它倾向于在 $ORACLE_HOME/bin 中查找,但我很确定通过 SQLPATH 环境变量在两个平台上都可以控制该行为。当然,您可以使用环境变量定义完整路径以执行,例如:

    @@$MY_APP_UPGRADE_DIR/foo.sql
    @@$MY_APP_UPGRADE_DIR/bar.sql
    @@$MY_APP_UPGRADE_DIR/baz.sql
    

    当然,如果脚本是为 *nix 构建的,那么另一方面,由于 /v \ 问题,它将无法在 Windows 上运行。但这不是一个容易解决的问题,尤其是在 sed 可以处理的 *nix 上。

    最初错过了错误注释:

    SET ECHO ON
    SPOOL $MY_APP_UPGRADE_DIR/my_giant_log_file
    WHENEVER SQLERROR EXIT SQL.CODE ROLLBACK;
    

    将在指定目录中放置一个日志文件,并在升级脚本引发任何 SQL 错误时将其删除。

    【讨论】:

      【解决方案2】:

      您没有指定您的操作系统,但对于 Unix,我会设置 .sh 脚本。

      它可能看起来像这样:

      $UID='myuid' $PWD='密码'

      sqlplus $UID/$PWD@SIDNAME @pl_sql_script1.sql

      sqlplus $UID/$PWD@SIDNAME @pl_sql_script2.sql


      如果您正在调用存储的 PL/SQL 过程,那么您应该创建一个包含以下行的脚本文件 (.sql):execute owner.stored_procedure

      【讨论】:

      • 如果我们使用 UNIX 会很棒!但我们不在 99% 的案例中
      【解决方案3】:
      user:
      -----
      set linesize 100
      set feedback off
      set verify off
      set pagesize 66
      set wrap off
      set pages 50
      set lines 131
      prompt
      prompt  Status of top active users by CPU
      prompt
      select to_char(sysdate,'YY-MM-DD:HH24-MI-SS') stime from dual;
      column u_name format a8
      column Osuser format a8
      column Orauser format a8
      column Sid_sn# format a13 Heading "'SID,SNO#'"
      column S_pid format a5
      column C_pid format a5
      column Server format a10
      column client_program format a28
      select s.osuser "Osuser",s.username "Orauser",''''||s.sid||','||s.serial#||'''' sid_sn#,
      s.process C_pid,substr(p.spid,1,5) "S_pid", s.machine Server,
      decode(instr(s.program,'@'), 0, s.program, nvl(substr(s.program,1,instr(s.program,'@')-1),p.program)) client_program,
      l.value "CPU",m.value "READS",to_char(s.logon_time, 'YY-MM-DD:HH24:MI:SS') logon_time from
      v$session s,v$process p, v$sesstat l, v$sesstat m
      where s.paddr = p.addr
      and l.sid=m.sid
      and s.status='ACTIVE'
      and s.sid=l.sid and l.statistic#=12
      and (l.value > 0 or m.value > 0)
      and m.statistic#=9
      order by l.value
      
      
      ams SPace:
      ----------
      col path for a40
      select NAME,STATE,TOTAL_MB,FREE_MB from v$ASM_DISKGROUP;
      
      select GROUP_NUMBER,DISK_NUMBER,TOTAL_MB,FREE_MB,STATE,PATH,NAME from v$asm_disk;
      
      Invalid object:
      --------------
      set lines 132
      col object_name format a50
      spool invalids.out
      select owner,object_type,object_name,last_ddl_time from dba_objects where status='INVALID'
      order by owner,object_type,object_name;
      spool off
      
      
      
      Locks:
      ------
      set lines 132
      column Session_ID format a15;
      SELECT DECODE(request,0,'Holder: ','Waiter: ')||sid Session_ID,
        id1 Lock_ID_1, id2 Lock_ID_2,
        decode(lmode,1,'Null',2,'Row-S(SS)',3,'Row-X(SX)',4,'Share(S)',5,'S/Row-x(SSX)',6,'Exclusive(X)','None') Lock_Mode,
        decode(request,1,'Null',2,'Row-S(SS)',3,'Row-X(SX)',4,'Share(S)',5,'S/Row-x(SSX)',6,'Exclusive(X)','None') Lock_Mode_Request,
        decode(type,'TX','Transaction Enqueue(TX)','TM','DML Enqueue(TM)','UL','User Supplied(UL)') Type_of_Lock,
        round(ctime/60,2) Time_Min
          FROM V$LOCK
         WHERE (id1, id2, type) IN
                   (SELECT id1, id2, type FROM V$LOCK WHERE request>0)
         ORDER BY id1, request;
      
      
       px waits:
      ----------
      set lines 131
      column sid format 9999
      column event format a25
      column p1text format a20
      column p2text format a10
      column p3text format a10
      
      select sw.sid,event,p1text,p1,p2text,p2,p3text,p3,server_set
      from v$session_wait sw, v$px_session ps
      where ps.sid = sw.sid
      order by qcsid,server_group,server_set,server#
      
      px stats:
      ---------
      set lines 131
      column name format a26
      break on name skip 1
      compute sum of value on name
      select /*+ ordered */ name,value,sid,serial#,qcsid,server_group,server_set,server#,degree,req_degree
      from v$statname n, v$px_sesstat ps
      where ps.statistic# = n.statistic#
      and name  in ('physical reads direct','session logical reads')
      order by name,qcsid,server_group,server_set,server#
      
      space_ts_report:
      -----------------
      set lines 120
      set pages 60
      ttitle center "Tablespace Space Usage Report" skip 2
      break on report
      compute sum of ddf_sum_megs on report
      compute sum of dfs_sum_megs on report
      compute avg of dfs_percent_free on report
      column dfs_tablespace_name format a30 heading "Tablespace"
      col ddf_sum_megs format 999,999,999.9 heading "MB Allocated"
      col dfs_sum_megs format 999,999,999.9 heading "MB Free"
      col dfs_percent_free format 999.9 heading "% Free"
      col dfs_max_megs format 999,999,999.9 heading "MB Max Free"
      col dfs_c_extents format 999,999,999,999 heading "# Free Extents"
      col dfs_avg_megs format 999,999,999.9 heading "MB Avg Free"
      
      spool /tmp/ts_space_report
      
      select   ddf_tablespace_name TABLESPACE,
               ddf_sum_bytes/1024/1024 ddf_sum_megs,
               nvl(dfs_sum_bytes,0)/1024/1024 dfs_sum_megs,
               (nvl(dfs_sum_bytes,0)/ddf_sum_bytes) * 100 dfs_percent_free,
               nvl(dfs_max_bytes,0)/1024/1024 dfs_max_megs,
               nvl(dfs_cnt_extents,0) dfs_c_extents,
               (nvl(dfs_sum_bytes,0)/dfs_cnt_extents)/1024/1024 dfs_avg_megs
      from     (
               select   tablespace_name dfs_tablespace_name,
                        sum(bytes) dfs_sum_bytes,
                        max(bytes) dfs_max_bytes,
                        count(*)   dfs_cnt_extents
               from     dba_free_space
               group by tablespace_name
               union all
               select tname dfs_tablespace_name,
                      nvl(tbytes,0) - nvl(ubytes,0) dfs_sum_bytes,
                      mblocks dfs_max_bytes,rcount dfs_cnt_extents
               from
               (select tablespace_name tname,sum(bytes) tbytes,count(*) rcount  from dba_temp_files group by tablespace_name),
               (select tablespace stname,sum(blocks)*8182 ubytes,max(blocks) mblocks from v$sort_usage group by tablespace)
                where stname (+) = tname
               ),
               (
               select   tablespace_name ddf_tablespace_name,
                        sum(bytes) ddf_sum_bytes
               from     dba_data_files
               group by tablespace_name
               union all
               select tablespace_name ddf_tablespace_name,
                     sum(bytes) ddf_sum_bytes
               from dba_temp_files
               group by tablespace_name
               )
      where    dfs_tablespace_name (+) = ddf_tablespace_name
      order by dfs_percent_free desc;
      
      
      
      lag
      ----
       SELECT to_char(APPLIED_TIME,'dd/mm/yyyy hh24:mi:ss')  "Standby Time",
                         to_char(READ_TIME,'dd/mm/yyyy hh24:mi:ss') "Recover time",
                         to_char(sysdate,'dd/mm/yyyy hh24:mi:ss') "Production Time",
                       trunc(((86400*(sysdate-APPLIED_TIME))/60/60/24))-(trunc((((86400*(sysdate-APPLIED_TIME))/60)/60/24)/30)) "Days",trunc(((86400*(sysdate-APPLIED_TIME))/60)/60)-24*(trunc((((86400*(sysdate-APPLIED_TIME))/60)/60)/24)) "Hrs",
                         trunc((86400*(sysdate-APPLIED_TIME))/60)-60*(trunc(((86400*(sysdate-APPLIED_TIME))/60)/60)) "Min",
                         trunc(86400*(sysdate-APPLIED_TIME))-60*(trunc((86400*(sysdate-APPLIED_TIME))/60)) "Sec"
                FROM DBA_LOGSTDBY_PROGRESS;
      
      current sql :
      -------------
      select sid, s.sql_id, s.sql_child_number, sql_fulltext
      from v$session s, v$process p, v$logstdby l, v$sql a
      where s.paddr=p.addr and p.spid=l.pid and s.sql_id=a.sql_id and s.sql_child_number=a.child_number;
      
      select t.*
      from v$session s, v$process p, v$logstdby l, v$sql a, table(DBMS_XPLAN.DISPLAY_CURSOR(a.sql_id, a.child_number, 'BASIC')) t
      where s.paddr=p.addr and p.spid=l.pid and s.sql_id=a.sql_id and s.sql_child_number=a.child_number;
      
      select sql_id, parse_calls, disk_reads, direct_writes, buffer_gets, rows_processed, fetches, executions, loads, version_count,
      cpu_time, elapsed_time, sorts, sharable_mem, total_sharable_mem
      from v$sqlstats where sql_id in (
      select s.sql_id from v$session s, v$process p, v$logstdby l where s.paddr=p.addr and p.spid=l.pid);
      
      
      Explain:
      --------
      REM
      REM   ident        @(#) BU DBA Group - P2K: explain.sql 1.4 07/06/01 09:33:13
      REM
      REM   File:        explain.sql    Release 1.4   06/01/07 09:33:13
      REM                This version checked out of SCCS on 07/06/01 at 09:33:13
      REM   Control:     /opt/oracle/dba/SCCS/common/sql/s.explain.sql
      REM   -------------------------------------------------------------------------
      REM           ***  Do not edit this file outside of SCCS control  ***
      REM
      REM   To get an editable copy of this file use the command: sccs edit explain.sql
      REM   Edit the file with your favourite editor.
      REM   When finished editing use the command: sccs delget explain.sql
      REM   -------------------------------------------------------------------------
      REM
      REM   Author:      Oracle 9.2 feature scripted by Muthu Chinnasamy
      REM
      REM   Synopsis:    Explain some arbitary SQL
      REM
      REM   Syntax:      @explain.sql SQLfilename
      REM
      REM   Example:
      REM                1. Logon to sqlplus
      REM                2. Run the command
      REM                     explain plan for "your SQL"
      REM                3. @explain
      REM
      REM   Assumptions: Requires $ORACLE_HOME/rdbms/admin/utlxplan.sql
      REM
      REM   History:     sccs prt explain.sql
      REM
      REM -- set error traps so that we can detect failure in the calling kshell
      whenever sqlerror exit sql.sqlcode rollback
      whenever oserror exit failure rollback
      set lines 132 pages 2000
      select * from table(dbms_xplan.display);
      rollback;
      REM spool off
      REM exit
      
      getsql
      -------
      set pages 100 lines 110 wrap on feed 0 termout on veri off head on
      accept sessionid Prompt "Enter SID : "
      column sid format 99999
      column serial# format 99999
      column program format a35
      column ora_user format a10
      column osuser format a10
      column cproc format 99999
      column sproc format 99999
      set long 5000
      select s.sid SID ,s.serial# serial#,s.program program, s.username ora_user ,s.osuser osuser,
      s.process c_proc,s.sql_hash_value,p.spid s_proc,s.sql_id sqlid  from v$session  s,v$process p
      where sid=&sessionid
      and s.paddr=p.addr;
      select t.sql_text from  v$session s,v$sqltext t
      where sid=&sessionid
      and s.sql_hash_value  = t.hash_value (+)
      order by t.piece
      ;
      
      
      
      sqlid:
      ------
      set lines 250 pages 9999 veri off long 9999
      col snap_time format a13
      col agg_cpu format 999999.99
      col agg_et format 999999.99
      col to_from format a13
      col ins format 99
      col exec format 999,999,999
      col bg format 999,999,999,999
      col bg_exe format 999,999,999
      col et_exe format 999,999.99
      col cpu_exe format 999,999.99
      col dr_exe format 999,999,999
      col rows_proc format 9,999,999
      col sql_id new_value sqlid
      select sql_id,sql_text from dba_hist_sqltext where sql_id='&sql_id';
      select
        b.sql_id,
        to_char(s.begin_interval_time,'YYYYMMDD::HH24') snap_time,
        b.snap_id||'-'||b.snap_id to_from,
        s.instance_number ins,
        b.plan_hash_value plan_hash,
        b.executions_delta exec,
        b.buffer_gets_delta bg,
        case b.executions_delta when 0 then 0 else (b.buffer_gets_delta / b.executions_delta) end bg_exe,
        case b.executions_delta when 0 then 0 else (b.cpu_time_delta/1000000)/b.executions_delta end cpu_exe,
        case b.executions_delta when 0 then 0 else (b.elapsed_time_delta/1000000)/b.executions_delta end et_exe,
        case b.executions_delta when 0 then 0 else b.disk_reads_delta/b.executions_delta end dr_exe,
        b.rows_processed_delta rows_proc
      from
        dba_hist_sqlstat b,
        dba_hist_snapshot s
      where
        b.sql_id = '&sqlid' and
        b.snap_id = s.snap_id
        and s.begin_interval_time >= sysdate-&days_back
        and s.instance_number = b.instance_number
        and b.executions_delta > 0
      order by
        b.sql_id,
        b.snap_id,
        b.snap_id,
        s.instance_number
      ;
      
      FRA:
      

      从 v$recovery_file_dest 中选择 *; 从 v$flash_recovery_area_usage 中选择 *;

      选择 文件类型, space_usedpercent_space_used/100/1024/1024 已使用, space_reclaimablepercent_space_reclaimable/100/1024/1024 可回收, frau.number_of_files 来自 v$recovery_file_dest rfd,v$flash_recovery_area_usage frau;

      【讨论】:

        猜你喜欢
        • 2018-10-07
        • 2012-12-28
        • 2016-05-26
        • 2013-11-12
        • 2019-09-07
        • 2014-08-29
        • 2011-01-29
        • 2014-06-20
        • 1970-01-01
        相关资源
        最近更新 更多