今天操作數據庫進行批量DML操作的時候,報了一個以前沒有見過的錯誤, java.sql.SQLException: No Transaction Isolation on non-logging db's,特此寫一遍記錄一下自己的解決過程。
首先,我從上述報錯看出大體就是此庫不記錄日志,但是以前我們的事務操作是一定會有日志的。所以展開了如下搜索。
1,查看日志模式:
onmonitor --> Logical-logs -->Databases 看各個庫的 Log Status
一看,狀態果然是N。這樣的話,就不支持事務。所以會報錯。
2,修改模式:
ontape -s -B dbname
我執行該語句報錯了,Error changing logging status - 'bmt'. iserrno 107. Program over. 原因好像是,執行該命令時,需要數據庫服務器是脫機的,就是不能執行任何增刪改查的操作才可以。
ontape –s –L 0 –N dbname 將數據庫dbname從-U,-B,-A其中一種模式改變到-N模式,創建0級備份
ontape –s –L 0 –U cem2 將數據庫”cem2”從-N改變到-U模式,創建0級備份
ontape –s –L 0 –B cem2 將數據庫”cem2”從-N改變到-B模式,創建0級備份
ontape –s –L 0 –A cem2 將數據庫”cem2”從-N改變到-A模式,創建0級備份
####ontape工具在-U,-B,-A三種模式中任何一種改變到另一種不需創建系統備份; 要完全從不帶日志模式改成帶日志模式,或者反過來,需要創建一個0級備份;
另外,
create database dbname with log
創建數據庫狀態是U
create database dbname with buffered log
創建數據庫狀態是B
這兩種都帶日志,支持事務。
下面大致列一下,各個模式的含義:
-N No Logging 沒有日志
-U Unbuffered Logging 非緩沖日志
-B Buffered Logging 緩沖日志
-A Unbuffered Logging, Mode ANSI ANSI模式
No Loggin 沒有日志模式:只向邏輯日志中記錄很少的信息,只能執行DDL語句,不支持事務,也就是不能執行DML語句。一個不帶日志的數據庫環境可以具有很高的吞吐率,但在發生嚴重的實例失敗時沒有能力重建對數據庫的修改。
Unbuffered Logging 非緩沖日志模式:只要事務提交,就會將包含該事務信息的物理日志和邏輯日志緩沖區刷新到磁盤上。這樣的話,即使出現嚴重的實例錯誤,數據完整性和一致性也可以在事務級得到保證。但是因為每一次提交事務都會導致緩沖區被刷新到磁盤上,所以增加了磁盤I/O。另外,因為刷新是按照當前事務的進度將整個緩沖區內容都寫到邏輯日志中,所以邏輯日志的頁面中會有很多沒有用的數據。日志填充得很快,但其中包含的“真正”數據卻比緩沖日志數據庫環境少得多。
Buffered Logging 緩沖日志模式:環境將在邏輯日志和物理日志緩沖區中保留這些事務信息,直到該緩沖區填滿,或者發生檢查點操作,或者是當事務還沒有被寫往日志之前關閉了產生該事務的用戶連接。在“緩沖日志”數據庫環境中,每個事務所造成的磁盤I/O大大降低,因此實例會運行得較快,但是因為事務信息存儲在共享內存中,嚴重的實例錯誤就會很危險,當實例的共享內存被釋放時,那些還沒有寫到磁盤上的事務信息就都丟失了。
#####非緩沖日志模式和緩沖日志模式的操作方式完全相同,其不同點在于何時將日志記錄寫到磁盤上。
Unbuffered Logging, Mode ANSI ANSI模式:ANSI模式的操作與非緩沖日志一樣,但它還強制與ANSI事務處理方式一致。ANSI一致性包括這樣一些特點和規則,如對引用表的唯一屬主命名,表級權限的不同缺省值,游標讀和更新能力的不同,以及character和decimal數據類型對數據類型越界或定義語句如何反應的不同。
####OnLine Dymanic Server在ANSI數據庫環境中并不嚴格強制遵從所有的ANSI標準,如果你執行一條非ANSI的SQL語句,實例會產生一條警告信息,但仍然往下處理。除非操作環境要求使用ANSI標準,否則使用ANSI模式不會得到任何好處。
如果想從N模式改到B模式,步驟如下:
onmode -u 清除連接session,進入quiescent mode
ontape -s -B spdb 修改spdb的日志模式為B
onmode -m 切回到聯機模式
onmonitor--> Logical-Logs-->Databases 再次查看spdb的日志模式,已經改回為B,重啟應用成功。
另附幾個命令:
查找進程的命令:onstat -g sql | grep dbname
刪除進程的命令:onmode -z 進程號
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。