外观
TDSQL 脚本编写规范
脚本分类与命名规范
脚本分类
- SQL脚本:用于数据库结构变更、数据迁移、数据初始化等
- Shell脚本:用于自动化部署、备份恢复、监控告警等
- Python脚本:用于复杂的数据分析、自动化运维、性能优化等
- 配置脚本:用于配置管理、环境初始化等
命名规范
- SQL脚本:
功能_对象_版本_日期.sql,例如:create_table_user_v1_20230101.sql - Shell脚本:
功能_对象.sh,例如:backup_tdsql.sh - Python脚本:
功能_对象.py,例如:monitor_tdsql.py - 配置脚本:
config_环境_对象.sh,例如:config_prod_tdsql.sh
版本管理
- 脚本必须包含版本信息
- 版本号格式:
v主版本号.次版本号.修订号,例如:v1.0.0 - 重要变更必须更新版本号
- 脚本必须包含变更日志
SQL脚本编写规范
基础规范
- 使用UTF-8编码
- 每行长度不超过120个字符
- 使用4个空格缩进,不使用制表符
- 关键字大写,对象名小写
- 逗号放在行首,便于注释和修改
- 每个语句必须以分号结尾
结构变更脚本
sql
-- 脚本名称:create_table_user_v1_20230101.sql
-- 功能:创建用户表
-- 版本:v1.0.0
-- 日期:2023-01-01
-- 作者:数据库运维组
-- 创建表之前先检查是否存在
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID'
,`username` VARCHAR(50) NOT NULL COMMENT '用户名'
,`password` VARCHAR(255) NOT NULL COMMENT '密码'
,`email` VARCHAR(100) NOT NULL COMMENT '邮箱'
,`status` TINYINT(4) NOT NULL DEFAULT 1 COMMENT '状态:1-启用,0-禁用'
,`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
,`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
,PRIMARY KEY (`id`)
,UNIQUE KEY `uk_username` (`username`)
,UNIQUE KEY `uk_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 创建索引
CREATE INDEX `idx_status` ON `user` (`status`);
-- 创建注释
COMMENT ON TABLE `user` IS '用户表';
COMMENT ON COLUMN `user`.`id` IS '用户ID';数据变更脚本
sql
-- 脚本名称:insert_data_user_v1_20230101.sql
-- 功能:插入用户数据
-- 版本:v1.0.0
-- 日期:2023-01-01
-- 作者:数据库运维组
-- 插入测试数据
INSERT INTO `user` (`username`, `password`, `email`, `status`)
VALUES ('admin', 'encrypted_password', 'admin@example.com', 1)
,('test', 'encrypted_password', 'test@example.com', 1);
-- 批量更新数据
UPDATE `user`
SET `status` = 1
WHERE `create_time` < '2023-01-01';事务处理
- 重要的数据变更必须使用事务
- 事务大小要合理,避免长事务
- 事务中必须包含错误处理
sql
-- 脚本名称:transaction_demo_v1_20230101.sql
-- 功能:事务处理示例
-- 版本:v1.0.0
-- 日期:2023-01-01
-- 作者:数据库运维组
START TRANSACTION;
-- 执行操作1
INSERT INTO `table1` (`column1`, `column2`)
VALUES ('value1', 'value2');
-- 执行操作2
UPDATE `table2`
SET `column1` = 'new_value'
WHERE `id` = 1;
-- 提交事务
COMMIT;
-- 或回滚事务
-- ROLLBACK;错误处理
- 脚本必须包含错误检查
- 使用
SET sql_mode = 'STRICT_ALL_TABLES'启用严格模式 - 使用
DECLARE EXIT HANDLER处理存储过程中的错误
Shell脚本编写规范
基础规范
- 使用UTF-8编码
- 首行必须包含shebang:
#!/bin/bash - 每行长度不超过120个字符
- 使用4个空格缩进
- 变量名使用大写字母,下划线分隔
- 函数名使用小写字母,下划线分隔
脚本结构
bash
#!/bin/bash
# 脚本名称:backup_tdsql.sh
# 功能:TDSQL 数据库备份脚本
# 版本:v1.0.0
# 日期:2023-01-01
# 作者:数据库运维组
# 设置严格模式
set -euo pipefail
# 定义变量
BACKUP_DIR="/backup/tdsql"
DATE=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="$BACKUP_DIR/backup_${DATE}.log"
# 日志函数
log() {
echo "$(date +"%Y-%m-%d %H:%M:%S") - $1" >> "$LOG_FILE"
}
# 检查目录
if [ ! -d "$BACKUP_DIR" ]; then
mkdir -p "$BACKUP_DIR"
log "创建备份目录:$BACKUP_DIR"
fi
# 执行备份
log "开始执行TDSQL备份"
# 备份命令...
log "TDSQL备份完成"
# 清理旧备份
find "$BACKUP_DIR" -name "*.sql" -mtime +7 -delete
log "清理7天前的旧备份"错误处理
- 使用
set -euo pipefail启用严格模式 - 每个命令的执行结果必须检查
- 错误信息必须记录到日志
- 脚本必须有合理的退出码
日志管理
- 所有脚本必须记录日志
- 日志必须包含时间戳
- 日志必须包含脚本名称和版本
- 日志必须包含关键操作的执行结果
- 日志文件必须定期清理
Python脚本编写规范
基础规范
- 使用UTF-8编码
- 首行必须包含shebang:
#!/usr/bin/env python3 - 遵循PEP 8编码规范
- 使用4个空格缩进
- 变量名和函数名使用小写字母,下划线分隔
- 类名使用驼峰命名法
脚本结构
python
#!/usr/bin/env python3
"""
脚本名称:monitor_tdsql.py
功能:TDSQL 数据库监控脚本
版本:v1.0.0
日期:2023-01-01
作者:数据库运维组
"""
import sys
import logging
import pymysql
from datetime import datetime
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='/var/log/tdsql/monitor.log'
)
logger = logging.getLogger(__name__)
# 数据库配置
DB_CONFIG = {
'host': 'localhost',
'port': 3306,
'user': 'monitor',
'password': 'password',
'database': 'information_schema'
}
# 监控函数
def monitor_tdsql():
"""监控TDSQL数据库"""
try:
# 连接数据库
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor()
# 执行监控SQL
cursor.execute("SELECT COUNT(*) FROM TABLES")
table_count = cursor.fetchone()[0]
logger.info(f"TDSQL数据库表数量:{table_count}")
# 关闭连接
cursor.close()
conn.close()
except Exception as e:
logger.error(f"监控TDSQL失败:{str(e)}")
return False
return True
# 主函数
if __name__ == "__main__":
logger.info("开始执行TDSQL监控脚本")
success = monitor_tdsql()
if success:
logger.info("TDSQL监控脚本执行成功")
sys.exit(0)
else:
logger.error("TDSQL监控脚本执行失败")
sys.exit(1)依赖管理
- 脚本必须包含依赖声明
- 依赖版本必须明确指定
- 使用虚拟环境隔离依赖
- 重要脚本必须包含requirements.txt文件
错误处理
- 使用try-except块处理异常
- 异常信息必须记录到日志
- 脚本必须有合理的退出码
- 关键操作必须进行重试
脚本安全规范
权限管理
- 脚本必须设置合理的执行权限,一般为700或750
- 脚本所有者必须是合法的运维用户
- 敏感脚本必须进行加密处理
- 脚本执行必须进行审计
敏感信息保护
- 脚本中不得硬编码密码、密钥等敏感信息
- 敏感信息必须通过环境变量或配置文件读取
- 配置文件必须设置合理的权限,一般为600
- 密码等敏感信息必须进行加密存储
输入验证
- 所有用户输入必须进行验证
- 避免使用
eval、exec等危险函数 - 处理外部数据时必须进行转义
- 防止SQL注入、命令注入等安全漏洞
脚本测试规范
测试环境
- 脚本必须在测试环境充分测试
- 测试环境必须与生产环境尽可能一致
- 测试数据必须模拟真实场景
- 测试必须包含正常和异常情况
测试流程
- 单元测试:测试脚本的各个功能模块
- 集成测试:测试脚本与其他系统的集成
- 性能测试:测试脚本的执行性能
- 安全测试:测试脚本的安全性
- 回归测试:修改后重新测试所有功能
测试文档
- 脚本必须包含测试文档
- 测试文档必须包含测试用例
- 测试文档必须包含预期结果
- 测试文档必须包含实际结果
脚本部署与维护规范
部署流程
- 代码审查:脚本必须经过代码审查
- 测试验证:脚本必须经过充分测试
- 部署上线:使用自动化工具部署脚本
- 监控运行:监控脚本的运行状态
- 日志分析:定期分析脚本运行日志
维护流程
- 脚本必须定期更新和优化
- 脚本变更必须经过审批
- 脚本变更必须记录变更日志
- 脚本必须进行版本管理
- 废弃脚本必须及时清理
常见问题(FAQ)
Q1: 脚本中如何处理敏感信息?
A1: 脚本中不得硬编码敏感信息,应通过环境变量、配置文件或密钥管理系统读取。配置文件必须设置合理的权限,敏感信息必须加密存储。
Q2: 如何确保脚本的可移植性?
A2: 避免使用特定平台的命令和工具,使用标准的命令和语法,明确指定依赖版本,使用虚拟环境隔离依赖。
Q3: 脚本执行失败后如何处理?
A3: 脚本必须包含错误处理机制,记录详细的错误日志,返回合理的退出码,重要操作必须进行重试。
Q4: 如何优化脚本的执行性能?
A4: 减少不必要的命令执行,使用并行处理,优化算法,合理设置缓存,定期清理临时文件。
Q5: 脚本如何进行版本管理?
A5: 使用Git等版本管理工具管理脚本,遵循语义化版本规范,包含详细的变更日志,重要变更必须更新版本号。
Q6: 如何确保脚本的安全性?
A6: 设置合理的执行权限,保护敏感信息,验证所有输入,避免使用危险函数,定期进行安全审计。
Q7: 脚本如何进行自动化部署?
A7: 使用Ansible、Jenkins等自动化工具部署脚本,建立标准化的部署流程,确保部署的一致性和可靠性。
Q8: 如何监控脚本的运行状态?
A8: 脚本必须记录详细的日志,使用监控系统监控脚本的运行状态,设置合理的告警规则,定期分析运行日志。
Q9: 脚本如何进行文档化?
A9: 脚本必须包含详细的注释和文档,说明脚本的功能、版本、作者、使用方法等信息,编写测试文档和使用手册。
Q10: 如何处理脚本的依赖问题?
A10: 明确指定依赖版本,使用虚拟环境隔离依赖,包含requirements.txt文件,定期更新依赖,确保依赖的安全性和稳定性。
