巧用閃回查詢來分析事務延遲的問題

2021-09-22 18:59:39 字數 1596 閱讀 2280

前段時間有個開發的同事向我諮詢乙個問題,

開發同事:oracle會存在乙個使用者插入資料,已經提交了;但是另外乙個使用者還查詢不到嗎?都是同一張表

jeanron:   不會的。

jeanron:   是oracle嗎,mysql還可能有這種情況

開發同事: oracle,mysql是什麼情況下會這樣?

jeanron:  mysql,主庫寫,從庫查,可能會有這種延遲

後續和他們確認了下,是oracle環境,而且都是在主庫端查詢,而且是同乙個表。這種情況聽起來著實有點意思,當然我們知道多版本查詢是oracle的乙個亮點,也是作為mvcc的乙個必備特徵。如果這個都不能保證,資料就會亂套了。

但是目前資料庫中的資料根據開發同學的反饋確實有這種情況,這一點就讓很有意思了。當然他們說感覺延遲,我希望能夠讓他們也幫忙具體定位一下,比如提供一條資料記錄,他們從前端的日誌中發現有延遲的這種情況,我在資料庫端就容易來定位問題了。

沒過多久,開發同學就提供了乙個語句,他們使用rowid定位到了那條記錄,這個對我來說就方便多了。

語句類似下面的樣子:

select count(*)from heart   where rowid='aaasdnaahaamgirabn'

他們反饋根據資料的情況,說這條記錄是在2016-07-14 16:40:00 這個時間點插入的,但是有很大的延遲,一直查不到資料。

這個時候使用oracle的閃回查詢就是乙個很好的實踐。首先確保根據rowid能夠定位到資料。

select count(*)from heart   where rowid='aaasdnaahaamgirabn' 1

然後延遲5秒鐘看看是否能夠看到資料,結果奇怪的是沒有找到匹配的資料

select count(*)from heart  as of timestamp to_timestamp('2016-07-14 16:40:05','yyyy-mm-dd hh24:mi:ss') where rowid='aaasdnaahaamgirabn' 0

然後我逐步放大實踐延遲,一直放大到延遲6分鐘,還是沒有找到匹配的資料。

select count(*)from heart  as of timestamp to_timestamp('2016-07-14 16:46:00','yyyy-mm-dd hh24:mi:ss') where rowid='aaasdnaahaamgirabn' 0

繼續放大延遲間隔,終於看到了匹配的記錄。

select count(*)from heart  as of timestamp to_timestamp('2016-07-14 16:47:00','yyyy-mm-dd hh24:mi:ss') where rowid='aaasdnaahaamgirabn' 1

從這個簡單的測試來看,這個資料是在2016-07-14 16:40:00插入的,可以從表裡的資料看出,表裡有乙個欄位會做標示,但是資料在乙個事務內一直未提交,所以其他的使用者查詢的時候會始終查到的是未提交狀態的資料,而資料是在16:46:00~16:47:00這個時間段提交的,而具體的時間戳已經不重要了,因為已經說明了問題。

可以基本斷定是在應用端存在乙個大事務,遲遲未提交,導致資料的狀態一直沒有得到更新,確認了這點,應用端就很好去分析和處理了。

MySQL回閃查詢 閃回查詢(undo sql)

select versions xid,versions operation,versions starttime,versions endtime,versions startscn,versions endscn from site daily report versions between t...

閃回事務查詢 閃回事務查詢案例

閃回事務查詢 1閃回事務查詢是閃回版本查詢的乙個擴充 2閃回事務查詢可以審計某個事務或者撤銷乙個已經提交的事務 閃回事務查詢案例 測試資料 create table sct4 id number 4 name varchar2 20 insert into sct4 values 1,lili co...

Oracle閃回查詢

閃回查詢 查詢在特定時間點存在的所有資料。使用閃回查詢功能,可以執行截止到特定時間的查詢。使用select語句的as of子句,可以指定要檢視其對應資料的時間戳。這在分析資料差異時非常有用。注 timestamp和scn是as of子句的有效選項。update employees set salar...