insert中啟用錯誤日誌的問題及分析
在平時的工作中,有時候需要insert一批資料,這些資料可能是臨時表,外部表,普通表,子查詢等形式,類似下面的格式
insert into xxxx (select xxxxx from xxx where xxxxx);
如果其中有冗餘資料的時候,整個Insert會自動rollback,一條資料也插不進去,錯誤類似下面的形式。
insert /*+ append */into mo1_memo select *from MO1_MEMO_EXT_92;
*
ERROR at line 1:
ORA-00001: unique constraint (MIG_TEST.MO1_MEMO_PK) violated
可能我們想保證正常資料能夠插入,對於違反約束等的資料稍後處理,這個是用錯誤日誌就是一個很好的選擇。
首先就是建立錯誤日誌,可以使用提供的包來建立,也可以手動建立。
這裡我需要用到表含有lob欄位,建立錯誤日誌的時候有下面的錯誤。
EXEC DBMS_ERRLOG.create_error_log(dml_table_name => 'MO1_MEMO')
BEGIN DBMS_ERRLOG.create_error_log(dml_table_name => 'MO1_MEMO'); END;
ERROR at line 1:
ORA-20069: Unsupported column type(s) found: MEMO_SYSTEM_TEXT_C
ORA-06512: at "SYS.DBMS_ERRLOG", line 235
ORA-06512: at line 1
不過想想也是合理的。不過問題還是要解決的。
可以看看建立錯誤日誌的包,oracle已經考慮到了,我們可以忽略這種不支援的型別,當然還可以指定錯誤日誌的名字。
SQL> desc dbms_errlog
PROCEDURE CREATE_ERROR_LOG
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
DML_TABLE_NAME VARCHAR2 IN
ERR_LOG_TABLE_NAME VARCHAR2 IN DEFAULT
ERR_LOG_TABLE_OWNER VARCHAR2 IN DEFAULT
ERR_LOG_TABLE_SPACE VARCHAR2 IN DEFAULT
SKIP_UNSUPPORTED BOOLEAN IN DEFAULT
我們建立錯誤日誌
SQL> EXEC DBMS_ERRLOG.create_error_log(dml_table_name => 'MO1_MEMO',SKIP_UNSUPPORTED=>true,ERR_LOG_TABLE_NAME=>'MO1_MEMO_ERROR');
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.03
嘗試插入有冗餘的資料,
SQL> insert /*+ append */into mo1_memo select *from MO1_MEMO_EXT_92 LOG ERRORS INTO MO1_MEMO_ERROR('test_unique') REJECT LIMIT UNLIMITED
2 /
insert /*+ append */into mo1_memo select *from MO1_MEMO_EXT_92 LOG ERRORS INTO MO1_MEMO_ERROR('test_unique') REJECT LIMIT UNLIMITED
*
ERROR at line 1:
ORA-00001: unique constraint (MIG_TEST.MO1_MEMO_PK) violated
Elapsed: 00:00:17.32
直接拋了錯誤,看來錯誤日誌沒有正確啟用。
檢視錯誤日誌,裡面也是空的。
SQL> /
COUNT(*)
----------
907544
錯誤日誌裡面有詳細的資料資訊。但是如果足夠細心檢視執行時間的話,就會發現如果不使用append,效能就會差很多。
下面是一個簡單的測試,
如果不使用append的時候,插入80萬左右的資料在1分鐘左右,如果使用了append就只需要大概13秒左右。
還有上面的測試結果,如果80萬記錄中99%左右的資料有冗餘,插入錯誤日誌就需要大概4分鐘的樣子
SQL> insert into mo1_memo select * from mo1_memo_ext_99 LOG ERRORS INTO MO1_MEMO_ERROR REJECT LIMIT UNLIMITED;
877245 rows created.
Elapsed: 00:01:12.91
SQL> insert into mo1_memo select * from mo1_memo_ext_98;
753637 rows created.
Elapsed: 00:01:04.75
SQL> rollback;
Rollback complete.
Elapsed: 00:00:56.35
SQL> insert /*+append*/ into mo1_memo select *from mo1_memo_ext_98;
753637 rows created.
Elapsed: 00:00:13.20
所以啟用錯誤日誌可以根據大家的需求來選擇,有利有弊。
insert into xxxx (select xxxxx from xxx where xxxxx);
如果其中有冗餘資料的時候,整個Insert會自動rollback,一條資料也插不進去,錯誤類似下面的形式。
insert /*+ append */into mo1_memo select *from MO1_MEMO_EXT_92;
*
ERROR at line 1:
ORA-00001: unique constraint (MIG_TEST.MO1_MEMO_PK) violated
可能我們想保證正常資料能夠插入,對於違反約束等的資料稍後處理,這個是用錯誤日誌就是一個很好的選擇。
首先就是建立錯誤日誌,可以使用提供的包來建立,也可以手動建立。
這裡我需要用到表含有lob欄位,建立錯誤日誌的時候有下面的錯誤。
EXEC DBMS_ERRLOG.create_error_log(dml_table_name => 'MO1_MEMO')
BEGIN DBMS_ERRLOG.create_error_log(dml_table_name => 'MO1_MEMO'); END;
ERROR at line 1:
ORA-20069: Unsupported column type(s) found: MEMO_SYSTEM_TEXT_C
ORA-06512: at "SYS.DBMS_ERRLOG", line 235
ORA-06512: at line 1
不過想想也是合理的。不過問題還是要解決的。
可以看看建立錯誤日誌的包,oracle已經考慮到了,我們可以忽略這種不支援的型別,當然還可以指定錯誤日誌的名字。
SQL> desc dbms_errlog
PROCEDURE CREATE_ERROR_LOG
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
DML_TABLE_NAME VARCHAR2 IN
ERR_LOG_TABLE_NAME VARCHAR2 IN DEFAULT
ERR_LOG_TABLE_OWNER VARCHAR2 IN DEFAULT
ERR_LOG_TABLE_SPACE VARCHAR2 IN DEFAULT
SKIP_UNSUPPORTED BOOLEAN IN DEFAULT
我們建立錯誤日誌
SQL> EXEC DBMS_ERRLOG.create_error_log(dml_table_name => 'MO1_MEMO',SKIP_UNSUPPORTED=>true,ERR_LOG_TABLE_NAME=>'MO1_MEMO_ERROR');
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.03
嘗試插入有冗餘的資料,
SQL> insert /*+ append */into mo1_memo select *from MO1_MEMO_EXT_92 LOG ERRORS INTO MO1_MEMO_ERROR('test_unique') REJECT LIMIT UNLIMITED
2 /
insert /*+ append */into mo1_memo select *from MO1_MEMO_EXT_92 LOG ERRORS INTO MO1_MEMO_ERROR('test_unique') REJECT LIMIT UNLIMITED
*
ERROR at line 1:
ORA-00001: unique constraint (MIG_TEST.MO1_MEMO_PK) violated
Elapsed: 00:00:17.32
直接拋了錯誤,看來錯誤日誌沒有正確啟用。
檢視錯誤日誌,裡面也是空的。
SQL> SELECT *FROM MO1_MEMO_ERROR; --no rows
反覆嘗試,最後發現是Hint的原因,去掉Hint 就沒有問題了。
SQL> insert into mo1_memo select *from MO1_MEMO_EXT_92 LOG ERRORS INTO MO1_MEMO_ERROR('test_unique') REJECT LIMIT UNLIMITED;
99 rows created.
Elapsed: 00:04:04.83
1* select count(*)from mo1_memo_error反覆嘗試,最後發現是Hint的原因,去掉Hint 就沒有問題了。
SQL> insert into mo1_memo select *from MO1_MEMO_EXT_92 LOG ERRORS INTO MO1_MEMO_ERROR('test_unique') REJECT LIMIT UNLIMITED;
99 rows created.
Elapsed: 00:04:04.83
SQL> /
COUNT(*)
----------
907544
錯誤日誌裡面有詳細的資料資訊。但是如果足夠細心檢視執行時間的話,就會發現如果不使用append,效能就會差很多。
下面是一個簡單的測試,
如果不使用append的時候,插入80萬左右的資料在1分鐘左右,如果使用了append就只需要大概13秒左右。
還有上面的測試結果,如果80萬記錄中99%左右的資料有冗餘,插入錯誤日誌就需要大概4分鐘的樣子
SQL> insert into mo1_memo select * from mo1_memo_ext_99 LOG ERRORS INTO MO1_MEMO_ERROR REJECT LIMIT UNLIMITED;
877245 rows created.
Elapsed: 00:01:12.91
SQL> insert into mo1_memo select * from mo1_memo_ext_98;
753637 rows created.
Elapsed: 00:01:04.75
SQL> rollback;
Rollback complete.
Elapsed: 00:00:56.35
SQL> insert /*+append*/ into mo1_memo select *from mo1_memo_ext_98;
753637 rows created.
Elapsed: 00:00:13.20
所以啟用錯誤日誌可以根據大家的需求來選擇,有利有弊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1190545/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- net 日誌分析錯誤
- alert日誌中的兩種ORA錯誤分析
- 開啟PHP的錯誤log日誌PHP
- 資料緊急修復之啟用錯誤日誌
- mysql 日誌之錯誤日誌MySql
- 如何使錯誤日誌更加方便地排查問題
- MySQL資料庫中的日誌檔案---(1)錯誤日誌MySql資料庫
- mysql insert語句錯誤問題解決MySql
- 排查錯誤日誌
- mysql慢查詢和錯誤日誌分析MySql
- 檢視mysql日誌及日誌編碼問題MySql
- 【SSH】--框架搭建錯誤及專案中問題框架
- Oracle10g中的flashback啟用日誌歸檔,寫滿空間導致錯誤Oracle
- Apche日誌系列(2):錯誤日誌(轉)
- Mabatis配置錯誤日誌BAT
- 日誌查詢錯誤
- 錯誤日誌檢視
- SQL Server 錯誤日誌SQLServer
- mysql之 日誌體系(錯誤日誌、查詢日誌、二進位制日誌、事務日誌、中繼日誌)MySql中繼
- 簡單分析MySQL 一則慢日誌監控誤報問題MySql
- SAP 錯誤日誌的調查
- 上一個日誌的錯誤
- guava cache大量的WARN日誌的問題分析Guava
- 如何用NodeJS讀取分析Nginx錯誤日誌NodeJSNginx
- log4j不輸出日誌錯誤分析
- websphere日誌分析——程式隱患問題Web
- 關閉Druid中某些錯誤日誌列印UI
- MySQL 狂寫錯誤日誌MySql
- jdon框架日誌資訊錯誤框架
- Mysql5.7 的錯誤日誌中最常見的note日誌MySql
- 常見的錯誤日誌型別型別
- Linux系統最近重啟時間、錯誤日誌Linux
- 一個比較難的問題:如何讓 unittest 的報告中錯誤情況有日誌輸出?
- 用外部表的方式查詢alert日誌檔案中ora-錯誤資訊
- JVM致命錯誤日誌(hs_err_pid.log)分析JVM
- 記一次log4j日誌寫到錯誤檔案的問題
- Kubelet 錯誤日誌 broken pipe 和 connection reset by peer 的原因分析
- Ubuntu下啟動、停止、重啟MySQL,檢視錯誤日誌命令大全UbuntuMySql