--=============================
-- 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; --退出
--重新登入後可以正常啟動
[oracle@robinson ~]$ 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視頻教程請關注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html