天天看點

SYSTEM 表空間管理及備份恢複

--=============================

-- 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

            --不能置為隻讀狀态

                SQL> alter tablespace system read only;

                alter tablespace system read only

                ORA-01643: system tablespace can not be made read only

            --不能重命名

                SQL> alter tablespace system rename to system2;

                alter tablespace system rename to system2

                ORA-00712: cannot rename system tablespace

            --不能删除

                SQL> drop tablespace system;

                drop tablespace system

                ORA-01550: cannot drop system tablespace

                SQL> drop tablespace system including contents and datafiles;

                drop tablespace system including contents and datafiles

                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表空間的冷備與恢複

        因僅僅涉及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

            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

            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

                                 *

            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

        --檢視日志歸檔模式

            ARCHIVELOG

        --删除system01.dbf

            SQL> ho rm $ORACLE_BASE/oradata/orcl/system01.dbf;

        --system01.dbf檔案丢失後,下面可以查詢users表空間的資料

            SQL> select count(1) from scott.emp;

                    14 

        --基于system表空間建立表并插入資料,提示system表空間的資料檔案丢失,無法建立該表

            SQL> create table tb_test tablespace system as select * from dba_segments ;

            create table tb_test as select * from dba_segments

               *

            ORA-01116: error in opening database file 1

            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;

        --下面給帳戶解鎖時收到system01.dbf丢失的錯誤,因為帳戶資訊存儲在system表空間

            SQL> alter user hr account unlock;

            alter user hr account unlock

            ORA-00604: error occurred at recursive SQL level 2

        --開啟另外一個會話,可以連接配接,但出現以下錯誤提示

            SQL> conn scott/tiger;

            ERROR:

            ORA-00604: error occurred at recursive SQL level 1

        --無法一緻性關閉資料庫

            SQL> shutdown immediate;  

            SQL> shutdown abort;    --強制關閉資料庫

            ORACLE instance shut down.

        --還原system表空間的資料檔案

        --恢複system表空間的資料檔案

            SQL> recover datafile 1;

            Media recovery complete.

            SQL> alter database open;

        --由于日志沒有丢失,是以已送出的事務保持一緻性

    總結:

        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> 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;

四、基于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表空間與熱備模式大同小異,故不再示範,請參考下面給出的相關連結。

五、更多參考

    有關基于使用者管理的備份和備份恢複的概念請參考:

    有關RMAN的恢複與管理請參考:

    有關Oracle體系結構請參考:

<a href="http://blog.csdn.net/robinson_0612/archive/2010/04/29/5542983.aspx">Oracle 資料庫執行個體啟動關閉過程</a>