28、undo_1_2(undo引數、undo段、事務)

一只c小凶许發表於2024-11-22

關於undo的幾個引數:

1、undo_management:
undo段的管理方式(AUTO)
2、undo_retention:
一個事務提交以後,事務所對應的undo資料儘量保留900秒

查詢引數:

SQL> show parameter undo
NAME	             			     TYPE    	 VALUE
------------------------------------ ----------- -----------
undo_management 	             	     string	        AUTO   -- undo段是自動管理的
undo_retention		        	     integer	   900   -- 一個事務提交以後,事務所對應的undu資料,儘量保證在900秒以內不被覆蓋,這個引數我們經常會改為24小時
undo_tablespace 	             	     string	     UNDOTBS1

undo_retention:
這個引數改了以後,還不能保證它確確實實能夠把一個事務提交以後,事務所對應的undo資料保留900秒;如果要確認能保留的話,還需要做幾件事:
1、查詢undo表空間,裡面有一個引數 RETENTION 必須是:GUARANTEE

select * from dba_tablespaces where tablespace_name='UNDOTBS1';

修改retention引數:

SQL> alter tablespace UNDOTBS1 retention guarantee;
Tablespace altered.
select * from dba_tablespaces where tablespace_name='UNDOTBS1';

2、還要確認UNDOTBS1表空間,所對應的資料檔案是可以自動擴充套件的:

select * from dba_data_files;

查詢undo表空間裡面的undo段(預設11個undo段):

select * from v$rollname;

隨著事務越來越繁忙,undo段會自己增加(這是因為段的自動管理方式)

或者(這個資訊更多一些):

select * from dba_rollback_segs

查詢一個undo段裡面的區的組成:

select * from dba_extents where segment_name='_SYSSMU1_3724004606$'

使用EM,看一下undo相關的一些維護:







undo表空間大小的影響因素:
1、undo資料的生成速度
2、最大select的執行時間

一個事務的開始和結束(挖掘日誌分析:DDL、commit、rollback):

SQL> create user u1 identified by u1 default tablespace testtb1;
User created.

SQL> grant connect,resource,dba to u1;
Grant succeeded.

SQL> connect u1/u1
Connected.

SQL> select sid from v$mystat where rownum=1;
       SID
----------
       932

SQL> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
	   1 CURRENT
	   2 INACTIVE
	   3 INACTIVE

切換一下日誌(希望所有的操作都在同一個日誌裡面):

SQL> alter system switch logfile;
System altered.

SQL> alter system flush buffer_cache;  -- 清空buffer cache裡面的髒塊(也就是將所有髒塊寫入到磁碟)
System altered.

現在系統用2號redo log日誌:

SQL> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
	   1 INACTIVE
	   2 CURRENT
	   3 INACTIVE

然後建一個表t1,插入一行資料:

SQL> create table t1(id int,name varchar2(20));
Table created.

SQL> insert into t1 values(1,'zyr');
1 row created.

SQL> commit;
Commit complete.

SQL> update t1 set id=2 where id=1;
1 row updated.

SQL> rollback;
Rollback complete.

SQL> update t1 set id=2 where id=1;
1 row updated.

SQL> create table t2(id int);
Table created.

檢視日誌狀態:

SQL> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
	   1 INACTIVE
	   2 CURRENT  -- 還是2號日誌
	   3 INACTIVE

切換日誌,讓剛才的這些操作都在2號日誌裡,方便檢視:

SQL> alter system switch logfile;
System altered.

SQL> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
  	   1 INACTIVE
	   2 ACTIVE
	   3 CURRENT

挖掘日誌,檢視2號日誌的內容:






啟用日誌的追加功能,挖掘的資訊就會多一些了

模擬一個事務(大事務)沒有提交,資料庫突然崩潰,資料庫重新啟動,select訪問這個表,檢視日誌、以及執行時統計資訊

檢視日誌狀態:

SQL> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
	 1 INACTIVE
	 2 INACTIVE
	 3 CURRENT

SQL> select GROUP#,BYTES/1024/1024,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
    GROUP# BYTES/1024/1024 FIRST_CHANGE# NEXT_CHANGE#
---------- --------------- ------------- ------------
	 1	              	50	     1295995      1314696
	 2	            	50	     1314696      1318831
	 3             		50	     1318831   2.8147E+14

新增日誌組:


查詢日誌狀態:

SQL> select GROUP#,BYTES/1024/1024,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
    GROUP# BYTES/1024/1024 FIRST_CHANGE# NEXT_CHANGE#
---------- --------------- ------------- ------------
	 1	             	50	     1295995      1314696
	 2	            	50	     1314696      1318831
	 3	             	50	     1318831   2.8147E+14
	 4	                 100	           0	      0
	 5	                 100	           0	      0

建一個表:

SQL> show user;
USER is "U1"

SQL> create table t3 as select a.* from dba_objects a,dba_objects b where rownum<=1000000;   -- 建立了t3表,有1000000行Table created.

再次查詢日誌狀態:

SQL> select GROUP#,BYTES/1024/1024,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
    GROUP# BYTES/1024/1024 FIRST_CHANGE# NEXT_CHANGE#
---------- --------------- ------------- ------------
	 1	             	50	     1295995      1314696
	 2	            	50	     1314696      1318831
	 3	             	50	     1318831      1321928
	 4	                 100	     1321928   2.8147E+14  -- 現在用第四組日誌了
	 5	                 100	           0	      0

刪除t3表(相當於一個大事務,t3表有1000000行):

SQL> delete from t3;
1000000 rows deleted.

這時候,事務沒有提交

檢視日誌狀態:

SQL> select GROUP#,BYTES/1024/1024,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
    GROUP# BYTES/1024/1024 FIRST_CHANGE# NEXT_CHANGE#
---------- --------------- ------------- ------------
	 1	              	50	     1322555      1322591
	 2	            	50	     1322591      1322624
	 3	             	50	     1322624      1322661
	 4	                 100	     1322661   2.8147E+14
	 5	                 100	     1322473      1322555

5組日誌已經迴圈使用了一遍

SQL> select GROUP#,BYTES/1024/1024,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
    GROUP# BYTES/1024/1024 FIRST_CHANGE# NEXT_CHANGE#
---------- --------------- ------------- ------------
	 1	              	50	     1322555      1322591
	 2	            	50	     1322591      1322624
	 3	            	50	     1322624      1322661
	 4	                 100	     1322661      1322755
	 5	                 100	     1322755   2.8147E+14

現在日誌又切換到第5組了

關閉資料庫(模擬一個事務未提交,資料庫崩潰了):

SQL> shutdown abort;
ORACLE instance shut down.

重新啟動資料庫,速度會有點慢,因為要進行大量的前滾和回滾(之前資料庫有事務未提交,資料庫崩潰了):

SQL> startup
ORACLE instance started.

Total System Global Area 1603411968 bytes
Fixed Size		          2253664 bytes
Variable Size		 1375734944 bytes
Database Buffers	        218103808 bytes
Redo Buffers		    7319552 bytes
Database mounted.
Database opened.

查詢日誌狀態:

SQL> select GROUP#,SEQUENCE#,FIRST_CHANGE#,NEXT_CHANGE#,STATUS from v$log;
    GROUP#  SEQUENCE# FIRST_CHANGE# NEXT_CHANGE# STATUS
---------- ---------- ------------- ------------ ----------------
	 1	          14	    1343262	     1343624 INACTIVE
	 2	          15	    1343624	     1343714 INACTIVE
	 3	          16	    1343714	     1343766 ACTIVE
	 4	          17	    1343766	     1343859 ACTIVE
	 5	          18	    1343859   2.8147E+14 CURRENT

資料庫重啟過程中,產生了好多日誌,redo log又被迴圈使用了一遍

================================================================================================================
undo表空間全新認識:
1、undo段、undo extent、undo表空間最佳實踐、undo表空間監控(EM)
2、rollback、commit
3、事務的開始和結束、挖掘日誌分析
DDL、commit、rollback
4、模擬一個事務沒有提交,資料庫突然崩潰,資料庫重新啟動,select訪問這個表,檢視日誌、以及執行時統計資訊
5、dump undo段頭塊分析事務表、dump表的資料庫分析事務槽(整個操作在一個事務模擬中分析)
6、分析xid、v$transaction
7、模擬ORA-01555錯誤及MOS解決方案
8、模擬insert、update、delete對資源的消耗

相關文章