oracle 运维常用脚本(函数篇)

  1. 创建表空间
CREATE OR REPLACE PROCEDURE PRC_CREATE_TABLESPACE (v_name varchar2,
                                                 v_initSize NUMBER,
                                                 v_extendSize NUMBER,
                                                 v_path varchar2) authid current_user as
  /*********************************
  名称:prc_create_tablespace
  功能描述:创建表空间
  **********************************/
  v_flag    number(10, 0);
  v_sqlfalg varchar2(200);
  v_sql  varchar2(1000);
  vErrInfo varchar2(500);
begin
  v_flag := 0;

  v_sqlfalg := 'select count(*) from dba_data_files  where tablespace_name=''' ||
               v_name || '''';
  execute immediate v_sqlfalg
    into v_flag;
  if v_flag = 0 then
    begin
         v_sql:=' create tablespace '||v_name||
                        ' datafile '''||v_path||v_name||'.dbf'' ' ||
                        'size '||v_initSize||'m ' || 'autoextend on ' ||
                        'next '||v_extendSize||'m maxsize unlimited ' ||
                        'extent management local';
         execute immediate  v_sql;
    end;
  end if;
EXCEPTION
  WHEN OTHERS THEN
    BEGIN
      vErrInfo := SUBSTR(SQLERRM, 1, 200);
      dbms_output.put_line(TO_CHAR(vErrInfo));
    END;
end;
  1. 表空间容量视图
CREATE OR REPLACE VIEW V_TBS_FREE AS
SELECT
/*********************************
  名称:V_TBS_FREE
  功能描述:查看表空间剩余量
  需要的权限,如
  GRANT SELECT ON DBA_FREE_SPACE TO xxx;
  GRANT SELECT ON DBA_DATA_FILES TO xxx;
  GRANT SELECT ON DBA_TABLESPACES TO xxx;
--  **********************************/

         A.TABLESPACE_NAME,
         A.TOTAL_SPACE_MB ALLOCATED_SPACE_MB, --已分配总共
         ROUND(B.FREE_SPACE_MB, 2) FREE_SPACE_MB, --空余的
         (A.MAX_SPACE - A.TOTAL_SPACE_MB) FREE_ALLOCATE_MB, --剩余的
         ROUND(A.MAX_SPACE, 2) MAX_SPACE_MB,
         ROUND((A.TOTAL_SPACE_MB - B.FREE_SPACE_MB) / A.TOTAL_SPACE_MB * 100,
               2) PCT_USAGE,
         ROUND(A.TOTAL_SPACE_MB / A.MAX_SPACE * 100, 2) PCT_ALLOCATED
    FROM (SELECT TABLESPACE_NAME,
                 SUM(BYTES) / 1024 / 1024 TOTAL_SPACE_MB,
                 DECODE(SUM(MAXBYTES / 1024 / 1024),
                        0,
                        SUM(BYTES) / 1024 / 1024,
                        SUM(CASE
                              WHEN AUTOEXTENSIBLE = 'YES' THEN
                               MAXBYTES
                              ELSE
                               BYTES
                            END) / 1024 / 1024) MAX_SPACE
            FROM DBA_DATA_FILES
           GROUP BY TABLESPACE_NAME) A,
         (SELECT TABLESPACE_NAME, SUM((BYTES) / 1024 / 1024) FREE_SPACE_MB
            FROM DBA_FREE_SPACE
           GROUP BY TABLESPACE_NAME) B
   WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
WITH READ ONLY;
  1. 自动追加数据文件(表空间自动维护集群版)
CREATE OR REPLACE PROCEDURE PRC_TBS_MONITOR  AUTHID CURRENT_USER AS
/*********************************
  名称:PRC_TBS_MONITOR
  功能描述:自动管理-表空间文件,当空间不足时自动追加数据文件
  需要的权限,如
  GRANT SELECT ON V_$DATABASE TO xxx;
  GRANT SELECT ON V_$ASM_DISKGROUP TO xxx;
  GRANT ALTER TABLESPACE TO xxx;
  **********************************/
   V_TBS_FREE_GB     NUMBER :=30;        --剩余表空间阀值,默认30GB,需要在此设置########
   V_ASM_FREE_GB     NUMBER :=200;       --磁盘组空余的阈值,默认为200G,需要在此设置########
   V_ASM_NAME        VARCHAR2(50) := NULL; --受监控的磁盘组,需要在此设置########

   V_MESSAGE         VARCHAR(250);
   V_DB_NAME         VARCHAR2(50);  --当前数据库名,自动获取
   V_NAME           VARCHAR2(200);  --数据文件名称
   CN INTEGER;
   ERROR_MSG VARCHAR2(500);
   V_SQL      VARCHAR2(1000);
BEGIN

     --获取数据库名
   SELECT NAME INTO V_DB_NAME FROM V$DATABASE;
   
   --磁盘组预警,优先选用剩余空间最大的ASM组来添加数据文件
   FOR V IN(
      SELECT NAME,ROUND(FREE_MB/1024,0) AS FREE_GB  FROM V$ASM_DISKGROUP WHERE  VOTING_FILES = 'N' ORDER BY FREE_MB DESC) 
   LOOP
      IF V_ASM_NAME IS NULL AND  V.FREE_GB < V_ASM_FREE_GB THEN
         V_MESSAGE := '磁盘组['|| V.NAME||']空间不足'||V_ASM_FREE_GB||'G';
         --PRC_INSERT_CREATELOG('PRC_TBS_MONITOR',V_MESSAGE,'WARN');
      END IF;
      --优先选用剩余空间最大的ASM组
      IF V_ASM_NAME IS NULL THEN
        V_ASM_NAME := V.NAME;
      END IF;
   END LOOP;
 
   FOR X IN (SELECT TABLESPACE_NAME,(FREE_SPACE_MB+FREE_ALLOCATE_MB) TOTAL_FREE_MB FROM V_TBS_FREE
    WHERE TABLESPACE_NAME LIKE 'TS_%') LOOP
    IF (ROUND(X.TOTAL_FREE_MB/1024,2)<= V_TBS_FREE_GB) THEN
      BEGIN
        --新增数据文件
        V_SQL := 'alter tablespace '||X.TABLESPACE_NAME||' add datafile '''||'+'||V_ASM_NAME||''' size 100M autoextend on next 100M maxsize unlimited';
        BEGIN
        EXECUTE IMMEDIATE V_SQL;
        
        --获取新增的数据文件名称
        SELECT FILE_NAME INTO V_NAME  FROM (SELECT FILE_NAME
                  FROM DBA_DATA_FILES F
                 WHERE F.TABLESPACE_NAME = X.TABLESPACE_NAME
                 ORDER BY F.FILE_ID DESC) A 
         WHERE ROWNUM = 1;
         --发送提醒
        V_MESSAGE := '成功追加数据文件,表空间['||X.TABLESPACE_NAME||'],数据文件['||V_NAME||']';
       -- PRC_INSERT_CREATELOG('PRC_TBS_MONITOR',V_MESSAGE,'INFO');
        EXCEPTION
        WHEN OTHERS THEN
          BEGIN
            ERROR_MSG := SQLERRM;
            V_MESSAGE := '失败追加数据文件,表空间['||X.TABLESPACE_NAME||']:';
            --PRC_INSERT_CREATELOG('PRC_TBS_MONITOR',V_MESSAGE|| ERROR_MSG,'ERROR');
          END;
        END;
       END;
    END IF;
   END LOOP;
END;
  1. httpPost 与外部交互(需开ACL网络权限,看本文第5点)
CREATE OR REPLACE PROCEDURE PRC_MSG_ADD(V_DATA VARCHAR2, --内容
                                        V_KEY VARCHAR2 DEFAULT 'dataBase'
                                        /*********************************
                                          名称:PRC_MSG_ADD
                                          功能描述:http调用外部接口Post模式
                                          **********************************/) AS
  V_URL         VARCHAR2(100) := 'http://xxxxx:8080/api/msg/add';  --需要配置
  REQ           UTL_HTTP.REQ;
  RESP          UTL_HTTP.RESP;
  L_CLOB        CLOB;
  L_BUF_RAW     RAW(10000);
  AMOUNT        NUMBER := 9000;
  VALUE         VARCHAR2(1000);
  L_PROCESS     VARCHAR2(20);
  L_REQ_BLOB    BLOB;
  L_BUF_LEN_STD NUMBER := 900;
  L_BUF_LEN_CUR NUMBER;
  L_BOD_LEN     NUMBER;
  ERROR_MSG VARCHAR2(500);
BEGIN
  REQ := UTL_HTTP.BEGIN_REQUEST(V_URL, 'POST');
  UTL_HTTP.SET_HEADER(REQ,
                      'Content-Type',
                      'application/x-www-form-urlencoded'); --POST
  UTL_HTTP.SET_HEADER(REQ, 'Keep-Alive', 'timeout=1'); --超时
  DBMS_LOB.CREATETEMPORARY(LOB_LOC => L_CLOB, CACHE => TRUE);
  L_CLOB := 'data='||V_DATA||'&'||'&'||'key='||V_KEY; --POST的内容
  DBMS_LOB.CREATETEMPORARY(LOB_LOC => L_REQ_BLOB, CACHE => TRUE);
  L_REQ_BLOB := FUN_CLOB2BLOB(L_CLOB);
  UTL_HTTP.SET_HEADER(REQ,
                      'Content-Length',
                      DBMS_LOB.GETLENGTH(L_REQ_BLOB));
  UTL_HTTP.WRITE_RAW(REQ, L_REQ_BLOB);

  --无需关注结果返回
  /*
  RESP := UTL_HTTP.GET_RESPONSE(REQ);
  LOOP
    UTL_HTTP.READ_LINE(RESP, VALUE, TRUE);
    DBMS_OUTPUT.PUT_LINE(VALUE);
  END LOOP;
  UTL_HTTP.END_RESPONSE(RESP);
  */


  UTL_HTTP.END_REQUEST(REQ);
EXCEPTION
  WHEN UTL_HTTP.END_OF_BODY THEN
    BEGIN
      ERROR_MSG := SUBSTR(SQLERRM, 1, 200);
      DBMS_OUTPUT.PUT_LINE(TO_CHAR(ERROR_MSG));
      PRC_INSERT_CREATELOG('PRC_MSG_ADD', ERROR_MSG);
     /*
      IF RESP IS NOT NULL THEN
       UTL_HTTP.END_RESPONSE(RESP);
      END IF;
      */
      UTL_HTTP.END_REQUEST(REQ);
    EXCEPTION
        WHEN OTHERS THEN
            ERROR_MSG := SUBSTR(SQLERRM, 1, 200);
            DBMS_OUTPUT.PUT_LINE(TO_CHAR(ERROR_MSG));
    END;
  WHEN OTHERS THEN
    ERROR_MSG := SUBSTR(SQLERRM, 1, 200);
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(ERROR_MSG));
    BEGIN
      PRC_INSERT_CREATELOG('PRC_MSG_ADD', ERROR_MSG);
      /*
      IF RESP IS NOT NULL THEN
       UTL_HTTP.END_RESPONSE(RESP);
      END IF;
      */
      UTL_HTTP.END_REQUEST(REQ);
    EXCEPTION
        WHEN OTHERS THEN
            ERROR_MSG := SUBSTR(SQLERRM, 1, 200);
            DBMS_OUTPUT.PUT_LINE(TO_CHAR(ERROR_MSG));
    END;
END PRC_MSG_ADD;
  1. 配置ACL网络规则,允许访问外部主机
--1.创建访问控制列表(ACLemail_server_permissions),
BEGIN
 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
  acl          => 'web_api_acl.xml', 
  description  => '将数据库信息同步到WEB接口',
  principal    => 'xxx', --此为将来要进行操作的用户
  is_grant     => TRUE, 
  privilege    => 'connect');
END;
/

--2. 将此 ACL 与API服务器相关联,
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
    acl         => 'web_api_acl.xml',
    host        => '*', --WEB服务器地址,这里写任意
    lower_port  => 8080,
    upper_port  => NULL);
  COMMIT;
END;
/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容