当前位置: 首页 > 科技观察

SQLServer序列监控

时间:2023-03-13 00:54:03 科技观察

本文转载自微信公众号《DBA的杂念》,作者潇湘隐士。转载本文请联系DBA杂念公众号。我们知道,如果数据库中的序列(SequenceNumbers)设置不当或者由于业务爆炸等各种原因,序列的值可能会被用完或者耗尽,这时候就会出现类似下面的错误:消息11728,级别16,状态1,第25行序列对象“SEQ_OVER_TEST”已达到其最小值或最大值。重新启动序列对象以允许生成新值。如果DBA没有对sequence进行监控,很有可能当用户报告/报告这个问题的时候,发现sequence的值已经用完了。这个时候用救火的方式来处理就显得有些仓促和尴尬了。因此,应该监控SQLServer的顺序使用情况。例如,当序列的当前值达到最大值的85%时,应该发出告警通知。这时候可能需要和开发商商量解决方案。以下脚本用于获取序列的用法。可以使用Python集中收集每个数据库序列的使用情况,然后对当前值超过最大值85%的序列触发告警。/***************************************************************************************************************************--脚本名称:db_sequences_alert.sql--脚本作者:潇湘隐士--创建日期:2021-01-21**************************************************************************************************************************脚本功能:检查数据库中序列的使用情况。如果序列当前值超过maximum_value的85%,则需要采取措施。****************************************************************************************************************************注:否*************************************************************************************************************************参考资料:https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-sequences-transact-sql?view=sql-server-ver15******************************************************************************************************************************更新记录:2021-01-21创建了这个脚本*********************************************************************************************************************/SELECT@@SERVERNAMEAS[server_name],DB_NAME(DB_ID())AS[database_name],SCHEMA_NAME(schema_id)AS[scheme_name],nameAS[sequence_name],create_dateAS[create_date],modify_dateAS[modify_date],type_descAS[type_desc],start_valueAS[起始值],current_valueAS[当前值],minimum_valueAS[最小值],maximum_valueAS[最大值]],is_cyclingAS[is_cycling],缓存_sizeAS[cache_size],is_exhaustedAS[is_exhausted],CASEWHENincrement>=1THENROUND(CAST(current_valueASDOUBLEPRECISION)/CAST(maximum_valueASDOUBLEPRECISION)*100,2)ELSEROUND(CAST(current_valueASDOUBLEPRECISION)/CAST(minimum_valueASDOUBLEPRECISION)*100cent_usage(%per)]FROMsys.sequencesWHEREis_cycling=0ORDERBY[percent_usage(%)]DESCGO