2016年8月16日 星期二

[ORACLE] ORA-01114 IO error writing block to file

問題:
  前端執行會出現ORA-01114的錯誤訊息,資料庫的ALERT LOG也有出現以下錯誤
ORA-01114: IO error writing block to file (block # )
ORA-01114: IO error writing block to file 201  (block # 113440 )

原因:空間不足(包含TABLESPACE及實體空間)

處理程序:
1. 透過dba_extents查詢是哪個OWNER的TABLESPACE滿了
    SQL> select owner,tablespace_name,segment_type,segment_name from dba_extents where file_id = 201 and block_id = 113440;

     no rows selected

2. 步驟一查詢並沒有查到任何資料,進一步去dba_free_space及dba_data_file也都沒發現tablespace空間不足的訊息

3. 回到作業系統層檢查磁碟空間透過df指令去查發現根目錄使用率100%

4. 與前端確認後得知正在操作的TABLESPACE就是放在root下的datafile

解決方式:
方式一:Extend根目錄

方式二:將一些TABLESPACE offline後再把TABLESPACE下的datafile搬到有足夠空間的磁碟下後online

2016年8月15日 星期一

[ORACLE] ORACLE的RAC環境下的連接管理(此篇文章來自Oracle Technology Network)

筆記一篇:此篇只要是在說ORACLE的RAC環境CLIENT端的TNSNAME的設定方式

文章出處:http://www.oracle.com/technetwork/cn/articles/database-performance/oracle-rac-connection-mgmt-1650424-zhs.html

[ORACLE] 安裝設定GOLDENGATE從單機到RAC

環境:
RAC(以下稱TARGET端)環境下兩節點HOSTNAME,IP ADDRESS等相關設定如下
# Public
192.168.100.110 racnode01.dba.local racnode01
192.168.100.120 racnode02.dba.local racnode02
# Private
10.0.0.110 racnode01-priv.dba.local racnode01-priv
10.0.0.120 racnode02-priv.dba.local    racnode02-priv
# Virtual
192.168.100.111 racnode01-vip.dba.local racnode01-vip
192.168.100.121 racnode02-vip.dba.local racnode02-vip
# SCAN
192.168.100.101 racnode.dba.local racnode
192.168.100.102 racnode.dba.local racnode
192.168.100.103 racnode.dba.local racnode

單主機(以下稱SOURCE端)HOSTNAME,IP ADDRESS等相關設定如下
192.168.100.50 oggs.dba.local

STORAGE(DNS)主機相關設定
192.168.100.10 racstorage.dba.local

設定程序如下:
在SOURCE端
建立GOLDENGATE安裝目錄
      [oracle@oggs ~]$ mkdir /u01/app/goldengate
      [oracle@oggs ~]$ mkdir /u01/app/goldengate/ogg
將p17952585_1121017_Linux-x86-64.zip解壓縮到/u01/app/goldengate/ogg路徑下
      [oracle@oggs ~]$ unzip p17952585_1121017_Linux-x86-64.zip
      [oracle@oggs ~]$ tar –xvf fbo_ggs_Linux_x64_ora11g_64bit.tar

在TARGET端
建立GOLDENGATE安裝目錄(此路徑為ACFS,好處是當一個節點有問題時,另一個節點也可以使用,設定方式會有另一篇文章教學)
      [oracle@racnode01 ogg]$ mkdir /u01/app/goldengate
      [oracle@racnode01 ogg]$ mkdir /u01/app/goldengate/ogg

將p17952585_1121017_Linux-x86-64.zip解壓縮到/u01/app/goldengate/ogg路徑下
      [oracle@racnode01 ogg]$ unzip p17952585_1121017_Linux-x86-64.zip
      [oracle@racnode01 ogg]$ tar –xvf fbo_ggs_Linux_x64_ora11g_64bit.tar

在SOURCE端
建立goldengate工作目錄
       [oracle@oggs ogg]$ ./ggsci
       GGSCI (oggs.dba.local) 2> create subdirs

在TARGET端
建立goldengate工作目錄
        [oracle@racnode01 ogg]$ ./ggsci
        GGSCI (racnode01.dba.local) 1> create subdirs

在SOURCE端
建立GOLDENGATE的tablespace,user及權限
       [oracle@oggs ogg]$ sqlplus / as sysdba
       SQL> create tablespace ogg_data datafile '/oradata/ogg_data_01.dbf' size 2048M AUTOEXTEND ON;
      SQL> CREATE USER OGG
                 IDENTIFIED BY ogg
                 DEFAULT TABLESPACE ogg_data
                 TEMPORARY TABLESPACE TEMP
                 PROFILE DEFAULT
                 ACCOUNT UNLOCK;
      SQL> GRANT CONNECT TO OGG;
      SQL> GRANT RESOURCE TO OGG;
      SQL> GRANT DBA TO OGG;
      SQL> ALTER USER OGG DEFAULT ROLE ALL;
      SQL> GRANT CREATE ANY SYNONYM TO OGG;
      SQL> GRANT UNLIMITED TABLESPACE TO OGG;
      SQL> GRANT CREATE SYNONYM TO OGG WITH ADMIN OPTION;
      SQL> ALTER USER OGG QUOTA UNLIMITED ON ogg_data;
      SQL> grant create any table to ogg;
      SQL> grant create any view to ogg;
      SQL> grant create any procedure to ogg;
      SQL> grant create any sequence to ogg;
      SQL> grant create any index to ogg;
      SQL> grant create any trigger to ogg;

在SOURCE端
啟用supplemental log
        SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
        SQL> ALTER SYSTEM SWITCH LOGFILE;

在SOURCE端
在OGG的目錄下登入資料庫,設定並啟用DDL Replication
        [oracle@oggs ogg]$ sqlplus / as sysdba
        SQL> @marker_setup
               --在Enter Oracle GoldenGate schema name輸入[ogg]
        SQL> @ddl_setup
               --Enter Oracle GoldenGate schema name輸入[ogg]
        SQL> @role_setup
               --Enter GoldenGate schema name輸入[ogg]
        SQL> GRANT GGS_GGSUSER_ROLE TO ogg;
        SQL> @ddl_enable
        SQL> @ddl_pin ogg
        SQL> @SEQUENCE

在TARGET端
建立GOLDENGATE的tablespace,user及權限
        SQL> create tablespace ogg_data datafile '+DATA01' size 2048M AUTOEXTEND ON;
        SQL> CREATE USER OGG
                   IDENTIFIED BY ogg
                   DEFAULT TABLESPACE ogg_data
                   TEMPORARY TABLESPACE TEMP
                   PROFILE DEFAULT
                   ACCOUNT UNLOCK;
        SQL> GRANT CONNECT TO OGG;
        SQL> GRANT RESOURCE TO OGG;
        SQL> GRANT DBA TO OGG;
        SQL> ALTER USER OGG DEFAULT ROLE ALL;
        SQL> GRANT CREATE ANY SYNONYM TO OGG;
        SQL> GRANT UNLIMITED TABLESPACE TO OGG;
        SQL> GRANT CREATE SYNONYM TO OGG WITH ADMIN OPTION;
        SQL> ALTER USER OGG QUOTA UNLIMITED ON ogg_data;
        SQL> grant create any table to ogg;
        SQL> grant create any view to ogg;
        SQL> grant create any procedure to ogg;
        SQL> grant create any sequence to ogg;
        SQL> grant create any index to ogg;
        SQL> grant create any trigger to ogg;
        SQL> grant create any view to ogg;
       
在TARGET端
啟用supplemental log
        SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
        SQL> ALTER SYSTEM SWITCH LOGFILE;

在TARGET端
在OGG的目錄下登入資料庫,設定並啟用DDL Replication
       [oracle@racnode01 ogg]$ sqlplus / as sysdba
       SQL> @marker_setup
                 --在Enter Oracle GoldenGate schema name輸入[ogg]
       SQL> @ddl_setup
                --Enter Oracle GoldenGate schema name輸入[ogg]
       SQL> @role_setup
               --Enter GoldenGate schema name輸入[ogg]
       SQL> GRANT GGS_GGSUSER_ROLE TO ogg;
       SQL> @ddl_enable
       SQL> @ddl_pin ogg
       SQL> @SEQUENCE

在SOURCE端
啟用transaction data change capture
        [oracle@oggs ogg]$ ./ggsci
        GGSCI (oggs.dba.local) 1> dblogin userid ogg@orcl Password ogg
        GGSCI (oggs.dba.local) 2> add checkpointtable ogg.chktab
        GGSCI (oggs.dba.local) 3> add trandata OD_CAS.*   代表OD_CAS SCHEMA下都要同步
驗證補充日誌已經在那些TABLE打開
        GGSCI (oggs.dba.local) 4> info trandata OD_CAS.*
        SQL> select table_name from dba_tables where owner='OD_CAS' minus select table_name from dba_log_groups where owner='OD_CAS';

                   no rows selected

在TARGET端
啟用transaction data change capture
        [oracle@racnode01 ogg]$ ./ggsci
        GGSCI (racnode01.dba.local) 5> dblogin userid ogg@orcl Password ogg
        GGSCI (racnode01.dba.local) 6> add checkpointtable ogg.chktab

在SOURCE端
配置Goldengate Manager Process
        [oracle@oggs ogg]$ ./ggsci
        GGSCI (oggs.dba.local) 1> edit params mgr
             PORT 7809
             DYNAMICPORTLIST 7810-7820, 7830
             userid ogg@orcl password ogg
             --AUTOSTART ER *
             --AUTORESTART ER *, RETRIES 3, WAITMINUTES 5, RESETMINUTES 60
             STARTUPVALIDATIONDELAY 5
             PURGEOLDEXTRACTS /u01/app/goldengate/ogg/dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3
             PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 5    
             PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 5  
啟動Manager
        GGSCI (oggs.dba.local) 2> start mgr

在TARGET端
配置Goldengate Manager Process
        [oracle@racnode01 ogg]$ ./ggsci
        GGSCI (racnode01.dba.local) 2> edit params mgr
             PORT 7809
             DYNAMICPORTLIST 7810-7820, 7830
             userid ogg@orcl password ogg
            --AUTOSTART ER *
            --AUTORESTART ER *, RETRIES 3, WAITMINUTES 5, RESETMINUTES 60
            STARTUPVALIDATIONDELAY 5
            PURGEOLDEXTRACTS /u01/app/goldengate/ogg/dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3
            PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 5    
           PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 5  
啟動Manager
       GGSCI (racnode01.dba.local) 3> start mgr

在SOURCE端
配置EXTRACT
        GGSCI (oggs.dba.local) 2> edit params e_odcas
              extract e_odcas
              setenv (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
              setenv (ORACLE_HOME="/u01/app/oracle/product/11.2.0.4/dbhome_1")
              --setenv (ORACLE_SID="orcl")
              userid ogg@orcl, password ogg
              --tranlogoptions dblogreader asmuser sys@sam2, asmpassword sss433
              --tranlogoptions altarchivelogdest threadid 1 F:\oracle\oradata\Archivelog,
              --altarchivelogdest threadid 2 F:\oracle\oradata\Archivelog
              exttrail /u01/app/goldengate/ogg/dirdat/E1
              ddl include mapped;
              ddloptions ADDTRANDATA, RETRYOP retrydelay 10 maxretries 10, getreplicates
              discardfile /u01/app/goldengate/ogg/dirrpt/e_odcas.dis, purge, megabytes 10
              dboptions ALLOWUNUSEDCOLUMN
              FETCHOPTIONS FETCHPKUPDATECOLS

              table od_cas.*;
              SEQUENCE od_cas.*

在SOURCE端
新增一個Extract group
       GGSCI (oggs.dba.local) 3> add extract e_odcas, tranlog, begin now
            --P.S.threads參數是指RAC節點數 add extract e_odcas, tranlog, threads 2, begin now

在SOURCE端
定義e_odcas trail file路徑
        GGSCI (oggs.dba.local) 4> add exttrail /u01/app/goldengate/ogg/dirdat/E1, extract e_odcas, megabytes 100

在SOURCE端
配置 pump process group
      GGSCI (oggs.dba.local) 5> edit params p_odcas
            extract p_odcas
            setenv (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
            setenv (ORACLE_HOME="/u01/app/oracle/product/11.2.0.4/dbhome_1")
            rmthost racnode.dba.local, mgrport 7809
            rmttrail /u01/app/goldengate/ogg/dirdat/R1
            passthru

           table od_cas.*;
           SEQUENCE od_cas.*

在SOURCE端
新增一組data pump名稱為p_odcas
       GGSCI (oggs.dba.local) 6> add extract p_odcas, exttrailsource /u01/app/goldengate/ogg/dirdat/E1, begin now

在SOURCE端
將p_odcas加入remote trail
       GGSCI (oggs.dba.local) 7> add rmttrail /u01/app/goldengate/ogg/dirdat/R1, extract p_odcas, megabytes 200

在SOURCE端
啟動extract及pump
        GGSCI (oggs.dba.local) 8> start extract e_odcas
        GGSCI (oggs.dba.local) 9> start extract p_odcas

在TARGET端配置replicat
        GGSCI (racnode01.dba.local) 5> edit params r_odcas
              replicat r_odcas
             setenv (ORACLE_HOME= "/u01/app/oracle/product/11.2.0.4/dbhome_1")
             setenv (ORACLE_SID=orcl)
             setenv (NLS_LANG="AMERICAN_TAIWAN.AL32UTF8")
             userid ogg@orcl, password ogg
             assumetargetdefs
             APPLYNOOPUPDATES
             BATCHSQL
             --reperror (default,discard)
             --reperror 1403, ignore
            discardfile /u01/app/goldengate/ogg/dirrpt/r_odcas.dsc,purge,megabytes 100 
           map od_cas.*, target od_cas.*;

在TARGET端
新增一個Replicat process
        GGSCI (racnode01.dba.local) 6> add replicat r_odcas, exttrail /u01/app/goldengate/ogg/dirdat/R1, checkpointtable ogg.chktab

在SOURCE端初始化資料(Initial Load)
取得SOURCE端資料庫SCN
        SQL> select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual;
                  GET_SYSTEM_CHANGE_NUMBER
                  ------------------------
                        1016207

在SOURCE端匯出資料
         expdp system/Aa1234567@orcl directory=dumpfile dumpfile=exp_full.dmp logfile=exp_full.log schemas=od_cas FLASHBACK_SCN=1016207

在TARGET端匯入
         impdp system/Aa1234567@orcl1 directory=dumpfile dumpfile=exp_full.dmp logfile=imp_full.log

在TARGET端
啟動replicat processes
start replicat R_ODCAS, aftercsn 1016207

檢查GOLDENGATE是否正常
檢查重點
1. 所有服務的STATUS皆須為RUNNING
2.  Lag at Chkpt需小於10秒
3. Time Since Chkpt 需小於10秒
在SOURCE端
         GGSCI (oggs.dba.local) 6> info all
              Program           Status              Group            Lag at Chkpt    Time Since Chkpt
              MANAGER    RUNNING                                          
              EXTRACT      RUNNING     E_ODCAS     00:00:00           00:00:01  
              EXTRACT      RUNNING     P_ODCAS     00:00:00           00:00:03  

在TARGET端
         GGSCI (racnode01.dba.local) 5> info all
              Program           Status              Group             Lag at Chkpt    Time Since Chkpt
              MANAGER     RUNNING                                          
              REPLICAT      RUNNING     R_ODCAS     00:00:00           00:00:02  


2016年8月9日 星期二

[ORACLE] 在RAC環境下變更資料庫端的CHARACTER(字符集)

說明:
1. 從AL32UTF8轉換為ZHT16BIG5
2. NODE01的INSTANCE為orcl1(主要操作主機,重點在alter system set cluster_database=false scope=spfile sid='orcl1';)
3. NODE01的INSTANCE為orcl1
4. NODE02的INSTANCE為orcl2
5. 別用srvctl語法下上DB

在NODE01上
[oracle@racnode01 ~]$ sqlplus / as sysdba

SQL> select userenv('language') from dual;
          USERENV('LANGUAGE')
          ----------------------------------------------------
          AMERICAN_AMERICA.AL32UTF8

SQL> select instance_name from v$instance;
          INSTANCE_NAME
          ----------------
          orcl1

SQL> alter system set cluster_database=false scope=spfile sid='orcl1';

SQL> shutdown immediate;

在NODE02上
[oracle@racnode02 ~]$ sqlplus / as sysdba

SQL> select instance_name from v$instance;
          INSTANCE_NAME
          ----------------
          orcl2

SQL> shutdown immediate;

在NODE01上
SQL> startup nomount;

SQL> Alter database mount exclusive;

SQL> Alter system enable restricted session;

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

SQL> Alter database open;

SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE ZHT16BIG5;

SQL> alter system set cluster_database=true scope=spfile sid='orcl1';

SQL> shutdown immediate;

SQL> startup;

SQL> select userenv('language') from dual;
         USERENV('LANGUAGE')
         ----------------------------------------------------
         AMERICAN_AMERICA.ZHT16BIG5

在NODE02上
SQL> startup;

SQL> select userenv('language') from dual;
          USERENV('LANGUAGE')
          ----------------------------------------------------
         AMERICAN_AMERICA.ZHT16BIG5

2016年8月4日 星期四

[ORACLE] 建立sequence Part II

        最近在測試GOLDENGATE的時候需要測試sequence透過GOLDENGATE同步時的結果,之前有寫過透過TRIGGER方式來取號([ORACLE] 11g建立sequence),但是我個人是不太愛TRIGGER,因為剛開始使用TRIGGER時都會記得,但久了很多AP幾乎都忘記有這個東西,當有TRIGGER的TABLE資料有異常時,AP就會來問我為什麼資料會這樣,我只要問他是不是有TRIGGER,通常AP就會很快地記起有這件事情,這著實照成了一些困擾。

所以呢這次就改用另一個方式來做吧
01. 先建立一個測試TABLE EMP
       CREATE TABLE "OD_XYZ"."EMP"
            ( COLUMN1  NUMBER(*,0),
              COLUMN2  VARCHAR2(20 BYTE),
              COLUMN3  DATE
            ) TABLESPACE "OD_XYZ_DATA" ;

02. 建立一個名稱為emp_sequence的Sequence 
        CREATE SEQUENCE emp_sequence 
                  INCREMENT BY 1  -- 每次加幾個 
                  START WITH 1    -- 從1開始 
                  NOMAXVALUE      -- 在這邊先不設定最大值 
                  NOCYCLE         -- 採用累加方式不循環使用 
                  CACHE 10; 

03. 新增10000筆測試資料
begin
    for i in 1.. 100000
        loop
             insert into OD_XYZ.emp values (emp_sequence.nextval, 'LEWIS', SYSDATE);
        commit;
    end loop;
end;

04. 看結果
      select * from emp order by 1 desc;



2016年8月3日 星期三

[ORACLE] ORA-00600:內部錯誤代碼,參數:[qks3tAssert:1],[35072]

問題:
將DBMS_STATS.GATHER_TABLE_STATS包在PACKAGE中,在執行PACKAGE的時候會報ORA-00600錯誤(圖一),再去看一下對應的TRACE可以看到如圖二的錯誤訊息
圖一

圖二

描述:
        一般來說SQL執行速度慢,不外乎幾個處理方式,看執行計畫有沒有需要增加INDEX,需不需要rebuild index,更新一下統計資訊之類的,在此case增加一個DBMS_STATS.GATHER_TABLE_STATS其實也沒有錯,但是好巧不巧剛好踩到ORACLE 9.2.0.7之後的一個BUG,剛好出問題的是9.2.0.8,不過還好這個BUG有Patch(5089244)可以修正

資料來源:ORACLE SUPPORT
文件ID:418727.1

後記:
        其實這個CASE有個好玩的地方,在測試環境執行PACKAGE的時候是不會有ORA-00600的錯誤,但是上到正式環境就會出現ORA-00600,更好玩的是雖然出現ORA-00600的錯誤,但是實際去看該TABLE的Last Analyzed卻是有執行完成。

2016年8月1日 星期一

[ORACLE] 批次expdp卡住,在expdp log中出現ORA-31693,ORA-02354,ORA-01555的錯誤訊息

問題:批次expdp卡住,在expdp log會看到如下的錯誤訊息

ORA-31693: Table data object "$SCHEMA"."$TABLE_NAME" failed to load/unload and is being skipped due to error:
ORA-02354: error in exporting/importing data
ORA-01555: snapshot too old: rollback segment number 20 with name "_SYSSMU20_4037596720$" too small

解決方法:
1. 若有長時間DML語法,請不要在EXPDP時間發動
2. 增加undo_retention參數size
3. UNDO tablespace 空間必須足夠不然會出現ORA-01555錯誤
4. 在報錯的TABLE上若有欄位是LOB請參考http://www.dba-oracle.com/t_export_unload_blob_clob.htm
5. 增加rollback segment 大小


資料來源