国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

10種減少數(shù)據(jù)庫誤操作的方法

數(shù)據(jù)分析與開發(fā) ? 來源:蘇三說技術(shù) ? 作者:因為熱愛所以堅持 ? 2021-10-13 17:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

無論是開發(fā)、測試,還是DBA,都難免會涉及到數(shù)據(jù)庫的操作,比如:創(chuàng)建某張表,添加某個字段、添加數(shù)據(jù)、更新數(shù)據(jù)、刪除數(shù)據(jù)、查詢數(shù)據(jù)等等。

正常情況下還好,但如果操作數(shù)據(jù)庫時出現(xiàn)失誤,比如:

刪除訂單數(shù)據(jù)時where條件寫錯了,導致多刪了很多用戶訂單。

更新會員有效時間時,一次性把所有會員的有效時間都更新了。

修復線上數(shù)據(jù)時,改錯了,想還原。

還有很多很多場景,我就不一一列舉了。

如果出現(xiàn)線上環(huán)境數(shù)據(jù)庫誤操作怎么辦?有沒有后悔藥?

答案是有的,請各位看官仔細往下看。

1.不要用聊天工具發(fā)sql語句

通常開發(fā)人員寫好sql語句之后,習慣通過聊天工具,比如:qq、釘釘、或者騰訊通等,發(fā)給團隊老大或者DBA在線上環(huán)境執(zhí)行。但由于有些聊天工具,對部分特殊字符會自動轉(zhuǎn)義,而且有些消息由于內(nèi)容太長,會被自動分成多條消息。

這樣會導致團隊老大或者DBA復制出來的sql不一定是正確的。

他們需要手動拼接成一條完整的sql,有時甚至需要把轉(zhuǎn)義后的字符替換回以前的特殊字符,無形之中會浪費很多額外的時間。即使最終sql拼接好了,真正執(zhí)行sql的人,心里一定很虛。

所以,強烈建議你把要在線上執(zhí)行的sql語句用郵件發(fā)過去,可以避免使用聊天工具的一些弊端,減少一些誤操作的機會。而且有個存檔,方便今后有問題的時候回溯原因。很多聊天工具只保留最近7天的歷史記錄,郵件會保留更久一些。

別用聊天工具發(fā)sql語句!

別用聊天工具發(fā)sql語句!

別用聊天工具發(fā)sql語句!

重要的事情說三遍,它真的能減少一些誤操作。

2.把sql語句壓縮成一行

有些時候,開發(fā)人員寫的sql語句很長,使用了各種join和union,而且使用美化工具,將一條sql變成了多行。在復制sql的時候,自己都無法確定sql是否完整。(為了裝逼,把自己也坑了,哈哈哈)

線上環(huán)境有時候需要通過命令行連接數(shù)據(jù)庫,比如:mysql,你把sql語句復制過來后,在命令行界面執(zhí)行,由于屏幕滾動太快,這時根本無法確定sql是否都執(zhí)行成功。

針對這類問題,強烈建議把sql語句壓縮成一行,去掉多余的換行符和空格,可以有效的減少一些誤操作。

sql壓縮工具推薦使用:https://tool.lu/sql/

3.操作數(shù)據(jù)之前先select一下

需要特別說明的是:本文的操作數(shù)據(jù)主要指修改和刪除數(shù)據(jù)。

很多時候,由于我們?nèi)藶槭д`,把where條件寫錯了。但沒有怎么仔細檢查,就把sql語句直接執(zhí)行了。影響范圍小還好,如果影響幾萬、幾十萬,甚至幾百萬行數(shù)據(jù),我們可能要哭了。

針對這種情況,在操作數(shù)據(jù)之前,把sql先改成select count(*)語句,比如:

update order set status=1 where status=0;

改成:

select count(*) from order where status=0;

查一下該sql執(zhí)行后影響的記錄行數(shù),做到自己心中有數(shù)。也給自己一次測試sql是否正確,確認是否執(zhí)行的機會。

4.操作數(shù)據(jù)sql加limit

即使通過上面的select語句確認了sql語句沒有問題,執(zhí)行后影響的記錄行數(shù)是對的。

也建議你不要立刻執(zhí)行,建議在正在執(zhí)行的時候,加上limit + select出的記錄行數(shù)。例如:

update order set status=1 where status=0 limit 1000;

假設有一次性更新的數(shù)據(jù)太多,所有相關(guān)記錄行都會被鎖住,造成長時間的鎖等待,而造成用戶請求超時。

此外,加limit可以避免一次性操作太多數(shù)據(jù),對服務器的cpu造成影響。

還有一個最重要的原因:加limit后,操作數(shù)據(jù)的影響范圍是完全可控的。

5.update時更新修改人和修改時間

很多人寫update語句時,如果要修改狀態(tài),就只更新狀態(tài),不管其他的字段。比如:

update order set status=1 where status=0;

這條sql會把status等于0的數(shù)據(jù),全部更新成1。

后來發(fā)現(xiàn)業(yè)務邏輯有問題,不應該這么更新,需要把status狀態(tài)回滾。

這時你可能會很自然想到這條sql:

update order set status=0 where status=1;

但仔細想想又有些不對。

這樣不是會把有部分以前status就是1的數(shù)據(jù)更新成0?

這回真的要哭了,嗚嗚嗚。

這時,送你一個好習慣:在更新數(shù)據(jù)的時候,同時更新修改人和修改時間字段。

update order set status=1,edit_date=now(),edit_user=‘admin’ where status=0;

這樣在恢復數(shù)據(jù)時就能通過修改人和修改時間字段過濾數(shù)據(jù)了。

后面需要用到的修改時間通過這條sql語句可以輕松找到:

select edit_user ,edit_date from `order` order by edit_date desc limit 50;

當然,如果是高并發(fā)系統(tǒng)不建議這種批量更新方式,可能會鎖表一定時間,造成請求超時。

有些同學可能會問:為什么要同時更新修改人,只更新修改時間不行嗎?

主要有如下的原因:

為了標識非正常用戶操作,方便后面統(tǒng)計和定位問題。

有些情況下,在執(zhí)行sql語句的過程中,正常用戶產(chǎn)生數(shù)據(jù)的修改時間跟你的可能一模一樣,導致回滾時數(shù)據(jù)查多了。

6.多用邏輯刪除,少用物理刪除

在業(yè)務開發(fā)中,刪除數(shù)據(jù)是必不可少的一種業(yè)務場景。

有些人開發(fā)人員習慣將表設計成物理刪除,根據(jù)主鍵只用一條delete語句就能輕松搞定。

他們給出的理由是:節(jié)省數(shù)據(jù)庫的存儲空間。

想法是好的,但是現(xiàn)實很殘酷。

如果有條極重要的數(shù)據(jù)刪錯了,想恢復怎么辦?

此時只剩八個字:沒有數(shù)據(jù),恢復不了。(PS:或許通過binlog二進制文件可以恢復)

如果之前設計表的時候用的邏輯刪除,上面的問題就變得好辦了。刪除數(shù)據(jù)時,只需update刪除狀態(tài)即可,例如:

update order set del_status=1,edit_date=now(),edit_user=‘a(chǎn)dmin’ where id=123;

假如出現(xiàn)異常,要恢復數(shù)據(jù),把該id的刪除狀態(tài)還原即可,例如:

update order set del_status=0,edit_date=now(),edit_user=‘a(chǎn)dmin’ where id=123;

7.操作數(shù)據(jù)之前先做備份

如果只是修改了少量的數(shù)據(jù),或者只執(zhí)行了一兩條sql語句,通過上面的修改人和修改時間字段,在需要回滾時,能快速的定位到正確的數(shù)據(jù)。

但是如果修改的記錄行數(shù)很多,并且執(zhí)行了多條sql,產(chǎn)生了很多修改時間。這時,你可能就要犯難了,沒法一次性找出哪些數(shù)據(jù)需要回滾。

為了解決這類問題,可以將表做備份。

可以使用如下sql備份:

create table order_bak_2021031721 like`order`;

insert into order_bak_2021031721 select * from`order`;

先創(chuàng)建一張一模一樣的表,然后把數(shù)據(jù)復制到新表中。

也可以簡化成一條sql:

create table order_bak_2021031722 select * from`order`;

創(chuàng)建表的同時復制數(shù)據(jù)到新表中。

此外,建議在表名中加上bak和時間,一方面是為了通過表名快速識別出哪些表是備份表,另一方面是為了備份多次時好做區(qū)分。因為有時需要執(zhí)行多次sql才能把數(shù)據(jù)修復好,這種情況建議把表備份多次,如果出現(xiàn)異常,把數(shù)據(jù)回滾到最近的一次備份,可以節(jié)省很多重復操作的時間。

恢復數(shù)據(jù)時,把sql語句改成select語句,先在備份庫找出相關(guān)數(shù)據(jù),每條數(shù)據(jù)對應一條update語句,還原到老表中。

8.中間結(jié)果寫入臨時表

有時候,我們要先用一條sql查詢出要更新的記錄的id,然后通過這些id更新數(shù)據(jù)。

批量更新之后,發(fā)現(xiàn)不對,要回滾數(shù)據(jù)。但由于有些數(shù)據(jù)已更新,此時使用相同的sql相同的條件,卻查不出上次相同的id了。

這時,我們開始慌了。

針對這種情況,我們可以先將第一次查詢的id存入一張臨時表,然后通過臨時表中的id作為查詢條件更新數(shù)據(jù)。

如果要恢復數(shù)據(jù),只用通過臨時表中的id作為查詢條件更新數(shù)據(jù)即可。

修改完,3天之后,如果沒有出現(xiàn)問題,就可以把臨時表刪掉了。

9.表名前面一定要帶庫名

我們在寫sql時為了方便,習慣性不帶數(shù)據(jù)庫名稱。比如:

update order set status=1,edit_date=now(),edit_user=‘a(chǎn)dmin’ where status=0;

假如有多個數(shù)據(jù)庫中有相同的表order,表結(jié)構(gòu)一模一樣,只是數(shù)據(jù)不一樣。

由于執(zhí)行sql語句的人一個小失誤,進錯數(shù)據(jù)庫了。

use trade1;

然后執(zhí)行了這條sql語句,結(jié)果悲劇了。

有個非常有效的預防這類問題的方法是加數(shù)據(jù)庫名:

update `trade2`。`order` set status=1,edit_date=now(),edit_user=‘a(chǎn)dmin’ where status=0;

這樣即使執(zhí)行sql語句前進錯數(shù)據(jù)庫了,也沒什么影響。

10.字段增刪改的限制

很多時候,我們少不了對表字段的操作,比如:新加、修改、刪除字段,但每種情況都不一樣。

新加的字段一定要允許為空

新加的字段一定要允許為空。為什么要這樣設計呢?

正常情況下,如果程序新加了字段,一般是先在數(shù)據(jù)庫中加字段,然后再發(fā)程序的最新代碼。

為什么是這種順序?

因為如果先發(fā)程序,然后在數(shù)據(jù)庫中加字段。在該程序剛部署成功,但數(shù)據(jù)庫新字段還沒來得及加的這段時間內(nèi),最新程序中,所有使用了新加字段的增刪改查sql都會報字段不存在的異常。

好了,就按先在數(shù)據(jù)庫中加字段,再發(fā)程序的順序。

如果數(shù)據(jù)庫中新加的字段非空,最新的程序還沒發(fā),線上跑的還是老代碼,這時如果有insert操作,就會報字段不能為空的異常。因為新加的非空字段,老代碼是沒法賦值的。

所以說新加的字段一定要允許為空。

除此之外,這種設計更多的考慮是為了程序發(fā)布失敗時的回滾操作。如果新加的字段允許為空,則可以不用回滾數(shù)據(jù)庫,只需回滾代碼即可,是不是很方便?

不允許刪除字段

刪除字段是不允許的,特別是必填字段一定不能刪除。

為什么這么說?

假設開發(fā)人員已經(jīng)把程序改成不使用刪除字段了,接下來如何部署呢?

如果先把程序部署好了,還沒來得及刪除數(shù)據(jù)庫相關(guān)表字段。當有insert請求時,由于數(shù)據(jù)庫中該字段是必填的,會報必填字段不能為空的異常。

如果先把數(shù)據(jù)庫中相關(guān)表字段刪了,程序還沒來得及發(fā)。這時所有涉及該刪除字段的增刪改查,都會報字段不存在的異常。

所以,線上環(huán)境必填字段一定不能刪除的。

根據(jù)實際情況修改字段

修改字段要分為這三種情況:

1.修改字段名稱

修改字段名稱也不允許,跟刪除必填字段的問題差不多。

如果把程序部署好了,還沒來得及修改數(shù)據(jù)庫中表字段名稱。這時所有涉及該字段的增刪改查,都會報字段不存在的異常。

如果先把數(shù)據(jù)庫中字段名稱改了,程序還沒來得及發(fā)。這時所有涉及該字段的增刪改查,同樣也會報字段不存在的異常。

所以,線上環(huán)境字段名稱一定不要修改。

2.修改字段類型

修改字段類型時一定要兼容之前的數(shù)據(jù)。例如:

tinyint改成int可以,但int改成tinyint要仔細衡量一下。

varchar改成text可以,但text改成varchar要仔細衡量一下。

3.修改字段長度

字段長度建議改大,通常情況下,不建議改小。如果一定要改小,要先確認該字段可能會出現(xiàn)的最大長度,避免insert操作時出現(xiàn)字段太長的異常。

此外,建議改大也需要設置一個合理的長度,避免數(shù)據(jù)庫資源浪費。

總結(jié)

本文分享了10種減少數(shù)據(jù)庫誤操作的方法,并非所有場景都適合你。特別是在一些高并發(fā),或者單表數(shù)據(jù)量非常大的場景,你需要根據(jù)實際情況酌情選擇。但我敢肯定的是讀完這篇文章,你一定會有一些收獲,因為大部分方法對你來說是適用的,可能會讓你少走很多彎路,強烈建議收藏。

責任編輯:haq

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

    關(guān)注

    9

    文章

    6203

    瀏覽量

    131363
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    4020

    瀏覽量

    68353

原文標題:總結(jié)

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

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

    國產(chǎn)數(shù)據(jù)庫的AI戰(zhàn)事

    國產(chǎn)數(shù)據(jù)庫硝煙再起,Vastbase V100構(gòu)筑企業(yè)智能基座
    的頭像 發(fā)表于 10-24 20:45 ?4028次閱讀
    國產(chǎn)<b class='flag-5'>數(shù)據(jù)庫</b>的AI戰(zhàn)事

    mysql數(shù)據(jù)恢復—mysql數(shù)據(jù)庫表被truncate的數(shù)據(jù)恢復案例

    某云ECS網(wǎng)站服務器,linux操作系統(tǒng),部署了mysql數(shù)據(jù)庫。工作人員在執(zhí)行數(shù)據(jù)庫版本更新測試時,錯誤地將本應在測試執(zhí)行的sql腳本在生產(chǎn)
    的頭像 發(fā)表于 09-11 09:28 ?874次閱讀
    mysql<b class='flag-5'>數(shù)據(jù)</b>恢復—mysql<b class='flag-5'>數(shù)據(jù)庫</b>表被truncate的<b class='flag-5'>數(shù)據(jù)</b>恢復案例

    數(shù)據(jù)庫性能優(yōu)化指南

    作為一名在大廠摸爬滾打多年的運維老兵,我見過太多因為數(shù)據(jù)庫性能問題導致的生產(chǎn)事故。今天分享一套完整的數(shù)據(jù)庫優(yōu)化方法論,從SQL層面到硬件配置,幫你徹底解決性能瓶頸!
    的頭像 發(fā)表于 08-18 11:21 ?746次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復—服務器異常斷電導致Oracle數(shù)據(jù)庫故障的數(shù)據(jù)恢復案例

    Oracle數(shù)據(jù)庫故障: 某公司一臺服務器上部署Oracle數(shù)據(jù)庫。服務器意外斷電導致數(shù)據(jù)庫報錯,報錯內(nèi)容為“system01.dbf需要更多的恢復來保持一致性”。該Oracle數(shù)據(jù)庫
    的頭像 發(fā)表于 07-24 11:12 ?640次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復—服務器異常斷電導致Oracle<b class='flag-5'>數(shù)據(jù)庫</b>故障的<b class='flag-5'>數(shù)據(jù)</b>恢復案例

    Oracle數(shù)據(jù)恢復—格式化分區(qū)導致Oracle數(shù)據(jù)庫報錯的數(shù)據(jù)恢復案例

    一臺服務器上一個分區(qū)存放Oracle數(shù)據(jù)庫數(shù)據(jù)。由于管理員誤操作不小心刪除了該分區(qū),數(shù)據(jù)庫報錯,無法使用。 北亞企安數(shù)據(jù)恢復工程師到達現(xiàn)場
    的頭像 發(fā)表于 07-22 14:06 ?404次閱讀
    Oracle<b class='flag-5'>數(shù)據(jù)</b>恢復—格式化分區(qū)導致Oracle<b class='flag-5'>數(shù)據(jù)庫</b>報錯的<b class='flag-5'>數(shù)據(jù)</b>恢復案例

    三款主流國產(chǎn)數(shù)據(jù)庫的技術(shù)特點

    隨著數(shù)字經(jīng)濟的快速發(fā)展和數(shù)據(jù)安全要求的提升,國產(chǎn)數(shù)據(jù)庫正迎來前所未有的發(fā)展機遇。在信創(chuàng)浪潮推動下,達夢數(shù)據(jù)庫、TiDB、華為高斯數(shù)據(jù)庫等國產(chǎn)數(shù)據(jù)庫
    的頭像 發(fā)表于 07-14 11:08 ?1148次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復—MongoDB數(shù)據(jù)庫文件丟失的數(shù)據(jù)恢復案例

    MongoDB數(shù)據(jù)庫數(shù)據(jù)恢復環(huán)境: 一臺操作系統(tǒng)為Windows Server的虛擬機上部署MongoDB數(shù)據(jù)庫。 MongoDB數(shù)據(jù)庫
    的頭像 發(fā)表于 07-01 11:13 ?642次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復—MongoDB<b class='flag-5'>數(shù)據(jù)庫</b>文件丟失的<b class='flag-5'>數(shù)據(jù)</b>恢復案例

    數(shù)據(jù)庫數(shù)據(jù)恢復—SQL Server數(shù)據(jù)庫被加密如何恢復數(shù)據(jù)

    SQL Server數(shù)據(jù)庫故障: SQL Server數(shù)據(jù)庫被加密,無法使用。 數(shù)據(jù)庫MDF、LDF、log日志文件名字被篡改。
    的頭像 發(fā)表于 06-25 13:54 ?674次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復—SQL Server<b class='flag-5'>數(shù)據(jù)庫</b>被加密如何恢復<b class='flag-5'>數(shù)據(jù)</b>?

    oracle數(shù)據(jù)恢復—oracle數(shù)據(jù)庫誤執(zhí)行錯誤truncate命令如何恢復數(shù)據(jù)

    oracle數(shù)據(jù)庫誤執(zhí)行truncate命令導致數(shù)據(jù)丟失是一常見情況。通常情況下,oracle數(shù)據(jù)庫誤操作刪除
    的頭像 發(fā)表于 06-05 16:01 ?1075次閱讀
    oracle<b class='flag-5'>數(shù)據(jù)</b>恢復—oracle<b class='flag-5'>數(shù)據(jù)庫</b>誤執(zhí)行錯誤truncate命令如何恢復<b class='flag-5'>數(shù)據(jù)</b>?

    SQLSERVER數(shù)據(jù)庫是什么

    支持在Linux和容器化環(huán)境中運行。 核心特點 關(guān)系型數(shù)據(jù)庫 基于SQL(結(jié)構(gòu)化查詢語言)進行數(shù)據(jù)操作,支持表、行、列等結(jié)構(gòu)化存儲。 提供ACID(原子性、一致性、隔離性、持久性)事務支持,確保
    的頭像 發(fā)表于 05-26 09:19 ?1172次閱讀

    MySQL數(shù)據(jù)庫是什么

    MySQL數(shù)據(jù)庫是一 開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS) ,由瑞典MySQL AB公司開發(fā),后被Oracle公司收購。它通過結(jié)構(gòu)化查詢語言(SQL)進行數(shù)據(jù)存儲、管理和
    的頭像 發(fā)表于 05-23 09:18 ?1210次閱讀

    HarmonyOS5云服務技術(shù)分享--云數(shù)據(jù)庫使用指南

    ?? ??性能優(yōu)化??: 避免頻繁小數(shù)據(jù)寫入,優(yōu)先批量操作。 復雜查詢盡量在服務端預過濾,減少數(shù)據(jù)傳輸量。 ??錯誤處理??: 所有操作建議包裹在try-catch中,捕獲異步異常。
    發(fā)表于 05-22 18:29

    SEGGER emFile支持大型數(shù)據(jù)庫

    SEGGER宣布emFile對大型數(shù)據(jù)庫的支持,集成了SQLite,方便與SEGGER的BigFAT和微軟的exFAT一起使用。
    的頭像 發(fā)表于 04-23 15:51 ?779次閱讀

    分布式存儲數(shù)據(jù)恢復—虛擬機上hbase和hive數(shù)據(jù)庫數(shù)據(jù)恢復案例

    分布式存儲數(shù)據(jù)恢復環(huán)境: 16臺某品牌R730xd服務器節(jié)點,每臺服務器節(jié)點上有數(shù)臺虛擬機。 虛擬機上部署Hbase和Hive數(shù)據(jù)庫。 分布式存儲故障: 數(shù)據(jù)庫底層文件被誤刪除,數(shù)
    的頭像 發(fā)表于 04-17 11:05 ?722次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復——MongoDB數(shù)據(jù)庫文件拷貝后服務無法啟動的數(shù)據(jù)恢復

    MongoDB數(shù)據(jù)庫數(shù)據(jù)恢復環(huán)境: 一臺Windows Server操作系統(tǒng)虛擬機上部署MongoDB數(shù)據(jù)庫。 MongoDB數(shù)據(jù)庫
    的頭像 發(fā)表于 04-09 11:34 ?867次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復——MongoDB<b class='flag-5'>數(shù)據(jù)庫</b>文件拷貝后服務無法啟動的<b class='flag-5'>數(shù)據(jù)</b>恢復