mssql dba操作规范

良好的规范是减少故障的基础。


[TOC]

基本规范意识

所有操作应该遵循下述原则:

  • <备份高于一切> 所有DML操作,必须事前做好备份,必要时可逆;
  • <事前通知> 所有影响业务的操作,必须事先通知DBA主管和业务方;
  • <大量操作分批做> 超过10W行的操作,必须分批处理;
  • <工单审计> 所有上线需求必须走工单系统,口头通知视为无效;

服务器操作

  • 禁用自动更新服务,原则上不允许在数据库服务器上安装补丁(重大安全更新除外);
  • 在数据库服务器上安装任何软件,需DBA经理确认,并经过安全同事检测;
  • 对数据库服务器的维护操作,请走内部网络;
  • 拷贝10G以上的文件必须限流,控制在50MB/s以下,如果无法限流,则只能在凌晨2点-8点期间拷贝;

数据库对象操作

数据库操作

创建数据库

  • 数据库命名必须遵守《sqlserver建库建表规范》
  • 调整自动增长设置,比如将默认 1MB 改为 100MB;
  • 设置数据库所有者为 sa ,数据库恢复模型(RECOVERY MODE)使用完整模式 Full;

备份数据库

  • 大于100G的生产库,只能在凌晨2点-8点期间做完整备份;
  • 必须启用压缩备份 with compression;

工具库的使用

数据库名称 功能 备注
bak 用于存放dml操作之前的表备份 简单模式,不做备份,数据可接受丢失
configdb 用于存放dba提供的各类工具资源 简单模式,不做备份,数据可接受丢失

数据表操作

新建表

  • 确认新表有主键、必要的索引;
  • 确认表存储的数据的业务属性,如果不被业务依赖,且数据量1天超过100W条记录,不允许放在业务库中,只能放日志库;
  • 确认是否可以做切表处理;
  • 若数据有效性只有n天,确认是否可以转mongodb(利用ttl索引便于定期清理);

备份表

  • 请规范使用:对象名_备份日期_备份人
--举例
select * into bak..orders_20170224_yuxiukai 
from orders with(nolock) where orderid=1206228

删除表

  • 已上线的表,原则上不允许改名或删除,除非和开发确认该表已经下线;
  • 以表名为关键字,通过trace监控主库和从库1天以上,确认无读写操作;
  • 改名(对象名del备份日期)后观察7天再删除,删除之前做归档;

字段操作

添加字段

  • 对大于100W条记录的表,只能添加允许为空的字段;
  • 要添加有默认值的NOT NULL字段,必须先允许NULL+默认值后分批更新值,再更改为NOT NULL;

删除字段

  • 已上线的表不允许进行字段删除(除非明确告知已确认影响范围);

更改字段类型

规范要求 允许 不允许
只能更改长度,不能更改类型 char → char int → bigint
长度只能改大,不能改小 varchar(10) → varchar(20) varchar(20) → varchar(10)

索引操作

添加或重建索引

  • 当该实例为线上业务所依赖时,记录大于100W条的表只能在凌晨2点-6点进行,且使用在线创建模式;
--举例
CREATE NONCLUSTERED INDEX idx_city ON ip2location(city) WITH(ONLINE=ON)

删除索引

  • 必须能够明确的证明该索引不被业务查询所使用;
  • 删除索引的顺序:先禁用,再删除;
--举例
ALTER INDEX idx_id ON PayOrder DISABLE 
DROP INDEX idx_id ON PayOrder

数据操作

插入数据

  • 单条语句插入数据大于10W条或者超过100MB时,必须分批操作;
  • 每批小于3000条,批次间主动停顿1秒以上;

更新数据

  • 更新的记录需备份到bak库中;
  • 单条语句更新数据大于10W条时,必须分批操作,每批小于3000条,批次间主动停顿1秒以上;

删除数据

  • 需业务对应研发主管确认,才能删除数据;
  • 删除的数据需备份到bak库中;
  • 单条语句删除大于5W条时,必须分批操作,每批小于1000条,批次间主动停顿1秒以上;

其他

  • DBA自己写的DML,影响行数超过10W行的,需找其他DBA二次确认,才能执行;

权限操作

  • 不允许使用sa作为业务账号;
  • 原则上业务账号只分配db_datareader、db_datawriter等dml权限,不给ddl(即db_owner) 权限;
  • 原则上只读账号只分配db_datareader权限;
  • 原则上禁止在生产环境申请开通个人帐号,也不允许在代码中使用个人账号连接数据库;
  • 新增账号,DBA请务必及时登记账号及密码信息,保存密码的文件必须加密;
  • 所有备份、监控、报表等作业建议使用专用账号,并严格控制相关权限;
  • 数据库账户,一定要做到权限划分明确,读写帐号分离,并且有辨识度,能区分具体业务;
  • 所有账户必须都在主库创建,只读查询只能从非候选上操作;
  • 单个账号访问多个实例,则请通过指定 @sid 并使用sp_addlogin创建,以避免db整合后访问异常;
  • 对DBA离职或转岗的同事要及时进行权限回收及账号注销;

备份操作

备份策略

数据库类型 备份策略 周天 频率 起止时间 说明
SQL Server 完整备份 周一三五七 Daily 03:00
差异备份 周二四六 Daily 03:00
日志备份 每天 20min 00:00 - 23:59

其他操作

  • DBCC freeproccache , DBCC dropcleanbuffer ,CheckPoint等语句不能在生产环境中使用,会清空内存、编译好的执行计划,造成短时间内cpu、io 急剧上升;
  • 线上数据库如果需要做SQL Server的failover、Mongo的stepdown、MySQL的主从切换,必须事先邮件通知相关业务方、开发、运维,操作时间为凌晨0点-8点,切换时间控制在1分钟内;
  • 修改数据库相关的DNS,需由另一个DBA二次确认;
  • 涉及数据库的影响范围较大的操作(如:拆分库分表、DB迁移等),DBA需提前做好可行的操作方案及异常情况下的回滚方案,并给出详细步骤的演练过程报告(包括:影响范围、执行时间等);最终该方案经过DBA团队、研发、运维等相关同事共同进行可行性评估及QA后方可通过;
  • 涉及数据库的影响范围较大的操作(如:拆分库分表、DB迁移等),必须提前与研发、运维同事沟通,并通知相关上下游业务方;对于需要停机维护的操作,需求方必须提前一周发起停机申请流程;
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2023-06-09 17:04:19

results matching ""

    No results matching ""