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

驚呆,一條SQL,Oracle炸了...

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

[[393461]]

圖片來自 Pexels

系統(tǒng)介紹

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

application1 和 application2 是一個分布式系統(tǒng)中的 2 個應用。

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,為了減少應用和數(shù)據(jù)庫的交互,使用了 Oracle 的 merge 語句。

注意,mybatis 相關的文件有 5 個:

  • TableAMapper.java
  • TableBMapper.java
  • TableAMapper.xml
  • TableBMapper.xml
  • TableAEntity.java

熟悉 MyBatis 的同學應該都知道,前兩個 Java 類是 SQL 操作接口類,第 3、4 兩個文件是存放 SQL 的 XML 文件,跟前兩個文件對應,最后一個 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 個的。

解決方案

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

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

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

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

DBA 方案

給 Oracle 打一個補丁,這個方案需要停服務。

業(yè)務方案 2 明細有優(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)了。測試的同學發(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 種,一種是會話級別,一種是事務級別:

  • 會話級別的臨時表,數(shù)據(jù)會在整個會話的生命周期中,會話結(jié)束,臨時表數(shù)據(jù)清空。
  • 事務級別的臨時表,數(shù)據(jù)會在整個事務執(zhí)行過程中,事務結(jié)束,臨時表數(shù)據(jù)清空。

下面看具體實施過程:

①我們創(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表臨時表'

②把 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 條。

③把臨時表的數(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

④最終業(yè)務代碼修改如下:

  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。當然,引發(fā) ORA-07445 的原因還有其他。

解決這個問題最好的方式是從業(yè)務代碼層面進行修改。也可以讓 DBA 可以給 Oracle 打一個補丁,但是 Oracle 必須要停服務。

延伸閱讀:

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

作者:jinjunzhu

編輯:陶家龍

出處:轉(zhuǎn)載自公眾號程序員 jinjunzhu

 

責任編輯:武曉燕 來源: 程序員 jinjunzhu
相關推薦

2021-02-09 09:50:21

SQLOracle應用

2025-05-20 00:00:00

2020-05-27 11:55:47

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

2020-10-26 08:02:28

SQL慢查詢索引

2010-11-15 14:16:09

Oracle表記錄

2024-07-29 09:49:00

SQLMySQL執(zhí)行

2017-10-23 15:17:42

技術業(yè)務職位

2025-05-12 08:27:25

2020-07-01 09:07:52

SQL索引語句

2011-03-23 13:52:09

ORACLESQL十進制

2022-10-12 07:38:24

SQL語句異常

2021-09-15 06:21:36

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

2022-02-11 14:43:53

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

2023-03-26 22:42:02

SQL關聯(lián)索引

2022-05-31 13:58:09

MySQL查詢語句

2023-10-06 15:29:07

MySQL數(shù)據(jù)庫更新

2024-12-17 06:20:00

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

2020-04-17 14:16:10

SQL數(shù)據(jù)庫HTTP

2022-07-31 22:07:03

宕機業(yè)務場景

2010-04-13 16:57:01

點贊
收藏

51CTO技術棧公眾號

少妇丰满尤物大尺度写真| 蜜臀av.com| 国产美女www| 日本a口亚洲| 日韩网站在线看片你懂的| 国产美女在线一区| 触手亚洲一区二区三区| 国产一区二区三区免费观看| 97国产精品视频| www..com.cn蕾丝视频在线观看免费版 | 中文字幕系列一区| 亚洲欧美另类在线| 欧美一级爽aaaaa大片| 国产视频第一页| 日韩精品电影在线| 国外色69视频在线观看| 日韩一卡二卡在线观看| 色婷婷av一区二区三区丝袜美腿| 欧美精三区欧美精三区| 欧美日韩国产精品激情在线播放| 久久综合九色综合网站| 国产亚洲欧美精品久久久www | 亚洲五月六月| 亚洲av激情无码专区在线播放| 久久国产三级精品| 国产91色在线| 国产午夜视频在线播放| 91精品国产麻豆国产在线观看 | 欧美日本韩国一区二区三区视频| 热99这里只有精品| 四虎亚洲成人| 综合网在线视频| 三区精品视频观看| 欧美日韩伦理片| 99久久精品国产一区| 不卡视频一区二区| 99久久精品无免国产免费| 欧美a级一区二区| 日本aⅴ大伊香蕉精品视频| 久久久久久久久久一区二区三区| 99热在线成人| 中文字幕不卡av| 美国黑人一级大黄| 成人在线免费视频观看| 国产亚洲欧美aaaa| 性欧美一区二区| 国产91一区| 亚洲男人第一av网站| 亚洲图片综合网| 国产美女撒尿一区二区| 精品国产乱码久久久久久久久| 在线观看网站黄| 日韩不卡在线视频| 日韩欧美综合在线| 亚洲婷婷在线观看| 高潮按摩久久久久久av免费| 精品国产伦一区二区三区观看体验| 国产ts在线观看| 鲁大师精品99久久久| 亚洲精品电影网| 野外性满足hd| 欧美中文一区二区| xxxx性欧美| 久草国产在线观看| 一本色道久久精品| 日韩美女激情视频| 人妻中文字幕一区二区三区| 奇米在线7777在线精品| 成人精品一区二区三区电影黑人 | 亚洲第一天堂av| 欧产日产国产精品98| 亚洲警察之高压线| 在线电影av不卡网址| 麻豆一区在线观看| 欧美精选在线| 97精品一区二区三区| 日本高清不卡码| 麻豆精品久久久| 91中文在线观看| 污污视频在线免费看| 久久蜜桃av一区精品变态类天堂| 亚洲v欧美v另类v综合v日韩v| 最新电影电视剧在线观看免费观看 | 国产精品区一区二区三在线播放| 日本福利片高清在线观看| 国产欧美日韩在线观看| 强开小嫩苞一区二区三区网站 | 婷婷亚洲一区二区三区| 国产视频亚洲色图| 日本老太婆做爰视频| 日韩大片免费观看| 精品污污网站免费看| 好吊操视频这里只有精品| 国产欧美日韩影院| 久久av红桃一区二区小说| 日韩美女视频网站| 久久综合综合久久综合| 国产精品久久久一区二区三区| 99热在线只有精品| 91免费观看在线| 亚洲AV无码成人精品一区| 2020国产在线| 欧美日韩mp4| 亚洲天堂成人av| 婷婷色综合网| 热99久久精品| 亚洲欧美激情国产综合久久久| 日本一区二区三区四区在线视频| 青青草视频国产| 高清av一区二区三区| 亚洲成人黄色在线| 超碰手机在线观看| 蜜臀99久久精品久久久久久软件| 动漫一区二区在线| 在线观看免费高清完整| 黑人巨大精品欧美一区二区一视频| 五月婷婷六月丁香激情| 色橹橹欧美在线观看视频高清| 美女av一区二区| 中文字幕一级片| 久久综合久久鬼色| 日本熟妇人妻xxxx| 精品国产乱码久久久久久樱花| 亚洲欧美变态国产另类| 日韩伦人妻无码| 国产99久久久国产精品| 日韩视频在线免费播放| 91亚洲视频| 亚洲人成电影网站色…| 久久露脸国语精品国产91| 国产高清精品在线| 男女爱爱视频网站| 亚洲青青久久| 久久精品这里热有精品| 亚洲婷婷久久综合| 久久久久久综合| 亚洲中文字幕无码中文字| 都市激情久久| 97久久精品视频| 成人无码一区二区三区| 亚洲自拍与偷拍| 午夜免费视频网站| 欧美一区久久| 91大片在线观看| 天堂亚洲精品| 亚洲成人999| 精品无码黑人又粗又大又长| 国产成人精品影视| 国产香蕉一区二区三区| 亚洲一区二区三区在线免费 | 91桃色在线观看| 亚洲成人在线网| 成年人免费高清视频| 91丨九色丨尤物| 黄色高清无遮挡| jlzzjlzz亚洲女人| 国产一区欧美二区三区| 麻豆网站在线免费观看| 91精品国产91综合久久蜜臀| 国产精品丝袜一区二区| 国产成人av影院| 成品人视频ww入口| 青青一区二区| 国产精品成人观看视频国产奇米| 国产日本在线| 欧美高清视频一二三区 | 成人在线播放av| jizz性欧美| 欧美精品一区二区三区在线播放| 色播视频在线播放| 久久精品夜色噜噜亚洲a∨| 免费看污黄网站| 婷婷综合久久| 国产精品亚洲一区| 91精品影视| 美女精品久久久| 天天躁日日躁狠狠躁喷水| 91久久精品午夜一区二区| 日本女人性生活视频| 国产麻豆9l精品三级站| 欧美 日韩 激情| 色婷婷色综合| 国产chinese精品一区二区| 欧美1级2级| 精品自在线视频| 欧美新色视频| 91精品国产综合久久久久久 | 国产一区二区黄色| 日韩三区免费| 欧美激情精品久久久久久黑人| 日韩电影在线观看完整版| 欧美日韩在线直播| 久久久久久久久久影院| 国产精品成人免费在线| 日韩aaaaa| 久久精品国产精品亚洲综合| 国产www免费| 日韩综合精品| 美女黄毛**国产精品啪啪| 成人自拍视频| 日韩免费不卡av| 七七久久电影网| 在线观看国产精品91| 亚洲精品久久久久久无码色欲四季| 懂色av中文一区二区三区天美| 日本视频在线免费| 91老司机福利 在线| 中文字幕在线视频一区二区三区 | 一区二区三区国产豹纹内裤在线| 一级做a爰片毛片| 国产成人午夜视频| 在线观看免费黄网站| 一区二区黄色| 日本wwwcom| 亚洲色图88| 日韩欧美一区二区在线观看| 老牛精品亚洲成av人片| 亚洲一区二区三区sesese| 小明成人免费视频一区| 欧美一级视频免费在线观看| 亚洲综合伊人久久大杳蕉| 中文字幕日韩av电影| 邻居大乳一区二区三区| 亚洲国产中文字幕在线观看| 国产suv一区二区| 欧美精品视频www在线观看| 无码人妻av一区二区三区波多野| 午夜一区二区三区在线观看| 真实国产乱子伦对白在线| 中文字幕乱码久久午夜不卡| av网站免费在线看| 久久综合国产精品| 丰满大乳奶做爰ⅹxx视频| 成人免费高清视频在线观看| 国产探花一区二区三区| 激情五月激情综合网| 亚洲欧美日韩三级| 激情欧美日韩一区二区| 亚洲一区二区三区四区五区| 日本欧美一区二区在线观看| 亚洲国产精品va在线看黑人动漫| 日b视频在线观看| 成人一区二区三区在线观看| 久久精品无码一区二区三区毛片| 极品美女销魂一区二区三区免费| 污视频网站观看| 激情丁香综合五月| www.亚洲男人天堂| 欧美成人精品欧美一级乱黄| 午夜a成v人精品| 五月婷婷开心网| 色猫猫国产区一区二在线视频| 精品免费囯产一区二区三区| 欧美日韩在线视频一区| 亚洲精品成人在线视频| 色婷婷久久久综合中文字幕| 精品人妻一区二区三区潮喷在线 | 日韩av手机版| 日本美女一区二区三区| 欧美成人黄色网址| 紧缚捆绑精品一区二区| 日本成人在线免费| 91亚洲精华国产精华精华液| 亚洲成人网在线播放| 国产精品素人一区二区| 一级性生活免费视频| 亚洲激情第一区| 欧美激情亚洲综合| 欧美在线免费视屏| 99在线观看精品视频| 亚洲精品成人网| 成年午夜在线| 欧美另类极品videosbest最新版本 | 免费午夜视频在线观看| 日韩成人午夜精品| 人妻少妇偷人精品久久久任期| 成人一区二区三区在线观看| 在线观看福利片| 中文字幕日本乱码精品影院| 国产中文字字幕乱码无限| 色婷婷久久综合| 国产片高清在线观看| 亚洲国产高清自拍| √新版天堂资源在线资源| 欧美日韩爱爱视频| 日本精品另类| 丁香五月网久久综合| 精品国产网站| 久草免费福利在线| 麻豆精品一区二区| 中文在线观看免费视频| 国产精品蜜臀av| 日本三级黄色大片| 欧美日韩精品一区二区三区蜜桃| 高h放荡受浪受bl| 伊人青青综合网站| www.综合网.com| 91精品视频大全| 国产免费久久| 欧美精品久久久久久久免费| 蜜桃精品在线观看| 国产三级视频网站| 夜夜精品浪潮av一区二区三区| 成人免费毛片视频| 精品国产乱码久久久久久夜甘婷婷| 1024免费在线视频| 日本精品一区二区三区在线播放视频| 欧美视频二区欧美影视| 日韩一二三区不卡在线视频| 尹人成人综合网| 四川一级毛毛片| 一区在线播放视频| 艳妇乳肉豪妇荡乳av无码福利 | 亚洲综合成人婷婷小说| 极品美女一区二区三区| 人人妻人人做人人爽| 久久99精品久久久久婷婷| 丰满少妇高潮一区二区| 亚洲国产裸拍裸体视频在线观看乱了| 又色又爽又黄无遮挡的免费视频| 日韩国产中文字幕| 男女免费观看在线爽爽爽视频| 91久久久久久久久久| 日本一本不卡| 免费看黄色一级大片| 久久综合资源网| 日本一级片免费看| 欧美成人官网二区| 手机在线免费看av| 成人在线视频网站| 欧美wwwww| 在线观看av日韩| 欧美国产乱子伦| 亚洲成人av网址| 亚洲欧美综合另类中字| 成人福利视频| 欧美一区二区高清在线观看| 午夜一区不卡| 亚洲AV无码片久久精品| 色噜噜狠狠成人网p站| 香蕉视频黄色片| 孩xxxx性bbbb欧美| 国内露脸中年夫妇交换精品| 成人一级生活片| 99视频精品全部免费在线| 精品无码久久久久久久| 亚洲缚视频在线观看| 成人免费网站观看| 精品一区二区国产| 久久久成人网| 中文字幕被公侵犯的漂亮人妻| 狠狠躁18三区二区一区| 日色在线视频| 国产精品久久一区| 色一区二区三区四区| 日韩成人av免费| 一区二区三区中文免费| 好吊视频一区二区三区| 午夜精品蜜臀一区二区三区免费| 欧美日韩夜夜| 日本成人在线免费视频| 国产欧美综合在线| 国产又爽又黄又嫩又猛又粗| 欧美乱人伦中文字幕在线| 东京久久高清| 色婷婷综合久久久久中文字幕 | 国产电影一区在线| 日韩精品人妻中文字幕| 亚洲久久久久久久久久久| 欧美日韩精品免费观看视欧美高清免费大片| 亚洲成人精品电影在线观看| 激情综合网天天干| 日本熟妇成熟毛茸茸| 亚洲天堂男人天堂女人天堂| 久久精品嫩草影院| 亚洲精品久久久久久久蜜桃臀| 久久久久久久久97黄色工厂| 午夜视频网站在线观看| 欧美巨大黑人极品精男| 亚洲宅男网av| 欧美一级免费在线| 日韩欧美在线观看| 成人直播在线| 欧美日韩亚洲一区二区三区在线观看| 美女网站一区二区| 黄色小视频在线免费看| 中日韩美女免费视频网站在线观看 | 欧美性xxxxx极品少妇| 青草在线视频在线观看| 日本免费高清不卡| 国产mv日韩mv欧美| 免费看av在线| 午夜精品福利在线观看| 91麻豆国产自产在线观看亚洲 | 日本成人a网站| 波多野结衣国产精品| 大桥未久av一区二区三区| 黄色免费在线观看网站| 欧美极品一区| 国产成人精品午夜视频免费|