[Oracle][ODBC SQL Server Driver][SQL Server]對象名 'RECOVER.HS_TRANSACTION_LOG' 無效(轉)


原帖由  qingyun 於 2010-6-21 15:44 發表 
在寫pl/sql的時候,有個很重要的注意點;
比如:
begin
  update  某個sqlserver的表@dblink名字 .....;
  update 某個oracle的表...;
end;

這段pl/sql執行會報錯:
錯誤信息是:
-----------------------------------------------------------------
執行失敗:ORA-02054: 事務處理 2.12.27634 有問題
ORA-28500: 連接 ORACLE 到非 Oracle 系統時返回此信息: 
[Oracle][ODBC SQL Server Driver][SQL Server]對象名 'RECOVER.HS_TRANSACTION_LOG' 無效。
ORA-02063: 緊接着 2 lines (起自 dblink名字)
-----------------------------------------------------------------

然后你執行:
  select * from    某個sqlserver的表@dblink名字 
這個沒問題;

再執行:
select * from  某個oracle的表

完了!結果提示:
執行失敗:ORA-01591: 鎖被有問題的分布式事務處理 2.12.27634 持有

這時候,你查詢:
SELECT * FROM DBA_2PC_PENDING 
會發現,被鎖的信息;

然后,你用
commit/rollback force '2.12.27634' ;  解鎖;

當然這里的2.12.27634 是隨機的。每次被鎖,都是不同的值;


這個問題如何解決呢? 
begin
  update  某個sqlserver的表@dblink名字 .....; 
  commit; --非常重要;
  update 某個oracle的表...;
end;
這樣就OK了,原因我覺得是這樣的:oracle內部其實是兩塊事務,一個是針對sqlserver,一個針對自己的oracle;
所以必須把兩端的事務獨立下來;

下面這個寫法也是OK的:

begin
  update  某個sqlserver的表@dblink名字 .....; 
update  某個sqlserver的表@dblink名字 .....; 
  commit; --非常重要;
  update 某個oracle的表...;
update 某個oracle的表...;
end;


終於把事務問題解決了,這個問題,如鯁在喉;困擾我半年了,如今客戶的系統馬上要正式使用;

我被迫又摸索了一把,終於搞定了:


解決方法:

1. 修改 initdg4msql.ora文件;

最后兩行:
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
修改成

HS_FDS_RECOVERY_ACCOUNT=dbo
HS_FDS_RECOVERY_PWD=sa的密碼;

這個是最簡單的方法,當然也可以在mssql 建立recover用戶,我覺得還是越簡單越好; 


2. 在sqlserver 數據庫上運行:
DROP TABLE HS_TRANSACTION_LOG
go

CREATE TABLE HS_TRANSACTION_LOG(
  GLOBAL_TRAN_ID char (64) NOT NULL,
  TRAN_COMMENT char (255) NULL
)
go

grant all on HS_TRANSACTION_LOG to public
go

這樣一切都搞定了;再也不用擔心兩個數據庫間事務切換的問題了;
 
http://www.daizhicun.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM