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
*
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表空間與熱備模式大同小異,故不再演示,請參考下面給出的相關連結。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31520497/viewspace-2156847/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【PG備份恢復】pg_basebackup 多表空間備份恢復測試
- Oracle RMAN 表空間恢復Oracle
- PostgreSQL從小白到高手教程 - 第41講:postgres表空間備份與恢復SQL
- 表空間TSPITR恢復-實驗
- 【Oracle 恢復表空間】 實驗Oracle
- innobackupex 部分表備份和恢復
- docker 中 MySQL 備份及恢復DockerMySql
- 【mysqldump】mysqldump及備份恢復示例MySql
- 2.5.3 建立本地管理的SYSTEM表空間
- RAC備份恢復之Voting備份與恢復
- MySQL 遷移表空間,備份單表MySql
- Mysql資料庫備份及恢復MySql資料庫
- 磁碟資料恢復及備份工具資料恢復
- 【MySQL】Xtrabackup備份及恢復指令碼MySql指令碼
- 【Xtrabackup】Xtrabackup全備、增量備份及恢復示例
- MySQL 日誌管理、備份與恢復MySql
- MySQL日誌管理,備份和恢復MySql
- 備份與恢復:polardb資料庫備份與恢復資料庫
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql
- (Les16 執行資料庫恢復)-表空間恢復資料庫
- 使用Xtrabackup完整備份中恢復單表
- 備份和恢復
- mydumper備份恢復
- Mysql備份恢復MySql
- [20210527]rman與undo表空間備份.txt
- 詳解叢集級備份恢復:物理細粒度備份恢復
- MySQL備份與恢復——基於MyDumper/MyLoader 邏輯備份恢復MySql
- Mysql備份與恢復(1)---物理備份MySql
- PostgreSQL備份恢復管理器pg_probackupSQL
- MySQL 備份與恢復MySql
- redis 備份和恢復Redis
- RMAN備份恢復技巧
- Jenkins備份與恢復Jenkins
- KunlunDB備份和恢復
- Grafana 備份恢復教程Grafana
- rman 增量備份恢復
- Postgresql 備份與恢復SQL
- MySQL備份與恢復——基於OUTFILE /LOAD DATA 邏輯備份恢復MySql