主備庫切換以解決主庫儲存空間不足

aaqwsh發表於2011-04-01
同事整理的文章:
 
背景: 主庫儲存空間不足,需要新增磁碟;先為物理備庫新增磁碟,然後進行主備庫切換
由於原來的硬碟是做了raid的,所以系統需要重灌,由於備庫os重新安裝了,因此需要新建一個備庫,然後執行切換。
以下是大致步驟

第一步 配置物理備庫
首先是安裝oracle,備份主庫的$ORACLE_HOME目錄,然後解壓縮到備庫
建立oracle使用者和使用者組以及相關路徑
[root@racdb02 ~]# groupadd -g 700 oinstall
[root@racdb02 ~]# groupadd -g 900 dba
[root@racdb02 ~]# useradd -u 500 -g oinstall oracle --這是一個失誤,沒有把oracle指定到dba使用者組,導致sqlplus / as sysdba 出現許可權不足
建立相應目錄,解壓縮安裝檔案,然後在$ORACLE_HOME/bin下relink

[oracle@racdb02 bdump]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.5.0 - Production on Fri Mar 11 17:45:57 2011

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

ERROR:
ORA-01031: insufficient privileges

[oracle@racdb02 admin]$ id oracle
uid=500(oracle) gid=700(oinstall) groups=700(oinstall)
檢視後發現oracle只分配到了oinstall組,需要將其也加入dba組
[root@racdb02 ~]# usermod -g oinstall -G dba -U oracle
[oracle@racdb02 admin]$ id oracle
uid=500(oracle) gid=700(oinstall) groups=700(oinstall),900(dba)
此時可以登入,但是無法載入
SQL> startup mount;
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device
原因是沒有修改系統引數/etc/sysctl.conf/,為此檔案新增引數
kernel.shmall = 33554432
kernel.shmmax = 68719476736
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
然後
[root@racdb02 etc]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.shmall = 33554432
kernel.shmmax = 68719476736
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
即可
SQL> startup mount
ORACLE instance started.
這步本是linux下安裝oracle的必須操作,但是以前的OS都已經配備好了kernel引數,所以歷次安裝時候沒有留意,這次在新安裝的OS上執行,問題就暴露了
另外引數檔案還需要配置,包括口令檔案、tnsnames.ora、listener.ora、standby controlfile在此略去

開頭說過,主庫空間不足了,
[oracle@orac1 ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             846G  748G   56G  94% /
/dev/sda1             190M   21M  160M  12% /boot
none                   63G     0   63G   0% /dev/shm
只剩不到60g,但是整庫有400g大小,因此不能將主庫整個備份傳輸到備庫進行恢復,因此擬定新的恢復計劃。
首先需要備份系統表空間,然後應用到備庫,以便備庫可以開啟恢復程式,然後把其餘資料檔案挨個備份並傳輸至備庫進行恢復,大致步驟如下

1、備份system,sysaux表空間,恢復到備庫
RMAN>  backup tablespace system,sysaux;
傳輸備份集到備庫/home/oracle/rman,備庫上執行restore
先將資料庫處於mount狀態
RMAN> catalog start with '/home/oracle/rman';
RMAN> restore tablespace system;
RMAN> restore tablespace sysaux;
開啟恢復程式
SQL> recover managed standby database;

2、恢復其餘資料檔案
通過shell指令碼來實現這一步驟
先在備庫上將其餘資料檔案offline drop掉,將其餘檔名放在b.txt檔案中,通過rman將資料檔案copy到/data/pump目錄,然後傳輸到備庫,接著將其online
for a in `cat b.txt`
do
    echo "rman target / "
    echo "copy datafile '/data/oracle/oradata /$a' to '/data/pump/$a';"
    echo "exit"
    echo scp /data/pump/$a *.*.*.*:/data/oracle/oradata—傳輸資料檔案到備庫
    echo rm /data/pump/$a
    echo "ssh *.*.*.*" –連線到備庫
    echo "sqlplus sys/nolog as sysdba"
    echo "alter database datafile '/data/oracle/oradata/$a' online;"
    echo "exit"
    echo " "
    echo "ssh *.*.*.*"—返回主庫
    echo " "
done
此步執行完後,還需在為備庫新增standby redo log,至此備庫就算是建立完全了



第二步 執行主備庫切換
一、檢查工作
1、檢查備庫是否執行在歸檔模式
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /data/oracle/oradata/edw1/arch
Oldest online log sequence     16465
Next log sequence to archive   0
Current log sequence           16472

2、日誌傳輸和應用是否存在延遲
SQL> select * from v$dataguard_stats;--apply lag的值不超過40s

3、主庫執行日誌切換,檢視主備最大日誌號是否相同
執行SQL>alter system switch logfile;
SELECT ARCHIVED,APPLIED,REGISTRAR, CREATOR, THREAD#, SEQUENCE#, FIRST_CHANGE#,NEXT_CHANGE# FROM V$ARCHIVED_LOG order by SEQUENCE#;

4、檢查主備庫引數
確認相應的歸檔日誌路徑已經設定並且enable
SQL> show parameter log_arch

二、主庫執行切換

5、 檢視主庫的狀態:
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
如果是TO_STANDBY,切換主庫到STANDBY庫:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
如果是SESSIONS ACTIVE,則處理這些session,如果處理完了還是SESSIONS ACTIVE,則使用
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY  WITH SESSION SHUTDOWN;
切換主庫到STANDBY庫;
切換前的主庫的CONTROLFILE會儲存在執行操作的這個session對應的trace檔案中,出現問題時這個控制檔案可以備用。很慢的時候可以嘗試先SHUTDOWN,然後起來後再切換。

6、停主庫並重啟到MOUNT狀態
Shutdown immediate;
Startup mount;
啟動到MOUNT狀態後,主庫已經切換到備用庫。

三、備庫執行切換

7、檢視備用庫的狀態:
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
確認返回的結果是:TO_PRIMARY,以確認備用庫是否接收到switch通知並準備轉換為主庫。如果返回是SESSION ACTIVE,則可以使用WITH SESSION SHUTDOWN選項來切換,或者乾脆重啟後再進行切換。

8、切換備用庫到主庫:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
如果備庫在MOUNT狀態,則ALTER DATABASE OPEN;如果備庫在OPEN狀態,則SHUTDOWN IMMEDIATE,然後STARTUP。


四、啟動備庫並檢查
9、登入,執行
alter database recover managed standby database disconnect from session using current logfile;

10、登入,執行日誌切換
SQL>alter system switch logfile;
檢查主備庫的最大日誌號是否相同
SELECT ARCHIVED,APPLIED,REGISTRAR, CREATOR, THREAD#, SEQUENCE#, FIRST_CHANGE#,NEXT_CHANGE# FROM V$ARCHIVED_LOG order by SEQUENCE#;

至此整個任務完成

回滾計劃
如果切成備庫,但切換主庫失敗,此時需要將重新啟用成主庫
登入,執行
SQL> alter database recover managed standby database cancel; FORCE關鍵字將會停止當前活動的RFS程式,以便立刻執行failover。
接著重新啟用成主庫
SQL> alter database commit to switchover to primary;
如果當前資料庫已mount,則直接open;如果是open read only,則先shutdown,然後open

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/758322/viewspace-691435/,如需轉載,請註明出處,否則將追究法律責任。

相關文章