Windows都蓝屏了,你们的SQL真的安全吗?

7月19日,话题“微软蓝屏”冲上了热搜榜第一。微软公司旗下部分应用和服务出现访问延迟、功能不全或无法访问问题,大量用户端电脑出现蓝屏现象。这个技术故障席卷全球,短短两个小时,就造成一场令人措手不及的大规模事件:多个国家和地区航班停飞,医疗、银行、酒店等行业“停摆”,连伦敦股票交易所都受到波及……微软很快就查明事故的根因并及时处理,此次故障与一家与微软有关联的全球安全公司CrowdStrike有关,因为推送了一个“更新”,却触发了某些Windows的bug导致了系统蓝屏。

图片

重视代码质量,不断优化质量控制机制,才能保证系统的安全性和稳定性。数据库层面如果出现这种失误也必将会造成巨大影响,那么该如何避免呢?

功能上线前SQL质量把控的必要性

在功能上线前,开发者通常需要进行SQL变更。这些SQL语句,在上线前很难识别是否存在潜在的坑和性能问题,发布后一旦出现错误,可能会导致数据丢失、性能下降甚至系统崩溃,对业务产生严重影响。因此在上线前进行SQL审核是非常有必要的,下面我们通过一个简单的例子来详细说明。

表结构和业务代码简化如下:

create table user_login_history (`user_id` varchar(32) NOT NULL PRIMARY KEY COMMENT '用户id',`login_time` int(11) NOT NULL DEFAULT 0 COMMENT '登录时间',`login_status` varchar(32) NOT NULL DEFAULT '' COMMENT '登录状态:success|failed',`failure_reason` VARCHAR(255) DEFAULT '' COMMENT '登录失败原因');

业务代码中涉及到如下相关SQL语句:

// 插入登录历史stmt, err :=conn.Prepare("insert into user_login_history values(?,?,?,?)")if err != nil {    log.Logger.Errorf("prepare sql failed")    return err}// 定期清理历史表sql := fmt.Sprintf("delete from user_login_history wherelogin_time<unix_timestamp(now())-%d limit 100", timeBefore)for {_, err := conn.Exec(sql)if err != nil {log.Logger.Errorf("DelLogInHistory exec sql  failed, sql:%s, err:%v", sql, err)}time.Sleep(10 * time.Second)}

上面SQL存在哪些问题?

从上面的代码中可以看到有以下两个问题:

1)代码中插入user_login_history表没有指定列名,新功能版本需要对该表进行新增字段,采用以下两种发布方式,会出现什么结果?

  • 方式一:先发布该表新增字段的SQL,然后滚动升级应用。

  • 方式二:先修改原有的版本将user_login_history表进行指定列名insert,然后滚动升级,升级完成后再发布新版本,先发布该表新增字段的SQL,然后滚动升级应用。

很多小伙伴是不是也会选择方式一进行发布,如果你真这么做了,那么一次故障review少不了。从执行新增字段SQL开始,滚动升级这段时间,老版本服务insert into user_login_history将会失败(由于新增的字段老版本服务代码中没有指明对应的value,字段个数对不上)。

选择方式二的小伙伴也许曾经踩到过类似坑吧,第一次服务滚动发布修复insert表未指定列问题,第二次服务滚动发布进行新功能发布。

2)历史表数据量一般都比较大,需要定期按照时间进行清理。从上面代码看user_login_history的login_time字段未添加索引,如果该表数据量增长迅猛或清理任务堆积,那么也会存在问题。

  • 系统刚上线时用户量比较少,并且只保留7天内的登录历史,没出现性能瓶颈,但是随着业务的增长,7天内的登录量超过几十万甚至几百万,那么清理的SQL将变慢。

  • 当SQL变慢,清理的任务会存在delay或者积压,会导致单条SQL扫描的页越来越多,甚至引起磁盘IO打满。一旦IO打满那么灾难就来了,应用服务重启也没用,只要有清理任务调度基本就挂。

清理任务涉及的login_time字段没加索引全表扫描,导致磁盘IO异常,从而会影响业务稳定性。

为什么会出现这么低级的问题呢?

对于开发同学来说,由于日常开发任务紧,一些类似insert不指定列的问题没有足够重视,先完成功能(不指定字段代码写起来比较省事),往往就会引入此类问题。不加索引导致故障的问题数不胜数,刚开始业务量比较小,表中数据不多,就算没索引也不会存在问题,缺乏对业务未来的评估。

通过这个例子也能看出依赖人工进行SQL审核和代码Review并不能完全识别出潜在问题。比如以下场景:

  • DBA或者SE比较忙没时间进行仔细的SQL审核

  • 有些公司也没有专职DBA,

  • SQL质量全靠开发自己负责。

人工Review的方式不靠谱,那么有没有好的工具能识别出类似上述问题呢?

DBdoctor自动批量SQL审核(规范审核+性能审核)防止“蓝屏事件”发生

行业内SQL审核的工具比较多,但大多数都聚焦在规范审核上,缺少针对SQL性能的审核。近期DBdoctor发布了批量性能审核的功能,开发人员可以快速发现并解决SQL语句中的各种问题,大大提升SQL质量和系统的稳定性。

  • 提升审核效率:支持SQL窗口输入和上传SQL文件两种方式,自动化的批量审核大幅减少了手动审核的时间和工作量,极大地提高了审核效率。

  • 统一审核标准:系统化的审核规则确保了SQL语句审核的一致性和准确性,避免了人工审核的主观差异。

  • 提前性能审核:行业独有的外置Cost优化器,无需任何变更,开发阶段即可评估该SQL未来上线后的性能,自动推荐最优索引,提前解决性能问题。

  • 降低人工成本:减少了对高技能审核人员的依赖,降低了SQL审核的整体成本。

  • 优化数据库性能:通过全面的性能优化建议,确保数据库运行在最佳状态,提升应用程序的响应速度。

  • 实时反馈:审核结果实时生成,便于开发者快速定位问题并进行修正。

如何用DBdoctor进行批量SQL审核

1.上传DDL文件

将此次版本涉及到的DDL文件上传。

图片

2.查看任务详情

任务详情中分别展示每条SQL的审核结果。

图片

3.查看审核详情

审核结果中对性能审核结果和规则审核结果分别展示。

图片

图片

4.同样的步骤审核DML文件

可以看到插入语句未显示指定列名插入,当表中存在1000条数据时,加上索引性能提升543倍,并提示出添加索引的SQL语句。

图片

图片

图片

结语

在当今数字化的时代,数据库的稳定和高效运行对于各行各业来说都是至关重要的。SQL语句作为数据库操作的基石,其质量和性能直接关系到整个系统的稳定性和安全性。然而,面对海量SQL语句的审核需求,传统的人工审核方式早就不能满足效率及准确率的需求。DBdoctor作为一个先进的数据库性能诊断和优化平台,提供的批量SQL审核功能,可帮助开发者和数据库管理员在多场景下对SQL语句进行高效、准确的审核,有效避免潜在事故的发生!

图片

图片

1️⃣ 产品介绍:

DBdoctor产品介绍

2️⃣免费下载/在线试用:

https://dbdoctor.hisensecloud.com/col.jsp?id=126

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/385949.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB-bode图编程

num[1 1];den [2 1];tf(num,den)bode(tf(num,den));hold on tf &#xff1a;传递函数 tf&#xff08;x&#xff0c;y&#xff09;&#xff1a;x是分子&#xff0c;y是分母 bode&#xff1a;伯特图 hold on&#xff1a;保持

物理机 gogs+jenkins+sonarqube 实现CI/CD

一、部署gogs_0.11.91_linux_amd64.tar.gz gogs官网下载&#xff1a;https://dl.gogs.io/ yum -y install mariadb-serversystemctl start mariadbsystemctl enable mariadbuseradd gittar zxvf gogs_0.11.91_linux_amd64.tar.gzcd gogsmysql -u root -p < scripts/mysql.…

【C/C++】C语言到C++的入门知识点(主要适用于C语言精通到Qt的C++开发入门)

【C/C】C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发入门&#xff09; 文章目录 C语言与C的不同C中写C语言代码C语言到C的知识点Qt开发中需要了解的C基础知识namespace输入输出字符串类型class类构造函数和析构函数&#xff08;解析函数&#xff09;类的继…

【C++】c++语法基础

引入&#xff0c;第一个c程序 这是用c写的helloworld程序 #include<iostream> using namespace std; int main() {cout << "hello,world\n" << endl;return 0;} 接下来我们将根据上述的代码来学习c的基本语法。 命名空间&#xff08;namespace…

基于DoDAF的陆上智能突击系统作战概念系统开发

源自&#xff1a;系统仿真学报 作者&#xff1a;王灿 纪浩然 郭齐胜 董志明 谭亚新 穆歌 注&#xff1a;若出现无法显示完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 人工智能、大数据、多模态大模型、计算机视觉、自然语言处理、数字孪生、深度强…

《计算机网络》(学习笔记)

目录 一、计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 1.1.2 计算机网络的组成 1.1.3 计算机网络的功能 1.1.4 电流交换、报文交换和分组交换 1.1.5 计算机网络的分类 1.1.6 计算机网络的性能指标 1.2 计算机网络体系结构与参考模型 1.2.1 计算机…

基于STM32的逻辑分析仪

文章目录 一、逻辑分析仪体验1、使用示例1.1 逻辑分析仪1.2 开源软件PulseView 2、核心技术2.1 技术方案2.2 信号采集与存储2.3 数据上传 3、使用逻辑分析仪4、 SourceInsight 使用技巧4.1新建工程4.2 设置工程名及工程数据目录4.3 指定源码目录4.4 添加源码4.5 同步文件4.6 操…

如何在调整节拍时间的过程中保持生产流程的稳定性?

在快节奏的工业生产领域&#xff0c;节拍时间&#xff08;Takt Time&#xff09;——即完成一个完整产品所需的标准时间&#xff0c;是维持生产效率和流程稳定性的关键指标。然而&#xff0c;市场需求的波动、技术升级或是生产线的微调&#xff0c;都可能要求我们对节拍时间进行…

云计算实训13——DNS域名解析、ntp时间服务器配置、主从DNS配置、多区域DNS搭建

一、DNS域名解析 1.正向解析 将域名解析为IP地址 DNS正向解析核心配置 (1)安装bind [rootdns ~]# yum -y install bind (2)编辑配置文件 编辑named.conf文件&#xff0c;限定访问权限 [rootdns ~]# vim /etc/named.conf 编辑named.rfc文件&#xff0c;指定要访问的域名 [ro…

VulnHub:colddbox easy

靶机下载地址 信息收集 主机发现 攻击机网段192.168.31.0/24&#xff0c;扫描同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 发现靶机&#xff0c;IP为192.168.31.176。 端口扫描 扫描靶机开放端口。 nmap 192.168.31.176 -A -p- -T4 开放了80,4512端口&#xff0c;注…

无人机之安全防护篇

在当今社会&#xff0c;园区的安全防护至关重要。无人机以其独特的视角、高效的作业能力和灵活的部署方式&#xff0c;为园区安防工作带来了前所未有的好处&#xff0c;显著提升了安全防护水平和管理效率。 一、全方位无死角的监控 与传统的固定摄像头相比&#xff0c;它不受位…

【Python Web】Flask扩展开发指南

Flask是一个轻量级的Python Web框架&#xff0c;它提供了丰富的扩展库和工具&#xff0c;可以帮助开发者快速构建Web应用。本篇博客将介绍如何进行Flask扩展开发&#xff0c;包括扩展的创建、配置、使用等方面的内容。 目录 Flask扩展开发指南 一、Flask扩展简介 二、创建Fl…

苹果CMS:资源采集站如何设置定时采集详细教程讲解

我们搭建好站点之后&#xff0c;会自定义一些采集&#xff0c;但是需要每天去手动执行&#xff0c;有时候甚至会忘记&#xff0c;那我们如何处理呢&#xff1f;今天我们就来介绍一下如何设置定时器。 如果按照官方例子来设置定时器会遇到一个问题就是采集的资源未绑定类型&…

[240728] Wikidata 介绍 | 微软与 Lumen 合作提升人工智能算力

目录 Wikidata 介绍微软与 Lumen 合作提升人工智能算力 Wikidata 介绍 中文&#xff1a; 文言: 粤语&#xff1a; 来源&#xff1a; https://www.wikidata.org/wiki/Wikidata:Introduction/zh 微软与 Lumen 合作提升人工智能算力 为了满足人工智能工作负载不断增长的需求&am…

查看路由表 netstat -r

“Kernel IP routing table” 是Linux系统中用于展示和配置IP路由的表。它告诉操作系统如何将数据包从一个网络接口发送到另一个网络或主机。下面是对您给出的路由表条目的解释&#xff1a; Destination&#xff1a;目的地地址&#xff0c;可以是具体的IP地址&#xff0c;也可…

「12月·长沙」人工智能与网络安全国际学术会议(ISAICS 2024)

人工智能与网络安全国际学术会议(ISAICS 2024)将于2024年12月20日-2024年12月22日在湖南长沙召开。会议中发表的文章将会被收录,并于见刊后提交EI核心索引。会议旨在在为国内与国际学者搭建交流平台,推进不同学科领域的融合发展&#xff0c;就当今人工智能与网络安全范畴内各学…

视觉-语言大模型应用

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

MySQL练习05

题目 步骤 触发器 use mydb16_trigger; #使用数据库create table goods( gid char(8) primary key, name varchar(10), price decimal(8,2), num int);create table orders( oid int primary key auto_increment, gid char(10) not null, name varchar(10), price decima…

蚓链数字化生态平台:构建城市智能商业,引领协同发展新潮流

​在当今数字化飞速发展的时代&#xff0c;城市商业的运行模式正在经历着数字化变革。蚓链数字化生态平台应运而生&#xff0c;以其强大的功能和创新的理念&#xff0c;成为构建城市智能商业枢纽中心的关键力量&#xff0c;推动着平台互通、业务贯通、管理协同的全新发展格局。…

这代码,给我看破防了……

之前有读者问&#xff0c;自己一直不明白如何写出合理的代码注释。 这也是不少程序员一直头疼的问题&#xff0c;比如接手新代码时&#xff0c;没有注释&#xff0c;完全搞不清逻辑&#xff1b;自己写的注释&#xff0c;跟不上代码修改&#xff0c;成了误导&#xff1b;复杂逻…