資料庫
控制檔案
描述
二進位制小檔案,記錄資料庫當前物理狀態,記錄RMAN備份的後設資料
在mount階段被讀取,維護資料庫的一致性
引數
control_file
檢視
v $controlfile ;
v $controlfile_record_section ;
實時更新
增加、刪除、刪除一個資料檔案或者一個聯機日誌檔案時,伺服器程式會立即更新控制檔案
日誌寫程式LGWR將當前日誌序列號記錄到控制檔案中
檢查點程式CKPT將檢驗點的資訊記錄到控制檔案
歸檔程式ARCn將歸檔日誌的資訊記錄到控制檔案
多路複用,控制檔案備份 3 個以上,不超過 8 個
1、修改引數 control_files (注意備份spfile)
2、SQL> shutdown immediate
3、複製控制檔案,建議儲存在不同物理磁碟上,多個控制檔案的版本、scn保持一致
轉儲(pump)控制檔案並分析
SQL> alter session set events 'immediate trace name controlf level 12';
SQL> select * from v$diag_info;
note:
alter session set events 詳解
https://blog.csdn.net/jlds123/article/details/8746761
備份,資料庫開啟狀態,不允許複製控制檔案
SQL> alter database backup controlfile to '/u01/oradata/prod/con.bak';
重建,mount或open狀態,生成一個trace檔案
可以在mount或open模式生成一個trace檔案,方便重建控制檔案:
①Default Trace File
SQL> alter database backup controlfile to trace;
②自定義
SQL>alter database backup controlfile to trace as '/u01/oradata/prod/con.trace';
恢復,nomount狀態下
第一步、Mount或open下生成trace指令碼
SQL>alter database backup controlfile to trace as '/u01/oradata/prod/con.trace';
第二步、啟動到 nomount 狀態下準備執行trace指令碼
SQL> startup force nomount
第三步、執行重建控制檔案語句
SQL>CREATE CONTROLFILE REUSE DATABASE "prod" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oradata/prod/redo01.log' SIZE 50M,
GROUP 2 '/u01/oradata/prod/redo02.log' SIZE 50M,
GROUP 3 '/u01/oradata/prod/redo03.log' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'/u01/oradata/prod/system01.dbf',
'/u01/oradata/prod/sysaux01.dbf',
'/u01/oradata/prod/users01.dbf',
'/u01/oradata/prod/example01.dbf',
'/u01/oradata/prod/test01.dbf',
'/u01/oradata/prod/undotbs01.dbf'
CHARACTER SET ZHS16GBK ;
三個控制檔案重新建立,資料庫在 mount 狀態
說明:這個重建控制檔案的過程主要有兩大部分內容:
第一部分是指令碼中的可見資訊:
1)定義db_name,
2)指定幾個引數限定控制檔案的最大值,
3)線上日誌的物理資訊,
4)資料檔案的物理資訊,
5)使用的字符集。
第二部分是隱含的不可見資訊,比如SCN資訊,重建複製了當前所有資料檔案頭部的最新SCN資訊複製到了控制檔案中。以便接下來開啟資料庫。
SQL> select file#,checkpoint_change# from v $datafile ;
SQL> select file#,checkpoint_change# from v $datafile_header ;
第四步、開啟資料庫
SQL> alter database open;
第五步、新增臨時資料檔案資訊(指令碼中的最後一行)
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oradata/prod/temp01.dbf'
SIZE 30408704 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
redo log 檔案
以組的方式管理redo log file ,至少 2 組,迴圈使用,寫滿時自動切換
歸檔模式連續儲存歷史日誌,非歸檔模式覆蓋歷史日誌
切換產生checkpoint,觸發dbwn寫髒塊到資料檔案,寫日誌到歸檔檔案(歸檔模式),並更新控制檔案
記錄資料庫的變化(DDL,DML)
用於資料塊的 recover
需要讀寫速度快的磁碟(比如RAID10),儲存於與資料檔案不同的磁碟
檢視
SQL> select * from v $log ;
SQL> select group#,member,status from v $logfile ;
SQL> select name , sequence# from v $archived_log ;
增加組
SQL> alter database add logfile group 4 '/u01/oradata/prod/redo04.log' size 50m;
新增組成員,一共4組
建立檔案
$ mkdir -p /u01/disk2/prod
增加成員
SQL> alter database add logifle member
'/u01/disk2/prod/redo01b.log' to group 1,
'/u01/disk2/prod/redo02b.log' to group 2,
'/u01/disk2/prod/redo03b.log' to group 3,
'/u01/disk2/prod/redo04b.log' to group 4;
同步,invalid狀態,需要同步
SQL> alter system switch logfile; -- 4組,至少4次
恢復
四種狀態
unused , inactive , active , current
inactive組損壞
SQL> alter database clear logfile group 4
current組損壞
資料庫未崩潰
SQL> alter system checkpoint ; -- 完全檢查點,髒資料寫入到資料檔案
SQL> alter database clear unarchived logfile group n;
完成後需要做資料庫 完全備份 ,因為日誌無法保證連續性
資料庫崩潰,執行基於日誌的不完全恢復或者閃回資料庫
SQL> recover database until cancel;
SQL> alter database open resetlogs;
完成後需要做資料庫 完全備份
active組損壞
SQL> alter system chekpoint
成功,然後按照inactive步驟恢復
失敗,然後按照current步驟恢復
刪除日誌組,current和active狀態的不允許刪除,需要switch
SQL> alter database drop logfile group 4;
刪除成員,current狀態的組不允許刪除,需要switch
SQL> alter database drop logfile member '/u01/disk2/prod/redo01.log'
刪除日誌檔案,直接刪除檔案
archive log 檔案
SQL> archive log list
設定歸檔
SQL> shutdown immediate 一定要乾淨的關閉資料庫
SQL> startup mount 啟動到mount下
SQL> alter database archivelog; 設定歸檔方式
SQL> archive log list; 檢視歸檔狀態
SQL> alter database open; 開啟資料庫
歸檔路徑優先順序
log_archive_dest_n 或 log_archive_dest
db_recovery_file_dest
$ORACLE_HOME/dbs
log_archive_format --格式化歸檔檔名
%t thread# 日誌執行緒號
%s sequence 日誌序列號
%r resetlog 代表資料庫的週期
設定 log_archive_log:
本地
SQL> alter system set log_archive_dest_1='location=/u01/arch';
遠端
alter system set log_archive_dest_2='service=standby'; --standby為連線符
切換日誌
SQL> alter system switch logfile;
SQL> alter system archive log current; --RAC下切換所有例項,適用於歸檔模式
undo
描述
回滾事務,讀一致性,例項恢復,閃回
引數
undo_management
undo_retention
undo_tablespace
檢視
v $session 檢視使用者建立的session
v $transaction 當前的事務
v $rollname undo段的名稱
v $rollstat undo段的狀態
v $undostat 檢視每10分鐘的統計資料
dba_undo_extents 檢視undo段中不同狀態的空間佔用
dba_rollback_segs 資料字典裡記錄的undo段狀態
檢視正在使用的回滾段
SQL> select * from v$rollname
刪除未啟用的undo
SQL> drop tablespace undotbs1 including contents and datafiles;
重用機制
active unexpired expired free
undo_retention
避免 空間不足 和 快照過舊 的錯誤
SQL> select begin_time,tuned_undoretention from v$undostat;
autoextend on , 參考undo_retention作為下限值,TUNED_UNDORETENTION期內,以擴充套件空間代替覆蓋unexpired,基本避免了ora-30036,ora-01555
guarantee,預設noguarantee
SQL> alter tablespace undotbs2 retention guarantee; --保證在retention 期間不允許被覆蓋
SQL> alter tablespace undotbs2 retention noguarantee;
checkpoint
描述
保證資料庫一致性
縮短例項恢復時間
90% OF SMALLEST REDO LOG(內部機制),從上次切換後算起,累計日誌為一個日誌組大小的90%時,做一次檢查點切換
3)每3s檢視checkpoint佇列髒塊的寫出進度,3s並不觸發檢查點,它只是記錄當時的檢查點位置,並將相關資訊寫入到controlfile
引數
FAST_START_MTTR_TARGET
完全檢查點
記下當前的scn, 將此scn之前所有的髒塊一次性寫完,再將該scn號同步更新控制檔案和資料檔案頭
做一下alter system checkpoint,然後觀察v$datafile和v$datafile_header中scn被更新
觸發完全檢查點的四個操作
①正常關閉資料庫:shutdown immediate
②手動檢查點切換:alter system checkpoint;
③日誌切換:alter system switch logfile;
④資料庫熱備模式:alter database begin backup;
增量檢查點
使能例項恢復顧問(MTTR Advisory)。需要設定兩個引數
1)STATISTICS_LEVEL 置為typical(預設) 或者all
2)FAST_START_MTTR_TARGET 置為非零值
合理的設定MTTR引數,可以參考檢視 v$instance_recovery的估算值
SQL> select recovery_estimated_ios,actual_redo_blks,target_redo_blks,target_mttr,estimated_mttr from v $instance_recovery ;
邏輯結構
表空間
建立表空間
SQL> create tablespace a datafile '/u01/oradata/prod/a01.dbf' size 10m;
dbms_metadata.get_ddl包檢視預設選項
SQL> set serverout on;
SQL>
declare
aa varchar2(2000);
begin
select dbms_metadata.get_ddl('TABLESPACE','B') into aa FROM dual;
dbms_output.put_line(aa);
end;
/
------
CREATE TABLESPACE "A" DATAFILE
'/u01/oradata/prod/a01.dbf' SIZE 10485760
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE --區本地管理且自動分配空間
SEGMENT SPACE MANAGEMENT AUTO --段自動管理
dbms_metadata.get_ddl也可以檢視錶
表空間的刪除
SQL> drop tablespace test including contents and datafiles;
表空間的offline
SQL> alter tablespace test offline;
資料庫OPEN下不能刪除的表空間
①system ②active undo tablespace ③default temporary tablespace ④default tablespace
資料庫OPEN下不能offine的表空間
①system ②active undo tablespace ③default temporary tablespace
檢視錶空間大小
SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_data_files group by tablespace_name;
檢視錶空間空閒大小
SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;
表空間(資料檔案)是否自動擴充套件
SQL> select file_name,tablespace_name,autoextensible from dba_data_files;
段
一個段比較大時可以跨多個資料檔案
ASSM(自動管理)使用點陣圖狀態位取代了MSSM(手動管理)的pctused
分割槽、索引有獨立的段空間,大物件有獨立的段空間
延遲段
DEFERRED_SEGMENT_CREATION=TRUE --延遲
區
字典管理(已淘汰)
SQL> select segment_name,file_id,extent_id,blocks,block_id,bytes/1024/1024 mb from dba_extents where segment_name='T1';
預先分配空間
可以根據需要預先分配一些extent
SQL>alter table scott.t1 allocate extent (datafile '/u01/oradata/prod/test01.dbf' size 5m);
注意:預分配的空間一定是在表空間可達到的size範圍內
回收free extent, 使用deallocate,
SQL> alter table scott.t1 deallocate unused ;
注意:只能收回從未使用的extent
塊
構成上分為block header、free space、data
行遷移是update語句當pctfree空間不足時引起的,它與insert和delete語句無關
如何知道發生了行連結或行遷移
檢視dba_tables的AVG_ROW_LEN列和CHAIN_CNT列
當CHAIN_CNT有值時,看AVG_ROW_LEN,它表示行的平均長度(byte)
如果AVG_ROW_LEN<塊大小,發生的是行遷移,否則可能有行連結
多種方法可以降低HWM:①移動表,②收縮表,③匯入匯出表,④線上重定義表
alter table t1 move [tablespace users]; --需要額外(一倍)的空間,索引需要重建
alter table t2 shrink space [cascade][compact];
優點:使用點陣圖管理,更合理的重新利用空閒塊
缺點:要求段管理是ASSM方式,表啟用row movement
臨時表空間
快取排序的資料(中間結果)
調整表空間大小
resize
add datafile
SQL> alter database datafile '/u01/oradata/prod/prod01.dbf' autoextend on next 10m maxsize 500m;
可恢復表空間resumble
兩個級別設定resumable
①system級別: RESUMABLE_TIMEOUT 非 0
②session級別:alter session enable|disable resumable [TIMEOUT];
檢視檢視的有關資訊
SQL> select session_id,sql_text,error_number from dba_resumable;
SESSION_ID SQL_TEXT ERROR_NUMBER
---------- --------------- ------------
136 INSERT INTO SCOTT.TEST VALUES('this is test') 1653
SQL> select sid,event,seconds_in_wait from v $session_wait where sid=136;
SID event SECONDS_IN_WAIT
---- ------ ------------
136 statement suspended, wait error to be cleared 1
網路
三個Oracle Net配置檔案
①listener.ora在伺服器端的配置檔案
②tnsnames.ora在客戶端的配置檔案
③sqlnet.ora描述連線方式的配置檔案
客戶端tnsnames.ora的SERVICE_NAME與伺服器端listener.ora的GLOBAL_DBNAME等同
listener.ora中監聽器的SID_NAME與例項的SID等同