2012年12月13日

完整複製和還原 Oracle 的 Instance 資料

要將 Oracle 資料庫要複製到新的機器,或是將正式區的資料複製到測試區,
當然可以用 rman 的備份還原方式,或是用 impdp/expdp、imp/exp …等方式。
好處就是資料會重新整理過,資料就會連續性的匯入,效能會好一點。

不過也有更快速的方式,就是直接將 dbf 檔案複製過去,然後再重建 control file ,
好處就是速度快,也不用再重新設定,而且可以修改 instance 名稱。
但是在異機做還原時,只能限定相同的 Oracle 版本和版次才行。

以下範例就是將 TOPPROD 完整的資料複製到 TOPTEST 。

1. 依照  topprod 的 control file 的參數產生 trace 檔案:
    切換到 topprod: export ORACLE_SID=topprod
    使用 sys 使用登入  sqlplus sys/sys_dsc as sysdba
    執行:SQL> alter database backup controlfile to trace;
     再來就是看檔案產生的位置:
select c.value || '/' || d.instance_name || '_ora_' || to_char(a.spid,'fm99999') || '.trc' from v$process a, v$session b, v$parameter c, v$instance d where a.addr = b.paddr and b.audsid = userenv('sessionid') and c.name = 'user_dump_dest';

出現:/u2/oracle/diag/rdbms/topprod/topprod/trace/topprod_ora_28140.trc

2. 停止 topprod 資料庫,並複製檔案到 toptest
    關閉資料庫:shutdown immediate
    複製檔案:rsync /u2/oracle/oradata/topprod/* /u2/oracle/oradata/toptest
    先刪除 control01.ctl、control02.ctl …檔案,之後會再重建。

3.  建立新的 inittoptest.ora 參數檔案 (檔名必需是 init[資料庫名].ora ,且必須放在 dbs 目錄)
     此作業是要建立一個新的 Instance ,如果已經有建立就可以不用 3、4、5 的步驟。
     進入到 sqlplus 並執行:
     create pfile='/u2/oracle/product/11.2.0/dbhome_1/dbs/inittoptest.ora' from spfile; 

4. 修改 initoptest.ora 檔案,將所有的  topprod 都改為 toptest。

5. 切換到  toptest 資料庫,建立 spfile 資料,並啟動資料庫。
    到 toptest 資料庫:export ORACLE_SID=toptest
    進入 sqlplus 。
    執行:SQL> create spfile from pfile;
    使用 nomount 方式啟動資料庫:startup nomount 
    查看 instance name :select instance_name from v$instance;

6. 複製 trace 檔案並修改為 sql 指令,再執行。
    修改 trc 檔:vi /u2/oracle/diag/rdbms/topprod/topprod/trace/topprod_ora_28140.trc
    修改 SET #1 的部份,並REUSE 改為SET,其餘全部刪除,只剩下如下所示:
 STARTUP NOMOUNT
CREATE CONTROLFILE SET DATABASE "TOPTEST" NORESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u2/oracle/oradata/toptest/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/u2/oracle/oradata/toptest/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/u2/oracle/oradata/toptest/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/u2/oracle/oradata/toptest/system01.dbf',
  '/u2/oracle/oradata/toptest/sysaux01.dbf',
  '/u2/oracle/oradata/toptest/undotbs01.dbf',
  '/u2/oracle/oradata/toptest/users01.dbf',
  '/u2/oracle/oradata/toptest/dbs1-01.dbf',
  '/u2/oracle/oradata/toptest/dbs1-02.dbf',
  '/u2/oracle/oradata/toptest/temptabs.dbf',
  '/u2/oracle/oradata/toptest/rptdbs1-01.dbf'
CHARACTER SET AL32UTF8
   執行 trace 的 SQL 檔就會產生 control file: SQL>@/u2/oracle/trace.sql

7. 開啟資料庫。
    執行:SQL> alter database open resetlogs;  

    如果執行失敗的話,出現ORA-01194: file 1 needs more recovery to be consistent,
    就是日誌的問題,解決方式:
    執行: recover database using backup controlfile until cancel;
    出現 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
    再輸入:/u2/oracle/oradata/toptest/system01.dbf


8. 再把 temporary 的 tablespace 重建,先建一個  TEMP1 然後再移轉再刪除即可。
    先建立:CREATE TEMPORARY TABLESPACE TEMP2 TEMPFILE
  '/u2/oracle/oradata/toptest/temp02.dbf' SIZE 20M AUTOEXTEND ON NEXT 640K MAXSIZE   UNLIMITED
   TABLESPACE GROUP ''
   EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

  再切換為預設:alter database default temporary tablespace temp2;
  再刪除:DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;

9. 完成,查看 datafile 。
    執行:select file_name,file_id,tablespace_name,status from dba_data_files;


10. 如果是複製到新的機器上或是新的 Instance 名稱,就要建立 toptest 資料庫的密碼檔案。     
      執行:orapwd file=orapwtopptest password=oracle entries=30

11. 新的機器上就要再設定監聽 listener.ora 和連線 tnsnames.ora的檔案,
      然後再重新啟動 Listener: lsnrctl reload listener 。

2012年12月5日

備援機制: TIPTOP 主機虛擬化

公司的 ERP 系統能夠允許中斷多久呢 ?
有沒有想過當 TIPTOP 主機掛了該怎麼辦,
中斷的時間的長短其實就取決在能夠花費多少金額。
最好就是 HA 再加上異地備援啦,當然也是所費不貲囉~~

在有限的資源下當然就是將 TIPTOP 主機虛擬化是最經濟的作法。
當 ERP 系統發生無法立即排除的情況時,
就可以馬上啟動虛擬的 TIPTOP 主機,再還原備份的檔案和資料庫,
就足以應付急迫的公司作業。

再來就是說明如何將目前的 TIPTOP 主機做線上遷移到虛擬主機,
Linux 的好處就是所有的設定都是文字檔,不像 windows 還有 register 註冊資料庫 。
所以只要檔案複製過去就可以使用了。
要先切換到 root 的使用者。

1. 把 TIPTOP 主機的資料 image 到檔案,先用 df -h 查看 partition 的空間大小,
    或是佔用的空間有多少。

2. 將磁碟、partition 或是建立空的映象檔做 image,以下二選一即可 。
    A.假設將 sda1 的 partition 做成 sda.img 映象檔,執行 dd if=/dev/sha1 of=/u2/sda1.img 。
        (此指令是破壞性磁碟指令,需注意。如果 sda1 為 100G,就會建立 100G 的檔案)
    B.或是建立空的 image 檔,再做資料同步複製也可以。
       建立空的 20 G 大小的 image 檔: dd if=/dev/zero of=/u2/sda1.img bs=1G count=20。
       格式化成 ext3 格式:mkfs.ext3 sda1.img。
       掛載到 \mnt 目錄: mount /u2/sda1.img /mnt。
       同步複製: rsync -av /u1/* /mnt。

3.  將檔案傳到虛擬主機上,然後轉換成 vhd 檔,利用 vhdtool.exe (需下載)做 convert。
     指令:   vhdtool /convert sda1.vhd。

4.  建立新的 guest virtual machine , 建立傳統網路卡需綁網卡的 mac ,並掛載 vhd 檔。

5.  開機,可以開啟喔~~~完成一半了。

6.  再來就是修改設定檔了。我會做下列的修改。
     修改登入是 text mode: vi /etc/init.tab 的 id:5:initdefault: 將 5 改為 3。
     設定網卡: vi /etc/sysconfig/network-scripts/ifcfg-eth0
      (應該會有一個 bak 檔,直接複製就好 cp ifcfg-eth0.bak ifcfg-eth0 )
     修改開機掛載的磁碟,有可能原本是 sda1 變成 hda1,先用 fdisk -l 查看 。
     設定開機自動掛載: vi /etc/fstab,將 sda 改為 hda。

7.   如果虛擬主機的記憶體設定太小,Oracle 有可能會開不起來,
      因為 SGA 設定必須在 tmpfs (ram disk) 以內,
      查看 tmpfs 空間: df -h 。
      到原本的 TIPTOP 主機查看 Global SGA memory ,
      進入 sqlplus 執行 show parameter mem,查看 memory_target 和 memory_max_target。
      然後再修改 tmpfs 的大小,執行: vi /etc/fatab ,在tmpfs 加上 size=4G。

8. 重新啟動,完成。記得千萬要隔離二台主機的網路,不然 mac 位置一樣會造成異常。

9. 平時就保持 Standby 的狀態,有問題時,將備份的程式直接蓋過去,就不多說明了。

10. 再來就是將 DB 也直接 import 進去,備援主機就完成。

如果能夠將資料庫獨立出去是最好了,還原就快多了,
平常第二台 Oracle 主機待機,利用第一台 Oracle 主機的 redo log 或 archive log 做資料的同步。
資料有損失的時間點就可以大幅的減少。
只需要修改 oracle 的連線檔:/u2/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
就可以切換到第二台 Oracle 主機做存取。

如果想要把測試區和標準區的資料庫刪除來節省磁碟空間和記憶體空間的,
在 Oracle 10g 以後就有提供 drop database 的指令,
以 sys 身份用 sysdba 的方式來登入 sqlplus,
sqlplus sys/sys as sysdba
alter database close;        關閉 database
alter system enable restricted session;        改為 restrict 模式
drop database;        刪除資料庫
刪除資料庫會連同 dbf 檔和 control file、redo file 全部刪除。

因為是 RHEL 5.5 版架設在 Hyper-V 上,所以需安裝 Linux Integration Services v2.1。
# mkdir /media/cdrom
# mount /dev/cdrom /media/cdrom
# mkdir /opt/linux_ic_v21_rtm
# cp -R /media/cdrom/* /opt/linux_ic_v21_rtm
# cd /opt/linux_ic_v21_rtm
# make
# make install
# reboot
下載 adjtimex RPM 套件確保時間的準確性
# rpm -ivh /media/cdrom/Server/adjtimex-1.20-2.1.x86_64.rpm

因為是 P2V 所以需要將 /boot/grub/grub.conf 的 hda=noprobe hdb= norpobe 去掉,不然會無法開機。
然後再放 RHEL 5.5 或是 CentOS 5.5 的安裝光碟重新編譯 Kernel。
1. 使用安裝光碟開機
2. 進入救援模式,輸入 linux rescue
3. chroot /mnt/sysimage 指令將目前的檔案系統環境,由光碟掛載點切換回虛擬主機的硬碟掛載點
4. cd /boot 指令切換目錄
5. ls /lib/modules」指令或「cat /etc/grub.conf」指令查看檔案內容來得知Linux核心版本
6. mkinitrd –v –f initrd-2.6.18-194.el15.img 2.6.18-194.el15
7. 重新開機

取消螢幕保護
修改 /etc/rc.d/rc.local 加入 setterm -powersave off -blank 0

備註:如果想要修改 IP ,需修改以下的檔案:
/etc/hosts
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network
/etc/resolv.conf
/u1/genero/fgl/etc/fglprofile
/u1/genero/fgl.ws/etc/fglprofile
/u1/genero/fgl.dev/etc/fglprofile
/u1/topprod/tiptop/bin/tiptop_env
/u1/usr/tiptop/.rhosts
license.sh 或是修改 cl_user.4gl

其他 License 相關問題就不在此說明了。