熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Linux9i下Dataguard配置

2022-06-13   來源: Oracle 

  環境
      os:  linux
   oracle:  oraclei
primary:
standby: (主副主機都是兩台普通的pc主機)

第一部分  oraclei 在linux上的安裝

 本來我不想寫這方面的東東但是對比oracli在solaris 下和在linux下安裝oraclei 在linux上的安裝真的是要麻煩很多下面我把我遇到的問題(好像也是大部分oracle初學者安裝時遇到的問題)簡要的說一下oraclei 在linux上的安裝也折騰了我好幾個月

)運行runinstaller的時候報錯
bashb$ /runInstaller
bashb$ Initializing Java Virtual Machine from /tmp/OraInstall_PM/jre/bin/java Please wait
/tmp/OraInstall_PM/jre/bin/i/native_threads/java: error while loading shared libraries: libstdc++libcso: cannot open shared object file: No such file or directory
Oracle Net configuration Assistant
Oracle Database configuration Assistant
Agent configuration Assistant
三個工具的details錯誤信息都是
/home/oracle/jre//bin/lib/i/native_threads/libzipso :symbol errnoversion GLIBC_ not definded in file libcso with link time reference(libzipso)
unable to initialize threads: cannot find class java/lang/Thread
Could not create java VM
解決方法
在運行runInstaller之前做下面的步驟
export LD_ASSUME_KERNEL=
ignore your kernal version
下載文件libcwaitc ftp:///drepper/libcwaitc  (通過IE無法下載的話就用命令行)用gcc shared o libcwaitso fpic O libcwaitc進行編譯然後export LD_PRELOAD=/$path/libcwaitso
上面的方法能使Oracle Net configuration Assistant  Oracle Database configuration Assistant 安裝成功

修復Agent configuration Assistant不能配置成功的方法請參考chinaunix上的
在RHAS上成功安裝Oracle作者:renxiao

運行runInstaller之後出現安裝組件的選擇結果這時點Install開始安裝復制文件進度條在一點一點的增加當安裝並link完後出現配置工具界面agent服務不能配置成功忽略不用管在下面修復DBCANETCAHTTP都正確配置完畢哦呵呵下面開始修復錯誤其實要是把各個界面抓取下來就更好了

安裝p__LINUXzip補丁

此補丁也是從下下載同時要下載一個opatch軟件包p__GENERICzip它主要是用來悠agent服務不能啟動的錯誤
過程如下[quote:fa]su oracle
$ cp p__GENERICzip /tmp
$ cd /tmp
$ unzip p__GENERICzip
$ export PATH=$PATH:/tmp/OPatch
$ export PATH=$PATH:/sbin        # the patch needs fuser which is located in /sbin
$ unzip p__LINUXzip
$ cd
$ opatch apply
[/quote:fa]補丁修復完成需要relinked一個mk文件
$ cd $ORACLE_HOME/network/lib
$ make f ins_oemagentmk install
現在在運行agentctl start看是不是可以成功運行agent服務了啊可以用stopstatus來停止此服務或者檢查服務的狀態
在這個成功之後居然不能啟動Oracle說是不能找到初始化文件沒辦法我用dbca先刪除了原來安裝時建立的庫再重新建立了數據庫

運行dbca來創建數據庫呵呵一路暢通完成數據庫的安裝
希望你也能成功安裝

運行runInstaller後安裝界面出來出現亂碼
export LANG=en_us 再運行runInstaller (這是最簡單實用的辦法)


報/etc/oratab 錯誤
如果在機器上以前安裝過再一次安裝的時候如果報/etc/oratab 錯誤請將/etc/oratab 清空(刪除也可)
cp /dev/null  /etc/oratab
()然後開始建庫當建庫到%時會出現共享內存問題
        ORA: unable to attach to shared memory segment
      這時需要給內核指定內存可以
        echo >/proc/sys/kernel/shmmax
      或者
        編輯/etc/nf
        kernelshmmax=
      這樣就可以數據庫的安裝
運行 要啟動oracle要先運行數據庫監聽程序lsnrctl  start   關閉lsnrctl stop
   運行oemapp console可以打開oracle企業管理器工具

 還有一些錯誤可能需要修改/etc/hosts/etc/nf請大家在google上搜一下按照網友提示的方法進行修改

 另外主副主機的目錄設置成一樣都將oracle用戶主目錄設為/home/oracle主副主機的數據庫名字都設為oracle實例名也都設為一樣都設為oracle(申明一點是否必須將主副主機的數據庫名字實例名都設為相同我曾在cu上發過貼子問過好像大家都說不需要但我們這的dba說是必須反正我在這裡設的是相同

第二步Dataguard配置
首先將主副兩主機都設為歸檔模式
        主節點備份並生成備用數據庫控制文件
登陸主節點進行數據庫備份並生成備用數據庫控制文件

    [oracle@primary]$ sqlplus / as sysdba
SQL> startup
SQL> shutdown immediate
SQL> exit

[oracle@primary]pwd
/home/oracle
[oracle@primary]$ ls
admin  dictionaryora  jre  oradata  oraInventory  oui  product  soft
[oracle@primary]tar cvf oradatatar oradata
[oracle@primary]$ ls l *tar
rwrr    oracle   dba       Aug : oradatatar
[oracle@primary]$ sqlplus / as sysdba
SQL> startup
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled  
Archive destination            /home/oracle/oradata/primary/archive
Oldest online log sequence     
Next log sequence to archive   
Current log sequence           
SQL> alter database create standby controlfile as /home/oracle/standbyctl;
Database altered
SQL> exit
[oracle@primary]

   登陸備用節點(standby)ftp獲得primary主機的數據庫文件(即oradatatar文件)備用控制文件(/home/oracle/standbyctl) 口令文件( $ORACLE_HOME/dbs/下的orapworacle)傳到standby裡的相應位置

具體步驟

    在standby的/home/oracle/oradata下原來有一個oracle的文件夾(裡面是該主機下的dbfredolog文件)再新建一個primary文件夾將primary主機的oradatatar解開的文件全部直接(即primary不要再有文件夾)放到primary下將剛生成的備用控制文件(/home/oracle/standbyctl)也放到primary下

  在standby的ORACLE_HOME/dbs/下先將以前的orapworacle備份一下(改個名字即可)再將primary的$ORACLE_HOME/dbs/下的orapworacle 文件ftp放到standby的ORACLE_HOME/dbs/下
說明一下我在查閱eygle的大作及很多人的相關文章都沒有提到這一點但如果沒做這一步的話再後面的啟動備用數據庫的時候即在
[oracle@eygle primary]$ sqlplus / as sysdba
SQL> startup nomount;
SQL> alter database mount standby database;
SQL> alter database recover managed standby database disconnect from session;
這一步時就會報ORA 錯誤說是Invalid passwd file詢問我們的dba說是必須要用primary的orapworacle來替換standby的 我試過這樣做了後就OK了
所以我這在這裡就把primary的orapworacle來替換standby的orapworacl也當作一步必須步驟但我真的不能肯定這一步是否是必須的如果不是必須的為何我做這一步總會報錯如果是必須的為何eygle和其他大牛的大作裡都沒有提到這一步難道是因為這個太簡單嗎?? 我真的是有些疑惑如果哪位大牛看到這請給我一個肯定的回答我不勝感激

在standby主機的$oracle/home/admin下原來有oracle目錄現在新建
primary目錄再在primary目錄下新建bdumpcdumpudump
Primary的參數文件

    oracle@primary_andy $cat  bash_profile
# bash_profile

# Get the aliases and functions
#if [ f ~/bashrc ]; then
#       ~/bashrc
#fi

# User specific environment and startup programs
#export BASH_ENV=$HOME/bashrc

PATH=$PATH:/home/oracle/product//bin:$oracle_home/jre/bin:/opt/SUNWspro/
bin:/usr/bin:/usr/ccs/bin:/usr/ucb:/etc:/usr/local/bin:/usr/bin/saved:
export PATH
unset USERNAME
ORACLE_OWNER=oracle
ORACLE_BASE=/home/oracle
export ORACLE_BASE
ORACLE_HOME=/home/oracle/product/
export ORACLE_HOME
LANG=
LC_ALL=
ORACLE_SID=oracle
export ORACLE_SID

TNS_ADMIN=/home; export TNS_ADMIN
NLS_LANG=american_americaZHSGBK; export NLS_LANG
#ORA_NLS=$Oracle_HOME/ocommon/nls/admin/data; export ORA_NLS
CLASSPATH=$Oracle_HOME/JRE:$Oracle_HOME/jlib:$Oracle_HOME/rdbms/jlib:/opt/jsdk_nb/jsdk/bin
export CLASSPATH
TMPDIR=/tmp;export TMPDIR
umask
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/lib/tls:/lib/i:/usr/openwin/lib:/usr/dt/lib
export LD_LIBRARY_PATH
export LD_PRELOAD=/home/oracle/libcwaitso;
export LD_ASSUME_KERNEL=;
DISPLAY=:;export DISPLAY;
export PS=\u@\H $

#cat initoracleora_primary
*aq_tm_processes=
*background_dump_dest=/home/oracle/admin/oracle/bdump
patible=
ntrol_files=/home/oracle/oradata/oracle/controlctl/home/oracle/oradata/oracle/c
ontrolctl/home/oracle/oradata/oracle/controlctl
re_dump_dest=/home/oracle/admin/oracle/cdump
*db_block_size=
*db_cache_size=
*db_domain=
*db_file_multiblock_read_count=
*db_name=oracle
*dispatchers=(PROTOCOL=TCP) (SERVICE=oracleXDB)
*fast_start_mttr_target=
*hash_join_enabled=TRUE
*instance_name=oracle
*java_pool_size=
*job_queue_processes=
*large_pool_size=
*log_archive_dest_=LOCATION=/home/oracle/oradata/archivelog/
*log_archive_dest_=service=standby mandatory reopen=
*log_archive_dest_state_=ENABLE
*log_archive_format=log_%t_%sarc
*log_archive_start=TRUE
*open_cursors=
*pga_aggregate_target=
*processes=
*query_rewrite_enabled=FALSE
*remote_login_passwordfile=EXCLUSIVE
*shared_pool_size=
*sort_area_size=
*star_transformation_enabled=FALSE
*timed_statistics=TRUE
*undo_management=AUTO
*undo_retention=
*undo_tablespace=UNDOTBS
*user_dump_dest=/home/oracle/admin/oracle/udump

  修改standby主機的initoracleora文件(先備份)我的initoracleora如下供參考


    *aq_tm_processes=
*background_dump_dest=/home/oracle/admin/primary/bdump
patible=
ntrol_files=/home/oracle/oradata/primary/standbyctl
re_dump_dest=/home/oracle/admin/primary/cdump
*db_block_size=
*db_cache_size=
*db_domain=
*db_file_multiblock_read_count=
*db_name=oracle
*dispatchers=(PROTOCOL=TCP) (SERVICE=oracleXDB)
*fast_start_mttr_target=
*hash_join_enabled=TRUE
*instance_name=oracle
*java_pool_size=
*job_queue_processes=
*large_pool_size=
*open_cursors=
*pga_aggregate_target=
*processes=
*query_rewrite_enabled=FALSE
*remote_login_passwordfile=EXCLUSIVE
*shared_pool_size=
*sort_area_size=
*star_transformation_enabled=FALSE
*timed_statistics=TRUE
*undo_management=AUTO
*undo_retention=
*undo_tablespace=UNDOTBS
*user_dump_dest=/home/oracle/admin/primary/udump
*log_archive_format=log_%t_%sarc
*log_archive_start=TRUE
*STANDBY_FILE_MANAGEMENT=AUTO
*log_archive_dest_=LOCATION=/home/oracle/oradata/archivelog/
*log_archive_dest_state_ = ENABLE
*fal_server=primary
*fal_client=standby
*DB_FILE_NAME_CONVERT=(/home/oracle/oradata/oracle/home/oracle/oradata/primary)              (主輔數據庫數據文件相互轉換的目錄)
*STANDBY_FILE_MANAGEMENT=AUTO  即可實現重命名主庫的數據文件!!
*LOG_FILE_NAME_CONVERT=(/home/oracle/oradata/archivelog/home/oracle/oradata/archivelog)   (主輔數據庫聯機日志redolog相互轉換的目錄)
*STANDBY_ARCHIVE_DEST=/home/oracle/oradata/archivelog                  
                     (從主數據庫產生的archivelog傳到輔數據庫的目錄)

    配置主節點(primary主機上)的tnsnamesora文件

      primary=(description=
(address=
(protocol=tcp)
(port=)
(host=))
(connect_data=
(SID=oracle)))
standby=(description=
(address=
(protocol=tcp)
(port=)
(host=))
(connect_data=
(SID=oracle)))

  同樣在副節點(standby) 的tnsnamesora文件

在副節點(standby)上配置listenerora文件 添加監聽服務standby_listener在相應的節裡添加有關的內容

    SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
        (SID_NAME = oracle)
        (GLOBAL_DBNAME = oracle)
      (ORACLE_HOME = /home/oracle/oradata)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
     (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = ))
    )
  )

  在主副庫上啟動lsnrctl
  bashb$ lsnrctl
LSNRCTL>start      # 啟動監聽服務

  在主備節點用tnsping測試網絡連通性

在primary機上
bashb$  tnsping  primary
bashb$  tnsping  standby

在standby機上
bashb$  tnsping  primary
bashb$  tnsping  standby
啟動副數據庫


       sql> startup nomount;
   SQL> alter database mount standby database;
Database altered
SQL> alter database recover managed standby database disconnect from session;
Database altered

在主節點設置歸檔路徑
SQL> alter system set log_archive_dest_=service=standby mandatory reopen=;
System altered
定義了主庫向副庫傳輸日志
# 定義歸檔到備用庫強制歸檔重試時間
# 如果定義為可選狀態(optional)那麼在歸檔失敗後不會再次嘗試歸檔的定義
# 為madatory狀態後如果本次歸檔失敗則在歸檔下一個日志時會再次嘗試
SQL> alter system switch logfile;
System altered
SQL> /
System altered
SQL>
在備用節點觀察日志
[oracle@eygle bdump]$ tail f alert_primarylog
MRP: Background Managed Standby Recovery process started
Starting datafile recovery in thread sequence
Datafile : /opt/oracle/oradata/primary/systemdbf
Starting datafile recovery in thread sequence
Datafile : /opt/oracle/oradata/primary/undotbsdbf
…………………………
bashb$ mkdir /home/oracle/oradata/oracle/stdarch

  主輔數據庫的切換(停止主數據庫啟用備用數據庫)
修改primary的參數文件initoracleora(先做好備份)

    增加
*standby_archive_dest=/home/oracle/oradata/standbyarch
*fal_server=standby
*fal_client=primary
*DB_FILE_NAME_CONVERT=(/home/oracle/oradata/primary/home/oracle/oradata/oracle)
*LOG_FILE_NAME_CONVERT=(/home/oracle/oradata/archivelog/home/oracle/oradata/archivelog)
*STANDBY_FILE_MANAGEMENT=AUTO
刪除  log_archive_dest_參數

修改standby的參數文件initoracleora(先做好備份)
增加
*log_archive_dest_=service=primary mandatory reopen=
*log_archive_dest_state_=ENABLE
刪除
*STANDBY_ARCHIVE_DEST=/home/oracle/oradata/archivelog
*fal_server=standby
*fal_client=primary
*DB_FILE_NAME_CONVERT=(/home/oracle/oradata/primary/home/oracle/oradata/oracle)
*LOG_FILE_NAME_CONVERT=(/home/oracle/oradata/archivelog/home/oracle/oradata/archivelog)
*STANDBY_FILE_MANAGEMENT=AUTO

在primary主機上執行
SQL> alter database commit to switchover to physical standby with session shutdown ;
Database altered
察看primary主機上的後台日志
……………………………

SQL> shutdown immediate
ORA: database not mounted
ORACLE instance shut down
以備用模式(standby)啟用主數據
SQL> create spfile from pfile;
SQL> startup nomount;
SQL>show parameter standby_file_management;
SQL> alter database mount standby database;
Database altered

打開備用數據庫(在standby主機上執行)
[oracle@standby oracle]$ sqlplus / as sysdba
            
SQL> alter database commit to switchover to primary with session shutdown ;
Database altered
SQL> shutdown immediate;
     ORA: database not mounted
ORACLE instance shut down
SQL>create spfile from pfile;
SQL> startup;
        ……
Database mounted
Database opened
SQL> select SEQUENCE#GROUP#STATUS from v$log;
SQL> select sequence#group#status from v$log;

SEQUENCE#     GROUP# STATUS

                  INACTIVE
                  INACTIVE
                  CURRENT

SQL> alter system switch logfile;

System altered

SQL> select sequence#group#status from v$log;

SEQUENCE#     GROUP# STATUS

                  CURRENT
                  INACTIVE
                  ACTIVE

在primary主機上執行
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Database altered

在primary主機上觀察日志應用情況
[oracle@primary bdump]$ tail f alert_oraclelog
Starting datafile recovery in thread sequence
Datafile : /opt/oracle/oradata/primary/undotbsdbf
Starting datafile recovery in thread sequence
Datafile : /opt/oracle/oradata/primary/usersdbf
………………………………………………
Media recover

  現在可做一個測試在standby主機上進行數據修改(standby主機現在做primary)


    SQL> create table t as select * from dba_users;
Table created
SQL> alter system switch logfile;       
System altered

在從庫上(primary主機上)以read only打開數據庫執行查詢
SQL> select username from t;
select username from t
*
ERROR at line :
ORA: database not open: queries allowed on fixed tables/views only
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered
SQL> ALTER DATABASE OPEN READ ONLY;
Database altered
SQL> select username from t;
USERNAME

SYS
SYSTEM
DBSNMP
OUTLN
WMSYS
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Database altered

  常見問題

至此主副的配置已基本完成可做以下實驗來驗證配置的准確性
.        在主庫上新建一個表看修改時候能馬上傳到副庫上
.        在主庫上新建一個表空間新增加一個datafile看修改時候能馬上傳到副庫上(應該是只要在副庫上執行恢復模式就能在副庫上看到新建的表空間
.        在主庫上新建一個臨時表空間rename datafile 均不能應用到副庫上
.        應當實時察看standby庫的alert文件就能清晰明了地知道主副更新的情況
.        關於啟動關閉順序
啟動的時候先從庫的listener再啟動從庫再啟動主庫的listener再主庫
關閉的時候先關閉主庫再啟動從庫
i副數據庫切換為主的話將無法再切為副主數據庫也是! 也就是說只能完成一次切換這叫failover!i可實現主副數據庫任意切換這叫switchover

第六點我理解得有些問題看了版主Rollingpig在itpub上的結論覺得他說的應該是對的現將他的陳述列在下面!
Rollingpig
我給個結論吧i 的dataguad環境中
Switch Over 必須是Primary 正常並且是必須Primary 主動先Switch 成 standby 然後standby 才能switch 成primary
如果需要作成primary出問題standby 能接管的話必須作 failover 而不是Switch Over


察看主機當前的運行狀態
SQL> select nameopen_modePROTECTION_MODEDATABASE_ROLE from v$database;
NAME      OPEN_MODE  PROTECTION_MODE      DATABASE_ROLE

PRIMARY   MOUNTED    MAXIMUM PERFORMANCE  PHYSICAL STANDBY
查看主數據庫日志是否全部傳送到副數據庫可查看v$archive_gap更簡單的方法是查看各自主機的日志歸檔目錄的日志序號即可

. 常用的一些方法
可在副數據庫上運行一些腳本確保主數據庫上的更新能及時在副數據庫上得到實現可將以下腳本放在crontab表中

    oracle@standby $cat refresh (刷新腳本)
ORACLE_SID=oracle
ORACLE_HOME=/home/oracle/product/
export ORACLE_SID ORACLE_HOME
DATE=`date +%Y%m%d`
touch /home/oracle/refresh_$DATElog
$ORACLE_HOME/bin/sqlplus /nolog << EOF
spool /home/oracle/refresh_$DATElog
connect sys/abc as sysdba
shutdown immediate;
quit
EOF
$ORACLE_HOME/bin/sqlplus /nolog << EOF
spool /home/oracle/refresh__$DATElog
connect sys/abc  as sysdba
startup nomount pfile=$ORACLE_HOME/dbs/initoracleora;
alter database mount standby database;
alter database set standby database to maximize performance;
alter database recover managed standby database disconnect from session;
spool off
EOF
oracle@standby $cat readonly (更新腳本)
#!/bin/sh
ORACLE_SID=oracle
ORACLE_HOME=/home/oracle/product/
export ORACLE_SID ORACLE_HOME
$ORACLE_HOME/bin/sqlplus /nolog << EOF
spool /home/oracle/refreshreadlog
connect sys/abc as sysdba
rem change from recover mode to readonly
alter database recover managed standby database cancel;
alter database open read only ;
spool off
EOF

  switchover過程

把數據庫切換回到主節點
先將standby此時的initoracleora恢復為以前是standby時的參數
在主節點(standby主機上)


    SQL> alter database commit to switchover to physical standby;
Database altered
SQL> shutdown immediate
ORA: database not mounted
statORACLE instance shut down
SQL> startup nomount  pfile=/home/oracle/product//dbs/initoracleora;
;
ORACLE instance started
Total System Global Area   bytes
Fixed Size                   bytes
Variable Size             bytes
Database Buffers            bytes
Redo Buffers                  bytes
SQL> alter database mount standby database;
Database altered
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Database altered

  在備用節點(在primary主機上)
先將primary此時的initoracleora恢復為以前是primary時的參數

    SQL> alter database commit to switchover to primary;
Database altered
SQL> shutdown immediate;
ORA: database not mounted
ORACLE instance shut down
SQL> startup  pfile=/home/oracle/product//dbs/initoracleora;
ORACLE instance started
Total System Global Area   bytes
Fixed Size                   bytes
Variable Size             bytes
Database Buffers            bytes
Redo Buffers                  bytes
Database mounted
Database opened 
             
衷心致謝: CU oracle斑竹 sshd 我在配置dataguard時得到他的很多幫助!!
參考文獻
Dataguard配置Step by step (eygle大作)


From:http://tw.wingwit.com/Article/program/Oracle/201311/17817.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.