2020-11-12文字底稿

Hello World !發表於2020-11-13

資料庫

控制檔案
	描述
	二進位制小檔案,記錄資料庫當前物理狀態,記錄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等同

相關文章