精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

驚呆,一條SQL竟然讓Oracle奔潰了

運維 數(shù)據(jù)庫運維
一條sql就能讓oracle掛了,真的是不敢相信啊,前幾天生產(chǎn)上確實出現(xiàn)了這樣一個故障,我們來一起做一個事件回放。

[[381485]]

 本文轉(zhuǎn)載自微信公眾號「程序員jinjunzhu」,作者jinjunzhu。轉(zhuǎn)載本文請聯(lián)系程序員jinjunzhu公眾號。 jinjunzhu  

一條sql就能讓oracle掛了,真的是不敢相信啊,前幾天生產(chǎn)上確實出現(xiàn)了這樣一個故障,我們來一起做一個事件回放。

系統(tǒng)介紹

系統(tǒng)架構(gòu)見下圖:

application1和application2是一個分布式系統(tǒng)中的2個應(yīng)用,application1連接的數(shù)據(jù)庫是database1,application2連接的數(shù)據(jù)庫是database2,application2生產(chǎn)的數(shù)據(jù)要給application1做跑批使用。

application1要獲取database2的數(shù)據(jù),并不是通過接口來獲取的,而是直連database2來獲取,因此application1也具有database2庫的讀權(quán)限。

database2中有1張表table_b,里面保存的數(shù)據(jù)是application1跑批需要的數(shù)據(jù)。application1查找到table_b的數(shù)據(jù)后,先保存到database1的數(shù)據(jù)庫表table_a中,等跑批時取出來用。

table_a和table_b的表結(jié)構(gòu)如下:

2個表的主鍵都是字段a,application1查詢出table_b的數(shù)據(jù)后,會根據(jù)主鍵a來判斷這條數(shù)據(jù)是否存在,如果數(shù)據(jù)存在,就更新,否則,就插入。

application1使用的orm框架是mybatis,為了減少應(yīng)用和數(shù)據(jù)庫的交互,使用了oracle的merge語句。

注意:mybatis相關(guān)的文件有5個:

TableAMapper.java

TableBMapper.java

TableAMapper.xml

TableBMapper.xml

TableAEntity.java

熟悉mybatis的同學(xué)應(yīng)該都知道,前兩個java類是sql操作接口類,第3、4兩個文件是存放sql的xml文件,跟前兩個文件對應(yīng),最后一個java文件是do類。

事故現(xiàn)場

TableBMapper中有一個方法selectForPage,用來按頁查詢table_b中數(shù)據(jù),每頁1萬條數(shù)據(jù),之后把這個list結(jié)果merge到table_a,看一下代碼:

  1. //從table_b按每頁1萬條來查詢數(shù)據(jù) 
  2. List<TableAEntity> list = tableBMapper.selectForPage(startPage, 10000); 
  3. //把查到的數(shù)據(jù)一次性merge到table_a中 
  4. tableAMapper.mergeFromTableB(list); 

我們再看一下TableAMapper.xml中的mergeFromTableB方法,代碼如下:

  1. <update id="mergeFromTableB" parameterType="list"
  2.   <foreach collection="list" item="item" index="index" separator=";" close=";end;" open="begin"
  3.       MERGE INTO table_a ta USING(select #{item.a} as a,#{item.b} as b,#{item.c} as c, #{item.d} as d from dual) tb 
  4.       on (ta.a = tb.a) 
  5.       WHEN MATCHED THEN UPDATE set 
  6.       ta.b=tb.b, 
  7.       ta.c=tb.c, 
  8.       ta.d=tb.d 
  9.       WHEN NOT MATCHED THEN insert
  10.       a, 
  11.       b, 
  12.       c, 
  13.       d 
  14.       ) 
  15.       values ( 
  16.       tb.a, 
  17.       tb.b, 
  18.       tb.c, 
  19.       tb.d 
  20.       ) 
  21.     </foreach> 
  22. </update

注意:為了文章排版,我對表結(jié)構(gòu)做了簡化,真實案例中table_a這張表有60多個字段。

這條sql執(zhí)行后,我截取部分oracle的日志,如下:

圖中可以看到oracle報了ORA-07445錯誤。

分析日志后發(fā)現(xiàn),sql綁定變量達到了了79010個,而oracle是不允許超過65535個的。

解決方案

前面的分析確定了導(dǎo)致oracle掛掉的原因是綁定變量超過了65535個,那對癥下藥,解決的方案有3個:

業(yè)務(wù)系統(tǒng)方案

1.循環(huán)單條執(zhí)行merge語句,優(yōu)點是修改簡單,缺點是業(yè)務(wù)系統(tǒng)跟數(shù)據(jù)庫交互太多,會影響跑批任務(wù)執(zhí)行效率。

2.對mergeFromTableB進行分批調(diào)用,比如每1000條調(diào)用一次merge方法,改造稍微多一點,但是交互會少很多。

DBA方案

給oracle打一個補丁,這個方案需要停服務(wù)。

業(yè)務(wù)方案2明細(xì)有優(yōu)勢,我用這個方案進行了改造,每次1000條,批量merge,代碼如下:

  1. for (int i = 0; i < list.size(); i += 1000) { 
  2.     if (i + 1000 < list.size()) { 
  3.         tableAMapper.mergeFromTableB(list.subList(i, i + 1000)); 
  4.     } else { 
  5.         tableAMapper.mergeFromTableB(list.subList(i, list.size())); 
  6.     } 

新的問題

按照上面的方案改造完成后,數(shù)據(jù)庫不會奔潰了,但是新的問題出現(xiàn)了。測試的同學(xué)發(fā)現(xiàn),每次處理超過1000條數(shù)據(jù),非常耗時,有時竟然達到了4分鐘,驚呆。

看打印的批量sql,類似于下面的語句:

  1. begin 
  2. merge into table_a ta USING(...; 
  3. merge into table_a ta USING(...; 
  4. end

分析了一下,雖然放在了一個SQL塊中,但還是單條執(zhí)行,最后一起提交。

再做一次優(yōu)化,把上面多條merge語句合成1條。

我的優(yōu)化思路是創(chuàng)建一張臨時表,先把list中的數(shù)據(jù)插入到臨時表中,然后用一次merge把臨時表的數(shù)據(jù)merge進table_a這張表。

oracle的臨時表有2種,一種是會話級別,一種是事務(wù)級別:

1.會話級別的臨時表,數(shù)據(jù)會在整個會話的生命周期中,會話結(jié)束,臨時表數(shù)據(jù)清空;

2.事務(wù)級別的臨時表,數(shù)據(jù)會在整個事務(wù)執(zhí)行過程中,事務(wù)結(jié)束,臨時表數(shù)據(jù)清空。

下面看具體實施過程。

1.我們創(chuàng)建一張會話臨時表,SQL如下:

  1. create global temporary table_a_temp on commit delete rows as select * from table_a; 
  2. comment on table_a_temp is 'table_a表臨時表'

2.把table_b查詢到的數(shù)據(jù)list插入臨時表,需要在 TableAMapper.xml 增加一個方法:

  1. <insert id="batchInsertTemp" parameterType="list"
  2.   insert all 
  3.   <foreach collection="list" index="index" item="item"
  4.     into table_a_temp 
  5.     <trim prefix="(" suffix=")" suffixOverrides="," > 
  6.       a, 
  7.       <if test="item.b != null" > 
  8.         b, 
  9.       </if> 
  10.       <if test="item.c != null" > 
  11.         c, 
  12.       </if> 
  13.       <if test="item.d != null" > 
  14.         d, 
  15.       </if> 
  16.     </trim> 
  17.     <trim prefix="values (" suffix=")" suffixOverrides="," > 
  18.       #{item.a}, 
  19.       <if test="item.b != null" > 
  20.         #{item.b,jdbcType=VARCHAR}, 
  21.       </if> 
  22.       <if test="item.c != null" > 
  23.         #{item.c,jdbcType=VARCHAR}, 
  24.       </if> 
  25.       <if test="item.d != null" > 
  26.         #{item.d,jdbcType=VARCHAR}, 
  27.       </if> 
  28.     </trim> 
  29.   </foreach> 
  30.   select 1 from dual 
  31. </insert

注意:oracle的insert all語句單次插入不能超過1000條。

3.把臨時表的數(shù)據(jù)merge到table_a中,需要在 TableAMapper.xml 增加一個方法:

  1. <update id="mergeFromTempData"
  2.   MERGE INTO table_a ta 
  3.     USING (select * from table_a_temp) tb 
  4.     on (ta.a = tb.a) 
  5.     WHEN MATCHED THEN UPDATE set 
  6.   ta.b = tb.b, 
  7.   ta.c = tb.c, 
  8.   ta.d = tb.d 
  9.   WHEN NOT MATCHED THEN 
  10.   insert 
  11.   (a, b, c, d) 
  12.   values 
  13.   (tb.a, tb.b, tb.c, tb.d) 
  14. </update

4.最終業(yè)務(wù)代碼修改如下:

  1. //從table_b查詢 
  2. List<TableAEntity> list = tableBMapper.selectForPage(startPage, 10000); 
  3. //批量插入table_a_temp臨時表 
  4. for (int i = 0; i < list.size(); i += 1000) { 
  5.     if (i + 1000 < list.size()) { 
  6.         tableAMapper.batchInsertTemp(list.subList(i, i + 1000)); 
  7.     } else { 
  8.         tableAMapper.batchInsertTemp(list.subList(i, list.size())); 
  9.     } 
  10. //從table_a_temp把數(shù)據(jù)merge到table_a 
  11. tableAMapper.mergeFromTempData(); 

總結(jié)

在oracle上執(zhí)行SQL時,如果綁定變量的數(shù)量超過了65535,會引發(fā)ORA-07445。當(dāng)然,引發(fā)ORA-07445的原因還有其他。

解決這個問題最好的方式是從業(yè)務(wù)代碼層面進行修改。

也可以讓DBA可以給oracle打一個補丁,但是oracle必須要停服務(wù)。

延伸閱讀:

https://community.oracle.com/tech/apps-infra/discussion/2424571/ora-07445-exception-encountered-core-dump-ptmak-106-sigsegv-addres

 

責(zé)任編輯:武曉燕 來源: 程序員jinjunzhu
相關(guān)推薦

2021-04-16 07:04:53

SQLOracle故障

2021-09-30 08:40:28

Oracle數(shù)據(jù)庫后端開發(fā)

2020-02-09 16:52:02

睡醒公司倒閉

2020-10-26 08:02:28

SQL慢查詢索引

2025-05-20 00:00:00

2020-05-27 11:55:47

Oracle SQL性能優(yōu)化數(shù)據(jù)庫

2021-04-09 08:13:14

API網(wǎng)關(guān)互聯(lián)網(wǎng)

2010-11-15 14:16:09

Oracle表記錄

2023-09-01 14:07:00

ChatGPTGPT數(shù)據(jù)分析

2017-10-23 15:17:42

技術(shù)業(yè)務(wù)職位

2024-07-29 09:49:00

SQLMySQL執(zhí)行

2020-07-01 09:07:52

SQL索引語句

2025-05-12 08:27:25

2011-03-23 13:52:09

ORACLESQL十進制

2022-10-12 07:38:24

SQL語句異常

2024-02-01 18:07:37

2021-09-15 06:21:36

Update語句數(shù)據(jù)庫

2023-03-26 22:42:02

SQL關(guān)聯(lián)索引

2022-02-11 14:43:53

SQL語句C/S架構(gòu)

2022-05-31 13:58:09

MySQL查詢語句
點贊
收藏

51CTO技術(shù)棧公眾號

中文字幕在线免费不卡| 午夜综合激情| 欧美一级高清大全免费观看| 中文字幕乱码免费| 亚洲国产精品久久久久久6q| 日韩亚洲国产精品| 国产亚洲精品91在线| 亚洲天堂av一区二区| 天堂8中文在线| 99re亚洲国产精品| 国产视频观看一区| 国产成人自拍视频在线| 色婷婷一区二区三区| 日韩丝袜情趣美女图片| 欧在线一二三四区| 亚洲欧美成人影院| 国产日本欧美一区二区| 99国精产品一二二线| 中文人妻av久久人妻18| 午夜精品国产| 最近的2019中文字幕免费一页| 成熟妇人a片免费看网站| 99久久亚洲国产日韩美女| 亚洲自拍偷拍欧美| 亚洲精品国产精品国自产| 欧美特黄一级视频| 精品在线一区二区| 日韩av免费网站| 久久久久久激情| 久久视频国产| 亚洲视屏在线播放| 亚洲一区二区三区综合| 精品视频一区二区三区| 在线观看av一区| 久久久久免费看黄a片app| 免费av毛片在线看| 国产精品免费视频观看| 久久久福利视频| 性生交生活影碟片| 国产综合久久久久久久久久久久| 国产成人一区二区| 国产成人在线免费视频| 狠狠色综合网| 欧美成人免费大片| 久久人妻无码aⅴ毛片a片app| 国产不卡一二三区| 国产午夜精品久久久 | 欧美国产日韩综合| 欧美hd在线| 色婷婷综合成人av| 影音先锋男人看片资源| 欧美偷拍自拍| 一区二区三区四区视频| 日韩中文字幕有码| 蜜桃一区二区三区| 日韩激情视频在线| 国产艳俗歌舞表演hd| 国产精品网在线观看| 国精产品一区| 99亚洲伊人久久精品影院红桃| 欧美久久精品一级黑人c片 | 美女网站免费观看视频| 欧美在线极品| 疯狂蹂躏欧美一区二区精品| 国产欧美在线一区| 色豆豆成人网| 欧美性猛交xxxxxx富婆| 亚洲综合色在线观看| 国语自产精品视频在线看抢先版结局| 在线观看日韩一区| 色婷婷综合网站| 色综合一区二区日本韩国亚洲| 欧美日韩精品系列| 天天综合成人网| 熟女视频一区二区三区| 你懂的网站在线| xfplay精品久久| 日韩国产高清一区| 日本高清中文字幕在线| 亚洲人成7777| 欧美精品久久久久久久久久久| 欧美sm一区| 色就色 综合激情| 午夜剧场高清版免费观看| 成人激情久久| 亚洲国产精品热久久| 一区二区三区久久久久| 999久久久国产精品| 欧美精品在线免费| 免费黄色网址在线| 久久精品国产精品青草| 成人三级视频在线观看一区二区| 瑟瑟在线观看| 最新国产成人在线观看| 男的插女的下面视频| 欧美日韩123区| 3751色影院一区二区三区| 制服丝袜第一页在线观看| 免费精品国产| 九九视频直播综合网| 欧美a∨亚洲欧美亚洲| 久久狠狠亚洲综合| 久久96国产精品久久99软件| 日本黄色片在线观看| 午夜视频在线观看一区二区三区| 亚洲色图38p| 日韩三级不卡| 亚洲午夜精品久久久久久性色| 日韩欧美中文字幕视频| 欧美亚洲网站| 91视频99| 日本免费在线视频| 欧美色视频日本高清在线观看| 久久久久久久久久毛片| 亚洲精品国产精品粉嫩| 欧美成人性生活| 国产精华7777777| 成年人国产精品| 男女激烈动态图| 国产精品久久久久久吹潮| 亚洲国产高清福利视频| 男人晚上看的视频| 麻豆精品网站| 国产精品一区在线播放| 麻豆传媒在线免费看| 色综合久久久久综合99| 黄色性视频网站| 欧美96在线丨欧| 成人黄色av播放免费| 黄色av网站在线免费观看| 亚洲成国产人片在线观看| 91网址在线观看精品| 欧美日韩在线观看视频小说| 91sao在线观看国产| 亚洲国产av一区二区| 亚洲三级免费电影| 欧美成人黄色网址| 国产精品三级| 欧美中文在线视频| 亚洲 美腿 欧美 偷拍| 亚洲综合在线观看视频| 日韩不卡的av| 51精产品一区一区三区| 国产在线拍偷自揄拍精品| av在线免费观看网站| 色婷婷av一区| 精品少妇人妻av一区二区三区| 欧美精品一卡| 99re在线国产| 欧美24videosex性欧美| 日韩免费电影一区| 九九精品在线观看视频| 国产精品一区久久久久| 国产美女作爱全过程免费视频| 久久wwww| 欧美激情精品久久久久久蜜臀| 国产成人三级在线播放 | 丝袜美腿小色网| 久久99久久99精品免视看婷婷 | 经典三级在线| 91精品福利视频| 一级肉体全黄裸片| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲在线观看免费视频| 日本高清不卡一区| 精品久久久久久中文字幕人妻最新| 欧美日韩国产欧| 国产成人精品福利一区二区三区| 色黄网站在线观看| 精品国产一区二区三区久久影院 | 日本一区二区乱| 久久国产精品久久久久久久久久| 国产喷水福利在线视频| 亚洲三级小视频| youjizz.com国产| 亚洲在线免费| 天堂资源在线亚洲资源| 色8久久久久| 久久99精品视频一区97| 日韩一卡二卡在线| 色久综合一二码| 中文字幕电影av| 成人小视频在线| 亚洲爆乳无码专区| 久久免费av| 国产超碰91| 日韩av一级| 欧美另类极品videosbestfree| 少妇人妻精品一区二区三区| 色88888久久久久久影院按摩| 情侣偷拍对白清晰饥渴难耐| 国产成人亚洲综合色影视| 国产精品333| 视频在线不卡免费观看| 国产精品日韩一区二区| a日韩av网址| 美女少妇精品视频| 麻豆av电影在线观看| 欧美一区日韩一区| youjizz在线视频| 亚洲欧美日韩久久| 91网站免费入口| 国产成人高清在线| 日本888xxxx| 亚洲精品欧美| 99热一区二区三区| 蜜臀av免费一区二区三区| 亚洲最大的免费| 日韩不卡免费高清视频| 欧美猛交免费看| 丁香婷婷在线| 亚洲黄一区二区| 国产欧美熟妇另类久久久| 欧美日韩亚洲精品内裤| 中文字幕五月天| 国产欧美精品国产国产专区| 一级黄色电影片| 精品在线播放午夜| 99久久国产宗和精品1上映| 欧美色123| 偷拍盗摄高潮叫床对白清晰| 最近国产精品视频| 国产精品乱码视频| 欧洲大片精品免费永久看nba| 国产精品99久久久久久白浆小说| 久久av色综合| 欧美黑人xxx| 浪潮av一区| 中文字幕日韩有码| 日本在线视频1区| 精品国产免费人成电影在线观看四季 | 欧美一区二区.| www中文字幕在线观看| 欧美成人网在线| 91社区在线高清| 尤物99国产成人精品视频| 头脑特工队2免费完整版在线观看| 日韩欧美在线综合网| 91九色蝌蚪91por成人| 在线观看亚洲专区| 一二三区免费视频| 日韩欧美在线视频日韩欧美在线视频| 国产乡下妇女做爰毛片| 亚洲综合激情另类小说区| 日日骚一区二区三区| 亚洲毛片av在线| 91高清免费观看| **欧美大码日韩| 在线观看美女av| 最新高清无码专区| 校园春色 亚洲| 亚洲免费大片在线观看| 久久久久久久久久97| 国产精品久久久久精k8| 99热这里只有精品4| 国产精品无圣光一区二区| www成人啪啪18软件| 日本一区二区三区dvd视频在线| 全黄一级裸体片| 国产三级精品三级| jizzjizzjizz国产| 专区另类欧美日韩| 青娱乐国产在线视频| 亚洲一区二区精品久久av| 国产又大又黑又粗免费视频| 欧美视频在线视频| www.久久久久久久| 欧美三级三级三级爽爽爽| 中文字幕在线播放av| 9191精品国产综合久久久久久| 99精品在线视频观看| 精品国产一二三| 亚洲日本中文字幕在线| 国产一区二区欧美日韩| 浪潮av一区| 午夜免费在线观看精品视频| 欧美gv在线| 国产精品亚洲自拍| 久久久国产精品入口麻豆| 国产传媒一区| 亚洲瘦老头同性70tv| 亚洲精品视频一二三| 中文字幕人成人乱码| 久久久久久免费看| 日韩成人精品在线观看| 四虎1515hh.com| 91农村精品一区二区在线| 国产精品成人在线视频| 一区二区在线看| 国内自拍视频在线播放| 538prom精品视频线放| 免费观看黄色av| 在线电影欧美日韩一区二区私密| 成人在线免费看片| 青草青草久热精品视频在线网站| 久久久久久久性潮| 国产亚洲精品久久飘花| 欧美一级精品片在线看| 久久手机在线视频| 日韩精品视频网站| 在线精品视频播放| 日本一区二区三区四区| 国产主播在线播放| 欧美日韩另类一区| 午夜18视频在线观看| 久久国内精品一国内精品| 福利影院在线看| 91久久在线观看| 欧美精品第一区| 日韩一区二区高清视频| 免费看欧美美女黄的网站| 欧美激情 亚洲| 亚洲免费视频成人| 中文字幕永久在线观看| 亚洲精品自在久久| 色婷婷在线播放| 成人网在线视频| 精品一区二区三区在线| 欧美这里只有精品| 激情综合色播激情啊| 最近中文字幕在线mv视频在线| 亚洲成人av在线电影| 国产特级黄色片| 中文字幕一区电影| 日韩欧美看国产| 国产一区免费| 狠狠色狠狠色综合日日tαg| 国产乱叫456| 18欧美亚洲精品| 在线免费观看高清视频| 亚洲网址你懂得| 性感女国产在线| 极品尤物一区二区三区| 欧美日韩福利| 日本女人黄色片| 国产精品久久久久久久久图文区 | 国产午夜精品久久久久免费视| 国产精品成人av性教育| 亚洲图区在线| 丝袜老师办公室里做好紧好爽| 成人99免费视频| 日本学生初尝黑人巨免费视频| 欧美一二三区在线| 性欧美猛交videos| 51国产成人精品午夜福中文下载| 久久久久午夜电影| 亚洲一级片av| 综合自拍亚洲综合图不卡区| 97caocao| 操日韩av在线电影| 精品午夜av| www.激情网| 成人激情午夜影院| 日韩精品一区二区三| 亚洲国产精品va在线看黑人| 91桃色在线观看| 精品国产一区二区三区麻豆免费观看完整版| 欧美日韩亚洲一区三区| 色欲欲www成人网站| 亚洲综合一二区| 蜜臀久久99精品久久久| 91sa在线看| 精品精品99| av在线免费看片| 一区二区三区四区乱视频| 亚洲AV无码成人片在线观看| 欧美激情影音先锋| 欧美性生活一级片| 日韩 欧美 高清| 欧美国产视频在线| 国产三级漂亮女教师| 欧美大片在线看免费观看| 麻豆一区二区| 中文字幕欧美人妻精品一区| 国产精品免费aⅴ片在线观看| 国产模特av私拍大尺度| 欧美乱妇高清无乱码| 日本亚洲不卡| 亚洲视频在线观看一区二区三区| 中文字幕制服丝袜成人av | 国产麻豆精品视频| 亚洲国产精一区二区三区性色| 亚洲免费电影一区| 国产电影一区| 欧美 日韩 激情| 国产精品麻豆久久久| 亚洲精品国产片| 国产成人一区二区| 欧美日韩专区| 91成人破解版| 日韩免费观看高清完整版在线观看| 理论片午夜视频在线观看| 亚洲欧美电影在线观看| 成人深夜在线观看| 中文天堂在线播放| 欧美精品videossex性护士| 欧美热在线视频精品999| 午夜免费视频网站| 在线观看日韩国产| 久草在线视频资源|