Thứ Năm, 14 tháng 4, 2022

Quy trình vận hành cơ sở dữ liệu Oracle từ A-Z với 9 bước hiệu quả

Hướng dẫn các thao tác vận hành và tác động vào DB cho các DBA với từng bước cụ thể, dựa vào các hướng dẫn để giám sát và vận hành các DB hàng ngày:
1. Hướng dẫn khai báo datafile:
+   Khai báo thêm các datafile cho DB theo qui trình đảm bảo hoạt động của DB, tránh nhầm lẫn khi thao tác với DB.
+   Sử dụng I/O của các mount point một cách hiệu quả nhất.
2. Hướng dẫn khai báo partition cho DB:
+   Thêm partition cho các bảng chia partition trong DB theo qui trình đảm bảo hoạt động của DB, tránh nhầm lẫn khi thao tác với DB.
+   Kiểm tra các bảng có partition.
3. Hướng dẫn kiểm tra lỗi lock bảng và tồn session:
+   Xử lý lỗi liên quan tới việc lock bảng và tồn session.
+   Đảm bảo lỗi phải được xử lý nhanh nhất.
+   Lưu lại log toàn bộ quá trình xử lý.
+   Thống nhất cách xử lý giữa các DBA.
4. Hướng dẫn kiểm tra cơ sở dữ liệu:
+   Kiểm tra log của DB, nhằm kiểm tra hoạt động của DB có gì bất thường không.
+   Kiểm tra log backup của DB, mục đích xem bản backup DB có thành công hay không.
5. Hướng dẫn rebuild index:
+   Đảm bảo DB và ứng dụng hoạt động ổn định.
+   Rebuild lại các index bị lỗi trong quá trình hoạt động.
6. Hướng dẫn tác động vào profile của user:
+   Kiểm tra các user bị giới hạn số lần login fail và bỏ giới hạn này.
+   Kiểm tra các user chưa có quyền unlimited tablespace và bổ sung thêm.
+   Đảm bảo các ứng dụng hoạt động bình thường sau khi tiếp nhận, các user ứng dụng không bị ảnh hưởng sau khi tác động.
7. Hướng dẫn quản trị oracle ASM:
+   Hướng dẫn các DBA cách quản lý, giám sát và vận hành oracle ASM.
8. Hướng dẫn vận hành oracle dataguard:
+   Cung cấp các bước vận hành giám sát trên 2 DB có cấu hình dự phòng bằng oracle dataguard.
9. Hướng dẫn vận hành oracle goldengate:
+   Hướng dẫn cấu hình oracle goldengate giữa 2 DB.
+   Giám sát, vận hành các tiến trình oracle goldengate.

1.Hướng dẫn khai báo datafile

1. Tổng hợp thông tin cho việc khai báo

-         Kiểm tra dung lượng free của các mount point hiện tại.
-         Kiểm tra vị trí và sequence các datafile (của tablespace) được khai báo gần nhất.
-         Datafile được khai báo sẽ tương ứng với 02 loại tablespace:
            + Tablespace chung, lưu trữ lâu dài (forever)
            + Tablespace riêng, lưu trữ theo tháng (monthly)

2. Thực hiện khai báo datafile

-      Khi khai báo datafile cho 01 tablespace ta sẽ add đồng thời  datafile (với N là số nguyên dương), tức là mỗi lần sẽ có một số chẵn datafile được khai báo thêm.
-         Datafile sẽ được khai báo lần lượt trên 02 mount point /uA, /uB cụ thể như sau:
           + Datafile có sequence lẻ sẽ được khai báo trên /uA.
           + Datafile có sequence chẵn sẽ được khai báo trên /uB.
-         Dung lượng của mỗi datafile sẽ tùy thuộc tốc độ tăng trưởng của tablespace tương ứng.
-         Câu lệnh dùng để khai báo datafile:
create tablespace "<TABLESPACE_NAME>" logging datafile '/<PATH_DATAFILE>/<TABLESPACE _NAME_XX>.dbf' size <y> extent management local segment space management auto;
<TABLESPACE_NAME>          : Tên tablespace cần add thêm datafile
<PATH_DATAFILE>                 : Đường dẫn chứa datafile
<TABLESPACE _NAME_XX>  : Tên datafile cần add thêm, có định dạng:
tablespace_name + sequence
<Y>                                            : Dung lượng datafile cần add thêm
Ví dụ:
create tablespace "DATA201902" logging datafile '/u03/oradata/oraaz/DATA201002_01.dbf' size 4g  extent management local segment space management auto;

alter tablespace "DATA201902" add datafile '/u04/oradata/oraaz/DATA201002_02.dbf' size 4g  autoextent off;
Chú ý: Dùng câu lệnh trên cho việc khai báo datafile để tăng hiệu năng đọc ghi của DB.


2.Hướng dẫn khai báo partition cho DB

Cách sử dụng script này:
1. Mở TOAd hoặc SQL Navigator
2. Copy toàn bộ và thực hiện từng bước một cho đến khi kết thúc
(hoặc có thể đặt job để tự động sinh partition nhé):

/***** 1. Tao tablespace *****/
--select * from dba_tablespaces where tablespace_name like '%2021%' order by tablespace_name;
--select * from dba_data_files where tablespace_name in ('DATA2021','INDX2021');

-- Sau nay read only tablespace này

create tablespace DATA2020   datafile '+DATA'  size 1g  autoextend on  next 100m;
create tablespace INDX2020   datafile '+DATA'  size 1g  autoextend on  next 100m;

-- Sau này read write tablespace 3, 5, 10 năm
create tablespace DATA2020_RW   datafile '+DATA'  size 1g  autoextend on  next 100m;
create tablespace INDX2020_RW   datafile '+DATA'  size 1g  autoextend on  next 100m;

/**** 2. GEN PARTITION *****/

/*  2.1.GEN PARTITION  THEO NĂM: */

select 'alter table '||table_owner||'.'||table_name||' add PARTITION DATA2021 VALUES LESS THAN (TO_DATE(''2021-01-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) LOGGING TABLESPACE DATA2020;'
from dba_tab_partitions
        WHERE PARTITION_NAME LIKE '%2019%'
        and table_name not like '%$%' and  table_name not like 'XXX%' --and table_name not like 'TMP%'   
        and table_owner not in ('Test')      
        GROUP BY table_owner, table_name    
        having length(max(partition_name))<9
        order by table_owner,table_name;
       
--2.1.1.Rebuild index theo năm:
DECLARE
   v_nam          varchar2(4) := '2020';
   v_tablespace   varchar2(50):='INDX';
   cursor c1 is 
     select table_owner,table_name,max(partition_name)
     from dba_tab_partitions where table_name not like '%$%' and table_name not like 'XXX%' --and table_name not like 'TMP%'
     and table_name not in ('Test')
     group by table_owner,table_name having max(partition_name) like '%'||2020||'%' and length(max(partition_name))<9  order by table_owner,table_name;
    
   cursor c2 (p_tablename varchar2,p_owner varchar2) is
     select * from DBA_PART_INDEXES where table_name = p_tablename and owner=p_owner;
BEGIN
   for r1 in c1
   LOOP
    FOR r2 in c2(r1.table_name,r1.table_owner)
    LOOP
       DBMS_OUTPUT.put_line ('alter index '|| r1.table_owner||'.'||r2.index_name || ' REBUILD PARTITION DATA'||v_nam||' TABLESPACE '||v_tablespace||v_nam||' nologging noparallel online;');
    END LOOP; 
   end loop;  
END;

/*  2.2.GEN PARTITION THEO THÁNG */

DECLARE
   v_nam          NUMBER (4) := 2020;
   v_thang_from   NUMBER (2)    := 1;
   v_thang_to     NUMBER (2)    := 12;
   v_tablespace   varchar2(50):='DATA';
       CURSOR c1
    IS
        select table_owner, table_name,max(partition_name)
        from dba_tab_partitions
        WHERE PARTITION_NAME LIKE '%2019%'
        and table_name not like '%$%' and table_name not like '%TEST%' and table_name not like 'XXX%' and table_name not like '%BAK' and table_name not like 'BK%'
        GROUP BY table_owner, table_name
        having length(max(partition_name))=10 and max(partition_name) like '%201912'
        order by table_owner,table_name;
BEGIN
    for r1 in c1 loop
        FOR i IN v_thang_from .. (v_thang_to-1)
        LOOP
          DBMS_OUTPUT.put_line ('alter table '||r1.table_owner ||'.'|| r1.table_name || ' add PARTITION DATA'||v_nam||LPAD (i, 2, '0')||' VALUES LESS THAN (TO_DATE('''|| v_nam ||'-'||LPAD (i+1, 2, '0')||'-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) LOGGING TABLESPACE '||v_tablespace||v_nam||';');
        END LOOP;
        DBMS_OUTPUT.put_line ('alter table '|| r1.table_owner ||'.'|| r1.table_name || ' add PARTITION DATA'||v_nam||LPAD (to_char(v_thang_to), 2, '0')||' VALUES LESS THAN (TO_DATE('''|| (v_nam +1) ||'-01-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) LOGGING TABLESPACE '||v_tablespace||v_nam||';');
    end loop;
END;

-- 2.2.1.Rebuild INDEX theo thang:

DECLARE
   v_nam          varchar2(4) := '2020';
   v_thang_from   NUMBER (2)    := 01;
   v_thang_to     NUMBER (2)    := 12;
   v_tablespace   varchar2(50):='INDX';
   cursor c1 is 
     select table_owner,table_name,max(partition_name)
     from dba_tab_partitions where table_name not like '%$%' and table_name not like 'XXX%'
     group by table_owner,table_name having max(partition_name) like '%'||2020||'%' and length(max(partition_name))=10  order by table_owner,table_name;    
   cursor c2 (p_tablename varchar2,p_owner varchar2) is
     select * from DBA_PART_INDEXES where table_name = p_tablename and owner=p_owner;
BEGIN
   for r1 in c1
   LOOP
    FOR r2 in c2(r1.table_name,r1.table_owner)
    LOOP
        FOR i IN v_thang_from .. (v_thang_to)
        LOOP
          DBMS_OUTPUT.put_line ('alter index '|| r1.table_owner||'.'||r2.index_name || ' REBUILD PARTITION DATA'||v_nam||LPAD (to_char(i), 2, '0')||' TABLESPACE '||v_tablespace||v_nam||' nologging parallel 8 online;');
        END LOOP;    END LOOP; 
   end loop; 
END;

/*  2.3.GEN PARTITION THEO NGAY */

--2.3.1.Gen data partition theo ngay_MAIN_OWNER

-- Chay vao ban dem > 22h, lock ~200, active session ~ 1000
-- Có th gp  Event: library cache lock, cursor: pin S wait on X

DECLARE
   v_tablename    VARCHAR2 (50);
   v_date_from   date;
   v_date_to     date := to_date('31/12/2020','dd/mm/yyyy');
   v_numday     number;
   v_tablespace varchar2(50):='DATA';
   cursor c1 is
      select table_owner,table_name,MAX(PARTITION_NAME) par_name from dba_tab_partitions where (table_owner, table_name, partition_name) in (
            select table_owner,table_name,MAX(PARTITION_NAME) par_name
            from dba_tab_partitions            
            where LENGTH(PARTITION_NAME)>=11
            and table_name not like '%$%' and table_name not like 'XXX%'
            and table_owner= 'MAIN_OWNER'   
            group by table_owner, table_name
            )
        and partition_name like 'DATA20191231%'
        GROUP BY table_owner,table_name  order by table_owner,table_name;  
BEGIN
    for r1 in c1 loop
       v_tablename:=r1.table_owner||'.'||r1.table_name;
       v_date_from:=to_date(substr(r1.par_name,5,8),'YYYYMMDD')+1;
       v_numday:=v_date_to-v_date_from;
       FOR i IN 0 .. v_numday
       LOOP
          DBMS_OUTPUT.put_line ('alter table '|| v_tablename || ' add PARTITION DATA'||to_char(v_date_from+i,'YYYYMMDD')||' VALUES LESS THAN (TO_DATE('''|| to_char(v_date_from+i+1,'YYYY-MM-DD')||' 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) LOGGING TABLESPACE DATA2020;');
       END LOOP;
    end loop;  
END;

-- 2.3.1.1.Rebuild Index theo ngay MAIN_OWNER

DECLARE
   v_date_from   date    := to_date('01/01/2020','dd/mm/yyyy');
   v_date_to     date    := to_date('31/12/2020','dd/mm/yyyy');
   v_numday     number;
   v_tablespace varchar2(50):='INDX';
   cursor c1 is
     select a.* from DBA_PART_INDEXES a, DBA_TAB_PARTITIONS b where a.owner=B.TABLE_OWNER and a.table_name=B.TABLE_NAME
     and a.owner='CUS_OWNER' and a.index_name not like '%$%' and b.partition_name like '%20191231'  order by a.owner,a.index_name;
BEGIN
   v_numday:=v_date_to-v_date_from;
   FOR i1 in c1
   LOOP
       FOR i IN 0 .. v_numday
       LOOP
            DBMS_OUTPUT.put_line ('alter index '||i1.owner||'.'||i1.index_name || ' REBUILD PARTITION DATA'||to_char(v_date_from+i,'YYYYMMDD')||' TABLESPACE '||v_tablespace||to_char(v_date_from+i,'YYYY')||' nologging parallel 8 online;');
       END LOOP;
      
   END LOOP;
END;

--2.3.2.Gen data partition theo ngay_User khac

DECLARE
   v_tablename    VARCHAR2 (50);
   v_date_from   date;
   v_date_to     date := to_date('31/12/2020','dd/mm/yyyy');
   v_numday     number;
   v_tablespace varchar2(50):='DUMP_DATA';
   cursor c1 is
      select table_owner,table_name,MAX(PARTITION_NAME) par_name
        from dba_tab_partitions
        WHERE (LENGTH(PARTITION_NAME)>=12 AND PARTITION_NAME LIKE '%20201231'
        and table_name not like '%$%' and table_name not like 'XXX%' and table_name not like '%TEST%' and table_name not like '%DAILY_20%'
        and  table_owner not in ('MAIN_OWNER')
        GROUP BY table_owner,table_name  order by table_owner,table_name;  
BEGIN
    for r1 in c1 loop
       v_tablename:=r1.table_owner||'.'||r1.table_name;
       v_date_from:=to_date(substr(r1.par_name,5,8),'YYYYMMDD')+1;
       v_numday:=v_date_to-v_date_from;
       if r1.table_name in ('REQUEST_LOG','RESPOND_LOG') then
       FOR i IN 0 .. v_numday
       LOOP
          DBMS_OUTPUT.put_line ('alter table '|| v_tablename || ' add PARTITION DATA'||to_char(v_date_from+i,'YYYYMMDD')||' VALUES LESS THAN (TO_DATE('''|| to_char(v_date_from+i+1,'YYYY-MM-DD')||' 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) LOGGING TABLESPACE  LOB noparallel;');
       END LOOP;
       elsif r1.table_name in ('AUDIT_LOG') then
       FOR i IN 0 .. v_numday
       LOOP
          DBMS_OUTPUT.put_line ('alter table '|| v_tablename || ' add PARTITION DATA'||to_char(v_date_from+i,'YYYYMMDD')||' VALUES LESS THAN (TO_DATE('''|| to_char(v_date_from+i+1,'YYYY-MM-DD')||' 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) LOGGING TABLESPACE  ' || substr(r1.par_name,1,8)|| ' noparallel;');
       END LOOP;      
       else
       LOOP
          DBMS_OUTPUT.put_line ('alter table '|| v_tablename || ' add PARTITION DATA'||to_char(v_date_from+i,'YYYYMMDD')||' VALUES LESS THAN (TO_DATE('''|| to_char(v_date_from+i+1,'YYYY-MM-DD')||' 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) LOGGING TABLESPACE  ' || substr(r1.par_name,1,8) ||' noparallel;');
       END LOOP;       
       end if;
    end loop;  
END;


-- 2.3.2.1.Rebuild Index theo ngày user khac

-- Lưu tại DUMP_INDX
DECLARE
   v_date_from   date    := to_date('01/01/2020','dd/mm/yyyy');
   v_date_to     date    := to_date('31/12/2020','dd/mm/yyyy');
   v_numday     number;
   v_tablespace varchar2(50):='DUMP_INDX';
   cursor c1 is
     select a.*,b.partition_name from DBA_PART_INDEXES a, DBA_TAB_PARTITIONS b where a.owner=B.TABLE_OWNER and a.table_name=B.TABLE_NAME
     and a.owner!='CUS_OWNER' and a.index_name not like '%$%' and b.partition_name like '%20201231' 
     order by a.owner,a.index_name;
BEGIN
   v_numday:=v_date_to-v_date_from;
   FOR i1 in c1
   LOOP
    if i1.owner='TEST_GATEWAY' then
       FOR i IN 0 .. v_numday
       LOOP
            DBMS_OUTPUT.put_line ('alter index '||i1.owner||'.'||i1.index_name || ' REBUILD PARTITION DATA'||to_char(v_date_from+i,'YYYYMMDD')||' TABLESPACE  LOB nologging parallel 8 online;');
       END LOOP;
       DBMS_OUTPUT.put_line ('alter index '||i1.owner||'.'||i1.index_name || ' noparallel;');
     else
       FOR j IN 0 .. v_numday
       LOOP
            DBMS_OUTPUT.put_line ('alter index '||i1.owner||'.'||i1.index_name || ' REBUILD PARTITION DATA'||to_char(v_date_from+j,'YYYYMMDD')||' TABLESPACE  INDX' || substr(i1.partition_name,5,4) ||' nologging parallel 8 online;');
       END LOOP;
       DBMS_OUTPUT.put_line ('alter index '||i1.owner||'.'||i1.index_name || ' noparallel;');
     end if;
   END LOOP;
END;

-- 2.3.4.Set noparallel index

DECLARE
   cursor c1 is
        select distinct a.index_owner, a.index_name from DBA_ind_partitions a where  a.index_owner='CUS_OWNER' and a.index_name not like '%$%' and a.partition_name like '%20201231' 
        order by a.index_owner,a.index_name;
BEGIN
   FOR i1 in c1
   LOOP
            DBMS_OUTPUT.put_line ('alter index '||i1.index_owner||'.'||i1.index_name || ' noparallel;');
   END LOOP;
END;

-- Một số câu lệnh khác hỗ trợ trong quá trình thực hiện
--Optional: Rebuild INDX PARTITION theo ngay, 1 bang
DECLARE
   v_tablename    VARCHAR2 (50) := 'REQUEST';
   v_owner        VARCHAR2 (50) := 'TEST_OWNER';
   v_date_from   date    := '1/11/2011';
   v_date_to     date    := '31/12/2011';
   v_numday     number(2);
   v_tablespace varchar2(50):='INDX';
   cursor c1 is
     select * from DBA_PART_INDEXES where table_name = v_tablename and owner=v_owner;
BEGIN
   v_numday:=v_date_to-v_date_from;
   FOR i1 in c1
   LOOP
       FOR i IN 0 .. v_numday
       LOOP
            DBMS_OUTPUT.put_line ('alter index '||v_owner||'.'||i1.index_name || ' REBUILD PARTITION DATA'||to_char(v_date_from+i,'YYYYMMDD')||' TABLESPACE '||v_tablespace||to_char(v_date_from+i,'YYYYMM')||';');
       END LOOP;
   END LOOP;
END;

-- MONITORING: Neu active session > 600, lock > 50 thi kill tien trinh
-- Trong quá trình thêm partition cn MONITOR cht ch tránh tình trng lock, cao ti gây timeout ng dng, nếu gp lock, cao ti cn dng li và chn thi đim THP TI khác đ chy (ví d 1h,2h,...)

-- Active session
SELECT distinct s.inst_id i#, s.username, s.SID SID, s.osuser, s.machine,DECODE(S.WAIT_TIME, 0, S.EVENT, 'CPU') ACTION,
s.sql_id, SUBSTR(DECODE(SS.SQL_TEXT, NULL, AA.NAME, SS.SQL_TEXT), 1, 1000) SQLTEXT,s.logon_time,s.p1text, S.P1, s.p2text, S.P2, s.p3text, S.P3
FROM GV$SESSION S, GV$SQLSTATS SS, AUDIT_ACTIONS AA
WHERE  S.STATUS = 'ACTIVE' AND S.SQL_ID = SS.SQL_ID (+) AND AA.ACTION = S.COMMAND and s.type != 'BACKGROUND' AND S.TYPE = 'USER'
--and s.username  not in ('SYS','SYSMAN')
--AND username LIKE 'SYS'
--and s.sid=1234
--and s.machine like '%app-2%'
--and DECODE(S.WAIT_TIME, 0, S.EVENT, 'CPU') like '%cell single block physical read%'
--and s.sql_id ='cb66zngs8xz5j'
--and lower(ss.sql_text) like lower('%test_customer%')
ORDER BY i#,username,sql_id,machine,S.SID;

/**************************************************  LOCK SESSION, WAITING *********************************************************/
select status, count(*) from gv$session  group by status order by status;

Select /*blocking_session*/ inst_id,blocking_session, sid, serial#, sql_id, wait_class, seconds_in_wait, username,STATUS,SCHEMANAME,OSUSER,MACHINE,PROGRAM,TYPE,LOGON_TIME 
From gv$session where blocking_session is not NULL and type not like 'BACKGROUND' order by inst_id --order by blocking_session;

SELECT /*blocking_session*/ inst_id, sid, DECODE (request, 0, 'Holder: ', 'Waiter: ') || sid sess, id1,id2,lmode, request,TYPE
FROM GV$LOCK WHERE (id1, id2, TYPE) IN (SELECT id1, id2, TYPE  FROM GV$LOCK WHERE request > 0) ORDER BY id1, request;

/**************************************************  SESSIONS *********************************************************/
select count(*) from gv$session ;

select /* count , status*/ username,status, count(*) from gv$session group by username,status order by count(*) desc;

select USERNAME,count(*) from gv$session group by USERNAME order by count(*) desc;

select machine,count(*) from v$session group by machine order by count(*) desc;

select inst_id, count(*) from gv$session group by inst_id;

select /*Thong ke theo status*/  username,status,count(*) from gv$session where username like 'TEST_OWNER%' group by username,status order by count(*) desc;

select /*Thong ke theo inst_id*/ inst_id,count(*), username from gv$session where username like 'TEST_OWNER%' group by inst_id, username order by username;

select /* user theo machine */ machine,count(*), username from gv$session where username like 'TEST_OWNER%' group by machine, username order by username;

/************************************************** KILLER *********************************************************/
SELECT /*username*/  'kill -9 ' || SPID A ,a.INST_ID,A.SID,A.SQL_ID, a.USERNAME, a.STATUS,A.SCHEMANAME,a.OSUSER,A.MACHINE,A.PROGRAM,A.TYPE,A.LOGON_TIME,BACKGROUND, A.EVENT
FROM gv$session a, gv$process b 
WHERE b.ADDR = a.paddr
AND a.inst_id=b.inst_id  
--AND B.inst_id = 1
--and a.status='INACTIVE'
--and A.USERNAME LIKE 'TEST%'
--AND A.USERNAME not  in ('SYS','SYSTEM','SYSMAN','BINHTV','DBSNMP','GGATE')
--and a.username not in ('SYS','SYSTEM','SYSMAN','BINHTV','DBSNMP','GGATE','APP1','APP2','APP3')
AND a.program not LIKE '%Toad.exe%'
--AND sql_id in ('44t0dk94q3xqg','6uac7nnud2gfa')
and machine  like '%TCTK-BINHTV%'
--and a.event in ('library cache lock','brary cache load lock','cursor: pin S wait on X','library cache pin','gc buffer busy acquire','enq: TS - contention','enq: TX - row lock contention','db file parallel read')
and type='USER'
order by a.inst_id;

SELECT /*SID*/  'kill -9 ' || spid a, a.INST_ID,A.SQL_ID,A.SID, A.SERIAL#, a.USERNAME, a.STATUS,A.SCHEMANAME,a.OSUSER,A.MACHINE,A.PROGRAM,A.TYPE,A.LOGON_TIME,BACKGROUND
FROM gv$session a, gv$process b
WHERE b.addr = a.paddr  
AND a.inst_id=b.inst_id
--and b.inst_id=2
AND a.sid in (
5812
)
and type='USER'
order by inst_id;

/***** 3.CHECK PARTITION *****/

-- Check partition theo NAM, max partition 2020 la OK
select table_owner,table_name,partition_name from dba_tab_partitions
where (table_owner,table_name,partition_position) in
    (select table_owner,table_name,max(partition_position) from dba_tab_partitions
    where table_name not like '%$%'
    group by table_name,table_owner)
and length(partition_name)<9
order by 1,2,3;

---- Check partition theo THANG,  max partiton 202012 la OK
select table_owner,table_name,partition_name from dba_tab_partitions where (table_owner,table_name,partition_position) in
(select table_owner,table_name,max(partition_position) from dba_tab_partitions
where table_name not like '%$%'
group by table_name,table_owner)
and length(partition_name)>=9
--and partition_name like 'DATA201912'
and length(partition_name)<11
order by table_owner, table_name, partition_name;

---- Check partition theo NGAY,  max partiton 20201231 la OK
select table_owner,table_name,partition_name from dba_tab_partitions where (table_owner,table_name,partition_position) in
(select table_owner,table_name,max(partition_position) from dba_tab_partitions
where table_name not like '%$%'
group by table_name,table_owner)
and length(partition_name)>=11
and partition_name like 'DATA20191231'
order by table_owner, table_name, partition_name;

-- Check ALL (nam, thang, ngay)
-- Dam bao nam 2019, thang 201912, ngay 20201231
select table_owner,table_name,partition_name from dba_tab_partitions where (table_owner,table_name,partition_position) in
(select table_owner,table_name,max(partition_position) from dba_tab_partitions
where table_name not like '%$%'
group by table_name,table_owner)
order by table_owner, table_name, partition_name;

--Test lai sau khi gen partitioin, null la OK
SELECT table_owner, table_name
  FROM (  SELECT table_owner, table_name, MAX (PARTITION_NAME) FROM dba_tab_partitions
           WHERE PARTITION_NAME LIKE '%2019%' and table_name not like '%$%'
        GROUP BY table_owner, table_name)
MINUS
SELECT table_owner, table_name
  FROM (  SELECT table_owner, table_name, MAX (PARTITION_NAME)  FROM dba_tab_partitions
           WHERE PARTITION_NAME LIKE '%2020%'  and table_name not like '%$%'
        GROUP BY table_owner, table_name);

SELECT table_owner, table_name
  FROM (  SELECT table_owner, table_name, MAX (PARTITION_NAME) FROM dba_tab_partitions
           WHERE PARTITION_NAME LIKE '%2020%' and table_name not like '%$%'
        GROUP BY table_owner, table_name)
MINUS
SELECT table_owner, table_name
  FROM (  SELECT table_owner, table_name, MAX (PARTITION_NAME)  FROM dba_tab_partitions
           WHERE PARTITION_NAME LIKE '%2019%'  and table_name not like '%$%'
        GROUP BY table_owner, table_name);


3.Hướng dẫn kiểm tra lỗi lock bảng và tồn session

1 Tiếp nhận yêu cầu

    DBA tiếp nhận phản ánh về các vấn đề liên quan đến lock session: import vào bảng chậm, delete dữ liệu từ bảng chậm, update dữ liệu vào bảng chậm hay thay đổi cấu trúc bảng không thành công. Với phạm vi những phản ánh này không có yêu cầu cụ thể về biểu mẫu, DBA có trách nhiệm phối hợp với nhân viên quản trị ứng dụng từ các phòng, ban để xử lý:
    + Từ các phòng sử dụng cơ sở dữ liệu
    + Từ cảnh báo tinh nhắm qua SMS
    + Từ các công cụ monitor

2 Kiểm tra DB

    Kiểm tra số lượng session active và inactive
-   Dùng câu lệnh sau để kiểm tra session active <--- Rất quan trọng

select   username, machine, status,server, count (*)
from v$session
where status = 'ACTIVE'
group by username, machine, status, server
order by count (*) desc;

-   Dùng câu lệnh sau để kiểm tra session inactive
select   username, machine, status,server, count (*)
from v$session
where status = 'INACTIVE'
group by username, machine, status, server
order by count (*) desc;

-       Nếu thấy số lượng session active >80 (tùy thuộc vào ngưỡng của mỗi hệ thống) thì cần restart lại ứng dụng này
-       Nếu thấy số lượng session inactive >250 thì cần restart lại ứng dụng này

    Kiểm tra số lượng lock session
-       Dùng câu lệnh sau để kiểm tra lock session <--- Rất quan trọng
select sid,SERIAL#,username, machine, server, sql_address
from v$session
where blocking_session is not null;

-       Dùng câu lệnh sau để kiểm tra lock bảng
select a.session_id, a.oracle_username, a.os_user_name, a.processb.owner,  b.object_nameb.subobject_nameb.object_type
from v$locked_object a, all_objects b
where a.object_id = b.object_id and locked_mode = 3
 order by oracle_username, session_id;

-   Nếu session, hoặc bảng nào lâu không giải phóng thì kiểm tra cụ thể session đó đang chạy câu lệnh gì
select   *
from v$sqltext
where address = '0000000A90D92F52'
order by piece;

-       Trong quá trình thực hiện yêu cầu lưu các file kết quả view ra file excel phục vụ việc đánh giá khi cần.

3 Tác động DB để giải phóng lock

Nếu câu lệnh gây lock bảng của ứng dụng thuộc về người dùng thì thực hiện kill session này.
alter system kill session 'sid,SERIAL#';
    
Nếu câu lệnh gây lock thuộc về ứng dụng cần xin ý kiến của lãnh đạo để thực hiện việc restart ứng dụng nhằm giải phóng session.

4 Test ứng dụng và kiểm tra DB

    Kiểm tra lại số lượng lock session:
-       Dùng câu lệnh sau để kiểm tra lock session
select sid,serial#,username, machine, server, sql_address
from v$session
where blocking_session is not null;

-       Dùng câu lệnh sau để kiểm tra lock bảng
select a.session_id,a.oracle_username,a.os_user_name,a.process,b.owner, b.object_name,b.subobject_name,b.object_type
from v$locked_object a, all_objects b
where a.object_id = b.object_id and locked_mode = 3
order by oracle_username, session_id;
    Yêu cầu các session có locked_mode=3 giải phóng liên tục không bị tồn, hoạt động của ứng dụng sau khi tác động nằm trong giới hạn KPI cho phép.

5 Thực hiện restart database

    Trong vòng 45p mà DB vẫn duy trì trạng thái lock các bảng ứng dụng hoặc DB chậm cần xin ý kiến để thực hiện việc restart DB này:
-     Tắt hết ứng dụng trỏ vào DB
-     Tắt listener của DB
-     Switch log DB
-     Kiểm tra CPU của DB
-     Shutdown DB ở chế độ immediate, nếu cần abort
-     Start DB và kiểm tra lại DB, ứng dụng. nếu vẫn không giải quyết được cần phải Reboot OS

6 Restart OS

    DBA xin ý kiến các cấp lãnh đạo Công ty thực hiện restart OS, chuyển yêu cầu  ban phần cứng reboot OS khi ý đề xuất được chấp thuận.

7 Kết thúc

Báo cáo trực tiếp lãnh đạo phòng về nguyên nhân, cách xử lý và đánh giá lại nguyên nhân để tránh gây ra tình trạng tương tự.

4.Hướng dẫn kiểm tra cơ sở dữ liệu (alert log, backup log,...)

1. Kiểm tra alert log của DB

-         Trong hướng dẫn này lấy minh họa trên DB orcl có các thông tin sau:
Ip: 192.168.1.20
Oracle_home: /u01/app/oracle/product/11.2.0/db_1
Oracle_sid: orcl
-         Kiểm tra thư mục lưu file alert log của DB:
SQL> show parameter background_dump_dest;
-         Sau khi có được kết quả từ câu lệnh kiểm tra trên, truy cập vào đường dẫn kết quả đó và tiến hành kiểm tra file alert của DB để có được thông tin hoạt động của DB:
cd /u01/app/oracle/admin/orcl/bdump
-         Kiểm tra 100 dòng cuối cùng của file alert log:
tail -100f alert_orcl.log
-         Kiểm tra thông tin file alert log:
more alert_ orcl.log
-         Kiểm tra thông tin file alert log và tìm kiểm thông tin lỗi
more alert_ orcl.log| grep ORA
more alert_ orcl.log| grep error

2.  Kiểm tra backup log của DB

-         Trong hướng dẫn này lấy minh họa trên DB orcl có các thông tin sau:
Ip: 192.168.1.20
Oracle_home: /u01/app/oracle/product/11.2.0/db_1
Oracle_sid: orcl

-         DB được backup full hàng ngày theo script, kiểm tra backup log của DB để biết dược DB backup có thành công hay không.
-         Kiểm tra xem file log backup của ngày 16/12/2019 có lỗi không, nếu chạy câu lệnh sau không có kết quả trả về thì backup thành công, nếu có kết quả trả về thì backup đang bị lỗi. Để biết lỗi chi tiết thì tiến hành more chi tiết file log backup:
grep –i error rman_backup_full_orcl_3_24_20141016.log
grep –i ERROR rman_backup_full_orcl_3_24_20141016.log
-         Kiểm tra xem file log backup của ngày 16/10/2014 có cảnh báo gì không, nếu chạy câu lệnh sau không có kết quả trả về thì backup thành công, nếu có kết quả trả về thì backup đang có cảnh báo. Để biết chi tiết của cảnh báo thì tiến hành more chi tiết file log backup:
grep –i warning rman_backup_full_orcl_3_24_20141016.log
grep –i WARNING rman_backup_full_orcl_3_24_20141016.log
-         Kiểm tra xem file log backup của ngày 16/12/2019 kết thúc chưa, nếu có kết quả trả về thì backup đã kết thúc, nếu không có kết quả trả về thì backup chưa kết thúc.
grep "Recovery Manager complete" rman_backup_full_orcl_3_24_20141016.log


5.Hướng dẫn rebuild index

1 Tiếp nhận yêu cầu

    DBA tiếp nhận yêu cầu thực hiện rebuid index từ các nguồn sau     
-       Từ phòng sử dụng cơ sở dữ liệu
-       Từ đơn vị quản lý ứng dụng
-       Từ phần mềm cảnh báo
-       Từ việc monitor hàng ngày

2 Kiểm tra index

-       DBA kiểm tra bảng chứa index bị lỗi có thuộc view nào không.
SELECT NAME, TYPE, REFERENCED_NAME, REFERENCED_TYPE
FROM USER_DEPENDENCIES
WHERE NAME = 'VIEW_NAME' AND TYPE = 'VIEW'
AND REFERENCED_TYPE = 'TABLE';

-       Nếu có bản ghi thì chuyển sang bước 3
-       Nếu khổng có bản ghi nào thì chuyển sang bước 4

3 Bỏ bảng khỏi view

-       Nếu bảng thuộc view thì DBA phải thực hiện comment lại phần select của bảng trong view.
-       Nếu bảng không thuộc view nào thi chuyển sang 4.

4 Rebuild lại Index

-       DBA kiểm tra xem Index cần rebuild có đánh partition không

-       Nếu Index đánh partition thì DBA thực hiện rebuild theo partition
   ALTER INDEX index_owner.index_name REBUILD PARTITION partition_name;

-       Nếu Index không đánh partition thì DBA thực hiện rebuild lại toàn bộ
ALTER INDEX index_owner.index_name REBUILD;

5 Kiểm tra lại việc đánh Index

-       Từ cửa sổ chạy SQL, DBA thực hiện chạy câu lệnh sau :
SELECT *
  FROM dba_ind_partitions
 WHERE INDEX_NAME NOT LIKE 'BIN$%' AND STATUS='UNUSABLE';

SELECT *
  FROM dba_indexes
 WHERE INDEX_NAME NOT LIKE 'BIN$%' AND STATUS ='INVALID';
    Nếu không có bản ghi nào nghĩa là việc rebuild lại Index đã hoàn thành.
-       Nếu có thì DBA phải thực hiện rebuild lại Index trong kết quả Select.

6 Kết thúc


-       Thông báo cho đơn vị gửi yêu cầu và theo dõi hiệu năng sau khi tạo lại index

6.Hướng dẫn tác động vào profile của user

Các yêu cầu có thể là: tạo user mới, thay đổi quyền user (Check quyền DBA của các user cần revoke, Revoke quyền DBA và thực hiện grant lại quyền), tiếp nhận database mới.


Nếu có thì thực hiện revoke quyền DBA:
revoke dba from <user_name>;
    
Sau khi revoke, thực hiện grant lại các quyền cần thiết cho user
grant connect, resource … to <user_name>;
Loại bỏ giới hạn số lần login fail của các user trong profile default
alter profile "DEFAULT" limit failed_login_attempts unlimited;

Bổ sung thêm quyền unlimited tablesapce cho các user còn thiếu.
alter user '<USER_NAME>' quota unlimited on '<tablespace_name>';

Loại bỏ giới hạn thời gian đổi password của user trong profile default.

alter profile default limit password_life_time unlimited;

Kiểm tra lại quyền DBA của user vừa revoke3. Kiểm tra

select *
from dba_role_privs
where granted_role = 'DBA' and grantee = <user_name>;
    
Kiểm tra các user bị giới hạn số lần login fail
select profile, resource_name, limit
from dba_profiles
where resource_name = 'FAILED_LOGIN_ATTEMPTS' and limit not in ('UNLIMITED');

Kiểm tra quyền unlimited tablespace của các user trên database
select *
from dba_ts_quotas
where username in ('<USER_NAME>') and max_bytes <> -1;

Kiểm tra các profile giới hạn password lifetime trong các profile

select profile, resource_name, limit
  from dba_profiles
 where resource_name = 'PASSWORD_LIFE_TIME' and limit not in ('UNLIMITED');

7.Vận hành Oracle ASM

1. ASM instance architecture:

- ASM có 3 thành phần chính: ASM instance, disk groups và ASM files.
- Một ASM instance có một số background processes như SMON, PMON và LGWR processes. Ngoài ra có 2 background processes mới: ASM Rebalance Master (RBAL) và ASM Rebalance (ARBn).
-  Oracle DB instance sử dụng ASM instance sẽ có thêm 2 background processes liên quan đến ASM: RBAL và  ASM Background (ASMB) processes
   + ASM Files backup phải thực hiện bằng RMAN

2.Managing the ASM instance

-    Tạo ASM instance: Sử dụng DBCA và chọn các option như hình vẽ sau:
Tạo ASM instance trên môi trường single-instance:


Tạo ASM instance trên môi trường oracle RAC:

Các bước khi sử dụng DB configuration assistant (DBCA) để tạo ASM instance trên môi trường RAC tương tự với trên môi trường single-instance, ngoại trừ bước thứ 1 và bước 3, bạn phải chọn option oracle real application clusters DB trong bước đầu tiên, và sau đó chọn select all ở bước thứ 3.

3. Các tham số khởi tạo cho ASM instance:

-       Các tham số tương tự như sau:
     NSTANCE_TYPE = ASM
     DB_UNIQUE_NAME = +ASM
     ASM_POWER_LIMIT = 1
     ASM_DISKSTRING = '/dev/rdsk/*s2', '/dev/rdsk/c1*'
     ASM_DISKGROUPS = dgroupA, dgroupB
     LARGE_POOL_SIZE = 8MB

3.1. Dynamic performance view trong ASM instance

-       Để xem thông tin của ASM intsance, select các view sau:

3.2. Starting up/shutting down ASM instance

-       Sử dụng SQLPLUS như một DB instance bình thường tương tự như sau:
$ sqlplus /nolog
SQL> CONNECT / AS sysdba
Connected to an idle instance.
SQL> STARTUP;
ASM instance started
Total System Global Area 147936196 bytes
Fixed Size                  324548 bytes
Variable Size             96468992 bytes
DB Buffers          50331648 bytes
Redo Buffers                811008 bytes
ASM diskgroups mounted
Hoặc sử dụng công cụ srvctl trong môi trường RAC
srvctl stop asm -n <node_name> [-i <asm_inst_name>] [-o <stop_options>]
    -n <node>                   Node name
    -i  <asm_inst_name> ASM instance name
    -o <stop_options>      Options shutdown command (normal, transactional, immediate, abort)
-       Tương tự với shutdown DB instance sử dụng sqlplus
Chú ý: Nếu shutdown ASM instance, tất cả oracle DBs đang kết nối tới nó cũng sẽ shut down.
Hoặc sử dụng công cụ srvctl trong môi trường RAC
srvctl start asm -n <node_name> [-i <asm_inst_name>] [-o <start_options>]
    -i  <asm_inst_name> ASM instance name
    -o <stop_options>      Options shutdown command (normal, transactional, immediate, abort)

3.3. Quản lý ASM Disk Groups

-       Khái niệm ASM Mirroring: Cung cấp mức dự phòng cho dữ liệu.
-       Có 3 loại ASM Mirroring:
·       External redundancy: Chọn loại này khi các disk đã được cấu hình dự phòng trên các thiết bị lưu trữ nằm ngoài máy.
·       Normal redundancy: Cung cấp two-way mirroring. Để hỗ trợ loại này, phải tạo ít nhất 2 failure group.
·       High redundancy: Cung cấp three-way mirroring. Để hỗ trợ cho loại này, phải tạo ít nhất 3 failure group.
-       Create và Delete Disk Groups:
·       Tạo Diskgroup tương tự sau:
CREATE DISKGROUP data NORMAL REDUNDANCY
FAILGROUP controller1 DISK
   '/devices/A1' NAME diskA1 SIZE 120G FORCE,
   '/devices/A2',
   '/devices/A3'
FAILGROUP controller2 DISK
   '/devices/B1',
   '/devices/B2',
   '/devices/B3';
          Hoặc:  
CREATE DISKGROUP data EXTERNAL REDUNDANCY DISK  '/devices/A1'  name DATA;
·       Xoá  Diskgroup tương tự sau:
DROP DISKGROUP data INCLUDING CONTENTS;
-       Thay đổi Diskgroup:
·       Thêm Disks vào một Disk Group
ALTER DISKGROUP data ADD DISK
  '/dev/rdsk/c0t4d0s2' NAME A5,
  '/dev/rdsk/c0t5d0s2' NAME A6,
  '/dev/rdsk/c0t6d0s2' NAME A7,
  '/dev/rdsk/c0t7d0s2' NAME A8;
·       Xoá Disk khỏi Diskgroup:   
ALTER DISKGROUP data DROP DISK A5;
·       Tạo directory:
ALTER DISKGROUP data DROP DIRECTORY '+data/mydir';
·       Xoá file trong diskgroup:
ALTER DISKGROUP data DROP FILE '+data/thread_1_seq_57.333.74511'
·       Tạo và xoá Alias:
ALTER DISKGROUP data ADD ALIAS '+data/mydir/second.dbf' FOR '+data/sample/datafile/mytable.342.3';
ALTER DISKGROUP data DROP ALIAS '+data/mydir/second.dbf';

3.4. Quản lý ASM Files

-       Qui ước tên trong ASM files tương ứng với 1 trong 6 qui tắc như sau:


select NAME,PATH,GROUP_NUMBER  from v$asm_disk;
select a.name,b.name,b.path from v$asm_diskgroup a, v$asm_disk b where a.GROUP_NUMBER=b.GROUP_NUMBER;

3.5. Giám sát ASM

-       Trong ASM cung cấp một số view phục vụ cho việc giám sát thông tin như sau:
·       V$ASM_DISKGROUP: Cung cấp thông tin về disk group. Chứa 1 row cho mỗi ASM disk group được mount bởi ASM instance.
·       V$ASM_CLIENT: Xác định tất cả các client DBs sử dụng các disk groups. Chứa 1 row cho mỗi ASM instance nếu DB open ASM files bất kỳ.
·       V$ASM_DISK: Chứa 1 row cho mỗi disk được phát hiện bởi ASM instance. Chỉ chứa các rows cho các disks đang sử dụng bởi DB instance.
·       V$ASM_FILE: Chứa 1 row cho mỗi ASM file trong mọi disk group được mount bởi ASM instance.
·       V$ASM_TEMPLATE: Chứa 1 row cho mỗi template trong mỗi disk group được mount bởi ASM instance.
-       Ngoài ra có thể giám sát theo thông tin trong file alert log
·       Kiểm tra trạng thái, dung lượng của diskgroup:
select NAME,STATE,TYPE,TOTAL_MB,FREE_MB  from v$asm_diskgroup;
·       Kiểm tra đường dẫn device của từng disk được cấu hình trong ASM
·       Xem thông tin alias:
select name,FILE_NUMBER,FILE_INCARNATION,ALIAS_DIRECTORY from v$ASM_ALIAS;
select name,FILE_NUMBER,FILE_INCARNATION,ALIAS_DIRECTORY from v$ASM_ALIAS;

8.Hướng dẫn vận hành oracle dataguard

1. Các bước stop, start standby database

-       Start Physical standby database gồm 3 bước:
1.     Start chế độ nomount:
STARTUP NOMOUNT;

2.     Mount  standby database:
ALTER DATABASE MOUNT STANDBY DATABASE;
                 
                    3. Start  managed recovery:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE  DISCONNECT FROM SESSION;

-       Stop  Physical Standby Database gồm 2 bước:
1. Cancel managed recovery:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

2. Shut down standby database.
SHUTDOWN IMMEDIATE;

2. Kiểm tra kết nối mạng giữa 2 database

Bước 1: Trên primary database, bằng user oracle thực hiện:
tnsping to_standby
sqlplus sys/password@to_standby as sysdba
    Luôn đảm bảo 2 lệnh trên là thành công

Bước 2: Tương tự trên standby database thực hiện:
tnsping to_primary
sqlplus sys/password@to_primary as sysdba
    Luôn đảm bảo 2 lệnh trên là thành công

3. Kiểm tra hoạt động chuyển archive tới physical standby database

    Mục đích để kiểm tra đồng bộ giữa 2 database với nhau, các thao tác dưới đây sẽ thực hiện hàng ngày để kiểm tra đảm bảo tiến trình đồng bộ thành công

Bước 1:  Kiểm tra archived redo logs hiện có.
-       Trên standby database, query V$ARCHIVED_LOG view:
SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

Bước 2: Thực hiện archiving current log.
-       Trên primary database, archive current log sử dụng lệnh sau:
ALTER SYSTEM ARCHIVE LOG CURRENT;

Bước 3: Kiểm tra new archived redo log nhận được trên standby database.
-       Trên standby database, queryV$ARCHIVED_LOG view:
SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME  FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

Bước 4: Kiểm tra new archived redo log applied.
-       Trên standby database, query theV$ARCHIVED_LOG view:
SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

       
- Kết quả trả về, giá trị của trường APPLIED là YES có nghĩa archive đã được apply vào standby database, trường SEQUENCE#  có gí trị lớn nhất băng với giá trị lớn nhất của trường này ở bên primary database

9.Thủ tục cài đặt, vận hành Oracle Goldengate

1.  Mô hình đồng bộ goldengate triển khai


2. Các bước thực hiện cấu hình đồng bộ dữ liệu giữa 2 DB ORACLE

-         Bước 1: Tạo user, gán các quyền cho user trên cả nguồn và đích
Create user ogg identified by ***;
Grant create session, dba to ogg;

Thực hiện enable supplemental trên DB nguồn
alter DB add supplemental log data;
alter system switch logfile;
-         Bước 2: Thực hiện cấu hình đồng bộ goldengate command line
Download bộ phần mềm GG tương ứng với OS trên trang chủ  oracle.com hoặc Oracle Delevery, DB của môi trường đồng bộ sau đó thực hiện unzip ra thư mục goldegate.
Thực thi file ggsci (./ggsci) xuất hiện màn hình command line
·     Tạo các thự mục mặc định cho tiến trình đồng bộ (trên cả nguồn và đích)
            ggsci>create subdirs
·     Các file tham số theo phụ lục
·     Sửa các file cấu hình theo nội dung phần phụ lục bằng lệnh edit trong môi trường ggsci> hoặc sử dụng trình vi từ môi trường OS
·     Cấu hình trên server nguồn của tiến trình đồng bộ
o   ggsci>dblogin userid ogg, password  ***
o   ggsci>add trandata ten_owner.ten_bang (tên bảng cần đồng bộ)
o   ggsci>add extract ext, TRANLOG, BEGIN NOW
o   ggsci>add exttrail /path_source/dirdat/im, extract ext
o   ggsci>add extract pump, EXTTRAILSOURCE /path_source/dirdat/im
o   ggsci>add rmttrail /path_target/dirdat/imextract pump
·     Cấu hình trên server đích của tiến trình đồng bộ
o   ggsci> dblogin userid ogg,password *** (user/pass của db target)
o   ggsci> add checkpointtable ogg.cpt_table
o   ggsci> ADD REPLICAT rep1, EXTTRAIL /u01/app/gg/dirdat/im, checkpointtable ogg. cpt_table
·     Bật tiến trình đồng bộ trên cả 2 server
o   ggsci>start mgr
o   ggsci>start ext
o   ggsci>start pump
o   ggsci>start rep
·     Kiểm tra trạng thái của tiến trình đồng bộ cả nguồn và đích
o   ggsci>status all

3.  Danh sách các file tham số cơ bản của goldengate và cách cấu hình

-         File tham số manager mgr.prm (cấu hình trên cả nguồn và đích).
-         File tham số extract ext.mgr (cấu hình trên server nguồn).
-         File tham số datapump pump.mgr (cấu hình trên server nguồn).
-         File tham số replicat rep.mgr (cấu hình trên server đích).
(Danh sách bảng đồng bộ/ nội dung file tham số lấy trên DB_Source(192.168.1.60) đồng bộ sang DB_Dest (192.168.1.68))

Nội dung file Ext.mgr
EXTRACT ext
-- Reporting
reportrollover on Monday
reportcount every
 1 hours, rate
--USERID ogg, PASSWORD
USERID ogg, password AACAAAAAAAAAAAGALDEJEBZFLJMEQGJB , encryptkey default
--RMTHOST 192.168.1.68, MGRPORT 7809
EXTTRAIL /path_source/dirdat/in
TABLE user1.shop;
TABLE user1.staff;

Nội dung file Pump.mgr

EXTRACT pump
--USERID ogg, PASSWORD
USERID ogg, password AACAAAAAAAAAAAGALDEJEBZFLJMEQGJB , encryptkey default
discardfile ./dirout/pump1.dsc, APPEND
-- Reporting
reportrollover on Monday
reportcount every 1 hours, rate
RMTHOST 192.168.1.68, MGRPORT 7809
RMTTRAIL /path_target/dirdat/im
PASSTHRU
TABLE user1shop;
TABLE user1.staff;

Nội dung file mgr.prm (Sử dụng trên cả server nguồn và đích)
port 7809
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPHOURS 48
autostart er *                                    
autorestart er * , WAITMINUTES 3, RETRIES 10

Nội dung file rep.mgr
REPLICAT rep
SETENV (NLS_LANG = "AMERICAN_AMERICA.UTF8")
USERID ogg, password AACAAAAAAAAAAALANAXFJGGBYDHICBGENCUIPAZBLJJAMHAD , encryptkey default
INSERTDELETES
INSERTUPDATES
HANDLECOLLISIONS
ASSUMETARGETDEFS
DISCARDFILE ./dirrpt/RORA01.DSC, append
MAP user1.STAFF, TARGET user1.STAFF
MAP user1.SHOP, TARGET user1.SHOP

4. 
Các bước vận hành oracle goldengate
-         Start các tiến trình oracle goldengate:
Start mgr
Start ext
Start pump
Start rep
-         Stop các tiến trình oracle goldengate
Stop mgr
Stop ext
Stop pump
Stop rep
-         View report các tiến trình oracle goldengate
View report mgr
View report ext
View report pump
View report rep
-         Alter các tiến trình oracle goldengate
Alter extract ext begin ...                               ---- thay đổi lại thời điểm bắt đầu extract.
Alter extract pump extseqno ..., extrba ...     --- thay đổi sequence, rba của tiến trình pump
Alter extract rep extseqno ..., extrba ...         --- thay đổi sequence, rba của tiến trình rep
-         Edit các file param của tiến trình

Edit param mgr
Edit param ext
Edit param pump
Edit param rep
=============================
* 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 oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

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