国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

同事給我埋了個坑:Insert into select語句把生產服務器炸了

數據庫 其他數據庫
由于考慮到會占用數據庫I/O,為了不影響業務,計劃是9:00以后開始遷移,但是xxx在8:00的時候,嘗試遷移了少部分數據(1000條),覺得沒啥問題,就開始考慮大批量遷移。

前言

Insert into select請慎用。這天xxx接到一個需求,需要將表A的數據遷移到表B中去做一個備份。本想通過程序先查詢查出來然后批量插入。但xxx覺得這樣有點慢,需要耗費大量的網絡I/O,決定采取別的方法進行實現。通過在Baidu的海洋里遨游,他發現了可以使用insert into select實現,這樣就可以避免使用網絡I/O,直接使用SQL依靠數據庫I/O完成,這樣簡直不要太棒了。然后他就被開除了。

事故發生的經過

由于數據數據庫中order_today數據量過大,當時好像有700W了并且每天在以30W的速度增加。所以上司命令xxx將order_today內的部分數據遷移到order_record中,并將order_today中的數據刪除。這樣來降低order_today表中的數據量。

由于考慮到會占用數據庫I/O,為了不影響業務,計劃是9:00以后開始遷移,但是xxx在8:00的時候,嘗試遷移了少部分數據(1000條),覺得沒啥問題,就開始考慮大批量遷移。

[[324520]]

  •  在遷移的過程中,應急群是先反應有小部分用戶出現支付失敗,隨后反應大批用戶出現支付失敗的情況,以及初始化訂單失敗的情況,同時騰訊也開始報警。

[[324521]]

  •  然后xxx就慌了,立即停止了遷移。

本以為停止遷移就就可以恢復了,但是并沒有。后面發生的你們可以腦補一下。

事故還原

在本地建立一個精簡版的數據庫,并生成了100w的數據。模擬線上發生的情況。

建立表結構

訂單表 

  1. CREATE TABLE `order_today` (  
  2.   `id` varchar(32) NOT NULL COMMENT '主鍵',  
  3.   `merchant_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商戶編號',  
  4.   `amount` decimal(15,2) NOT NULL COMMENT '訂單金額',  
  5.   `pay_success_time` datetime NOT NULL COMMENT '支付成功時間',  
  6.   `order_status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '支付狀態  S:支付成功、F:訂單支付失敗',  
  7.   `remark` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '備注',  
  8.   `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', 
  9.    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間 -- 修改時自動更新',  
  10.   PRIMARY KEY (`id`) USING BTREE,  
  11.   KEY `idx_merchant_id` (`merchant_id`) USING BTREE COMMENT '商戶編號'  
  12. ENGINE=InnoDB DEFAULT CHARSET=utf8

訂單記錄表 

  1. CREATE TABLE order_record like order_today; 

今日訂單表數據

模擬遷移

把8號之前的數據都遷移到order_record表中去。 

  1. INSERT INTO order_record SELECT  
  2.     *   
  3. FROM  
  4.     order_today   
  5. WHERE  
  6.     pay_success_time < '2020-03-08 00:00:00'; 

在navicat中運行遷移的sql,同時開另個一個窗口插入數據,模擬下單。

從上面可以發現一開始能正常插入,但是后面突然就卡住了,并且耗費了23s才成功,然后才能繼續插入。這個時候已經遷移成功了,所以能正常插入了。

出現的原因

在默認的事務隔離級別下:insert into order_record select * from order_today 加鎖規則是:order_record表鎖,order_today逐步鎖(掃描一個鎖一個)。

分析執行過程。

通過觀察遷移sql的執行情況你會發現order_today是全表掃描,也就意味著在執行insert into select from 語句時,mysql會從上到下掃描order_today內的記錄并且加鎖,這樣一來不就和直接鎖表是一樣了。

這也就可以解釋,為什么一開始只有少量用戶出現支付失敗,后續大量用戶出現支付失敗,初始化訂單失敗等情況,因為一開始只鎖定了少部分數據,沒有被鎖定的數據還是可以正常被修改為正常狀態。由于鎖定的數據越來越多,就導致出現了大量支付失敗。最后全部鎖住,導致無法插入訂單,而出現初始化訂單失敗。

解決方案

由于查詢條件會導致order_today全表掃描,什么能避免全表掃描呢,很簡單嘛,給pay_success_time字段添加一個idx_pay_suc_time索引就可以了,由于走索引查詢,就不會出現掃描全表的情況而鎖表了,只會鎖定符合條件的記錄。

最終的sql 

  1. INSERT INTO order_record SELECT  
  2.     *   
  3. FROM  
  4.     order_today FORCE INDEX (idx_pay_suc_time)  
  5. WHERE  
  6.     pay_success_time <= '2020-03-08 00:00:00'; 

執行過程

總結

使用insert into tablA select * from tableB語句時,一定要確保tableB后面的where,order或者其他條件,都需要有對應的索引,來避免出現tableB全部記錄被鎖定的情況。 

 

責任編輯:龐桂玉 來源: Java后端技術
相關推薦

2020-04-30 10:07:54

數據庫數據遷移Insert into

2018-03-28 15:22:52

無服務器云計算

2018-03-28 10:55:26

無服務器云計算操作數據

2020-04-14 10:06:20

微服務Netflix語言

2010-09-03 15:27:02

SQLSELECT語句

2022-07-24 14:41:09

服務器谷歌虛擬機

2017-09-04 16:51:03

Java虛擬機GC

2019-08-14 10:39:48

命令服務器關機

2012-02-09 09:52:39

服務器節能

2019-11-22 10:41:13

支付寶存儲服務器

2024-11-19 08:36:16

2013-07-23 09:51:32

Tomcat性能優化服務器性能優化

2021-12-03 11:57:27

代碼##語言

2012-05-28 10:52:17

EMC服務器

2018-07-06 11:01:03

2021-08-05 15:03:14

Windows 服務器系統

2024-03-06 08:18:22

語句GreatSQL

2010-05-21 15:51:32

2025-07-28 02:55:00

虛擬列表JavaScript單線程

2023-10-30 08:10:26

Map存儲信息
點贊
收藏

51CTO技術棧公眾號

精品一区二区三区中文字幕老牛| 色狠狠av一区二区三区| 天堂男人av| 欧美日韩一区二区在线观看视频| 在线看片福利| 国产国语videosex另类| 天堂久久久久va久久久久| 免费裸体美女网站| 色综合久久99| 国产 日韩 欧美| 国产一区再线| 国产精品欧美一区二区三区| 国产一二三区在线观看| 国模精品视频一区二区| 国产一区二区三区久久久久久久久| 日韩av在线第一页| 91 com成人网| 日韩精品福利一区二区三区| 黄色一级视频播放| 色综合久久久久| 日韩在线精品强乱中文字幕| 欧美福利精品| 亚洲一区二区三区自拍| 欧美xoxoxo| 国产一区免费| 一区二区三区四区视频精品免费| 91精品xxx在线观看| 亚洲精品国久久99热| 在线免费av电影| 日本91av在线播放| 成人国产一区二区三区精品| 色网站免费在线观看| 91精品国产99| 成人av在线影院| 麻豆传媒视频在线观看| 国产成人精品亚洲精品| av午夜精品一区二区三区| 三级网站视频在在线播放| 国产在线久久久| 国产精品婷婷午夜在线观看| 欧美日韩国产v| 欧美日韩一区在线观看视频| 欧美日韩亚洲一区二区三区| 亚洲69av| 国产 porn| 一本色道久久综合狠狠躁篇的优点 | a级片在线免费观看| 91九色在线免费视频| 中文字幕在线不卡视频| 亚洲爽爆av| 综合视频在线观看| 精品欧美一区二区久久| 激情综合视频| 韩国福利在线| 91久久国产精品| 婷婷夜色潮精品综合在线| 欧美精品尤物在线观看| 国产九色porn网址| 欧美在线视频观看| 亚洲人成网站影音先锋播放| 日本男女交配视频| 一本到不卡免费一区二区| 欧美激情理论| 亚洲高清福利| 91久久久在线| 欧美日韩中文一区| 久久久精品日韩| 色女人在线视频| 日本免费在线视频观看| 亚洲精品福利免费在线观看| 国产在线播精品第三| 日韩福利一区| 日产精品久久久久久久蜜臀| 国产亚洲精品一区二区| 国产成人小视频| 深夜福利亚洲| 最新中文字幕2018| 国产91九色视频| 日韩人在线观看| 亚洲免费黄色| 北岛玲heyzo一区二区| 欧美色图色综合| 国外色69视频在线观看| 亚洲国产中文字幕在线视频综合| 99精品电影| 秋霞a级毛片在线看| 一区国产精品| 美日韩精品免费观看视频| 亚洲精品久久久久久国产精华液| 自拍偷拍欧美| av成人影院在线| 国产精品-区区久久久狼| 国产91|九色| 欧洲亚洲精品在线| 蜜桃一区二区三区在线观看| 99久久999| 无人视频在线观看免费| 欧美一区二区三区四区在线观看地址| 日韩精品免费视频| 亚洲国产精品t66y| 97人人精品| www.综合网.com| 男女啪啪网站视频| **亚洲第一综合导航网站| 精品国产区一区| 国产视频亚洲色图| 亚洲国产一区二区三区在线播放| 国产欧美精品国产国产专区| 成av人片一区二区| 日韩一级二级三级精品视频| 国产精品久久二区| 中文字幕亚洲一区| 台湾亚洲精品一区二区tv| 麻豆影视在线观看| 欧美日韩亚洲激情| 99热精品在线观看| 国产成人精选| 你懂的视频在线免费| 免费在线看黄色片| 成人激情免费在线| 亚洲乱码国产乱码精品精天堂| 亚洲欧美一区二区三区久本道91| 玖玖国产精品视频| 国产劲爆久久| 欧美日韩经典丝袜| 啦啦啦中文高清在线视频| 亚洲激情电影在线| 奇米4444一区二区三区 | 男女啪啪的视频| 热久久免费视频精品| 欧美变态口味重另类| 亚洲免费高清视频在线| 久久国产欧美日韩精品| 少妇精品久久久一区二区| 午夜激情电影在线播放| 午夜在线不卡| 成人性生活视频免费看| 97中文在线| 欧美日韩国产二区| 精品久久一区二区| 亚洲综合色在线| 成人午夜av在线| 亚洲一区不卡| 日韩欧美一区免费| 久久av网站| 极品在线视频| 岛国在线视频| 黄色福利视频网站| av片在线免费| 久久国产精品免费一区| 青青草一区二区| 久久精品电影一区二区| 国产一区二区在线免费观看| 亚洲午夜精品网| 青青草原av在线| 2019中文字幕视频| 日本一本草久p| 成人欧美一区二区三区在线观看| 午夜精品一区二区三区av| 亚洲片在线资源| 这里只有精品视频在线观看| 一区二区在线观看av| 99r国产精品| 精品中文av资源站在线观看| 国产精品a级| 欧美日韩精品在线一区| 国偷自产视频一区二区久| 欧美天堂在线| 成人天堂yy6080亚洲高清| 亚洲精品白浆| 免费日本一区二区三区视频| 色资源在线观看| 在线看片地址| 乱子伦视频在线看| 69精品丰满人妻无码视频a片| 久久久影院一区二区三区| 91亚洲午夜在线| 久久一区二区三区国产精品| 在线日韩电影| 国产精品福利在线观看播放| 欧美综合久久| 欧美精选一区二区三区| 天堂av一区二区三区在线播放 | 成人激情在线播放| 日本aⅴ大伊香蕉精品视频| 欧美福利视频在线| 久久久久久久91| 久久久亚洲网站| 性欧美在线看片a免费观看| 91精品国产成人| 国产精品夫妻激情| 91美女高潮出水| 爱情岛论坛亚洲入口| 精品欧美一区二区久久久伦| 欧洲在线视频一区| 日本一级淫片演员| 国产在线精品91| 成人在色线视频在线观看免费大全 | 九九热这里只有在线精品视| 欧美国产亚洲精品久久久8v|