標籤:
一、建立非標準塊的資料表空間
在資料庫中可以建立不同於資料庫標準塊大小的資料表空間,這個特徵可以在兩個具有不同塊大小的資料庫之間傳輸資料表空間。在建立非標準塊資料表空間之前,必須保證設定了DB_CACHE_SIZE和至少一個DB_nK_CACHE_SIZE初始化參數,DB_nK_CACHE_SIZE即為非標準塊資料表空間的塊大小。
# 查看參數db_16k_cache_size系統預設值,預設值為0,表示未啟用。show parameter db_16k_cache_sizeNAME TYPE VALUE--------------------- -------------------- -------------------db_16k_cache_size big integer 0# 建立非標準塊的緩衝區,在測試過程中,即使指定的非標準塊大小是4M,系統會自動給出一個最小的32M大小。alter system set db_16k_cache_size=4M scope=both;System altered.show parameter db_16k_cache_sizeNAME TYPE VALUE-------------------- -------------------- --------------------db_16k_cache_size big integer 32M# 添加資料庫塊為16K的非標準塊資料表空間create tablespace test_spc datafile ‘/u01/app/oracle/oradata/orcl/test01.dbf‘ size 100M uniform size 1M blocksize 16K;
二、控制重做記錄的產生
對於資料庫的一些操作,我們可以控制重做記錄的產生,當然,如果沒有重做記錄,介質恢複將無法進行。然而不生產重做記錄可以提高效能,並且對於某些容易恢複的操作來說這種方式可能是適當的。例如這樣的語句:create table ... as select 。預設情況下,對錶空間內的任何對象上進行操作都會產生重做記錄。但是,在建立資料表空間時,使用nologging子句將阻止重做記錄的產生。不管是否指定nologging祖居,在臨時段或者暫存資料表空間從來都不會產生重做記錄。
如果對錶空間設定為不產生重做日誌,而資料表空間上的對象則設定為產生重做日誌,例如:create table ... logging ,則對象上的設定覆蓋資料表空間上的設定;如果在資料表空間上使用force logging(強制產生重做記錄),則在資料表空間級的設定將覆蓋在任何對象級進行的設定,即:如果在資料表空間上設定強制產生重做記錄,那麼在資料表空間內的對象上再設定nologging是無效的。
注意:如果force logging模式的資料表空間傳輸到另外的資料庫,那麼force logging模式將會失效。
三、調整資料表空間的可用性
對於普通使用者來說,如果資料表空間離線(offline),則意味著資料表空間及其對象將無法訪問,但此時資料庫內的其他資料時可以訪問的;同樣的,也可以讓資料表空間線上(online),使使用者恢複對其的訪問。修改資料表空間的線上或離線狀態時,資料庫必須處於開啟狀態。通過使用alter tablespace ... online/offline語句調整資料表空間的線上或離線狀態。
1、何時需要進行資料表空間離線的操作
- 資料庫內部分資料不可用時,為了保證使用者可以正常訪問其他資料,這時可以使相關資料表空間離線。
- 執行資料表空間離線備份時,可以設定相關資料表空間離線。
- 在應用程式維護或更新時,可以設定該應用的相關資料表空間離線。
- 重新命名(修改儲存位置)資料檔案數,可以設定相關資料表空間離線。
2、以下資料表空間無法進行離線操作
- 系統資料表空間,system
- 撤銷資料表空間,undo
- 暫存資料表空間,temporary
3、資料表空間離線方式
# for recover 的作用同immediate類似,10g以後不建議使用alter tablespace <tablespace_name> offine normal | temporary | immediate | for recover;
下表為資料表空間離線方式中有關參數的說明:
| 參數 |
作用描述 |
| normal |
資料表空間正常離線,在所有資料表空間的所有資料檔案上執行檢查點操作,當資料表空間online,不需要進行介質恢複 |
| temporary |
對錶空間線上的資料檔案進行檢查點操作,離線資料檔案不進行檢查點,當資料表空間online,執行檢查點的資料檔案不需要進行介質恢複 |
| immediate |
在所有資料檔案上不執行檢查點,資料表空間online,需要執行檢查點,無法在noarchivelog上使用immediate方式offline資料表空間 |
以下內容為測試結果:
SQL> alter tablespace test_tbs01 offline normal;Tablespace altered.SQL> alter tablespace test_tbs01 online;Tablespace altered.SQL> alter tablespace test_tbs01 offline temporary;Tablespace altered.SQL> alter tablespace test_tbs01 online;Tablespace altered.SQL> archive log listDatabase log mode No Archive ModeAutomatic archival DisabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 1Current log sequence 2SQL> alter tablespace test_tbs01 offline immediate;alter tablespace test_tbs01 offline immediate*ERROR at line 1:ORA-01145: offline immediate disallowed unless media recovery enabled
四、唯讀資料表空間
所有的資料表空間在建立時預設都是可讀寫的(read write),同時使用read only選項可以講資料表空間置為唯讀狀態。唯讀資料表空間可以阻止對錶空間內資料檔案的寫操作,其主要目的是為了避免對大型資料庫的靜態部分執行備份和恢複操作。另外,唯讀資料表空間提供了一種曆史資料的儲存方法,在唯讀資料表空間內,任何對象都無法修改,而不論使用者是否有更新的許可權。(粗體部分的闡述和實驗結果衝突)
有關唯讀資料表空間的操作限制:
# 唯讀資料表空間不允許建立對象。SQL> create table t3 (rec_id number,name varchar(4)) tablespace ro_tbs;create table t3 (rec_id number,name varchar(4)) tablespace ro_tbs*ERROR at line 1:ORA-01647: tablespace ‘RO_TBS‘ is read only, cannot allocate space in it# 唯讀資料表空間不允許修改記錄。SQL> update t2 set name=‘Blank‘ where id=2002;update t2 set name=‘Blank‘ where id=2002 *ERROR at line 1:ORA-00372: file 7 cannot be modified at this timeORA-01110: data file 7: ‘/u01/app/oracle/oradata/stdb/read_only.dbf‘# 唯讀資料表空間不允許刪除記錄。SQL> delete from t2 where id=2002;delete from t2 where id=2002 *ERROR at line 1:ORA-00372: file 7 cannot be modified at this timeORA-01110: data file 7: ‘/u01/app/oracle/oradata/stdb/read_only.dbf‘# 唯讀資料表空間允許刪除表。SQL> drop table t2;Table dropped.# 唯讀資料表空間允許修改對象。SQL> alter table t3 modify (name varchar(10));Table altered.
在將資料表空間置為唯讀之前應考慮如下的前提條件:
1、資料表空間必須線上,而且必須確保沒有要應用到資料表空間上的撤銷資訊。(資料表空間上的事務都應被提交)
SQL> alter tablespace test_tbs01 offline normal;Tablespace altered.SQL> alter tablespace test_tbs01 read only;alter tablespace test_tbs01 read only*ERROR at line 1:ORA-01539: tablespace ‘TEST_TBS01‘ is not online
2、不能將活動事務的撤銷資料表空間和系統資料表空間置為唯讀。
3、如果當前資料表空間正在聯機備份,不能將該資料表空間置為唯讀狀態,因為在備份結束後會更新資料表空間上所有資料檔案的檔案頭資訊。
當執行alter tablespace ... read only語句之前,在該資料表空間上有一事務掛起或未被提交,該語句將等待資料表空間上的事務提交或復原後才會返回;如果在執行alter tablespace ... read only語句之前,資料表空間上的事務掛起或未被提交,但某一時刻該交易回復到了一個儲存點(savepoint),則此時將執行事務的復原,alter tablespace ... read only語句不再等待該事務。如果發現alter tablespace ... read only語句長時間無法返回,則需要判斷是否有事務阻止了該語句的完成,並通知事務的所有者,必要時,中斷這些事務。
SQL> select sql_text,saddr from v$sqlarea,v$session 2 where v$sqlarea.address=v$session.sql_address 3 and sql_text like ‘alter tablespace%‘;SQL_TEXT SADDR-------------------------------------------------- ----------------alter tablespace test_tbs01 read only 0000000070F6FE40 --> //這是將資料表空間置為唯讀語句的會話地址SQL> select ses_addr,start_scnb from v$transaction order by start_scnb;SES_ADDR START_SCNB---------------- ----------0000000070F829F0 643505 --> //這是將資料表空間置為唯讀狀態之前的操作0000000070F6FE40 643536 --> //這是將資料表空間置為唯讀語句SQL> select t.ses_addr,s.username,s.machine from v$session s,v$transaction t 2 where t.ses_addr=s.saddr 3 order by t.ses_addr;SES_ADDR USERNAME MACHINE---------------- ------------------------------ --------------------0000000070F6FE40 SYS stdb.localdomain0000000070F829F0 SYS stdb.localdomain --> //需要中斷這個動作表空間才能被置為唯讀
Oracle資料表空間基礎(4)