SYSTEM 表空間管理及備份恢復
標簽: systemoraclesqldatabasefile數據庫 2010-11-28 18:14 12689人閱讀 評論(0) 收藏 舉報 分類:
版權聲明:本文為博主原創文章,歡迎擴散,擴散請務必註明出處。
--=============================
-- SYSTEM 表空間管理及備份恢復
--=============================
SYSTEM表空間是Oracle數據庫最重要的一個表空間,存放了一些DDL語言產生的信息以及PL/SQL包、視圖、函數、過程等,稱之為數據字典,
因此該表空間也具有其特殊性,下面描述SYSTEM表空間的相關特性及備份與恢復。
一、SYSTEM表空間的管理
1.建議不存放用戶數據,避免用戶錯誤導致系統表空間不可用
應當為系統設定缺省的默認表空間來避免用戶創建時使用系統表空間
ALTER DATABASE DEFAULT TABLESPACE tablespace_name
SQL> col property_value format a30
SQL> select property_name,property_value from database_properties
2 where property_name like ‘DEFAULT%‘;
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------------------
DEFAULT_TEMP_TABLESPACE TEMP
DEFAULT_PERMANENT_TABLESPACE USERS --此處應當為非SYSTEM表空間
DEFAULT_TBS_TYPE SMALLFILE
2.SYSTEM表空間特性
不能脫機offline
不能置為只讀read only
不能重命名
不能刪除
--演示不能脫機
SQL> alter tablespace system offline;
alter tablespace system offline
*
ERROR at line 1:
ORA-01541: system tablespace cannot be brought offline; shut down if necessary
SQL> alter database datafile 1 offline;
alter database datafile 1 offline
*
ERROR at line 1:
ORA-01541: system tablespace cannot be brought offline; shut down if necessary
--不能置為只讀狀態
SQL> alter tablespace system read only;
alter tablespace system read only
*
ERROR at line 1:
ORA-01643: system tablespace can not be made read only
--不能重命名
SQL> alter tablespace system rename to system2;
alter tablespace system rename to system2
*
ERROR at line 1:
ORA-00712: cannot rename system tablespace
--不能刪除
SQL> drop tablespace system;
drop tablespace system
*
ERROR at line 1:
ORA-01550: cannot drop system tablespace
SQL> drop tablespace system including contents and datafiles;
drop tablespace system including contents and datafiles
*
ERROR at line 1:
ORA-01550: cannot drop system tablespac
總結:system表空間就一句話,普通表空間所具有的更名、刪除、只讀、脫機不為system表空間所擁有
3.空間管理
保證空間可用,一般存放單個數據文件。設置為自動擴展
如果SYSTEM表空間數據文件很大,可以考慮使用bigfile
使用下面的視圖來獲取表空間的相關狀態,使用空間等等
dba_data_files
dba_tablespaces
dba_free_space
v$datafiles
v$tablespace
--查看表空間的大小及已用大小
SQL> select tablespace_name,bytes/1024/1024 cur_size,user_bytes/1024/1024 as user_bytes,status,online_status
2 from dba_data_files;
TABLESPACE_NAME CUR_SIZE USER_BYTES STATUS ONLINE_
------------------------------ ---------- ---------- --------- -------
USERS 5 4.9375 AVAILABLE ONLINE
SYSAUX 250 249.9375 AVAILABLE ONLINE
UNDOTBS1 35 34.9375 AVAILABLE ONLINE
SYSTEM 500 499.9375 AVAILABLE SYSTEM
EXAMPLE 100 99.9375 AVAILABLE ONLINE
--查看表空間的剩余空間
SQL> select tablespace_name,sum(bytes/1024/1024)
2 from dba_free_space group by tablespace_name;
TABLESPACE_NAME SUM(BYTES/1024/1024)
------------------------------ --------------------
UNDOTBS1 11.6875
SYSAUX 2.125
USERS 2
SYSTEM 10.125
EXAMPLE 31.75
--查看已用空間的百分比
select a.tablespace_name, round((sizea-sizeb),2) as used_space, round(sizeb,2) ||‘ MB‘ as free_space,
round((sizea-sizeb)/sizea*100,2) ||‘%‘ as used_percent
from
(select tablespace_name,bytes/1024/1024 sizea from dba_data_files) a
inner join
(select tablespace_name,sum(bytes/1024/1024) sizeb
from dba_free_space group by tablespace_name) b
on a.tablespace_name = b.tablespace_name
order by a.tablespace_name;
二、SYSTEM表空間的冷備與恢復
關於數據庫的冷備份請參考: Oracle 冷備份
關於如何切換歸檔模式請參考:Oracle 歸檔日誌
因僅僅涉及SYSTEM表空間的備份與恢復,在此僅僅備份SYSTEM表空間
1.非歸檔模式下的備份與恢復
--查看歸檔模式
SQL> select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG
--關閉數據庫後備份system01.dbf文件到指定備份目錄
SQL> shutdown immediate;
SQL> ho cp $ORACLE_BASE/oradata/orcl/system01.dbf $ORACLE_BASE/coolbak/
--基於非系統表空間創建表tb
SQL> startup
SQL> create table tb tablespace users as select * from scott.emp;
SQL> select count(1) from tb;
COUNT(1)
----------
14
--多次切換日誌直到日誌組被清空
SQL> alter system switch logfile;
--刪除system01.dbf文件
SQL> ho rm $ORACLE_BASE/oradata/orcl/system01.dbf
--強制啟動後出現錯誤提示
SQL> startup force;
ORACLE instance started.
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: ‘/u01/app/oracle/oradata/orcl/system01.dbf‘
--還原system表空間的數據文件
SQL> ho cp $ORACLE_BASE/coolbak/system01.dbf $ORACLE_BASE/oradata/orcl/
--基於放棄的恢復system01.dbf
SQL> recover database until cancel;
ORA-00279: change 677850 generated at 08/15/2010 14:00:36 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2010_08_15/o1_mf_1_10_%u_.arc
ORA-00280: change 677850 for thread 1 is in sequence #10
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel --系統提示成功恢復需要使用RESETLOGS打開數據庫
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 2 needs more recovery to be consistent--提示數據文件需要執行一致性恢復,有些數據在undo表空間丟失
ORA-01110: data file 2: ‘/u01/app/oracle/oradata/orcl/undotbs01.dbf‘
ORA-01112: media recovery not started
--由於沒有備份datafile 2,因此啟用隱藏參數_allow_resetlogs_corruption
SQL> alter system set "_allow_resetlogs_corruption" = true scope = spfile; --此參數為靜態參數,需要設置scope
SQL> startup force;
ORACLE instance started.
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
--使用resetlogs打開數據庫時系統異常終止
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error
SQL> exit; --退出
--重新登錄後可以正常啟動
[[email protected] ~]$ sqlplus / as sysdba
SQL> startup
ORACLE instance started.
Database mounted.
Database opened.
--關閉隱藏參數_allow_resetlogs_corruption
SQL> alter system reset "_allow_resetlogs_corruption" scope =spfile sid =‘*‘;
--提交的事務因日誌被清空,數據丟失
SQL> select count(1) from tb;
select count(1) from tb
*
ERROR at line 1:
ORA-00942: table or view does not exist
2.歸檔模式下的備份與恢復
--獲得system表空間的路徑後一致性關閉數據庫並復制system表空間數據文件到備份路徑
SQL> col name format a55
SQL> select name from v$datafile where file# = 1;
NAME
-------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
SQL> shutdown immediate;
SQL> ho cp $ORACLE_BASE/oradata/orcl/system01.dbf $ORACLE_BASE/coolbak/
--查看日誌歸檔模式
SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
--刪除system01.dbf
SQL> ho rm $ORACLE_BASE/oradata/orcl/system01.dbf;
--system01.dbf文件丟失後,下面可以查詢users表空間的數據
SQL> select count(1) from scott.emp;
COUNT(1)
----------
14
--基於system表空間創建表並插入數據,提示system表空間的數據文件丟失,無法創建該表
SQL> create table tb_test tablespace system as select * from dba_segments ;
create table tb_test as select * from dba_segments
*
ERROR at line 1:
ORA-01116: error in opening database file 1
ORA-01110: data file 1: ‘/u01/app/oracle/oradata/orcl/system01.dbf‘
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
--可以基於非system表創建對象,如下在users表空間創建表tb_test
SQL> create table tb_test tablespace users as select * from scott.emp;
SQL> select count(1) from tb_test;
COUNT(1)
----------
14
--下面給帳戶解鎖時收到system01.dbf丟失的錯誤,因為帳戶信息存儲在system表空間
SQL> alter user hr account unlock;
alter user hr account unlock
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 2
ORA-01116: error in opening database file 1
ORA-01110: data file 1: ‘/u01/app/oracle/oradata/orcl/system01.dbf‘
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
--開啟另外一個會話,可以連接,但出現以下錯誤提示
SQL> conn scott/tiger;
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-01116: error in opening database file 1
ORA-01110: data file 1: ‘/u01/app/oracle/oradata/orcl/system01.dbf‘
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
--無法一致性關閉數據庫
SQL> shutdown immediate;
ORA-01116: error in opening database file 1
ORA-01110: data file 1: ‘/u01/app/oracle/oradata/orcl/system01.dbf‘
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
SQL> shutdown abort; --強制關閉數據庫
ORACLE instance shut down.
--還原system表空間的數據文件
SQL> ho cp $ORACLE_BASE/coolbak/system01.dbf $ORACLE_BASE/oradata/orcl/
--恢復system表空間的數據文件
SQL> recover datafile 1;
Media recovery complete.
SQL> alter database open;
--由於日誌沒有丟失,因此已提交的事務保持一致性
SQL> select count(1) from tb_test;
COUNT(1)
----------
14
總結:
a.非歸檔模式下,由於聯機重做日誌的循環使用規則,一些已經寫入日誌但尚未及時更到數據文件的數據信息在故障發生後將丟失
因此僅僅能恢復到表空間(此處為system表空間)備份的時刻,而歸檔模式下可以恢復到指定或最新時刻
b.當system表空間丟失後,涉及到system表空間的數據字典將不可用,也不可在system表空間添加對象
c.使用了resetlogs重置了日誌文件,建議一致性關閉數據庫後,立即全備數據庫
三、SYSTEM表空間的熱備與恢復
由於非歸檔模式容易造成數據的丟失,而且生產數據庫一般采用歸檔模式,因此在此不再考慮非歸檔模式下的備份與恢復處理
--查看日誌歸檔模式
SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
--在session1中開始system表空間的熱備模式
SQL> alter tablespace system begin backup;
--在session2中創建表tb_seg
SQL> show user;
USER is "LION"
SQL> create table tb_seg tablespace users as select * from dba_segments;
--在session1中進行熱備到指定路徑
SQL> ho cp $ORACLE_BASE/oradata/orcl/system01.dbf $ORACLE_BASE/hotbak/
--在session2中清空剛剛創建的tb_seg表
SQL> delete from tb_seg;
SQL> commit;
--在session1中關閉熱備模式,並刪除system01.dbf
SQL> alter tablespace system end backup;
SQL> ho rm $ORACLE_BASE/oradata/orcl/system01.dbf
--在session2中繼續會話並執行下列操作
SQL> insert into tb_seg select * from dba_segments where rownum<6;
SQL> commit;
SQL> select count(1) from tb_seg;
COUNT(1)
----------
5
--強制啟動數據
SQL> startup force;
ORACLE instance started.
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: ‘/u01/oracle/oradata/orcl/system01.dbf‘
--還原system表空間的數據文件
SQL> ho cp $ORACLE_BASE/hotbak/system01.dbf $ORACLE_BASE/oradata/orcl/
--執行介質恢復
SQL> recover datafile 1;
Media recovery complete.
SQL> alter database open ;
--驗證恢復,表tb_seg的數據正確
SQL> select count(1) from lion.tb_seg;
COUNT(1)
----------
5
四、基於RMAN,SYSTEM表空間的備份與恢復
1.在使用RMAN備份表空間,數據文件時,邏輯上等同於使用Oracle的熱備份,只不過RMAN是將表空間、數據文件進行打包封裝到一個備
份集多個備份片之中。事實上,在備份system表空間與備份普通表空間是一樣的,但使用RMAN備份system表空間時,RMAN會自動備份控制文件
以及spfile文件。RMAN使用backup datafile 1(backup database)一條命令來代替將表空間置於熱備以及手動復制文件的過程
2.對於RMAN下system表空間的還原與恢復,與冷備,熱備模式所不同的是,還原時並不需要實現手工拷貝備份文件至原始位置,一旦
發布restore指令,RMAN會自動尋找該表空間最新備份的數據,並完成還原操作。其次使用recover指令來完成介質恢復。
3.如上描述,使用RMAN備份system表空間與熱備模式大同小異,故不再演示,請參考下面給出的相關鏈接。
五、更多參考
有關基於用戶管理的備份和備份恢復的概念請參考:
Oracle 冷備份
Oracle 熱備份
Oracle 備份恢復概念
Oracle 實例恢復
Oracle 基於用戶管理恢復的處理(詳細描述了介質恢復及其處理)
有關RMAN的恢復與管理請參考:
RMAN 概述及其體系結構
RMAN 配置、監控與管理
RMAN 備份詳解
RMAN 還原與恢復
有關Oracle體系結構請參考:
Oracle 實例和Oracle數據庫(Oracle體系結構)
Oracle 表空間與數據文件
Oracle 密碼文件
Oracle 參數文件
Oracle 數據庫實例啟動關閉過程
Oracle 聯機重做日誌文件(ONLINE LOG FILE)
Oracle 控制文件(CONTROLFILE)
Oracle 歸檔日誌
SYSTEM 表空間管理及備份恢復