Oracle進階培訓 第6課 學習筆記 作者:JackYang (JackYang.sh@gmail.com)日期:2006-10-18 本課包含多個實驗,目前還未通過上機驗證。 TSPITR(資料表空間基於時間點的恢複)為了減少損失,推出TSPITR。比DBPITR進階。 設計思想:假如一個生產資料庫的某個TABLE被誤刪除了。 先對原來的生產資料庫CLONE,然後再造一個次要資料庫和原來的一模一樣。CLONE出來的資料庫叫做次要資料庫,原來的資料庫叫生產資料庫。對次要資料庫做TSPITR。把次要資料庫恢複到備份點。然後把次要資料庫包含被刪除表的資料表空間EXPORT(匯出)。把匯出的資料表空間,匯入生產資料庫。這樣生產資料庫中,其它的資料表空間不受影響,僅僅是受損資料表空間恢複。在次要資料庫上所作的恢複操作和恢複一個表的操作是一樣的。 TSPITR的具體步驟參考老師提供的檔案TSPITR.txt(一)Prepare Product Database:1. Checking self contained for recovery setsql>execute dbms_tts.transport_set_check('DATA2',true);sql>select * from transport_set_violation; no rows selected 檢查資料表空間是否自包含。對資料庫複製只要包含系統資料表空間,暫存資料表空間和受損的資料表空間。其它資料表空間不用CLONE到輔助資料表空間中。自包含的意思:受損資料表空間中的一個表有index。這個index被其它資料表空間使用,那麼那個資料表空間也要被CLONE。 2. simulate before fault: sql> create table dept1 tablespace data1 as select * from scott.dept; sql> create table dept2 tablespace data2 as select * from scott.dept; sql> insert into dept1(deptno,dname) values(28,'before drop'); sql> insert into dept2(deptno,dname) values(28,'before drop'); sql> commit; sql> alter system archive log current; 3. Backup recovery set and auxiliary set before TSPITR time sql> alter database begin backup;sql> host copy d:/ora101g/oradata/db1/*.dbf d:/backup/db1sql> alter database end backup;sql> alter system archive log current;sql> alter database backup controlfile to 2 'D:/backup/db1/conl.ctl' reuse;sql> alter system archive log current; 對資料庫進行備份 4. simulate after fault:sql>select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual; recoding the sysdate!sql> truncate table dept2;sql> insert into dept1(deptno,dname) values(38,'after drop');sql> commit;sql> alter system archive log current; 取出時間。刪除表,類比損壞的操作。插入一行資料,以便驗證恢複結果是否成功。 (二)Prepare AUXiliary DataBase:1. Prepare OS environment: dos>mkdir F:/auxdb1dos>mkdir F:/auxdb1/bdumpdos>mkdir F:/auxdb1/udumpdos>mkdir F:/auxdb1/arc 建立次要資料庫 2. create oracle service for AUXiliary Database:dos>oradim -new -sid AUXDB1 -intpwd ora123 建立服務 3. Prepare parameter file for AUXiliary database:(dos>copy D:/ora101g/database/initDB1.ora D:/ora101g/database/iniAUXDB1.oraEDIT D:/ora101g/database/initAUXDB1.ora:) 老師提供檔案initAUXDB1.ora的內容如下:db_unique_name='AUXDB1'db_file_name_convert='D:/ora101g/oradata/db1','F:/auxdb1'log_file_name_convert='D:/ora101g/oradata/db1','F:/auxdb1','D:/ora101g/oradata/db1','F:/auxdb1'background_dump_dest='F:/auxdb1/bdump'compatible='10.1.0.2.0'control_files=('F:/auxdb1/con1.ctl','F:/auxdb1/con2.ctl')core_dump_dest='F:/auxdb1/cdump'db_name='DB1'remote_login_passwordfile='EXCLUSIVE'sessions=20undo_management='AUTO'undo_tablespace='undotbs'user_dump_dest='F:/auxdb1/udump'log_archive_dest_1='location=D:/backup/db1/arc'log_archive_format='%s_%t_%r.arc'service_names='AUXDB1'instance_name='AUXDB1' 複製初始化參數檔案,並進行小修改 其中: db_name不變 加db_uniqure_name db_file_name和log_file_name_convert 把原來DB1的路徑轉化為次要資料庫的路徑。 log_archive_dest_1不變,把複製的資料庫恢複時,要用到歸檔日誌。次要資料庫沒有歸檔日誌,生產資料庫有歸檔日誌,所以這個路徑不改變。改service_name和instance_name 4. RESTORE Recovery SET and auxiliary SETsql>host copy D:/backup/db1/*.dbf F:/auxdb1sql>host copy D:/backup/db1/con1.ctl F:/auxdb1/con1.ctlsql>host copy D:/backup/db1/con1.ctl F:/auxdb1/con2.ctl 把原來生產資料庫的備份檔案,copy到次要資料庫裡面去。 5. Start AUX DB: sql>connect sys/ora123@AUXDB1 as sysdba sql>startup nomount sql> alter database mount clone database; sql> alter database datafile 'F:/auxdb1/SYS01.DBF' online; sql> alter database datafile 'F:/auxdb1/UNDOTBS.DBF' online; sql> alter database datafile 'F:/auxdb1/data2.dbf' online; sql> recover database until time '2007-04-01 17:28:43' using backup controlfile; sql> alter database open resetlogs; check the table dept2 exist: sql> select * from dept2; sql> alter tablespace temp add tempfile 'F:/auxdb1/temp.dbf' size 5M reuse; 啟動次要資料庫進行CLONE操作 using backup controlfile是指使用備份的控制檔案。複製的時候不能修改控制檔案,執行recover的時候能夠修改控制檔案,因為recover能夠利用redo log (三) EXPort and IMPort Recovery Set1. EXPort Recovery Setdos>exp 'sys/ora123 as sysdba' point_in_time_recover=y tablespaces=data2 file=F:/auxdb1/data2.dmp Export terminated successfully without warnings. 用sysdba登入,用exp命令匯出指定的資料表空間。 2. IMPort Recovery Setsql>connect sys/ora123@DB1 as sysdbasql> alter tablespace data2 offline; dos>copy F:/auxdb1/data2.dbf D:/ora101g/oradata/db1dos>imp 'sys/ora123@DB1 as sysdba' point_in_time_recover=y datafiles= D:/ora101g/oradata/db1/data2.dbf file=F:/auxdb1/data2.dmp Import terminated successfully without warnings. 串連到生產資料庫上 使生產資料庫中損壞的資料表空間offline。 3. Check the TSPITR result:sql> alter tablespace data2 online; sql>select * from dept2;sql>select * from dept1; 檢查恢複的結果 被刪除的表要恢複。 違背刪除的表,記錄都要在 4. delete AUXiliary DB刪除次要資料庫
實驗一:實驗目的:實踐TSPITR1. SQL> select * from dept1; 2. SQL> select * from dept2; 現在資料庫中有兩個表dept1和dept2。故障是資料表空間data1中的dept1被誤刪除,恢複資料表空間dept1,且不影響到資料表空間data2中的dept2 3. SQL> alter database begin backup; 4. SQL> host copy e:/ora01g/oradata/db1/*.dbf e:/backup/db1/hot 5. SQL> alter database end backup; 6. SQL> alter database backup controlfile to ‘E:/backup/db1/hot/con1.ctl’ reuse; 7. SQL> alter system archive log current; 備份好之後,立刻對資料庫做一次手工歸檔。 8. SQL> select to_char(sysdate, ‘YYYY-MM-DD HH24:MI:SS’) from dual; 取一個用於恢複的時間 9. SQL> drop table dept1; 刪除表,類比故障 10. SQL> select * from dept1; 查詢失敗 11. SQL> insert into dept2(deptno,dname) values (99,’after 1908’); 12. SQL> insert into dept2(deptno,dname) values(66,’after 1908’); 插入兩條資料,用於驗證恢複的結果是否成功。 13. 另外開啟一個終端視窗來CLONE資料庫oradim –new –sid AUXDB1 –intpwd ora123建立次要資料庫的服務 14. COPY過來初始化參數檔案,並進行修改。修改了:db_file_name_convertlog_file_name_convertbackground_dump_destuser_dump_dest control_filescore_dump_destservice_nameinstance_name 然後利用初始化參數檔案啟動資料庫 15. copy e:/backup/db1/hot/*.dbf e:/auxdb1e:/auxdb1中的data2.dbf是不需要COPY的 16. copy e:/backup/db1/hot/con1.ctl e:/auxdb1 17. copy e:/backup/db1/hot/con1.ctl e:/auxdb1/con2.ctlcopy控制檔案 18. sqlplus /nolog 19. SQL> connect sys/ora123@AUXDB1 as sysdba 20. SQL> startup nomount 21. SQL> alter database mount clone database; 22. SQL> alter database datafile ‘e:/auxdb1/system01.dbf’ online; 23. SQL> alter database datafile ‘e:/auxdb1/undotbs.dbf’ online; 24. SQL> alter database datafile ‘e:/auxdb1/sysaux01.dbf’ online; 25. SQL> alter database datafile ‘e:/auxdb1/data1.dbf’ online; 26. SQL> recover database until time ‘2006-10-17 19:08:05’ using backup controlfile; 恢複操作 沒成功,把生產資料庫再歸檔一次。 回到生產資料庫的終端視窗進行下面這個操作 SQL> alter system archive log current; 27. SQL> alter database open resetlogs; 28. SQL> select * from dept1; dept1表被恢複出來了,但目前實在次要資料庫中,接著要用exp命令匯出。 29. SQL> host exp ‘sys/ora123@AUXDB1 as sysdba’ point_in_time_recover=Y tablespaces=data1 file=data1.dmp 最後看到螢幕上顯示’Export terminated successfully without warnings’這句話,才表示匯出操作成功。 省略了檢查自包含的步驟。 30. 回到生產資料庫的終端視窗 31. SQL> alter tablespace data1 offline; 32. SQL> host copy e:/auxdb1/data1.dbf e:/ora01g/oradata/db1 33. SQL> host imp ‘sys/ora123@db1 as sysdba’ point_in_time_recover=Y datafiles=’e:/ora01g/oradata/db1/data1.dbf’ file=data1.dmp 最後看到螢幕上顯示’Import terminated successfully without warnings.’這句話,才表示匯入操作成功。 34. SQL> alter tablespace data1 online; 35. SQL> select * from dept1; 36. SQL> select * from dept2; 前面插入的兩條記錄都在,99 after 1908和66 after 1908 以下出現的頁碼與《Oracle9i 資料庫管理基礎II Ed 1.1 Vol.2.pdf》對應指南:http://blog.csdn.net/magus_yang/archive/2006/10/10/1328283.aspx P121配置ORACLE伺服器的共用模式 之前用的都是ORACLE伺服器的專用模式在專用伺服器模式下,每個使用者進程對應一個伺服器處理序。浪費資源。 在共用伺服器模式下,一個伺服器處理序可以同時為多個使用者服務。 P125除了有共用服務進程(Snnn),一定還要有發送器。 P127ORACLE共用伺服器的優點 發送器進行調度,來實現負載平衡 P128TNSNAME.ORA檔案的內容有SERVER=DEDICATED,採用專用伺服器模式。如果沒有這個參數,ORACLE會盡量採用共用伺服器模式 使用共用伺服器模式,不能發shutdown和startup命令。發這兩個命令必須用專用伺服器模式建立串連。 P129共用伺服器模式下,不能使用SET ORACLE_SID的方式來串連資料庫,而必須使用網路連接方式,因為要先串連到ORACLE的接聽程式上。 P130這圖非常重要。串連步驟使用者發出請求,請求送到監聽程式。監聽程式把請求發到三個發送器中,最空的一個發送器。所有的發送器共用一個請求隊列(一個執行個體只有一個請求隊列)。共用伺服器處理序一有空,就去請求隊列看是否有請求,有就拿來提供服務。每個發送器有它自己的響應隊列。響應隊列和發送器一一對應。ORACLE的發送器會進程到自己的響應隊列中去看,有沒有從共用伺服器處理序返回的應答,有就取出來,返回使用者進程 。整個過程中有個看不見的幽靈,叫虛擬電路circuit。共用伺服器模式下,每個使用者進程和虛擬電路(本質是記憶體中的一小塊空間)一一對應。虛擬電路的資料和會話的數目相等。一但使用者進程起來和發送器建立串連,那麼之後的請求都是這個發送器進行處理,而不會換成別的發送器。不過,共用服務進程處理請求隊列中的請求,是隨機的。每個發送器最多可以為1024個使用者服務,一般一個發送器為200個使用者服務。 P132共用伺服器模式下,共用池的大小要擴大些 P133配置共用伺服器要用到的參數。DISPATCHERS,表示在常式啟動時,要啟動多少個發送器。 SHARED_SERVERS。表示在常式啟動時,啟動多少個共用服務進程。預設為0,表示只能執行專用伺服器模式。 MAX_DISPATCHERS,系統最大啟動的發送器數。和OS有關的參數 MAX_SHARED_SERVERS,系統最大啟動的共用服務進程數 CIRCUITS,虛擬電路。 SHARED_SERVER_SESSIONS,單指共用的會話數,這個值等於SESSIONS減5,這5個留給專用伺服器。用於執行startup和shutdown等命令。 P134通過不同的協議串連,每個協議必須都建立DISPATCHER P136設定這個參數,可以動態增加發送器 P138系統啟動的時候,建立的服務進程數目。 P141CIRCUITS的大小,影響到SGA的大小 P142把SESSIONS減5,留給專用伺服器 P143LARGE_POOL_SIZESGA空間要擴大預設情況下,等於0,相關資訊都放到SHARED_POOL裡面。設定了LARGE_POOL_SIZE,相關資訊就放在LARGE_POOL中。 P145listener要偵聽發送器,也要到listener中去註冊。這個是自動註冊(DB startup後的60秒內進行註冊)。可用lsnrctl services查看是否註冊成功。 P147共用伺服器模式下,有一個請求隊列和多個響應隊列。查看隊列情況的動態視圖 在OLAP裡面,使用者數多,操作時間比較短的情況下,用共用伺服器模式比較多。在DSS資料倉儲裡面,用專用伺服器模式比較多
實驗二:實驗目的:配置共用伺服器模式ORAcle V9.2來進行的實驗。 初始化參數檔案initDB91.ora中沒有下面這些參數,資料庫起來後,只能使用專用伺服器模式shared_serviersmax_shared_serversdispatchersdispatchersdispatchersmax_dispathers 設定三個dispather,是因為它們各對應不同的協議。 1. sqlplus /nolog 2. SQL> connect sys/ora123@DB91D as sysdba 3. SQL> startup 4. SQL> host 5. lsnrctl 6. LSNRCTL> service 資料庫啟動了,這個時候就能看到DISPATCHERS都啟動了。說明DISPATCHERS是自動註冊的。 檢查資料庫中的DISPATCHER是否啟動。 並且能看到每個DISPATCHER當前各建立了多少串連。 7. LSNRCTL> exit 8. exit 9. SQL> show parameter dispatcher 查看在參數中設定的dispatcher 10. SQL> select * from v$queue;00是請求隊列,後面三個是響應隊列。TATALQ表示曾經處理過的請求數。 11. SQL> select * from v$circuit;資訊比較多 12. SQL> show parameter circuitcircuits的值是38 13. SQL> show parameter sessionssessions的值是38shared_server_sessions的值是33 14. SQL> get perf601 看服務進程的忙碌程度,使用/進行執行 具體所執行的SQL語句,在老師提供的perf601.sql檔案中。 15. SQL> alter system set shared_servers=4;強行設定共用服務進程數為4 16. SQL> desc v$shared_server 17. SQL> select name,status from v$shared_server;列出4個共用服務進程 18. SQL> alter system set shared_servers=1; 19. SQL> desc v$dispatcher 20. SQL> column network format a15 21. SQL> column status format a5 22. SQL> select name,network,status from v$dispatcher; network/admin/TNSNAMES檔案中server=shared 共用伺服器模式server=dedicated 專用伺服器模式 sysdba進去用DB91DSQL> connect sys/ora123@DB91D as sysdba保證是以專用伺服器模式進去,這樣就能shutdown了 老師提供的db10doc目錄下重要檔案有:initAUXDB1.oraTSPITR.txtstandby.txt 華騰給軌道交通系統做的容災備份資料庫。 儲存SQL語句的方法SQL>save perfcache.sql儲存在目前的目錄下 調出已儲存的SQL語句SQL> get perf602SQL> //是執行