精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

系統(tǒng)上線(xiàn)時(shí)SQL腳本的9大坑

jf_78858299 ? 來(lái)源:蘇三說(shuō)技術(shù) ? 作者:蘇三說(shuō)技術(shù) ? 2023-04-24 17:10 ? 次閱讀

系統(tǒng)上線(xiàn)時(shí),非常容易出問(wèn)題。

即使之前在測(cè)試環(huán)境,已經(jīng)執(zhí)行過(guò)SQL腳本了。但是有時(shí)候,在系統(tǒng)上線(xiàn)時(shí),在生產(chǎn)環(huán)境執(zhí)行相同的SQL腳本,還是有可能出現(xiàn)一些問(wèn)題。

有些小公司,SQL腳本是開(kāi)發(fā)自己執(zhí)行的,有很大的風(fēng)險(xiǎn)。

有些大廠(chǎng),有專(zhuān)業(yè)的DBA把關(guān),但DBA也不是萬(wàn)能的,還是有可能會(huì)讓一些錯(cuò)誤的SQL腳本被生產(chǎn)環(huán)境執(zhí)行了,比如:update語(yǔ)句的順序不對(duì)。

今天跟大家一起聊聊,系統(tǒng)上線(xiàn)時(shí)SQL腳本的9大坑,以便于大家吸取教訓(xùn),能夠防微杜漸,希望對(duì)你會(huì)有所幫助。

1 漏腳本了

我們上線(xiàn)時(shí)執(zhí)行的SQL腳本,出現(xiàn)次數(shù)最多的問(wèn)題,應(yīng)該是漏腳本了。

  • 有時(shí)候少加了一個(gè)字段。
  • 有時(shí)候字段的注釋沒(méi)有及時(shí)修改。
  • 有時(shí)候有些新表沒(méi)創(chuàng)建。
  • 有時(shí)候字段類(lèi)型忘了修改。

等等。

我們的SQL腳本中漏腳本的情況有很多。

那么,如何解決這個(gè)問(wèn)題呢?

答:將SQL腳本做成代碼的一部分。在項(xiàng)目的代碼中,創(chuàng)建一個(gè)專(zhuān)門(mén)的sql目錄,在該目錄下根據(jù)每個(gè)迭代創(chuàng)建一個(gè)子目錄,比如:mv3.2.1,將SQL腳本存放到mv3.2.1下。

我們?cè)陂_(kāi)發(fā)環(huán)境任何對(duì)表的相關(guān)操作,比如:增加字段、修改字段類(lèi)型、修改注釋、增加索引、創(chuàng)建表等等,都需要通過(guò)SQL語(yǔ)句操作,然后把該SQL語(yǔ)句,整理到SQL腳本中。

最后提交到公司GitLab上,我們?cè)跍y(cè)試環(huán)境和生產(chǎn)環(huán)境發(fā)版時(shí),去GitLab上找相關(guān)迭代版本的SQL腳本執(zhí)行。

通過(guò)該方式基本可以解決漏腳本的問(wèn)題。

2 腳本語(yǔ)法錯(cuò)誤

有些小伙伴看到這個(gè)標(biāo)題可能有點(diǎn)懵,SQL腳本不是已經(jīng)在測(cè)試環(huán)境執(zhí)行過(guò)了嗎?為什么還會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤?

比如說(shuō)有這樣的場(chǎng)景:原本你的SQL腳本沒(méi)問(wèn)題的,但沒(méi)有按照規(guī)范,給一張表的添加多個(gè)字段,你寫(xiě)了多條ALTER語(yǔ)句。

例如:

alter table t_user add column  `work` varchar(30) DEFAULT NULL COMMENT '工作';
alter table t_user add column  `provice` varchar(10) DEFAULT NULL  COMMENT '籍貫';

在上線(xiàn)時(shí),你給DBA提SQL工單時(shí),該工單被DBA審核拒絕打回來(lái)了。

然后為了趕時(shí)間,你急急忙忙把多條ALTER語(yǔ)句改成一條ALTER語(yǔ)句。

例如:

alter table t_user add `work` varchar(30) DEFAULT NULL COMMENT '工作',
add `provice` varchar(10) DEFAULT NULL  COMMENT '籍貫';

但在修改的過(guò)程中,有地方少了一個(gè)逗號(hào),就可能會(huì)出現(xiàn)SQL語(yǔ)法錯(cuò)誤。

因此,不管是什么SQL語(yǔ)句,要養(yǎng)成好習(xí)慣,只要修改了一定要記得到開(kāi)發(fā)環(huán)境的數(shù)據(jù)庫(kù)中,先執(zhí)行測(cè)試一下,切勿直接提到生產(chǎn)環(huán)境,即使你有很大的把握,也需要再更慎重一些。

這樣基本可以避免SQL語(yǔ)法錯(cuò)誤的問(wèn)題。

3 腳本順序不對(duì)

有些時(shí)候,我們?cè)谏暇€(xiàn)系統(tǒng)時(shí),DBA在執(zhí)行SQL腳本的時(shí)候,沒(méi)有報(bào)錯(cuò),但最后的數(shù)據(jù)就是不對(duì)。

有可能是腳本順序不對(duì)導(dǎo)致的。

比如有這樣一種場(chǎng)景:你往某張表通過(guò)insert初始化了一條數(shù)據(jù)。

例如:

INSERT INTO `sue`.`t_user`(`id`, `code`, `age`, `name`, `height`, `address`, `work`, `provice`) VALUES (1, '101', 21, '周星馳', 173, '香港', NULL, NULL);

另外一個(gè)人要基于你這條數(shù)據(jù),通過(guò)update修改數(shù)據(jù)。

例如:

update t_user set age=25 where id=1;

你們提了兩條SQL腳本。

另外一個(gè)人先提的,你后提的。

DBA先把他的SQL工單審核通過(guò)了,先update數(shù)據(jù),此時(shí)通過(guò)id是沒(méi)法找到那條數(shù)據(jù)的,影響行數(shù)為0。

然后DBA再審核你的SQL工單,審核通過(guò)了,插入了一條數(shù)據(jù)。

由于SQL腳本的順序不對(duì),導(dǎo)致最終系統(tǒng)上線(xiàn)時(shí)的數(shù)據(jù)不對(duì)。

那么這個(gè)問(wèn)題要如何解決呢?

雙方要事先溝通好,把另外一個(gè)同事的SQL腳本加到你的初始化腳本中,你的腳本在初始化時(shí),直接去修改數(shù)據(jù)即可。

例如:

INSERT INTO `sue`.`t_user`(`id`, `code`, `age`, `name`, `height`, `address`, `work`, `provice`) VALUES (1, '101', 25, '周星馳', 173, '香港', NULL, NULL);

這樣可以避免執(zhí)行順序問(wèn)題。

4 執(zhí)行時(shí)機(jī)不對(duì)

有些系統(tǒng)功能已經(jīng)上線(xiàn)了,在后面的迭代中,為了盡量避免少影響線(xiàn)上功能,可以增加一個(gè)pre(即預(yù)生產(chǎn)環(huán)境)。

該環(huán)境跟生產(chǎn)環(huán)境是差不多的,連接了相同的數(shù)據(jù)庫(kù),使用了相同的apollo配置。

但唯一的區(qū)別是pre環(huán)境沒(méi)有實(shí)際的用戶(hù)流量,只能公司內(nèi)部人員才能訪(fǎng)問(wèn)。

一般在迭代版本上線(xiàn)之前,先要把系統(tǒng)功能發(fā)布到pre環(huán)境中,測(cè)試通過(guò)之后,才能發(fā)布到prod(即生產(chǎn)環(huán)境)。

但有些SQL腳本,卻沒(méi)法再pre環(huán)境中執(zhí)行,不然會(huì)影響生產(chǎn)環(huán)境。

比如:修改了字段類(lèi)型,int改成varchar了,或者初始化數(shù)據(jù)時(shí),初始化了一條新加的枚舉數(shù)據(jù)。

由于pre環(huán)境是運(yùn)行的最新代碼,但prod環(huán)境還是運(yùn)行的老代碼。

如果在發(fā)布pre環(huán)境時(shí),直接執(zhí)行SQL腳本,可能會(huì)導(dǎo)致prod環(huán)境的功能異常。

因此要搞清楚SQL腳本的執(zhí)行時(shí)機(jī),哪些是要在pre環(huán)境執(zhí)行的,哪些是要在prod環(huán)境執(zhí)行的。

我們?cè)谔酳QL工單時(shí),千萬(wàn)不要一股腦就提了,一定要區(qū)分時(shí)機(jī)。

在發(fā)pre環(huán)境時(shí),要么不提發(fā)prod環(huán)境的SQL腳本。要么,在工單的名稱(chēng)上做區(qū)分,比如增加prod_開(kāi)頭的標(biāo)識(shí)。

這樣可以解決SQL腳本執(zhí)行時(shí)機(jī)的問(wèn)題。

5 搞錯(cuò)數(shù)據(jù)庫(kù)了

有時(shí)候,我們的數(shù)據(jù)庫(kù)做了分庫(kù)分表,或者增加備份庫(kù)

在執(zhí)行SQL腳本的時(shí)候,由于我們自己的疏忽,提SQL工單時(shí)選錯(cuò)數(shù)據(jù)庫(kù)了,或者DBA的疏忽,在執(zhí)行SQL工單時(shí)搞錯(cuò)數(shù)據(jù)庫(kù)了,就會(huì)出現(xiàn)問(wèn)題。

建議我們的SQL腳本增加庫(kù)名,比如:

alter table sue.t_user add `work` varchar(30) DEFAULT NULL COMMENT '工作';

這里增加庫(kù)名:sue。

這樣基本可以避免選錯(cuò)數(shù)據(jù)庫(kù)的問(wèn)題。

6 腳本耗時(shí)太長(zhǎng)

有時(shí)候,我們的SQL腳本需要批量修改生產(chǎn)環(huán)境的一些數(shù)據(jù),正常情況下一條update語(yǔ)句就能搞定。

例如:

update user set status=0 where status=1;

但由于user表的數(shù)據(jù)量非常大,我們?cè)趫?zhí)行該SQL腳本之前,沒(méi)有預(yù)先評(píng)估該SQL腳本的耗時(shí)情況,而選擇直接在生產(chǎn)環(huán)境的數(shù)據(jù)庫(kù)中執(zhí)行。

假如該SQL腳本耗時(shí)非常長(zhǎng),比如要10分鐘才能執(zhí)行完,可能會(huì)導(dǎo)致user表長(zhǎng)期鎖表,影響正常的業(yè)務(wù)功能。

在該SQL腳本執(zhí)行的過(guò)程中,極有可能會(huì)出現(xiàn)業(yè)務(wù)功能操作,導(dǎo)致的死鎖問(wèn)題。

因此,建議這種大批量的數(shù)據(jù)更新操作,要在用戶(hù)較少的凌晨,分批多次執(zhí)行。

我們要盡可能少的影響線(xiàn)上用戶(hù)的功能。

此外,在生產(chǎn)環(huán)境增加字段,增加索引等操作,也能會(huì)導(dǎo)致長(zhǎng)期鎖表。也要避免在用戶(hù)訪(fǎng)問(wèn)高峰期執(zhí)行相關(guān)的SQL腳本。

7 腳本無(wú)法回滾

絕大多數(shù)系統(tǒng)上線(xiàn)是能夠成功的,雖然過(guò)程中會(huì)遇到很多問(wèn)題,但如果能夠及時(shí)解決,也能夠上線(xiàn)成功

但如果有些問(wèn)題,沒(méi)法再規(guī)定的時(shí)間內(nèi)解決,很有可能會(huì)導(dǎo)致上線(xiàn)失敗

如果上線(xiàn)失敗,意味著代碼和數(shù)據(jù)庫(kù)的SQL腳本要回滾。

如果只回滾了代碼,不回滾數(shù)據(jù)庫(kù),可能會(huì)導(dǎo)致很多系統(tǒng)異常。

因此,我們?cè)跍?zhǔn)備SQL語(yǔ)句時(shí),要留點(diǎn)心眼,順便想想該SQL語(yǔ)句能否回滾。

對(duì)于update語(yǔ)句可以加上修改時(shí)間:

update t_user set age=25,time=now(3) where id=1;

這樣可以通過(guò)該時(shí)間追溯一次SQL操作修改的數(shù)據(jù),方便后面做回滾。

有些時(shí)候我們要update的數(shù)據(jù),是要通過(guò)多條sql語(yǔ)句查詢(xún)出來(lái)的,比如:需要使用的id。

為了方便回滾我們可以增加臨時(shí)表,保存這些id,后面就能追溯了。

當(dāng)然有些開(kāi)源的數(shù)據(jù)庫(kù)管理平臺(tái),比如:Archery,是有自帶SQL審核和回滾的功能。

8 忘了加索引

我們?cè)谠黾恿俗侄沃螅浅H菀缀雎缘囊患率牵?code>加索引。

特別是當(dāng)前表數(shù)據(jù)量很大,而且增加的字段是另外一張表的id時(shí),這種情況強(qiáng)烈建議增加索引。

如果我們上線(xiàn)系統(tǒng)時(shí),在SQL腳本中,忘了給該字段增加索引。如果該id字段被大批量訪(fǎng)問(wèn),全部走的全表掃描,可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)性能直線(xiàn)下降,出現(xiàn)大量的超時(shí)問(wèn)題

所以建議我們?cè)陂_(kāi)發(fā)的時(shí)候,如果要增加字段的話(huà),要養(yǎng)成良好習(xí)慣,想一想這個(gè)字段需不需要建索引

如果不確定數(shù)據(jù)量的話(huà),可以先到生產(chǎn)環(huán)境查詢(xún)一下真實(shí)的用戶(hù)數(shù)據(jù),不然后續(xù)可能會(huì)引起比較大的生產(chǎn)事故

9 字段改名

對(duì)于生產(chǎn)環(huán)境的表字段,通常情況下,我們不允許修改名稱(chēng)。

如果你在發(fā)布pre環(huán)境時(shí),通過(guò)SQL腳本把某張表的某個(gè)字段名稱(chēng)修改了,pre環(huán)境代碼使用了新的名稱(chēng),系統(tǒng)沒(méi)有問(wèn)題。

但prod環(huán)境還是使用老的名稱(chēng),所有使用該名稱(chēng)的sql語(yǔ)句,在代碼執(zhí)行過(guò)程中都會(huì)報(bào)錯(cuò)。

因此,禁止在生產(chǎn)環(huán)境通過(guò)SQL腳本修改字段名稱(chēng)

當(dāng)然系統(tǒng)上線(xiàn)時(shí)除了SQL腳本的這些坑之外,還有系統(tǒng)發(fā)版失敗,代碼合錯(cuò)分支,mq消息被pre消費(fèi)了,無(wú)法回滾等等,還有很多問(wèn)題。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    750

    瀏覽量

    43902
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    382

    瀏覽量

    14761
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是 Flink SQL 解決不了的問(wèn)題?

    簡(jiǎn)介 在實(shí)時(shí)數(shù)據(jù)開(kāi)發(fā)過(guò)程中,大家經(jīng)常會(huì)用 Flink SQL 或者 Flink DataStream API 來(lái)做數(shù)據(jù)加工。通常情況下選用2者都能加工出想要的數(shù)據(jù),但是總會(huì)有 Flink SQL
    的頭像 發(fā)表于 07-09 20:50 ?164次閱讀

    SQL全外連接剖析

    SQL中的全外連接是什么? 在SQL中,F(xiàn)ULLOUTERJOIN組合左外連接和右外連接的結(jié)果,并返回連接子句兩側(cè)表中的所有(匹配或不匹配)行。接下面sojson給大家詳細(xì)講解。 ? 圖解:SQL
    的頭像 發(fā)表于 03-19 18:28 ?1752次閱讀
    <b class='flag-5'>SQL</b>全外連接剖析

    為什么需要監(jiān)控SQL服務(wù)器?

    如今,大多數(shù)桌面、移動(dòng)、云、物聯(lián)網(wǎng)和其他應(yīng)用程序都嚴(yán)重依賴(lài)數(shù)據(jù)庫(kù)。為了支持這些,SQL Server部署、容量和工作負(fù)載不斷增長(zhǎng)。當(dāng)這種情況發(fā)生時(shí),企業(yè)需要確保數(shù)據(jù)系統(tǒng)滿(mǎn)足所需的性能要求。 SQL
    的頭像 發(fā)表于 02-19 17:19 ?359次閱讀

    Linux系統(tǒng)中調(diào)用腳本的常見(jiàn)方法

    在linux系統(tǒng)中有多種方法可以在系統(tǒng)啟動(dòng)后調(diào)用腳本,接下來(lái)介紹幾種常見(jiàn)的方法
    的頭像 發(fā)表于 12-13 18:16 ?869次閱讀

    Oracle如何執(zhí)行sql腳本文件

    Oracle是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),可用于存儲(chǔ)、查詢(xún)和管理大量的數(shù)據(jù)。在Oracle中,可以通過(guò)執(zhí)行SQL腳本文件來(lái)一次性地執(zhí)行多個(gè)SQL語(yǔ)句或者批量處理數(shù)據(jù)。在下面的文章中,我將
    的頭像 發(fā)表于 12-06 10:51 ?5532次閱讀

    oracle執(zhí)行sql查詢(xún)語(yǔ)句的步驟是什么

    Oracle數(shù)據(jù)庫(kù)是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),具有強(qiáng)大的SQL查詢(xún)功能。Oracle執(zhí)行SQL查詢(xún)語(yǔ)句的步驟包括編寫(xiě)SQL語(yǔ)句、解析SQL
    的頭像 發(fā)表于 12-06 10:49 ?776次閱讀

    oracle sql 定義變量并賦值

    在Oracle SQL中,變量是用來(lái)存儲(chǔ)數(shù)據(jù)值的標(biāo)識(shí)符。通過(guò)定義和使用變量,我們可以在SQL語(yǔ)句中使用它們來(lái)存儲(chǔ)和處理數(shù)據(jù),從而實(shí)現(xiàn)更靈活和動(dòng)態(tài)的查詢(xún)和操作。 在Oracle SQL中,定義變量并
    的頭像 發(fā)表于 12-06 10:46 ?2079次閱讀

    腳本錯(cuò)誤scripterror怎么解決

    腳本錯(cuò)誤”(Script Error)通常是在運(yùn)行或嘗試運(yùn)行一段腳本或程序時(shí)出現(xiàn)的錯(cuò)誤。這種錯(cuò)誤可能源于許多不同的原因,包括語(yǔ)法錯(cuò)誤、運(yùn)行環(huán)境問(wèn)題、依賴(lài)庫(kù)缺失等。解決腳本錯(cuò)誤需要針對(duì)具體錯(cuò)誤進(jìn)行
    的頭像 發(fā)表于 11-26 14:46 ?5826次閱讀

    小程序開(kāi)發(fā)“巨”多,華為云這款輕量應(yīng)用服務(wù)器輕松避

    地分享和傳播。小程序開(kāi)發(fā)如今已經(jīng)成為了很多企業(yè)和個(gè)人的選擇,它具有快速、簡(jiǎn)潔、低成本等優(yōu)勢(shì),但同時(shí)也存在許多隱藏的陷阱。 七大巨,埋雷眾多 第一大坑:設(shè)計(jì)不合理 不合理的設(shè)計(jì)會(huì)給用戶(hù)帶來(lái)困惑和不良的使用體驗(yàn)
    的頭像 發(fā)表于 11-23 00:53 ?183次閱讀
    小程序開(kāi)發(fā)“巨<b class='flag-5'>坑</b>”多,華為云這款輕量應(yīng)用服務(wù)器輕松避<b class='flag-5'>坑</b>

    mysql和sql server區(qū)別

    MySQL和SQL Server是兩種常見(jiàn)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),用于存儲(chǔ)和管理數(shù)據(jù)庫(kù)。雖然它們都支持SQL語(yǔ)言,但在其他方面存在一些顯著的區(qū)別。以下是MySQL和SQL
    的頭像 發(fā)表于 11-21 11:07 ?1251次閱讀

    什么是SQL注入?Java項(xiàng)目防止SQL注入方式

    Java項(xiàng)目防止SQL注入方式 這里總結(jié)4種: PreparedStatement防止SQL注入 mybatis中#{}防止SQL注入 對(duì)請(qǐng)求參數(shù)的敏感詞匯進(jìn)行過(guò)濾 nginx反向代理防止
    發(fā)表于 10-16 14:26 ?450次閱讀

    sql是什么意思網(wǎng)絡(luò)用語(yǔ)

    sql是什么意思?sql是結(jié)構(gòu)化查詢(xún)語(yǔ)言(Structured Query Language)的縮寫(xiě)。它是一種專(zhuān)門(mén)用于管理關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)的編程語(yǔ)言。sql用于執(zhí)行各種數(shù)據(jù)庫(kù)操作,包括
    的頭像 發(fā)表于 10-13 17:31 ?3102次閱讀

    數(shù)據(jù)庫(kù)SQL的優(yōu)化

    用戶(hù)成功連接數(shù)據(jù)庫(kù)之后,用戶(hù)和數(shù)據(jù)庫(kù)成功建立起了會(huì)話(huà)。此后,用戶(hù)每通過(guò)會(huì)話(huà)發(fā)出一條SQL語(yǔ)句,數(shù)據(jù)庫(kù)系統(tǒng)都會(huì)對(duì)其進(jìn)行一系列檢查、分析、處理。 同時(shí)優(yōu)化器會(huì)對(duì)SQL進(jìn)行一些優(yōu)化,并選擇出一個(gè)它覺(jué)得最優(yōu)的執(zhí)行計(jì)劃,然后再去執(zhí)行這些
    的頭像 發(fā)表于 10-09 15:43 ?943次閱讀
    數(shù)據(jù)庫(kù)<b class='flag-5'>SQL</b>的優(yōu)化

    sql注入漏洞解決方法有哪些?

    什么是sql注入?SQL注入(SQLi)是一種執(zhí)行惡意SQL語(yǔ)句的注入攻擊。攻擊者可能會(huì)利用 SQL 注入漏洞來(lái)繞過(guò)應(yīng)用程序安全措施。典型的SQLi攻擊會(huì)通過(guò)添加、刪除和修改數(shù)據(jù)庫(kù)中的
    的頭像 發(fā)表于 10-07 17:29 ?4516次閱讀
    <b class='flag-5'>sql</b>注入漏洞解決方法有哪些?

    SQL常用語(yǔ)句篇

    SQL (Structured Query Language) 是具有數(shù)據(jù)操縱和數(shù)據(jù)定義等多種功能的數(shù)據(jù)庫(kù)語(yǔ)言,這種語(yǔ)言具有交互性特點(diǎn),能為用戶(hù)提供極大的便利,數(shù)據(jù)庫(kù)管理系統(tǒng)應(yīng)充分利用SQL語(yǔ)言提高計(jì)算機(jī)應(yīng)用
    的頭像 發(fā)表于 10-07 16:22 ?447次閱讀
    <b class='flag-5'>SQL</b>常用語(yǔ)句篇