Thứ Hai, 20 tháng 9, 2021

Tự động thêm datafile dạng file system trong Oracle Database

Mục đích: Tự động thêm datafile dạng file system trong Oracle Database

Bước 1: Tạo package sau:

CREATE PACKAGE sys.dba_operations
  IS
  PROCEDURE extend_space;
  FUNCTION get_next_datafile_name (p_ts_name VARCHAR2) RETURN VARCHAR2;
END; -- Package spec

CREATE PACKAGE BODY sys.dba_operations
IS
    free_space_low_level   NUMBER := 20000;                              --20GB
    p_mountpoint             NUMBER:= 8;            -- 8 mount point cap datafile

    FUNCTION get_next_datafile_name (p_ts_name VARCHAR2)
        RETURN VARCHAR2
    IS
        v_sequence               NUMBER;
        v_next_sequence_string   VARCHAR2 (4);
        v_curr_sequence_string   VARCHAR2 (4);

        TYPE fileloc_table_type IS TABLE OF VARCHAR2 (1500)
                                       INDEX BY BINARY_INTEGER;

        file_table               fileloc_table_type;

        p_loc1                   NUMBER;
        p_loc2                   NUMBER;
        p_file                   VARCHAR2 (500);
        p_ind                    NUMBER;
    BEGIN
        file_table (0) := '/u02/oracle/data/dbaviet/';
        file_table (1) := '/u03/oracle/data/dbaviet/';
        file_table (2) := '/u04/oracle/data/dbaviet/';
        file_table (3) := '/u05/oracle/data/dbaviet/';
        file_table (4) := '/u06/oracle/data/dbaviet/';
        file_table (5) := '/u07/oracle/data/dbaviet/';
        file_table (6) := '/u08/oracle/data/dbaviet/';
        file_table (7) := '/u09/oracle/data/dbaviet/';

        select  max(to_number(substr(file_name,instr(file_name,'_',-1)+1, instr(file_name,'.',-1)-instr(file_name,'_',-1)))) +1
        into v_next_sequence_string
        from dba_data_files where tablespace_name=p_ts_name;

        p_ind := MOD (v_next_sequence_string, p_mountpoint); -- so mount point cap datafile

        v_next_sequence_string := lpad(v_next_sequence_string, 3, '0'); --do dai so la 3, vi du 003.dbf

        RETURN file_table (p_ind)|| lower(p_ts_name) ||
                           '_' || v_next_sequence_string ||'.dbf';
    END;

   PROCEDURE extend_space
   IS
      CURSOR c_free_space -- get tablespace free left 200MB.
      IS
        SELECT
              a.tablespace_name,
               ROUND (a.bytes_alloc / 1024 / 1024) megs_alloc,
               ROUND (NVL (b.bytes_free, 0) / 1024 / 1024) megs_free,
               ROUND (maxbytes / 1048576) MAX,
               ROUND (maxbytes / 1048576)-ROUND ( (a.bytes_alloc - NVL (b.bytes_free, 0)) / 1024 / 1024) free_tbs
            FROM (  SELECT f.tablespace_name,
                         SUM (f.bytes) bytes_alloc,
                         SUM (
                            DECODE (f.autoextensible,
                                    'YES', f.maxbytes,
                                    'NO', f.bytes))
                            maxbytes
                    FROM dba_data_files f
                GROUP BY tablespace_name) a,
               (  SELECT f.tablespace_name, SUM (f.bytes) bytes_free
                    FROM dba_free_space f
                GROUP BY tablespace_name) b
            WHERE a.tablespace_name = b.tablespace_name(+)
            AND (LOWER (a.tablespace_name) IN
                                           ('data','indx',
                                            'data' || to_char(sysdate,'YYYY'),'indx' || to_char(sysdate,'YYYY'),
                                            'data' || to_char(sysdate,'YYYYMM'),
                                            'indx' || to_char(sysdate,'YYYYMM'),
                                            'lob','users'
                                            --'data' || to_char(sysdate-30,'YYYYMM'),
                                            --'indx' || to_char(sysdate-30,'YYYYMM'),
                                            --'undotbs1','undotbs2','undotbs3','undotbs4'
                                              )
                                )
            AND ROUND (maxbytes / 1048576)-ROUND ( (a.bytes_alloc - NVL (b.bytes_free, 0)) / 1024 / 1024) < free_space_low_level
            order by ROUND (maxbytes / 1048576)-ROUND ( (a.bytes_alloc - NVL (b.bytes_free, 0)) / 1024 / 1024) desc;


        v_sql   varchar2(1000);
   BEGIN
        for v_free_space in c_free_space
        loop

            for count in 1..p_mountpoint loop
                --1-----------------------------------------------------
                begin
                    v_sql :=
                           'ALTER TABLESPACE '
                        || v_free_space.tablespace_name
                        || ' ADD DATAFILE '''
                        || get_next_datafile_name(v_free_space.tablespace_name)
                        || ''' size 8G';
                    EXECUTE IMMEDIATE v_sql;
                    dbms_output.put_line(v_sql);
                    --send_sms_binhtv(v_sql);

                EXCEPTION
                    when others then null;
                end;
            end loop;
        end loop;
   END;
END;

Bước 2: Tạo job với scheduler job

Tạo job 1h chạy 1 lần chạy thủ tụcb  sys.dba_operations.extend_space;

Hy vọng hữu ích cho bạn.
=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, oracle oca, oracle ocp, oracle ocm

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master