机房重构——存储过程

本文介绍了存储过程的概念及其优势,包括提升执行效率、减少网络流量和增强安全性等,并通过一个具体实例展示了如何利用存储过程简化复杂的数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

            存储过程

      在做机房重构的时候,看好多同学都用到了存储过程,可是自己还没有用到,当时也很纳闷存储过程是什么,也不知道有什么好处和作用,只记得在学习SQL视频的时候,老师好像给讲过,但是一向有点懒的我就是不愿意找我以前的笔记,于是果断的看别人的博客,这个时候深感博客的好处。看完大神们的博客,明白了什么是存储过程,用存储过程有什么用。

一、什么是存储过程:

   存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。  ---百度百科(自我感觉解释的还是很清楚的)

二、存储过程有什么好处:

  

①重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
②减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
③安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
简单讲:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
任何事物都是有两面性的,有优点必然会有缺点:
1:调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4: 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
当然上边的缺点都是从百度上看到的,但我自己还没有体会到缺点。。毕竟用的还少,但是优点是真的体会到了。

举例:

下边用我的机房做个例子:
在登录时会在onwork  表增加记录,同样在关闭程序的时候就要在worklog表中添加记录,同时删除onwork表中对应的记录。
UI层的代码:获得需要的信息
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
            if ( MessageBox.Show("确定要退出系统吗?", "确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)==DialogResult .OK )
            {    
                //删除上机表中的信息,将工作日志表中的信息补充完整。
                Login.Modle.WorkLog  offwork = new Login.Modle.WorkLog ();
                offwork.UserID = frmLogin.username;
                DateTime n=DateTime.Now;

                offwork.LogoutDate = n.ToShortDateString();
                offwork.LogoutTime = DateTime.Now.ToShortTimeString();
                offwork.Status = "false";
                LoginFacade.loginFacade facade = new LoginFacade.loginFacade();
                int table = facade.OffWorkFacade(offwork);  //传递到外观层

                Application.Exit();//  退出
            }
        }
  外观、B层、还有工厂和接口的写法,跟其他访问数据库的写法一样。
D层代码:
public int OffWork(Login.Modle.WorkLog offwork)
       {
           SqlParameter[] para ={new SqlParameter ("@userid",offwork .UserID),
                                 new SqlParameter ("@logoutdate",offwork .LogoutDate),
                                 new SqlParameter ("@logouttime",offwork .LogoutTime),
                                 new SqlParameter ("@status",offwork .Status)};
           string store = "pro_OffWork";  //此处不用写sql语句,写存储过程的名字就行
           int back = SqlHelper.DeleteSQLHelper.DelecteTable(store, para, CommandType.StoredProcedure);
           return back;
       }
  写sql语句的地方写成存储过程名字就行,另外SQLHelper中的参数类型也要写成:
CommandType.StoredProcedure
  存储过程中的代码
存储过程一般与事物一起使用,因为事务具有原子性和一致性。
ALTER PROCEDURE [dbo].[pro_OffWork]   --存储过程名字
	-- Add the parameters for the stored procedure here
	--定义下边要用到的字段。
	@userid char(10),
	@logoutdate datetime,
	@logouttime time(0),
	@status char(10)
AS
declare @logintime time(0)
BEGIN
declare @error int ---声明事物变量
set @error=0  --给事物变量赋值
BEGIN TRANSACTION --事物开始语句

select @logintime =logintime from OnWork_Info where UserID =@userid 
     --删除onwork表中相应的数据
	delete from OnWork_Info where userid=@userid

set @error =@error+@@ERROR   --事物

	--更新worklog表中相应的数据。
	update worklog_Info set LogoutDate =@logoutdate ,LogoutTime =@logouttime,status =@status where UserID =@userid and LoginTime =@logintime 

set @error =@error+@@ERROR   --事物

if @error <>0
  ROLLBACK --发生错误时回滚
else
  COMMIT  --不发生错误时执行语句

END 
  
     到这里关闭程序所需要的功能就完成了。
  
 假如我们不用存储过程,一般的思路可能就是,先访问数据库,删除onwork表中的数据,然后再次进入数据库,在worklog表中添加记录,这样就要访问两次数据库。这样无形中会增加很多代码,但是用存储过程就只访问一次数据库就可以了,可以少写好多代码,提高我们的工作效率。
多学一些知识,多尝试着使用这些知识,你会收获很多,能提高我们的学习工作效率。



<think>嗯,用户这次聚焦在华为存储平台频繁出现硬盘自动恢复告警的问题,看来之前关于告警类型的解释没能完全解决ta的困惑。用户引用的资料里提到硬件告警中的硬盘告警类别[^1],但ta更关心的是“频繁自动恢复”这个特殊现象。 从技术角度看,这种告警频繁触发往往意味着存储系统在反复经历“故障-自愈”的循环。结合华为存储设计特点,需要重点排查几个方向:首先是物理层,比如硬盘背板接触不良或供电波动会导致硬盘间歇性掉线又自动重连;其次是RAID组状态,如果热备盘不足或重构频繁失败,系统会不断尝试恢复;还要考虑硬盘本身的亚健康状态,比如SMART参数中Reallocated_Sector_Count(重映射扇区数)持续增长就会触发修复动作[^1]。 用户引用的华为云Stack相关内容[^2]其实也暗示了另一个维度——如果是云环境,底层存储服务(如FusionStorage)的自动修复机制过于敏感也可能导致告警风暴。这点在ta提供的FusionCompute存储架构[^3]里得到印证,虚拟化存储层的逻辑卷异常修复同样会触发同类告警。 考虑到用户提到“频繁”,建议优先检查物理环境:硬盘温度(环境告警类)、供电电压稳定性、以及多路径配置。曾经有案例是因为机柜PDU老化导致硬盘在用电高峰集体闪断,触发连锁恢复告警。另外Grafana监控看板[^4]如果能接入SMART日志,可以直观看到告警频次与硬盘I/O负载的关联性。 最后想到个容易被忽视的点——硬盘固件版本。某些早期型号的硬盘在华为存储上有兼容性问题,固件bug会导致误报故障,后来通过补丁解决了。得提醒用户确认硬盘兼容性列表。</think>华为存储平台频繁出现硬盘“自动恢复告警”通常由以下原因引起,需结合硬件状态、系统配置及环境因素综合排查: --- ### **一、核心原因分析** 1. **硬盘物理状态不稳定** - **间歇性连接故障**:硬盘背板接触不良、SAS线缆松动或端口氧化导致通信时断时续,触发系统反复尝试恢复[^1]。 - **供电异常**:电源波动或硬盘供电模块老化,引发硬盘频繁脱机/重连。 - **硬盘亚健康**:SMART参数中`Reallocated_Sector_Count`(重映射扇区数)或`UDMA_CRC_Error_Count`(传输校验错误)持续增长,表明硬盘处于临界故障状态[^1]。 2. **RAID组配置或重构异常** - **重构压力过大**:多块硬盘轮流故障导致RAID反复重构,耗尽系统资源(如缓存或带宽),延长恢复时间并触发告警[^3]。 - **热备盘不足**:当故障盘无可用热备盘替换时,系统会持续尝试修复原硬盘。 - **重构策略激进**:策略设置为“立即重构”可能在高负载时段频繁触发恢复操作。 3. **系统逻辑层问题** - **多路径切换频繁**:存储网络(如FC SAN)链路震荡,导致硬盘路径反复切换,误触发恢复流程[^3]。 - **虚拟化层异常**:FusionCompute中虚拟化存储(如虚拟化SAN)的元数据不一致,引发虚假硬盘故障告警[^3]。 4. **环境与运维因素** - **温度/湿度超标**:机房冷却故障或灰尘堆积导致硬盘温度持续过高(如>55℃),触发保护性降级[^1]。 - **误操作或配置变更**:手动强制上线故障硬盘(`force online`)或误删RAID组缓存配置。 --- ### **二、排查步骤** #### **1. 检查硬件状态** ```bash # 查看硬盘物理状态(华为OceanStor CLI) show disk physical-state -d disk_id # 检查SMART关键参数 show disk smart -d disk_id | grep "Reallocated_Sector\|CRC_Error" ``` **关注点**: - `Physical State` 是否为 **Normal** - `Health Status` 是否为 **Healthy** - SMART错误计数是否持续增加 #### **2. 分析RAID组与重构日志** ```bash # 查看RAID组状态 show raid_group general # 检索重构事件 show event_log -t raid_rebuild ``` **关键指标**: - RAID状态是否长期处于 **Rebuilding** 或 **Degraded** - 重构进度是否反复重置(如从30%退回0%) #### **3. 验证存储网络稳定性** ```bash # 检查FC端口误码率 show fc_port -t performance | grep "CRC_Error" # 查看多路径切换记录 show path -v | grep "Failover" ``` **阈值参考**: - 端口CRC错误 > **10次/小时** 需检查光纤链路 - 路径切换频率 > **5次/天** 需排查HBA卡或交换机 #### **4. 环境监测** ```bash # 查询硬盘温度 show disk temperature # 检查机房温湿度传感器日志 ``` **告警阈值**: - 硬盘温度 > **50℃**(SSD)或 **55℃**(HDD) - 湿度持续 > **70%** --- ### **三、解决方案** | **场景** | **措施** | |---------------------------|--------------------------------------------------------------------------| | 硬盘物理故障 | 更换故障盘,优先使用同批次兼容型号 | | RAID重构频繁失败 | 扩容热备盘,调整重构速率:`change raid_group rebuild_rate=medium` | | 存储网络震荡 | 更换SAS/FC线缆,清洁光纤接口,更新HBA卡固件 | | 虚拟化存储异常 | 在FusionCompute执行存储池一致性校验[^3] | | 环境问题 | 优化机房散热,清理风道,校准温湿度传感器 | > ⚠️ **紧急操作**:若告警导致业务卡顿,可临时降级重构优先级: > ```bash > change raid_group rebuild_priority=low > ``` --- ### **四、预防措施** 1. **定期维护**:每季度清洁背板与接口,每半年更换老旧线缆。 2. **监控增强**: - 配置Grafana看板监控SMART趋势与重构耗时[^4] - 设置阈值告警(如单盘日恢复次数 >3) 3. **策略优化**: - 避开业务高峰执行重构 - 启用慢盘检测策略:`change storage_disk auto_bad_disk_detect=on` --- 通过以上步骤,可定位并解决硬盘自动恢复告警频繁问题。若告警仍持续,建议收集`RAID组重构日志`及`硬盘SMART全量报告`联系华为技术支持分析。 --- ### **相关问题** 1. 如何解读华为存储硬盘的SMART参数阈值? 2. FusionCompute存储池一致性校验的操作步骤是什么? 3. 华为OceanStor如何配置慢盘自动隔离策略? 4. 存储网络CRC错误率过高该如何定位故障点? [^1]: 硬件告警中的硬盘状态异常及环境因素影响 [^3]: FusionCompute存储架构与虚拟化层故障关联性 [^4]: 通过Grafana实现存储健康趋势监控
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值