(轉) DB 遷移到Data Guard 實施方案

xz43發表於2011-02-16
原DB是 Linux Heartbeat 的HA 系統,業務是7*24的,所以遷移要考慮當機時間的問題。我考慮的是先將DG環境搭建好,這樣遷移過程中當機的就2部分時間,一是exp/imp 的時間,還有一個就是Data Guard  copy  同步的時間。因為資料庫不大,所以時間應該不會太長,如果不出什麼意外的話。
 
搬遷的方案:
 
1.       先正在執行的Database 用邏輯匯出的方式匯出到dump 檔案,這個過程需要停機。
2.       在搬遷之前先將Data Guard 服務的OS 和資料庫安裝好,這樣可以減少系統的當機時間。
3.       將匯出的dmp 檔案匯入新的伺服器,並重建DG環境。
4.       測試系統能否正常工作。
 
說明:因為原來的伺服器為4G記憶體,上線之後的為8G,所以在新的DG 環境上,計劃SGA 分4.8G記憶體,PGA 1.6G,剩下的給OS。
 
該方案只需要當機一次。 當機時間按如下計算:
1.       dmp 匯出時間。 因為資料檔案在20G左右,估計dmp 需要時間在30分鐘左右。
2.       imp 時間。 這個預計一個小時。
3.       一旦imp 成功之後,DG同步,可以用最簡單的方式來實現,就是把匯入之後的資料檔案直接copy到備庫。這個過程估計在30分鐘左右。
 所以估計需要2個小時的當機時間,留一點冗餘時間。所以對小額支付DB 搬遷考慮申請4個小時的當機時間。時間段可以在凌晨2:00 – 早上7:00。
 
 
風險評估:
       1. DG環境不可用。因為原來HA 環境沒有破壞,如果DG不可用,可以直接將系統切換到原來的HA系統。
       2. DG 環境後續的效能。這個需要慢慢調整,可以根據AWR報告來調整相關引數。
 
 
搬遷的操作步驟如下:
 
一. 匯出資料
 
匯出匯入命令:
exp user/pwd file=/u01/qishun.dmp log=/u01/dave.log full=y
 
Imp user/pwd file=/u01/qishun.dmp log=/u01/dave.log full=y
 
 
二. 安裝資料庫
 
2.1 安裝Oracle
 
2.1.1 檢查相關包
 
Oracle 的安裝需要如下包:
binutils-2.17.50.0.6
compat-libstdc++-33-3.2.3
elfutils-libelf-0.125
elfutils-libelf-devel-0.125
elfutils-libelf-devel-static-0.125
gcc-4.1.2
gcc-c++-4.1.2
glibc-2.5-24
glibc-common-2.5
glibc-devel-2.5
glibc-headers-2.5
kernel-headers-2.6.18
ksh-20060214
libaio-0.3.106
libaio-devel-0.3.106
libgcc-4.1.2
libgomp-4.1.2
libstdc++-4.1.2
libstdc++-devel-4.1.2
make-3.81
numactl-devel-0.9.8.i386
sysstat-7.0.2
 
from :
 
 
檢查相關包:
rpm -q binutils-2.17.50.0.6 \
compat-libstdc++-33-3.2.3 \
elfutils-libelf-0.125 \
elfutils-libelf-devel-0.125 \
elfutils-libelf-devel-static-0.125 \
gcc-4.1.2 \
gcc-c++-4.1.2 \
glibc-2.5-24 \
glibc-common-2.5 \
glibc-devel-2.5 \
glibc-headers-2.5 \
kernel-headers-2.6.18 \
ksh-20060214 \
libaio-0.3.106 \
libaio-devel-0.3.106 \
libgcc-4.1.2 \
libgomp-4.1.2 \
libstdc++-4.1.2 \
libstdc++-devel-4.1.2 \
make-3.81 \
numactl-devel-0.9.8.i386 \
sysstat-7.0.2
 
 
2.1.2 修改相關引數
 
在/etc/sysctl.conf 新增如下內容:
 
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
net.ipv4.ip_local_port_range = 1024 65000
 
vi /etc/sysconfig/limits.conf
oracle soft memlock 5242880
oracle hard memlock 524280
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 65536
oracle hard nofile 65536
 
 
vi /etc/pam.d/login:
session required /lib/security/pam_limits.so
 
使引數生效:
sysctl -p
 
 
 
2.1.3 建立使用者和目錄,修改使用者引數
建立使用者和密碼:
[root@dg1 Server]# groupadd oinstall
[root@dg1 Server]# groupadd dba
[root@dg1 Server]# groupadd oper
[root@dg1 Server]# useradd -g oinstall -G dba oracle
[root@dg1 Server]# passwd oracle
Changing password for user oracle.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
 
建立相關目錄:
[root@dg2 Server]# mkdir -p /u01/app/oracle/product/10.2.0/db_1
[root@dg2 Server]# chown -R oracle.oinstall /u01
[root@dg2 Server]# chmod -R 777 /u01
 
修改OS版本
[root@dg2 Server]# cat /etc/redhat-release
#Red Hat Enterprise Linux Server release 5.4 (Tikanga)
redhat-4
 
 
設定使用者變數:
[oracle@dg2 ~]$ cat ~/.bash_profile
# .bash_profile
 
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
 
# User specific environment and startup programs
 
PATH=$PATH:$HOME/bin
 
export PATH
 
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/jre:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
 
2.1.4 在主庫安裝軟體和例項,在備庫只安裝軟體
 
2.1.5 修改/etc/oratab將所需啟動的例項修改為Y
orcl:/u01/app/oracle/product/10.2.0/db_1:Y
 
將第一步匯出的dump 檔案匯入到主庫中,然後開始搭建DG環境。
 
 
三. 搭建DG 環境
 
3.1 主庫端準備工作
 
1.  主庫設定為force logging 模式
SQL> alter database force logging;
 
2. 主庫設為歸檔模式
SQL> archive log list;
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> archive log list;
 
3. 新增redo log file
新增一個新的Standby Redologs組(注意組號不要與當前存在的Online Redologs組重複),併為該組指定一個成員:
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/redo05.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/redo06.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/redo07.log') size 50M;
 
4. 建立備庫的密碼檔案和控制檔案
 
SQL> alter database create standby controlfile as '/u01/control01.ctl';
-- 判斷一個資料庫是Primary還是Standby,就是透過控制檔案來判斷的。
orapwd file=/u01/app/oracle/product/10.2.0/db_1/dbs/orapworcl password=admin
如果已經存在,就不用建立了。預設情況下,win下口令檔案的格式是pwdsid.ora,unix下的格式是orapwSID(大小寫敏感)
 
5. 修改初始化引數檔案
SQL> create pfile='/u01/initorcl.ora' from spfile;
 
 
在initorcl.ora 新增如下內容:
*.DB_UNIQUE_NAME='orcl_pd'
*.log_archive_dest_1='location=/u01/archive'
*.log_archive_dest_2='SERVICE=orcl_st'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.standby_file_management='AUTO'
*.standby_archive_dest='/u01/archive'
*.FAL_SERVER='orcl_st'
*.FAL_CLIENT='orcl_pd'
 
 
如果主庫和備庫的資料檔案位置不同,還需要加如下2個引數:
*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
 
6. 修改tnsnames.ora 和 Listener.ora 檔案
 
[oracle@dg1 admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
 
ORCL_ST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.6.3)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
 
ORCL_PD =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.6.1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
 
 
[oracle@dg1 admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
 
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (GLOBAL_DBNAME = orcl)
    )
  )
 
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dg1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )
 
SID_LIST_LISTENER 配置的是靜態註冊,如果沒有該引數,而且Data Guard 啟動順序又不正確,那麼在主庫可能會報 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 錯誤,導致歸檔無法完成。
 
7.用修改之後的pfile啟動資料庫,並建立spfile.
 
[oracle@dg1 dbs]$ sqlplus /nolog
 
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Nov 5 03:48:19 2010
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora'
ORACLE instance started.
 
Total System Global Area  184549376 bytes
Fixed Size                  1218412 bytes
Variable Size              62916756 bytes
Database Buffers          117440512 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
SQL> create spfile from pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora';
 
File created.
 
 
3.2 備庫配置
 
這裡方便起見,我們和主庫的目錄一致。
 
 
1. 建立目錄
 
[oracle@dg2 u01]$ mkdir -p $ORACLE_BASE/oradata/orcl
[oracle@dg2 u01]$ mkdir -p $ORACLE_BASE/admin/orcl/adump
[oracle@dg2 u01]$ mkdir -p $ORACLE_BASE/admin/orcl/bdump
[oracle@dg2 u01]$ mkdir -p $ORACLE_BASE/admin/orcl/cdump
[oracle@dg2 u01]$ mkdir -p $ORACLE_BASE/admin/orcl/dpdump
[oracle@dg2 u01]$ mkdir -p $ORACLE_BASE/admin/orcl/pfile
[oracle@dg2 u01]$ mkdir -p $ORACLE_BASE/admin/orcl/udump
[oracle@dg2 u01]$ ls
app
[oracle@dg2 u01]$ cd app/
[oracle@dg2 app]$ ls
oracle
[oracle@dg2 app]$ cd oracle/
[oracle@dg2 oracle]$ ls
admin  oradata  oraInventory  product
[oracle@dg2 oracle]$ cd admin/
[oracle@dg2 admin]$ ls
orcl
[oracle@dg2 admin]$ cd orcl/
[oracle@dg2 orcl]$ ls
adump  bdump  cdump  dpdump  pfile  udump
 
2. 修改備庫的tnsnames.ora 和 Listener.ora 檔案
 
[oracle@dg2 admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
 
ORCL_ST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.6.3)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
 
ORCL_PD =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.6.1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
 
 
[oracle@dg2 admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
 
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
 
    (SID_DESC =
      (SID_NAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (GLOBAL_DBNAME = orcl)
    ) 
)
 
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dg2)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )
 
 
3. 將主庫的密碼檔案,控制檔案,資料檔案,引數檔案,日誌檔案copy到備庫。
 
說明一點,這個控制檔案是我們自己建立的standby 控制檔案。將copy過來的控制檔案再複製三份就可以了。  主備的控制檔案是不一樣的。  這裡除了採用直接copy 檔案之外,還可以採用Rman 恢復來做。 直接copy 需要停資料庫,如果採用RMAN 的話,就不需要停機了。
 
[oracle@dg1 dbs]$ ls
hc_orcl.dat  initdw.ora  init.ora  initorcl.ora  lkORCL  orapworcl  spfileorcl.ora
[oracle@dg1 dbs]$ scp initorcl.ora 192.168.6.3://u01/app/oracle/product/10.2.0/db_1/dbs
initorcl.ora                                                      100% 1332     1.3KB/s   00:00   
[oracle@dg1 dbs]$ scp orapworcl 192.168.6.3://u01/app/oracle/product/10.2.0/db_1/dbs
orapworcl                                                         100% 1536     1.5KB/s   00:00   
[oracle@dg1 dbs]$
 
[oracle@dg1 orcl]$ pwd
/u01/app/oracle/oradata/orcl
[oracle@dg1 orcl]$ ls
control01.ctl  redo01.log  redo04.log  redo07.log    temp01.dbf
control02.ctl  redo02.log  redo05.log  sysaux01.dbf  undotbs01.dbf
control03.ctl  redo03.log  redo06.log  system01.dbf  users01.dbf
[oracle@dg1 orcl]$ scp * 192.168.6.3://u01/app/oracle/oradata/orcl
control01.ctl                                                     100% 6896KB   3.4MB/s   00:02   
control02.ctl                                                     100% 6896KB   1.7MB/s   00:04   
control03.ctl                                                     100% 6896KB   3.4MB/s   00:02   
redo01.log                                                        100%   50MB 497.1KB/s   01:43   
redo02.log                                                        100%   50MB 753.0KB/s   01:08   
redo03.log                                                        100%   50MB 453.1KB/s   01:53   
redo04.log                                                        100%   50MB 930.9KB/s   00:55   
redo05.log                                                        100%   50MB 753.0KB/s   01:08   
redo06.log                                                        100%   50MB   1.6MB/s   00:31   
redo07.log                                                        100%   50MB   3.9MB/s   00:13   
sysaux01.dbf                                                      100%  240MB   3.4MB/s   01:11   
system01.dbf                                                      100%  480MB   4.8MB/s   01:40   
temp01.dbf                                                        100%   20MB   5.0MB/s   00:04   
undotbs01.dbf                                                     100%   25MB   6.3MB/s   00:04   
users01.dbf                                                       100% 5128KB   5.0MB/s   00:00   
[oracle@dg1 orcl]$
 
這裡注意一點,我們一起復制過來的控制檔案是主庫的。 我們需要用standby 的控制檔案。 先把複製過來的control file 刪除掉。 在把之前的複製過來,在複製三份。
 
[root@dg2 orcl]# rm *.ctl
rm: remove regular file `control01.ctl'? y
rm: remove regular file `control02.ctl'? y
rm: remove regular file `control03.ctl'? y
 
 
[oracle@dg1 u01]$ scp control01.ctl 192.168.6.3://u01/app/oracle/oradata/orcl
control01.ctl                                                     100% 6896KB   6.7MB/s   00:01   
[oracle@dg1 u01]$
 
[root@dg2 orcl]# cp control01.ctl control02.ctl
[root@dg2 orcl]# cp control01.ctl control03.ctl
[root@dg2 orcl]# ls
control01.ctl  redo01.log  redo04.log  redo07.log    temp01.dbf
control02.ctl  redo02.log  redo05.log  sysaux01.dbf  undotbs01.dbf
control03.ctl  redo03.log  redo06.log  system01.dbf  users01.dbf
[root@dg2 orcl]#
 
 
4. 修改pfile 引數,並用pfile啟動資料庫,在建立spfile
 
在pfile裡面新增如下內容:
*.DB_UNIQUE_NAME='orcl_st'
*.log_archive_dest_1='location=/u01/archive'
*.log_archive_dest_2='SERVICE=orcl_pd'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=DEFER
*.standby_file_management='AUTO'
*.standby_archive_dest='/u01/archive'
*.FAL_SERVER='orcl_pd'
*.FAL_CLIENT='orcl_st'
 
 
5. 啟動備庫至 mount 狀態
 
SQL> startup mount pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora'
ORACLE instance started.
SQL> create spfile from pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora';
 
 
至此,Data Guard 的操作已經完成,下面來開始驗證。
 
 
 
3.3 驗證備庫
 
注意Data Guard 啟動順序:
 
啟動順序:先standby ,後primary;
關閉順序:先primary 後standby;
 
在備庫將例項啟動到mount 狀態:
SQL> startup nomount;
SQL>alter database mount standby database ;
---SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL>alter database recover managed standby database disconnect from session;
 
在備庫啟動監聽:
$lsnrctl start
 
 
在主庫啟動例項:
SQL> startup;
 
在主庫啟動監聽:
$lsnrctl start
 
 
在主庫驗證歸檔目錄是否有效:
SQL> SELECT STATUS,DESTINATION, ERROR FROM V$ARCHIVE_DEST;
 
如果有錯誤,要排查原因。
 
 
主庫:
SQL> alter system switch logfile;
SQL> select max(sequence#) from v$archived_log;
 
MAX(SEQUENCE#)
--------------
            12
 
備庫:
SQL> startup nomount
ORACLE instance started.
 
Total System Global Area  184549376 bytes
Fixed Size                  1218412 bytes
Variable Size              62916756 bytes
Database Buffers          117440512 bytes
Redo Buffers                2973696 bytes
SQL> alter database mount standby database;
 
Database altered.
 
SQL> alter database recover managed standby database disconnect from session;
 
Database altered.
 
SQL> select sequence#,applied from v$archived_log;
 
 SEQUENCE# APP
---------- ---
         8 YES
         9 YES
        10 YES
        11 YES
 
SQL> /
 
 SEQUENCE# APP
---------- ---
         8 YES
         9 YES
        10 YES
        11 YES
        12 YES
 
SQL>
 
 
主備查詢結果一致,Data Guard 搭建結束。
 
 
注意:如果在主庫執行 alter database clear unarchived logfile或alter database open resetlogs , 則dataguard要重建。
 

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

相關文章