亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

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

jf_78858299 ? 來源:蘇三說技術(shù) ? 作者:蘇三說技術(shù) ? 2023-04-24 17:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

1 漏腳本了

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

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

等等。

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

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

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

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

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

通過該方式基本可以解決漏腳本的問題。

2 腳本語法錯(cuò)誤

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

比如說有這樣的場景:原本你的SQL腳本沒問題的,但沒有按照規(guī)范,給一張表的添加多個(gè)字段,你寫了多條ALTER語句。

例如:

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

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

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

例如:

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

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

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

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

3 腳本順序不對

有些時(shí)候,我們在上線系統(tǒng)時(shí),DBA在執(zhí)行SQL腳本的時(shí)候,沒有報(bào)錯(cuò),但最后的數(shù)據(jù)就是不對。

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

比如有這樣一種場景:你往某張表通過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ù),通過update修改數(shù)據(jù)。

例如:

update t_user set age=25 where id=1;

你們提了兩條SQL腳本。

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

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

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

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

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

雙方要事先溝通好,把另外一個(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í)行順序問題。

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

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

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

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

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

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

比如:修改了字段類型,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í)行的。

我們在提SQL工單時(shí),千萬不要一股腦就提了,一定要區(qū)分時(shí)機(jī)。

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

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

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

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

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

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

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

這里增加庫名:sue。

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

6 腳本耗時(shí)太長

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

例如:

update user set status=0 where status=1;

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

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

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

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

我們要盡可能少的影響線上用戶的功能。

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

7 腳本無法回滾

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

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

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

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

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

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

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

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

有些時(shí)候我們要update的數(shù)據(jù),是要通過多條sql語句查詢出來的,比如:需要使用的id。

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

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

8 忘了加索引

我們在增加了字段之后,非常容易忽略的一件事是:加索引。

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

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

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

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

9 字段改名

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

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

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

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

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

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

    關(guān)注

    1

    文章

    789

    瀏覽量

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

    關(guān)注

    1

    文章

    406

    瀏覽量

    29006
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Hummingbirdv2 E203 仿真排之路

    弄清楚它的基本邏輯,系統(tǒng)和軟件的版本確實(shí)非常折磨人,如果有docker就能方便很多?;仡櫼幌逻@個(gè)過程,最大的是ubunbu18.04的版本和iverilog 12的版本。
    發(fā)表于 10-31 09:22

    關(guān)于系統(tǒng)鏈接腳本的介紹

    一、隊(duì)伍介紹 本篇為蜂鳥E203系列分享第四篇,本篇介紹的內(nèi)容是系統(tǒng)鏈接腳本。 二、如何實(shí)現(xiàn)不同的下載模式? 實(shí)現(xiàn)三種不同的程序運(yùn)行方式,可通過makefile的命令行指定不同的鏈接腳本,從而實(shí)現(xiàn)
    發(fā)表于 10-30 08:26

    MES系統(tǒng)指南

    架構(gòu)普及化 、 AI 算法工程化應(yīng)用 、 數(shù)字孿生技術(shù)落地 。MES 系統(tǒng)已逐漸成為企業(yè)實(shí)現(xiàn)生產(chǎn)智能化的核心引擎。以下結(jié)合行業(yè)數(shù)據(jù)與技術(shù)趨勢,為您解析國內(nèi)MES 系統(tǒng)廠商的競爭力,并提供選型避指南。 二、MES
    的頭像 發(fā)表于 10-29 13:46 ?38次閱讀

    【技術(shù)分享】正確編寫SysV Init腳本以實(shí)現(xiàn)Systemd兼容(上)

    嵌入式的ubuntu系統(tǒng)如何寫好SysVInit腳本呢?與system服務(wù)又有什么差別呢?一起隨著文章來探究吧。問題背景許多傳統(tǒng)Linux服務(wù)仍使用SysVInit腳本(/etc/init.d
    的頭像 發(fā)表于 10-28 11:45 ?326次閱讀
    【技術(shù)分享】正確編寫SysV Init<b class='flag-5'>腳本</b>以實(shí)現(xiàn)Systemd兼容(上)

    LuatOS腳本開發(fā)入門:嵌入式運(yùn)行框架全解析!

    想搞懂LuatOS如何運(yùn)行Lua腳本?本文深入剖析其嵌入式運(yùn)行框架,涵蓋虛擬機(jī)加載、任務(wù)協(xié)程、系統(tǒng)初始化等關(guān)鍵環(huán)節(jié),適合初學(xué)者。 一、LuatOS 編程起步 1.1 底層固件怎么啟動(dòng) LuatOS
    的頭像 發(fā)表于 09-26 17:45 ?167次閱讀
    LuatOS<b class='flag-5'>腳本</b>開發(fā)入門:嵌入式運(yùn)行框架全解析!

    SQL 通用數(shù)據(jù)類型

    SQL 通用數(shù)據(jù)類型 數(shù)據(jù)庫表中的每個(gè)列都要求有名稱和數(shù)據(jù)類型。Each column in a database table is required to have a name and a
    的頭像 發(fā)表于 08-18 09:46 ?511次閱讀

    達(dá)夢數(shù)據(jù)庫常用管理SQL命令詳解

    達(dá)夢數(shù)據(jù)庫常用管理SQL命令詳解
    的頭像 發(fā)表于 06-17 15:12 ?4112次閱讀
    達(dá)夢數(shù)據(jù)庫常用管理<b class='flag-5'>SQL</b>命令詳解

    如何一眼定位SQL的代碼來源:一款SQL染色標(biāo)記的簡易MyBatis插件

    作者:京東物流 郭忠強(qiáng) 導(dǎo)語 本文分析了后端研發(fā)和運(yùn)維在日常工作中所面臨的線上SQL定位排查痛點(diǎn),基于姓名貼的靈感,設(shè)計(jì)和開發(fā)了一款SQL染色標(biāo)記的MyBatis插件。該插件輕量高效,對業(yè)務(wù)代碼無
    的頭像 發(fā)表于 03-05 11:36 ?675次閱讀
    如何一眼定位<b class='flag-5'>SQL</b>的代碼來源:一款<b class='flag-5'>SQL</b>染色標(biāo)記的簡易MyBatis插件

    Devart: dbForge Compare Bundle for SQL Server—比較SQL數(shù)據(jù)庫最簡單、最準(zhǔn)確的方法

    主要版本控制系統(tǒng)的實(shí)時(shí)數(shù)據(jù)庫、快照、腳本文件夾、備份和存儲(chǔ)庫。 為什么選擇Data Compare For SQL Server? 自
    的頭像 發(fā)表于 01-17 11:35 ?810次閱讀

    dbForge Studio For SQL Server:用于有效開發(fā)的最佳SQL Server集成開發(fā)環(huán)境

    dbForge Studio For SQL Server:用于有效開發(fā)的最佳SQL Server集成開發(fā)環(huán)境 SQL編碼助手 SQL代碼分析 查詢分析器 可視化查詢生成器 數(shù)據(jù)和模式
    的頭像 發(fā)表于 01-16 10:36 ?991次閱讀

    Linux從零到精通:最簡單的Shell腳本入門教程

    通過簡單的命令和腳本,實(shí)現(xiàn)對系統(tǒng)的靈活控制和自動(dòng)化管理。 shell腳本前言 shell腳本入門 shell變量基礎(chǔ) shell變量子串 shell數(shù)值運(yùn)算 條件表達(dá)式 流程控制語句
    的頭像 發(fā)表于 12-05 09:56 ?2188次閱讀
    Linux從零到精通:最簡單的Shell<b class='flag-5'>腳本</b>入門教程

    SQL錯(cuò)誤代碼及解決方案

    SQL數(shù)據(jù)庫開發(fā)和管理中,常見的錯(cuò)誤代碼及其解決方案可以歸納如下: 一、語法錯(cuò)誤(Syntax Errors) 錯(cuò)誤代碼 :無特定代碼,但通常會(huì)在錯(cuò)誤消息中明確指出是語法錯(cuò)誤。 原因 :SQL語句
    的頭像 發(fā)表于 11-19 10:21 ?9853次閱讀

    常用SQL函數(shù)及其用法

    SQL(Structured Query Language)是一種用于管理和操作關(guān)系數(shù)據(jù)庫的編程語言。SQL 提供了豐富的函數(shù)庫,用于數(shù)據(jù)檢索、數(shù)據(jù)更新、數(shù)據(jù)刪除以及數(shù)據(jù)聚合等操作。以下是一些常用
    的頭像 發(fā)表于 11-19 10:18 ?2035次閱讀

    SQL與NoSQL的區(qū)別

    在信息技術(shù)領(lǐng)域,數(shù)據(jù)庫是存儲(chǔ)和管理數(shù)據(jù)的核心組件。隨著互聯(lián)網(wǎng)的發(fā)展和大數(shù)據(jù)時(shí)代的到來,對數(shù)據(jù)庫的需求也在不斷變化。SQL和NoSQL作為兩種主流的數(shù)據(jù)庫管理系統(tǒng),各自有著獨(dú)特的優(yōu)勢和應(yīng)用場
    的頭像 發(fā)表于 11-19 10:15 ?938次閱讀

    微軟生成式AI腳本GenAIScript的安裝與配置

    GenAIScript 是一種結(jié)合了生成式人工智能(Generative AI,簡稱 GenAI)和腳本編寫能力的新型腳本語言。
    的頭像 發(fā)表于 11-07 09:13 ?1153次閱讀
    微軟生成式AI<b class='flag-5'>腳本</b>GenAIScript的安裝與配置