mysql dba操作规范
良好的规范是减少故障的基础。
[TOC]
基本规范意识
所有操作应该遵循下述原则:
- <备份高于一切> 所有DML操作,必须事前做好备份,必要时可逆;
- <事前通知> 所有影响业务的操作,必须事先通知DBA主管和业务方;
- <大量操作分批做> 超过10W行的操作,必须分批处理;
- <工单审计> 所有上线需求必须走工单系统,口头通知视为无效;
服务器操作
- 禁用自动更新服务,原则上不允许在数据库服务器上安装补丁(重大安全更新除外);
- 在数据库服务器上安装任何软件,需DBA经理确认,并经过安全同事检测;
- 对数据库服务器的维护操作,请走内部网络;
- 拷贝10G以上的文件必须限流,控制在50MB/s以下,如果无法限流,则只能在凌晨2点-8点期间拷贝;
数据库对象操作
数据库操作
创建数据库
- 数据库命名必须遵守《mysql建库建表规范》
备份数据库
- 大于100G的生产库,只能在凌晨2点-8点期间做完整备份;
工具库的使用
数据库名称 | 功能 | 备注 |
---|---|---|
bak | 用于存放dml操作之前的表备份 | 不做备份,数据可接受丢失 |
数据表操作
新建表
- 确认新表有主键、必要的索引;
- 确认表存储的数据的业务属性,如果不被业务依赖,且数据量1天超过100W条记录,不允许放在业务库中,只能放日志库;
- 确认是否可以做切表处理;
- 若数据有效性只有n天,确认是否可以转mongodb(利用ttl索引便于定期清理);
备份表
- 请规范使用:对象名备份日期备份人,举例:
use xxx;
create table bak.orders_20170224_yuxiukai like orders;
insert into bak.orders_20170224_yuxiukai select * from orders where orderid=1206228;
删除表
- 已上线的表,原则上不允许改名或删除,除非和开发确认该表已经下线;
- 删表之前,通过audit监控主库和从库1天以上,确认无读写操作;
- 改名(对象名del备份日期)后观察7天再删除,删除之前做归档;
字段操作
添加字段
- 对大于100W条记录的表,只能添加允许为空的字段;
- 要添加有默认值的NOT NULL字段,必须先允许NULL+默认值后分批更新值,再更改为NOT NULL;
删除字段
- 已上线的表不允许进行字段删除(除非明确告知已确认影响范围);
更改字段类型
规范要求 | 允许 | 不允许 |
---|---|---|
只能更改长度,不能更改类型 | char -> char | int -> bigint |
长度只能改大,不能改小 | varchar(10) -> varchar(20) | varchar(20) -> varchar(10) |
大表变更
- 在对大表做表结构变更时,如修改字段属性会造成锁表,并会造成从库延迟,从而影响线上业务,必须在凌晨 00:00 后业务低峰期执行,另统一用工具 pt-online-schema-change 避免锁表且降低延迟执行时间。使用范例:
pt-online-schema-change --alter="add index idx_id_no(id_no)" \
--no-check-replication-filters --recursion-method=none --user=dba_admin \
--password=*** D=db_xxx,t=table_xxx --execute
索引操作
添加或重建索引
- 当该实例为线上业务所依赖时,记录大于100W条的表只能在凌晨2点-6点进行;
删除索引
- 必须能够明确的证明该索引不被业务查询所使用;
- 删除索引的顺序:先禁用,再删除;
数据操作
插入数据
- 单条语句插入数据大于10W条或者超过100MB时,必须分批操作;
- 每批小于3000条,批次间主动停顿1秒以上;
更新数据
- 更新的记录需备份到bak库中;
- 单条语句更新数据大于10W条时,必须分批操作,每批小于3000条,批次间主动停顿1秒以上;
删除数据
- 需业务对应研发主管确认,才能删除数据;
- 删除的数据需备份到bak库中;
- 单条语句删除大于5W条时,必须分批操作,每批小于1000条,批次间主动停顿1秒以上;
权限操作
- 不允许使用root作为业务账号;
- 原则上只读账号只分配 select 权限;
- 原则上禁止在生产环境申请开通个人帐号,也不允许在代码中使用个人账号连接数据库;
- 新增账号,DBA请务必及时登记账号及密码信息,保存密码的文件必须加密;
- 所有备份、监控、报表等作业建议使用专用账号,并严格控制相关权限;
- 数据库账户,一定要做到权限划分明确,读写帐号分离,并且有辨识度,能区分具体业务;
- 所有账户必须都在主库创建,只读查询只能从非候选上操作;
- 对DBA离职或转岗的同事要及时进行权限回收及账号注销;
备份操作
备份策略
数据库类型 | 备份策略 | 周天 | 频率 | 起止时间 | 说明 |
---|---|---|---|---|---|
MySQL | 完整备份 | 每天 | Daily | 03:00 | |
日志备份 | 每天 | 20min | 00:00 - 23:59 |
其他操作
- 线上数据库如果需要做Mongo的stepdown、MySQL的主从切换,必须事先邮件通知相关业务方、开发、运维,操作时间为凌晨0点-8点,切换时间控制在1分钟内;
- 修改数据库相关的DNS,需由另一个DBA二次确认;
- 涉及数据库的影响范围较大的操作(如:拆分库分表、DB迁移等),DBA需提前做好可行的操作方案及异常情况下的回滚方案,并给出详细步骤的演练过程报告(包括:影响范围、执行时间等);最终该方案经过DBA团队、研发、运维等相关同事共同进行可行性评估及QA后方可通过;
- 涉及数据库的影响范围较大的操作(如:拆分库分表、DB迁移等),必须提前与研发、运维同事沟通,并通知相关上下游业务方;对于需要停机维护的操作,需求方必须提前一周发起停机申请流程;