版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Oracle11g利用rman創(chuàng)建物理standby實驗配置指南內(nèi)部公開TIME\@"yyyy年M月d日星期W"2010年7月29日星期四內(nèi)部資料,請勿擴(kuò)散第頁資料編碼QJSHKJB002產(chǎn)品名稱Oracle11gR1dataguard使用對象所有使用ORACLE數(shù)據(jù)庫軟件的部門產(chǎn)品版本Oracle11g利用rman創(chuàng)建物理standby實驗配置指南(VMserver+centOS4.7+Single-instance)擬制:XXX日期:2010-07-29修訂記錄日期修訂版本作者描述20100/07/29V1.00821初始發(fā)行注意:些例僅為測試,生產(chǎn)環(huán)境中請根據(jù)實際情況利用不同配置目錄第1章實驗環(huán)境 4第2章復(fù)制前準(zhǔn)備工作 52.1調(diào)整主數(shù)據(jù)庫 52.1.1強(qiáng)制記錄所有的交易 52.1.2創(chuàng)建備用重做日志組 52.1.3文件存放路徑轉(zhuǎn)換 62.1.4修改主站點初始化參數(shù) 62.1.5網(wǎng)絡(luò)配置修改 92.2準(zhǔn)備復(fù)制:準(zhǔn)備備用站點 112.2.1創(chuàng)建必要的目錄 112.2.2設(shè)置密碼文件 112.2.3創(chuàng)建備用初始化參數(shù)文件 11第3章通過DUPLICATEDATABASE復(fù)制備用數(shù)據(jù)庫 13第4章復(fù)制之后:清除、校驗和轉(zhuǎn)換 194.1物理standby的Switchover 214.1.1檢查是否支持switchover操作--primary數(shù)據(jù)庫操作 214.1.2啟動switchover--primary數(shù)據(jù)庫操作 214.1.3重啟動到mount--原primary數(shù)據(jù)庫操作 224.1.4檢查是否支持switchover操作--待轉(zhuǎn)換standby數(shù)據(jù)庫操作 224.1.5轉(zhuǎn)換角色到primary--待轉(zhuǎn)換standby數(shù)據(jù)庫操作 224.1.6完成轉(zhuǎn)換,打開新的primary數(shù)據(jù)庫 244.1.7驗證新的primary數(shù)據(jù)庫 254.2物理standby的failover 264.2.1檢查歸檔文件是否連續(xù) 264.2.2檢查歸檔文件是否完整 274.2.3啟動failover 274.2.4切換物理standby角色為primary 274.2.5啟動新的primary數(shù)據(jù)庫。 27第5章監(jiān)控primary/standby數(shù)據(jù)庫 285.1dataguard監(jiān)控配置的方式 285.2調(diào)整物理standbylog應(yīng)用頻率 34第6章數(shù)據(jù)保護(hù)模式簡述 35實驗環(huán)境筆者的硬件基本情況是:VMWareServer1.0.10、CentOS4.7(2.6.9-78.EL)1CPU、2G通過不斷的實驗和總結(jié)我們終于完成了oracle11g物理standby的安裝配置,在本文中VMWare虛擬機(jī)安裝配置cetnOS安裝配置oracle11g軟件安裝配置等不作為本文說明重點,我們將集中精力說明通過復(fù)制特性創(chuàng)建備用數(shù)據(jù)庫過程。oracle11g全面改良了物理standby,最突出的特點就是在readonly打開模式下,可以邊接收邊應(yīng)用(主要是進(jìn)行select操作)。在oracle11g中創(chuàng)建一個備用數(shù)據(jù)庫變得非常方便,我們可以使用恢復(fù)管理器(RMAN),oracle11G支持直接從主數(shù)據(jù)庫使用DUPLICATEDATABASE命令集通過網(wǎng)絡(luò)復(fù)制一個備用數(shù)據(jù)庫,只要目標(biāo)數(shù)據(jù)庫是活動的即可。這意味著再也不用先生→成再傳輸→最后在備用數(shù)據(jù)庫上通過復(fù)雜的手工方式還原和恢復(fù)主數(shù)據(jù)庫的RMAN備份集了,RMAN在主站點內(nèi)存中自動生成一個轉(zhuǎn)換腳本在,然后在備用站點上使用此腳本管理復(fù)制操作,實際上不用DBA進(jìn)行任何干預(yù)。在主、備站點的/etc/hosts文件中添加合適的條目#thatrequirenetworkfunctionalitywillfail.localhost.localdomainlocalhost91node490node3讓主站點(node3)和備用站點(node4)之間建立起網(wǎng)絡(luò)連接,然后在每個節(jié)點上都安裝Oracle11g數(shù)據(jù)庫,最后,在主站點(node3)上創(chuàng)建好標(biāo)準(zhǔn)的11gR1種子數(shù)據(jù)庫,包括標(biāo)準(zhǔn)的示例方案。此數(shù)據(jù)庫的ORACLE_SID是primary,接下來就可以開始執(zhí)行實況復(fù)制操作了。復(fù)制前準(zhǔn)備工作調(diào)整主數(shù)據(jù)庫在復(fù)制主數(shù)據(jù)庫到對應(yīng)的備用環(huán)境中之前,我需要對主數(shù)據(jù)庫做一些調(diào)整,下面的步驟未做特別說明沒有先后順序,只要在發(fā)出DUPLICATEDATABASE命令前這些步驟都執(zhí)行完了即可,在復(fù)制操作過程中應(yīng)該沒有什么讓人意外的事件出現(xiàn)。強(qiáng)制記錄所有的交易大多數(shù)組織實施數(shù)據(jù)衛(wèi)士配置的主要原因是保證所有交易都不丟失,但遺憾的是,默認(rèn)情況下,Oracle數(shù)據(jù)庫是運(yùn)行在NOFORCELOGGING模式下的,這意味著對對象的改變可能丟失,因為他們的存儲屬性被設(shè)為NOLOGGING,為了確保所有的改變都被記錄下來,我們必須執(zhí)行ALTERDATABASEFORCELOGGING命令,此命令需要在ALTERDATABASEARCHIVELOG命令將數(shù)據(jù)庫配置為ARCHIVELOG模式前執(zhí)行將主數(shù)據(jù)庫切換到ARCHIVELOG模式--為歸檔日志文件設(shè)置一個合適的格式(格式有該參數(shù):log_archive_format控制)
ALTERSYSTEMSETlog_archive_format='log_%s_%t_%r.arc'SCOPE=SPFILE;
--設(shè)置新的DB_UNIQUE_NAME(標(biāo)識數(shù)據(jù)庫的唯一名字)參數(shù),它不能動態(tài)修改
ALTERSYSTEMSETdb_unique_name='lijl'SCOPE=SPFILE;
SHUTDOWNIMMEDIATE;
STARTUPMOUNT;
ALTERDATABASEFORCELOGGING;
ALTERDATABASEARCHIVELOG;
ALTERDATABASEOPEN;創(chuàng)建備用重做日志組自O(shè)racle9iR2開始支持備用重做日志(standbyredolog即SRL)組開始,Oracle就建議配置它,SRL對于實時應(yīng)用(RealTimeApply)特性是需要的,或DBA想要實現(xiàn)重做日志串聯(lián)目的時也需要,除此之外,它依然是備用數(shù)據(jù)庫配置選項。Oracle11g另一個優(yōu)點是如果SRL在主數(shù)據(jù)庫上已經(jīng)配置好,那么DUPLICATEDATABASE命令將會在備用數(shù)據(jù)庫上自動創(chuàng)建它們。下述過程顯示了在主數(shù)據(jù)庫上創(chuàng)建SRL,注意我們使用了多個重SRL文件保護(hù)整個SRL組,避免數(shù)據(jù)丟失,這一點和在線重做日志組類似。在主數(shù)據(jù)庫上創(chuàng)建備用重做日志文件ALTERDATABASEADDSTANDBYLOGFILE'/oracle/app/oradata/lijl/srl01.log'SIZE50MREUSE;ALTERDATABASEADDSTANDBYLOGFILE'/oracle/app/oradata/lijl/srl02.log'SIZE50MREUSE;ALTERDATABASEADDSTANDBYLOGFILE'/oracle/app/oradata/lijl/srl03.log'SIZE50MREUSE;文件存放路徑轉(zhuǎn)換一般情況下,備用數(shù)據(jù)庫都是創(chuàng)建在與主數(shù)據(jù)庫不同的主機(jī)上的,否則,在災(zāi)難中主備數(shù)據(jù)庫都有可能受到危害,最佳做法是將對應(yīng)的備用數(shù)據(jù)庫的目錄和文件名都配成一樣,但如果遇到掛載點(unix系統(tǒng)和windons系統(tǒng)不同,可以將目錄加載到不同的掛載點上)不一樣時,目錄名需要修改。此種轉(zhuǎn)換通過DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT初始化參數(shù)進(jìn)行控制。修改主站點初始化參數(shù)在主數(shù)據(jù)庫上設(shè)置下列初始化參數(shù)確保DUPLICATEDATABASE命令能夠同樣配置備用數(shù)據(jù)庫,下述過程詳細(xì)列出了這些初始化參數(shù)含義及相應(yīng)設(shè)置:在主數(shù)據(jù)庫上設(shè)置合適的初始化參數(shù)值*.audit_trail='db'*.compatible='.0*.control_files='/oracle/app/oradata/lijl/control01.ctl','/oracle/app/oradata/lijl/control02.ctl','/oracle/app/oradata/lijl/control03.ctl'*.db_block_size=8192*.db_domain=''*.db_name='lijl'*.db_recovery_file_dest='/oracle/app/flash_recovery_area'*.db_recovery_file_dest_size=2147483648*.diagnostic_dest='/oracle/app'*.dispatchers='(PROTOCOL=TCP)(SERVICE=primaryXDB)'*.log_archive_dest_1='LOCATION=/oracle/app/archive'*.log_archive_format='%t_%s_%r.arc'*.log_archive_dest='/oracle/app/archive'*.memory_target=314572800*.nls_language='SIMPLIFIEDCHINESE'*.nls_territory='CHINA'*.open_cursors=300*.processes=150*.remote_login_passwordfile='EXCLUSIVE'*.undo_tablespace='UNDOTBS1'下面的參數(shù)是配置dataguard過程中添加的*.db_unique_name='primary'*.archive_lag_target=1800*.fal_client='standby'*.fal_server='primary'*.log_archive_config='dg_config=(primary,standby)'*.log_archive_dest_1='LOCATION=/oracle/app/archive/DB_UNIQUE_NAME=primaryVALID_FOR=(ALL_LOGFILES,ALL_ROLES)'*.log_archive_dest_2='SERVICE=standbyASYNCDB_UNIQUE_NAME=standbyVALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)'*.log_archive_dest_state_1='ENABLE'*.log_archive_dest_state_2='ENABLE'*.log_archive_format='log_%s_%t_%r.arc'*.db_file_name_convert='/oracle/app/oradata/lijl/','/oracle/app/oradata/lijl/'*.log_file_name_convert='/oracle/app/oradata/lijl/','/oracle/app/oradata/lijl/'*.standby_file_management='AUTO'下列參數(shù)為primary角色相關(guān)的初始化參數(shù):DB_NAME注意保持同一個DataGuard中所有數(shù)據(jù)庫DB_NAME相同。例如:DB_NAME=lijlDB_UNIQUE_NAME為每一個數(shù)據(jù)庫指定一個唯一的名稱,該參數(shù)一經(jīng)指定不會再發(fā)生變化,除非你主動修改它。例如:DB_UNIQUE_NAME=primaryLOG_ARCHIVE_CONFIG該參數(shù)通過DG_CONFIG屬性羅列同一個DataGuard中所有DB_UNIQUE_NAME(含primarydb及standbydb),以逗號分隔例如:LOG_ARCHIVE_CONFIG='DB_CONFIG=(primary,stdby)'CONTROL_FILES沒啥說的,控制文件所在路徑。LOG_ARCHIVE_DEST_n歸檔文件的生成路徑。該參數(shù)非常重要,并且屬性和子參數(shù)也特別多(這里不一一列舉,建議直接查詢oracle11g官方文檔。Dataguard白皮書中介紹了該參數(shù)各屬性及子參數(shù)的功能和設(shè)置)。例如:LOG_ARCHIVE_DEST_1='LOCATION=/oracle/app/archive/VALID_FOR=(ALL_LOGFILES,ALL_ROLES)DB_UNIQUE_NAME=jssweb'LOG_ARCHIVE_DEST_STATE_n指定參數(shù)值為ENABLE,允許redo傳輸服務(wù)傳輸redo數(shù)據(jù)到指定的路徑。該參數(shù)共擁有4個屬性值,功能各不相同。REMOTE_LOGIN_PASSWORDFILE推薦設(shè)置參數(shù)值為EXCLUSIVE或者SHARED,注意保證相同DataGuard配置中所有db服務(wù)器sys密碼相同。LOG_ARCHIVE_FORMAT指定歸檔文件格式。LOG_ARCHIVE_MAX_PRODUC指定歸檔進(jìn)程的數(shù)量(1-30),默認(rèn)值通常是4。注意:上面列舉的這些參數(shù)僅只是對于primary/standby兩角色可能會相關(guān)的參數(shù),還有一些基礎(chǔ)性參數(shù)比如*_dest,*_size等數(shù)據(jù)庫相關(guān)的參數(shù)在具體配置時也需要根據(jù)實際情況做出適當(dāng)修改。STANDBY_FILE_MANAGMENT有兩個值auto和manual如果設(shè)置為manual的話,對于表空間和數(shù)據(jù)文件的操作必須有dba手工介入,需要提醒你的是,如果存儲采用文件系統(tǒng)或者ASM,那當(dāng)然沒有問題,但是如果采用了裸設(shè)備,你就必須將該參數(shù)設(shè)置為manual。5、確保數(shù)據(jù)庫處于歸檔模式SQL>archiveloglistDatabaselogmodeArchiveModeAutomaticarchivalEnabledArchivedestination/oracle/app/archive/Oldestonlinelogsequence328Nextlogsequencetoarchive330Currentlogsequence330SQL>如果當(dāng)前primary數(shù)據(jù)庫并未處于歸檔模式,可通過下列命令將數(shù)據(jù)庫置為歸檔模式:SQL>STARTUPMOUNT;SQL>ALTERDATABASEARCHIVELOG;SQL>ALTERDATABASEOPEN;網(wǎng)絡(luò)配置修改最后,我需要確保主數(shù)據(jù)庫和備用數(shù)據(jù)庫之間能夠通過網(wǎng)絡(luò)通信,備用數(shù)據(jù)庫的LISTENER.ORA配置文件也需要一個備用數(shù)據(jù)庫實例的靜態(tài)監(jiān)聽器。在數(shù)據(jù)庫本地命名配置文件(TNSNAMES.ORA)中加上備用數(shù)據(jù)庫的實例,主數(shù)據(jù)庫實和備用數(shù)據(jù)庫tnsnames.ora條目都采用相同的配置如下:
PRIMARY=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node3)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=primary)))STANDBY=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node4)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=standby)))主數(shù)據(jù)庫實和備用數(shù)據(jù)庫中l(wèi)istener.ora的內(nèi)容如下
主數(shù)據(jù)庫:PRIMARY=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node3)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=primary)))STANDBY=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node4)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=standby)))備數(shù)據(jù)庫:SID_LIST_LISTENER=(SID_LIST=(SID_DESC=(SID_NAME=standby)(ORACLE_HOME=/oracle/app/product)(GLOBAL_DBNAME=standby)))LISTENER=(DESCRIPTION_LIST=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node4)(PORT=1521))(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))))準(zhǔn)備復(fù)制:準(zhǔn)備備用站點現(xiàn)在主站點已經(jīng)準(zhǔn)備好可以復(fù)制了,在對應(yīng)的備用站點上也需要做一些對應(yīng)的調(diào)整:創(chuàng)建必要的目錄需要為數(shù)據(jù)庫控制文件、數(shù)據(jù)文件、在線重做日志文件和備用重做日志文件創(chuàng)建必要的目錄,我還為數(shù)據(jù)庫的審核跟蹤創(chuàng)建了合適的目錄。mkdir-p/oracle/app/admin/lijl/adumpmkdir-p/oracle/app/admin/lijl/dpdumpmkdir-p/oracle/app/admin/lijl/pfilemkdir-p/oracle/app/oradata/lijlmkdir-p/oracle/app/archive設(shè)置密碼文件因為主數(shù)據(jù)庫要和備用數(shù)據(jù)庫進(jìn)行通信時需要使用遠(yuǎn)程認(rèn)證,我將會使用orapwd工具創(chuàng)建一個新的密碼文件,確保SYS的密碼和主數(shù)據(jù)庫匹配(注意我們可以直接從主數(shù)據(jù)庫拷貝到備用數(shù)據(jù)庫)。創(chuàng)建備用初始化參數(shù)文件最后,我需要創(chuàng)建一個初始化參數(shù)文件(PFILE),僅允許我啟動備用數(shù)據(jù)庫實例,它理論上只需要一個參數(shù):DB_NAME。當(dāng)DUPLICATEDATABASE命令腳本執(zhí)行完畢后,它將會創(chuàng)建一個服務(wù)端參數(shù)文件(SPFILE),它僅包括合適的初始化參數(shù)設(shè)置??稍谧鰧嶒炦^程中為了保證能成功創(chuàng)建物理standby我們使用的初始化參數(shù)配置如下:備用數(shù)據(jù)庫臨時初始化參數(shù)文件
*.db_name=lijl*.compatible='.0*.processes=150*.remote_login_passwordfile='EXCLUSIVE'*.undo_tablespace='UNDOTBS1'*.db_unique_name='standby'*.archive_lag_target=18000*.fal_client='primary'*.fal_server='standby'*.control_files='/oracle/app/oradata/lijl/control01.ctl','/oracle/app/oradata/lijl/control02.ctl','/oracle/app/oradata/lijl/control03.ctl'*.log_archive_dest='/oracle/app/archive'*.log_archive_config='dg_config=(primary,standby)'*.log_archive_dest_1='location=/oracle/app/archivevalid_for=(ALL_LOGFILES,ALL_ROLES)db_unique_name=standby'*.log_archive_dest_2='service=primaryASYNCvalid_for=(ONLINE_LOGFILE,PRIMARY_ROLE)db_unique_name=primary'*.log_archive_dest_state_1='ENABLE'*.log_archive_dest_state_2='ENABLE'*.log_archive_format='log_%s_%t_%r.arc'*.log_file_name_convert='/oracle/app/oradata/lijl,'/oracle/app/oradata/lijl/'*.db_file_name_convert='/oracle/app/oradata/lijl,'/oracle/app/oradata/lijl/'*.standby_file_management='AUTO'上述參數(shù)中添加了下面這樣一些額外的參數(shù),可能和主數(shù)據(jù)庫的參數(shù)稍有不同:(1)DB_UNIQUE_NAME我將此參數(shù)的值設(shè)為stdby了。(2)CONTROL_FILES我只為備用數(shù)據(jù)庫創(chuàng)建了3個控制文件。(3)FAL_CLIENT和FAL_SERVER這兩個參數(shù)確定哪個數(shù)據(jù)庫服務(wù)分別擔(dān)任FAL(fetcharchivelog)客戶端和服務(wù)器,例如,無論何時,當(dāng)主數(shù)據(jù)庫和備用數(shù)據(jù)庫之間的網(wǎng)絡(luò)斷掉后,或如果備用數(shù)據(jù)庫已經(jīng)關(guān)閉相當(dāng)長一段時間,歸檔重做日志可能就不會傳輸?shù)絺溆梅?wù)器上。這種情況叫做歸檔日志空白(archiveloggap),這兩個FAL服務(wù)名確定了由哪個服務(wù)器(FAL_SERVER)維護(hù)所有歸檔重做日志組主列表,由它為FAL_CLIENT提供可能發(fā)生的歸檔日志空白解決方案。在我們的數(shù)據(jù)衛(wèi)士設(shè)置中,將備用服務(wù)器配置為FAL_SERVER,將主服務(wù)器配置為FAL_CLIENT。(4)LOG_FILE_NAME_CONVERT我已經(jīng)使用此參數(shù)將主數(shù)據(jù)庫的歸檔重做日志和備用重做日志的目標(biāo)做了翻譯,確保在復(fù)制過程中RMAN能夠自動在備用數(shù)據(jù)庫上創(chuàng)建恰當(dāng)?shù)母北?。?)LOG_ARCHIVE_DEST_n和主數(shù)據(jù)庫一樣,我也設(shè)置了兩個歸檔日志目標(biāo):一個主目標(biāo)LOG_ARCHIVE_DEST_1和次要目標(biāo)LOG_ARCHIVE_DEST_2。將來主備站點角色發(fā)生交換后,將由次要目標(biāo)中的歸檔重做日志傳輸?shù)皆贾鲾?shù)據(jù)庫中。這些命令和臨時備用數(shù)據(jù)庫初始化參數(shù),為了開啟DUPLICATEDATABASE復(fù)制操作,我將啟動備用站點的監(jiān)聽器(lsnrctlstart),然后使用前面創(chuàng)建的PFILE初始化參數(shù)文件將備用數(shù)據(jù)庫實例啟動到NOMOUNT狀態(tài)。$>exportORACLE_SID=stdby
$>sqlplus/assysdba
SQL>startupnomountpfile='/oracle/app/product/dbs/initstdby.ora';通過DUPLICATEDATABASE復(fù)制備用數(shù)據(jù)庫從主數(shù)據(jù)庫的RMAN會話環(huán)境啟動DUPLICATEDATABASE命令,前面我已經(jīng)提到過,Oracle11g中DUPLICATEDATABASE命令最引人注目的改變是它可以通過網(wǎng)絡(luò)直接將主數(shù)據(jù)庫復(fù)制到備用數(shù)據(jù)庫站點。最后,讓我們開始復(fù)制吧!首先在主數(shù)據(jù)庫服務(wù)器上啟動一個RMAN會話,以target連接到主數(shù)據(jù)庫,以auxiliary連接到備用數(shù)據(jù)庫:來自一個成功的備用數(shù)據(jù)庫復(fù)制操作的輸出內(nèi)容[oracle@node3admin]$rmantarget/auxiliarysys/oracle@standbyRecoveryManager:Release.0-ProductiononFriJul2312:43:162010Copyright(c)1982,2007,Oracle.Allrightsreserved.connectedtotargetdatabase:LIJL(DBID=1374471298)connectedtoauxiliarydatabase:LIJL(notmounted)RMAN>duplicatetargetdatabaseforstandbyfromactivedatabasedorecovernofilenamecheck;StartingDuplicateDbat23-JUL-10usingtargetdatabasecontrolfileinsteadofrecoverycatalogallocatedchannel:ORA_AUX_DISK_1channelORA_AUX_DISK_1:SID=95devicetype=DISKcontentsofMemoryScript:{backupascopyreusefile'/oracle/app/product/dbs/orapwprimary'auxiliaryformat'/oracle/app/product/dbs/orapwstandby';}executingMemoryScriptStartingbackupat23-JUL-10allocatedchannel:ORA_DISK_1channelORA_DISK_1:SID=145devicetype=DISKFinishedbackupat23-JUL-10contentsofMemoryScript:{backupascopycurrentcontrolfileforstandbyauxiliaryformat'/oracle/app/oradata/lijl/control01.ctl';restoreclonecontrolfileto'/oracle/app/oradata/lijl/control02.ctl'from'/oracle/app/oradata/lijl/control01.ctl';restoreclonecontrolfileto'/oracle/app/oradata/lijl/control03.ctl'from'/oracle/app/oradata/lijl/control01.ctl';sqlclone'alterdatabasemountstandbydatabase';}executingMemoryScriptStartingbackupat23-JUL-10usingchannelORA_DISK_1channelORA_DISK_1:startingdatafilecopycopyingstandbycontrolfileoutputfilename=/oracle/app/product/dbs/snapcf_primary.ftag=TAG20100723T124330RECID=6STAMP=725114611channelORA_DISK_1:datafilecopycomplete,elapsedtime:00:00:01Finishedbackupat23-JUL-10Startingrestoreat23-JUL-10usingchannelORA_AUX_DISK_1channelORA_AUX_DISK_1:skipped,AUTOBACKUPalreadyfoundchannelORA_DISK_1:skipped,AUTOBACKUPalreadyfoundchannelclone_default:copiedcontrolfilecopyFinishedrestoreat23-JUL-10Startingrestoreat23-JUL-10usingchannelORA_AUX_DISK_1channelORA_AUX_DISK_1:skipped,AUTOBACKUPalreadyfoundchannelORA_DISK_1:skipped,AUTOBACKUPalreadyfoundchannelclone_default:copiedcontrolfilecopyFinishedrestoreat23-JUL-10sqlstatement:alterdatabasemountstandbydatabasecontentsofMemoryScript:{setnewnamefortempfile1to"/oracle/app/oradata/lijl/temp01.arc";switchclonetempfileall;setnewnamefordatafile1to"/oracle/app/oradata/lijl/system01.arc";setnewnamefordatafile2to"/oracle/app/oradata/lijl/sysaux01.arc";setnewnamefordatafile3to"/oracle/app/oradata/lijl/undotbs01.arc";setnewnamefordatafile4to"/oracle/app/oradata/lijl/users01.arc";backupascopyreusedatafile1auxiliaryformat"/oracle/app/oradata/lijl/system01.arc"datafile2auxiliaryformat"/oracle/app/oradata/lijl/sysaux01.arc"datafile3auxiliaryformat"/oracle/app/oradata/lijl/undotbs01.arc"datafile4auxiliaryformat"/oracle/app/oradata/lijl/users01.arc";sql'altersystemarchivelogcurrent';}executingMemoryScriptexecutingcommand:SETNEWNAMErenamedtempfile1to/oracle/app/oradata/lijl/temp01.arcincontrolfileexecutingcommand:SETNEWNAMEexecutingcommand:SETNEWNAMEexecutingcommand:SETNEWNAMEexecutingcommand:SETNEWNAMEStartingbackupat23-JUL-10usingchannelORA_DISK_1channelORA_DISK_1:startingdatafilecopyinputdatafilefilenumber=00001name=/oracle/app/oradata/lijl/system01.arcoutputfilename=/oracle/app/oradata/lijl/system01.arctag=TAG20100723T124354RECID=0STAMP=0channelORA_DISK_1:datafilecopycomplete,elapsedtime:00:01:05channelORA_DISK_1:startingdatafilecopyinputdatafilefilenumber=00003name=/oracle/app/oradata/lijl/undotbs01.arcoutputfilename=/oracle/app/oradata/lijl/undotbs01.arctag=TAG20100723T124354RECID=0STAMP=0channelORA_DISK_1:datafilecopycomplete,elapsedtime:00:00:35channelORA_DISK_1:startingdatafilecopyinputdatafilefilenumber=00002name=/oracle/app/oradata/lijl/sysaux01.arcoutputfilename=/oracle/app/oradata/lijl/sysaux01.arctag=TAG20100723T124354RECID=0STAMP=0channelORA_DISK_1:datafilecopycomplete,elapsedtime:00:00:25channelORA_DISK_1:startingdatafilecopyinputdatafilefilenumber=00004name=/oracle/app/oradata/lijl/users01.arcoutputfilename=/oracle/app/oradata/lijl/users01.arctag=TAG20100723T124354RECID=0STAMP=0channelORA_DISK_1:datafilecopycomplete,elapsedtime:00:00:01Finishedbackupat23-JUL-10sqlstatement:altersystemarchivelogcurrentcontentsofMemoryScript:{backupascopyreusearchiveloglike"/oracle/app/archive/log_54_1_725102466.arc"auxiliaryformat"/oracle/app/archive/log_54_1_725102466.arc";catalogclonearchivelog"/oracle/app/archive/log_54_1_725102466.arc";switchclonedatafileall;}executingMemoryScriptStartingbackupat23-JUL-10usingchannelORA_DISK_1channelORA_DISK_1:startingarchivedlogcopyinputarchivedlogthread=1sequence=54RECID=26STAMP=725114760outputfilename=/oracle/app/archive/log_54_1_725102466.arcRECID=0STAMP=0channelORA_DISK_1:archivedlogcopycomplete,elapsedtime:00:00:01Finishedbackupat23-JUL-10catalogedarchivedlogarchivedlogfilename=/oracle/app/archive/log_54_1_725102466.arcRECID=1STAMP=724769476datafile1switchedtodatafilecopyinputdatafilecopyRECID=6STAMP=724769477filename=/oracle/app/oradata/lijl/system01.arcdatafile2switchedtodatafilecopyinputdatafilecopyRECID=7STAMP=724769477filename=/oracle/app/oradata/lijl/sysaux01.arcdatafile3switchedtodatafilecopyinputdatafilecopyRECID=8STAMP=724769477filename=/oracle/app/oradata/lijl/undotbs01.arcdatafile4switchedtodatafilecopyinputdatafilecopyRECID=9STAMP=724769477filename=/oracle/app/oradata/lijl/users01.arccontentsofMemoryScript:{setuntilscn416378;recoverstandbyclonedatabasedeletearchivelog;}executingMemoryScriptexecutingcommand:SETuntilclauseStartingrecoverat23-JUL-10usingchannelORA_AUX_DISK_1startingmediarecoveryarchivedlogforthread1withsequence54isalreadyondiskasfile/oracle/app/archive/log_54_1_725102466.arcarchivedlogfilename=/oracle/app/archive/log_54_1_725102466.arcthread=1sequence=54mediarecoverycomplete,elapsedtime:00:00:00Finishedrecoverat23-JUL-10FinishedDuplicateDbat23-JUL-10RMAN>exitRecoveryManagercomplete.[oracle@node3admin]$clear[oracle@node3admin]$復(fù)制之后:清除、校驗和轉(zhuǎn)換至此復(fù)制操作執(zhí)行結(jié)束,我需要確保備用數(shù)據(jù)庫從主數(shù)據(jù)庫接收到歸檔重做日志,為了驗證主備數(shù)據(jù)庫確實是聯(lián)通的,我將在主數(shù)據(jù)庫上執(zhí)行一次重做日志切換。SQL﹥ALTERSYSTEMARCHIVELOGCURRENT;下面是來自備用數(shù)據(jù)庫的警告日志,從中可以看出在線重做日志成功傳輸并應(yīng)用到備用數(shù)據(jù)庫上了。oracle@node4trace]$tail-falert_stdby.logRecoveryofOnlineRedoLog:Thread1Group4Seq57Readingmem0Mem#0:/oracle/app/oradata/stdby/srl01.logSunJul1802:40:242010MediaRecoveryWaitingforthread1sequence58SunJul1802:40:242010PrimarydatabaseisinMAXIMUMPERFORMANCEmodekcrrvslf:activeRFSarchivalforlog4thread1sequence57RFS[2]:Successfullyopenedstandbylog5:'/oracle/app/oradata/stdby/srl02.log'RecoveryofOnlineRedoLog:Thread1Group5Seq58Readingmem0Mem#0:/oracle/app/oradata/stdby/srl02.logSunJul1802:41:042010PrimarydatabaseisinMAXIMUMPERFORMANCEmodeSunJul1802:41:052010MediaRecoveryWaitingforthread1sequence59(intransit)RFS[2]:Successfullyopenedstandbylog5:'/oracle/app/oradata/stdby/srl02.log'RecoveryofOnlineRedoLog:Thread1Group5Seq59Readingmem0Mem#0:/oracle/app/oradata/stdby/srl02.log啟動redo應(yīng)用SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASEDISCONNECTFROMSESSION;啟動實時應(yīng)用SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASEUSINGCURRENTLOGFILEDISCONNECTFROMSESSION;提示:disconnectfromsession子句并非必須,該子句用于指定啟動完應(yīng)用后自動退出到命令操作符前,如果不指定的話,當(dāng)前session就會一直停留處理redo應(yīng)用,如果想做其它操作,就只能新建一個連接。停止standby正常情況下,我們停止也應(yīng)該是先停止redo應(yīng)用,可以通過下列語句:SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASECALCEL;然后再停止standby數(shù)據(jù)庫SQL>SHUTDOWNIMMEDIATE;當(dāng)然你非要直接shutdown也沒問題,dataguard本來就是用于容災(zāi)的,別說你生停standby,就是直接拔電源也不怕。物理standby的Switchover注意操作步驟的先后,很關(guān)鍵。檢查是否支持switchover操作--primary數(shù)據(jù)庫操作登陸primary數(shù)據(jù)庫,查詢v$database視圖的switchover_status列。SQL>SelectLOG_MODE,CONTROLFILE_TYPE,OPEN_MODE,PROTECTION_MODE,DATABASE_ROLE,SWITCHOVER_STATUSfromv$database;LOG_MODECONTROLOPEN_MODEPROTECTION_MODEDATABASE_ROLESWITCHOVER_STATUSARCHIVELOGCURRENTREADWRITEMAXIMUMPROTECTIONPRIMARYTOSTANDBY如果該列值為"TOSTANDBY"則表示primary數(shù)據(jù)庫支持轉(zhuǎn)換為standby角色,否則的話你就需要重新檢查DataGuard配置,如查看LOG_ARCHIVE_DEST_n之類參數(shù)值是否正確有效等。啟動switchover--primary數(shù)據(jù)庫操作首先將primary轉(zhuǎn)換為standby的角色,通過下列語句:SQL>alterdatabasecommittoswitchovertophysicalstandby;數(shù)據(jù)庫已更改。語句執(zhí)行完畢后,primary數(shù)據(jù)庫將會轉(zhuǎn)換為standby數(shù)據(jù)庫,并自動備份控制文件到trace。重啟動到mount--原primary數(shù)據(jù)庫操作SQL>alterdatabasecommittoswitchovertophysicalstandby;Databasealtered.SQL>shutdownimmediate;ORA-01507:databasenotmountedORACLEinstanceshutdown.檢查是否支持switchover操作--待轉(zhuǎn)換standby數(shù)據(jù)庫操作待原primary切換為standby角色之后,檢查待轉(zhuǎn)換的standby數(shù)據(jù)庫switchover_status列,看看是否支持角色轉(zhuǎn)換。SQL>selectLOG_MODE,CONTROLFILE_TYPE,OPEN_MODE,PROTECTION_MODE,DATABASE_ROLE,SWITCHOVER_STATUSfromv$database;LOG_MODECONTROLOPEN_MODEPROTECTION_MODEDATABASE_ROLESWITCHOVER_STATUSARCHIVELOGSTANDBYMOUNTEDMAXIMUMPROTECTIONPHYSICALSTANDBYTOPRIMARY此時待轉(zhuǎn)換standby數(shù)據(jù)庫switchover_status列值應(yīng)該是"TO_PRIMARY",如否則檢查其初始化參數(shù)文件中的設(shè)置,可以參考原primary數(shù)據(jù)庫的初始化參數(shù)修改。轉(zhuǎn)換角色到primary--待轉(zhuǎn)換standby數(shù)據(jù)庫操作通過下列語句轉(zhuǎn)換standby到primary角色:注意:待轉(zhuǎn)換的物理standby不能處于openreadwrite模式。SQL>selectLOG_MODE,CONTROLFILE_TYPE,OPEN_MODE,PROTECTION_MODE,DATABASE_ROLE,SWITCHOVER_STATUSfromv$database;LOG_MODECONTROLOPEN_MODEPROTECTION_MODEDATABASE_ROLESWITCHOVER_STATUSARCHIVELOGSTANDBYMOUNTEDMAXIMUMPROTECTIONPHYSICALSTANDBYSWITCHOVERPENDINGSQL>alterdatabasecommittoswitchovertoprimary;alterdatabasecommittoswitchovertoprimary*ERRORatline1:ORA-16139:mediarecoveryrequiredSQL>![oracle@linux2~]$tail/oracle/oradata/standby/bdump/alert_stand.logEnd-Of-REDOarchivedlogfilehasnotbeenrecoveredArchivedlogfilesdetectedbeyondEnd-Of-REDOIncompleterecoverySCN:0:234931archiveSCN:0:265075DatabasenotavailableforswitchoverEnd-Of-REDOarchivedlogfilehasbeenreceivedEnd-Of-REDOarchivedlogfilehasnotbeenrecoveredArchivedlogfilesdetectedbeyondEnd-Of-REDOIncompleterecoverySCN:0:234931archiveSCN:0:265075Switchover:Mediarecoveryrequired-standbynotinlimboORA-16139signalledduring:alterdatabasecommittoswitchovertoprimary...啟動redo應(yīng)用SQL>alterdatabaserecovermanagedstandbydatabasedisconnectfromsession;Databasealtered.SQL>![oracle@linux2~]$tail/oracle/oradata/standby/bdump/alert_stand.logCompleted:alterdatabaserecovermanagedstandbydatabasedisconnectfromsessionTueApr1509:08:372008MediaRecoveryLog/oracle/oradata/standby/arch/1_29_651601678.arcMediaRecoveryLog/oracle/oradata/standby/arch/1_30_651601678.arcMediaRecoveryLog/oracle/oradata/standby/arch/1_31_651601678.arcMediaRecoveryLog/oracle/oradata/standby/arch/1_32_651601678.arcMediaRecoveryLog/oracle/oradata/standby/arch/1_33_651601678.arcMediaRecoveryLog/oracle/oradata/standby/arch/1_34_651601678.arcMediaRecoveryLog/oracle/oradata/standby/arch/1_35_651601678.arcMediaRecoveryLog/oracle/oradata/standby/arch/1_36_651601678.arcSQL>selectLOG_MODE,CONTROLFILE_TYPE,OPEN_MODE,PROTECTION_MODE,DATABASE_ROLE,SWITCHOVER_STATUSfromv$database;LOG_MODECONTROLOPEN_MODEPROTECTION_MODEDATABASE_ROLESWITCHOVER_STATUSARCHIVELOGSTANDBYMOUNTEDMAXIMUMPROTECTIONPHYSICALSTANDBYTOPRIMARYSQL>alterdatabasecommittoswitchovertoprimary;Databasealtered.完成轉(zhuǎn)換,打開新的primary數(shù)據(jù)庫SQL>alterdatabaseopen;Databasealtered.SQL>selectLOG_MODE,CONTROLFILE_TYPE,OPEN_MODE,PROTECTION_MODE,DATABASE_ROLE,SWITCHOVER_STATUSfromv$database;LOG_MODECONTROLOPEN_MODEPROTECTION_MODEDATABASE_ROLESWITCHOVER_STATUSARCHIVELOGCURRENTREADWRITEMAXIMUMPROTECTIONPRIMARYTOSTANDBY驗證新的primary數(shù)據(jù)庫SQL>showparameterdb_uniqueNAMETYPEVALUEdb_unique_namestringstdbySQL>selectmax(sequence#)fromv$archived_log;MAX(SEQUENCE#)67SQL>altersystemswitchlogfile;Databasealtered.SQL>selectmax(sequence#)fromv$archived_log;MAX(SEQUENCE#)68新的standby數(shù)據(jù)庫SQL>showparameterdb_uniqueNAMETYPEVALUEdb_unique_namestringprimarySQL>selectmax(sequence#)fromv$archived_log;MAX(SEQUENCE#)68轉(zhuǎn)換成功。物理standby的failover注意幾點:failover之后,原primary數(shù)據(jù)庫默認(rèn)不再是dataguard配置的一部分。多數(shù)情況下,其它邏輯/物理standby數(shù)據(jù)庫不直接參與failover的過程,因此這些數(shù)據(jù)庫不需要做任何操作。某些情況下,新的primary數(shù)據(jù)庫配置之后,需要重新創(chuàng)建其它所有的standby數(shù)據(jù)庫。另外,如果待轉(zhuǎn)換角色的standby處于maximumprotection或maximumavailability模式的話,歸檔日志應(yīng)該是連續(xù)存在的,這種情況下你可以直接從第3步執(zhí)行,否則建議你按照操作步驟從第1步開始執(zhí)行。一般情況下failover都是表示primary數(shù)據(jù)庫癱瘓,最起碼也是起不來了,因此這種類型的切換基本上不需要primary數(shù)據(jù)庫做什么操作。所以下列步驟中如果有提到primary和standby執(zhí)行的,只是建議你如果primary還可以用,那就執(zhí)行一下,即使它能用你卻不執(zhí)行,也沒關(guān)系,不影響standby數(shù)據(jù)庫的切換:)檢查歸檔文件是否連續(xù)查詢待轉(zhuǎn)換standby數(shù)據(jù)庫的V$ARCHIVE_GAP視圖,確認(rèn)歸檔文件是否連接:SQL>SELECTTHREAD#,LOW_SEQUENCE#,HIGH_SEQUENCE#FROMV$ARCHIVE_GAP;norowsselectedSQL>如果返回的有記錄,按照列出的記錄號復(fù)制對應(yīng)的歸檔文件到待轉(zhuǎn)換的standby服務(wù)器。這一步非常重要,必須確保所有已生成的歸檔文件均已存在于standby服務(wù)器,不然可能會數(shù)據(jù)不一致造成轉(zhuǎn)換時報錯。文件復(fù)制之后,通過下列命令將其加入數(shù)據(jù)字典:SQL>ALTERDATABASEREGISTERPHYSICALLOGFILE'filespec1';檢查歸檔文件是否完整分別在primary/standby執(zhí)行下列語句:SQL>selectdistinctthread#,max(sequence#)over(partitionbythread#)afromv$archived_log;該語句取得當(dāng)前數(shù)據(jù)庫各線程已歸檔文件最大序號,如果primary與standby最大序號不相同,必須將多出的序號對應(yīng)的歸檔文件復(fù)制到待轉(zhuǎn)換的standby服務(wù)器。不過既然是failover,有可能primary數(shù)據(jù)庫此時已經(jīng)無法打開,甚至無法訪問啟動failover執(zhí)行下列語句:SQL>alterdatabaserecovermanagedstandbydatabasefinishforce;Databasealtered.FORCE關(guān)鍵字將會停止當(dāng)前活動的RFS進(jìn)程,以便立刻執(zhí)行failover。剩下的步驟就與前面switchover很相似了切換物理standby角色為primarySQL>alterdatabasecommittoswitchovertoprimary;Databasealtered.啟動新的primary數(shù)據(jù)庫。如果當(dāng)前數(shù)據(jù)庫已mount,直接open即可,如果處于read-only模式,需要首先shutdownimmediate,然后再直接startup。SQL>alterdatabaseopen;Databasealtered.角色轉(zhuǎn)換工作完成。剩下的是補(bǔ)救措施(針對原primary數(shù)據(jù)庫),由于此時primary數(shù)據(jù)庫已經(jīng)不再是dataguard配置的一部分,我們需要做的就是嘗試看看能否恢復(fù)原primary數(shù)據(jù)庫,將其改造為新的standby服務(wù)器。具體操作方式可以分為二類:1.重建2.備份恢復(fù)。監(jiān)控primary/standby數(shù)據(jù)庫dataguard監(jiān)控配置的方式先給大家提供一個表格(描述不同事件的不同信息監(jiān)控途徑):在oracle11g中alert的位置有所變化/oracle/app/diag/rdbms/dbname/sid/trace/alert_sid.logprimary數(shù)據(jù)庫事件primary監(jiān)控途徑standby帶有enable|disablethread子句的alterdatabase命令A(yù)lert_primary.logV$thredAlert_stdby.log當(dāng)前數(shù)據(jù)庫角色,保護(hù)模式,保護(hù)級別,switchover狀態(tài),failover快速啟動信息等V$databaseV$database重建控制文件AlertlogAlertlog手工執(zhí)行恢復(fù)AlertlogAlertlogRedo切換AlertlogV$logV$logfile的status列Alertlog表空間狀態(tài)修改(read-write/read-only,online/offline)Dba_tablespacesAlertlogV$recover_file創(chuàng)建刪除表空間或數(shù)據(jù)文件Dba_data_filesAlertlogV$datafileAlertlog表空間或數(shù)據(jù)文件offlineV$RECOVER_FILEAlertlogDBA_TABLESPACESV$RECOVER_FILEDBA_TABLESPACES重命名數(shù)據(jù)文件V$DATAFILEAlertlogV$DATAFILEAlertlog未被日志記錄或不可恢復(fù)的操作V$DATAFILEviewV$DATABASEviewAlertlog恢復(fù)的進(jìn)程V$ARCHIVE_DEST_STATUSAlertlogV$ARCHIVED_LOGV$LOG_HISTORYV$MANAGED_STANDBYAlertlogRedo傳輸?shù)臓顟B(tài)和進(jìn)度V$ARCHIVE_DEST_STATUSV$ARCHIVED_LOGV$ARCHIVE_DESTAlertlogV$ARCHIVED_LOGAlertlog數(shù)據(jù)文件自動擴(kuò)展AlertlogAlertlog執(zhí)行OPENRESETLOGS或CLEARUNARCHIVEDLOGFILESAlertlogAlertlog修改初始化參數(shù)AlertlogAlertlog概括起來主要通過二個方面:1、AlertLog我們一定要養(yǎng)成定期不定期查看alert.log的好習(xí)慣,同時特別注意alert中的提示,通常不經(jīng)意間會發(fā)現(xiàn)它的提示能夠讓你的思路豁然開朗。2、動態(tài)性能視圖做為oracle自己自覺主動維護(hù)的一批虛擬表它的作用非常明顯通過它可以及時獲得當(dāng)前數(shù)據(jù)庫狀態(tài)及處理進(jìn)度總之好處多多也需特別關(guān)注后面示例也會多處用首先介紹與恢復(fù)進(jìn)度相關(guān)的v$視圖應(yīng)用示例:(1)查看進(jìn)程的活動狀況v$managed_s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 馬術(shù)場破碎施工合同
- 道路橋梁外委施工協(xié)議
- 策劃行業(yè)合同范例
- 行政訴訟案件代理合同(2篇)
- 工作單位終止勞動合同的證明
- 集體合同正副本
- 小型合同范例承包范圍
- 羊肉加盟合同范例
- 路基包工合同范例
- 工程訂貨定金合同范例
- 40篇短文搞定高中英語3500單詞
- 智慧物業(yè)綜合管理系統(tǒng)
- 三年級語文上冊期末《句子》專項訓(xùn)練含答案
- 2024年中國遠(yuǎn)洋海運(yùn)集團(tuán)招聘筆試參考題庫附帶答案詳解
- 2024年內(nèi)蒙古交通集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 山東省聊城市文軒教育集團(tuán)2023-2024學(xué)年九年級上學(xué)期期末化學(xué)模擬試卷
- 物業(yè)公司經(jīng)營規(guī)劃
- 2024年心腦血管藥物項目營銷策劃方案
- 攪拌站規(guī)劃設(shè)計方案
- 醫(yī)共體醫(yī)療質(zhì)量控制中心工作職責(zé)(終版改)
- 四川省綿陽市2023年九年級上學(xué)期期末化學(xué)試題附答案
評論
0/150
提交評論