Skip to content

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
  • 密码等敏感信息必须进行加密存储

输入验证

  • 所有用户输入必须进行验证
  • 避免使用evalexec等危险函数
  • 处理外部数据时必须进行转义
  • 防止SQL注入、命令注入等安全漏洞

脚本测试规范

测试环境

  • 脚本必须在测试环境充分测试
  • 测试环境必须与生产环境尽可能一致
  • 测试数据必须模拟真实场景
  • 测试必须包含正常和异常情况

测试流程

  1. 单元测试:测试脚本的各个功能模块
  2. 集成测试:测试脚本与其他系统的集成
  3. 性能测试:测试脚本的执行性能
  4. 安全测试:测试脚本的安全性
  5. 回归测试:修改后重新测试所有功能

测试文档

  • 脚本必须包含测试文档
  • 测试文档必须包含测试用例
  • 测试文档必须包含预期结果
  • 测试文档必须包含实际结果

脚本部署与维护规范

部署流程

  1. 代码审查:脚本必须经过代码审查
  2. 测试验证:脚本必须经过充分测试
  3. 部署上线:使用自动化工具部署脚本
  4. 监控运行:监控脚本的运行状态
  5. 日志分析:定期分析脚本运行日志

维护流程

  • 脚本必须定期更新和优化
  • 脚本变更必须经过审批
  • 脚本变更必须记录变更日志
  • 脚本必须进行版本管理
  • 废弃脚本必须及时清理

常见问题(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文件,定期更新依赖,确保依赖的安全性和稳定性。