kingbase教程FG128-金仓数据库自动化运维脚本开发
本文档风哥主要介绍金仓数据库的自动化运维脚本开发,包括脚本开发基础、常用脚本示例、自动化工具集成和实战案例等内容。风哥教程参考金仓官方文档运维管理、自动化工具等内容编写,适合DBA人员开发自动化运维脚本,提高运维效率。
Part01-基础概念与理论知识
1.1 自动化运维概述
自动化运维是通过脚本和工具,实现数据库运维工作的自动化执行,减少人工干预,提高运维效率和准确性。
自动化运维的核心价值:
常用脚本语言:
1. Shell脚本
– 优势:系统内置,适合系统级操作
– 适用场景:日常巡检、备份恢复、服务管理
2. Python
– 优势:功能强大,生态丰富,适合复杂逻辑
– 适用场景:数据处理、性能分析、自动化工具开发
3. Perl
– 优势:文本处理能力强,适合日志分析
– 适用场景:日志分析、数据转换
4. PowerShell
– 优势:Windows环境原生支持
– 适用场景:Windows服务器运维
常用调度工具:
1. Crontab
– 系统内置的定时任务调度器
– 适合简单的定时任务
2. Airflow
– 强大的工作流调度平台
– 支持复杂的任务依赖关系
3. Jenkins
– 持续集成/持续部署工具
– 支持构建、测试、部署等流程
4. Ansible
– 配置管理和自动化工具
– 适合批量配置和部署
5. SaltStack
– 配置管理和远程执行工具
– 适合大规模集群管理
脚本架构层次:
┌─────────────────────────────────────────────────────────────┐
│ 应用层 │
│ 业务脚本(如备份脚本、巡检脚本) │
├─────────────────────────────────────────────────────────────┤
│ 工具层 │
│ 通用工具函数(如数据库连接、日志处理) │
├─────────────────────────────────────────────────────────────┤
│ 配置层 │
│ 配置文件(如数据库连接信息、脚本参数) │
├─────────────────────────────────────────────────────────────┤
│ 基础层 │
│ 系统命令、数据库API │
└─────────────────────────────────────────────────────────────┘
脚本命名规范:
格式:[功能]-[模块]-[版本].sh
示例:
– backup-database-v1.0.sh
– check-health-v2.0.sh
– monitor-performance-v1.5.sh
命名原则:
– 清晰明了,反映脚本功能
– 使用小写字母和连字符
– 包含版本号,便于管理
脚本头部信息模板:
#!/bin/bash
# script_name.sh
# 功能描述:数据库备份脚本
# 整理发布:风哥
# 版本:1.0
# 创建日期:2024-01-15
# 最后修改:2024-01-20
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 脚本参数说明
# $1: 数据库名称
# $2: 备份目录
# $3: 备份类型(full/incremental)
- 提高运维效率,减少人工操作
- 降低人为错误,提高操作准确性
- 实现标准化、规范化运维流程
- 支持批量操作,提高处理能力
- 实现7×24小时不间断监控和维护
1.2 脚本开发基础
1.2.1 常用脚本语言
常用脚本语言:
1. Shell脚本
– 优势:系统内置,适合系统级操作
– 适用场景:日常巡检、备份恢复、服务管理
2. Python
– 优势:功能强大,生态丰富,适合复杂逻辑
– 适用场景:数据处理、性能分析、自动化工具开发
3. Perl
– 优势:文本处理能力强,适合日志分析
– 适用场景:日志分析、数据转换
4. PowerShell
– 优势:Windows环境原生支持
– 适用场景:Windows服务器运维
1.2.2 脚本开发基础要素
- 变量定义:用于存储配置和中间结果,学习交流加群风哥微信: itpux-com
- 条件判断:根据不同情况执行不同操作
- 循环结构:处理重复任务
- 函数定义:封装可复用的代码块
- 错误处理:捕获和处理异常情况
- 日志记录:记录脚本执行过程和结果
1.3 自动化工具链
1.3.1 调度工具
常用调度工具:
1. Crontab
– 系统内置的定时任务调度器
– 适合简单的定时任务
2. Airflow
– 强大的工作流调度平台
– 支持复杂的任务依赖关系
3. Jenkins
– 持续集成/持续部署工具
– 支持构建、测试、部署等流程
4. Ansible
– 配置管理和自动化工具
– 适合批量配置和部署
5. SaltStack
– 配置管理和远程执行工具
– 适合大规模集群管理
1.3.2 监控工具
- Prometheus:时序数据库,用于监控指标收集
- Grafana:数据可视化工具,用于监控面板展示
- Zabbix:综合监控系统,支持告警功能,学习交流加群风哥QQ113257174
- Nagios:网络监控和告警系统
Part02-生产环境规划与建议
2.1 脚本架构设计
2.1.1 脚本架构层次
脚本架构层次:
┌─────────────────────────────────────────────────────────────┐
│ 应用层 │
│ 业务脚本(如备份脚本、巡检脚本) │
├─────────────────────────────────────────────────────────────┤
│ 工具层 │
│ 通用工具函数(如数据库连接、日志处理) │
├─────────────────────────────────────────────────────────────┤
│ 配置层 │
│ 配置文件(如数据库连接信息、脚本参数) │
├─────────────────────────────────────────────────────────────┤
│ 基础层 │
│ 系统命令、数据库API │
└─────────────────────────────────────────────────────────────┘
2.1.2 脚本模块化设计
- 功能模块化:将不同功能拆分为独立模块
- 参数化设计:通过参数控制脚本行为
- 配置分离:将配置与代码分离,便于维护
- 错误处理:统一的错误处理机制
- 日志记录:标准化的日志格式
2.2 脚本规范与标准
2.2.1 脚本命名规范
脚本命名规范:
格式:[功能]-[模块]-[版本].sh
示例:
– backup-database-v1.0.sh
– check-health-v2.0.sh
– monitor-performance-v1.5.sh
命名原则:
– 清晰明了,反映脚本功能
– 使用小写字母和连字符
– 包含版本号,便于管理
2.2.2 脚本头部信息
脚本头部信息模板:
#!/bin/bash
# script_name.sh
# 功能描述:数据库备份脚本
# 整理发布:风哥
# 版本:1.0
# 创建日期:2024-01-15
# 最后修改:2024-01-20
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 脚本参数说明
# $1: 数据库名称
# $2: 备份目录
# $3: 备份类型(full/incremental)
2.2.3 代码风格规范
- 缩进:使用4个空格或1个制表符进行缩进,更多视频教程www.fgedu.net.cn
- 变量命名:使用大写字母和下划线
- 函数命名:使用小写字母和下划线
- 注释:关键代码添加注释说明
- 代码长度:单行代码长度不超过80个字符
2.3 安全性考虑
2.3.1 安全最佳实践
脚本安全最佳实践:
敏感信息处理示例:
# 不推荐:硬编码密码
# PASSWORD=”mysecretpassword”
# 推荐:使用环境变量
export KINGBASE_PASSWORD=”mysecretpassword”
ksql -U system -d fgedudb -c “SELECT 1”
# 推荐:使用配置文件(权限600)
# config.conf
# [database]
# user=system
# password=mysecretpassword
# 读取配置文件
source /path/to/config.conf
ksql -U “$DB_USER” -d “$DB_NAME” -c “SELECT 1”
#!/bin/bash
# db_connect.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 数据库连接函数
function db_connect() {
local db_name=$1
local sql=$2
ksql -U system -d “$db_name” -t -c “$sql”
}
# 测试连接
function test_connection() {
local db_name=$1
result=$(db_connect “$db_name” “SELECT 1”)
if [ “$result” = “1” ]; then
echo “数据库连接成功”
return 0
else
echo “数据库连接失败”
return 1
fi
}
# 示例使用
if test_connection “fgedudb”; then
echo “执行SQL查询…”
db_connect “fgedudb” “SELECT count(*) FROM fgedu.users”
fi
#!/bin/bash
# backup_database.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置参数
DB_NAME=”fgedudb”
BACKUP_DIR=”/kingbase/backup”
TIMESTAMP=$(date +”%Y%m%d_%H%M%S”)
BACKUP_FILE=”${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.backup”
# 创建备份目录
mkdir -p “$BACKUP_DIR”
# 执行备份
echo “开始备份数据库 $DB_NAME…”
kbackup -U system -d “$DB_NAME” -f “$BACKUP_FILE”
# 检查备份结果
if [ $? -eq 0 ]; then
echo “备份成功:$BACKUP_FILE”
# 清理过期备份(保留7天)
find “$BACKUP_DIR” -name “${DB_NAME}_*.backup” -mtime +7 -delete
echo “已清理7天前的备份文件”
else
echo “备份失败”
exit 1
fi
# 记录备份日志
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 备份 $DB_NAME 到 $BACKUP_FILE” >> “${BACKUP_DIR}/backup.log”
#!/bin/bash
# health_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置参数
DB_NAME=”fgedudb”
CHECK_LOG=”/kingbase/log/health_check.log”
# 创建日志目录
mkdir -p “$(dirname “$CHECK_LOG”)”
# 开始检查
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 开始健康检查” >> “$CHECK_LOG”
# 1. 检查数据库连接
echo “检查数据库连接…”
result=$(ksql -U system -d “$DB_NAME” -t -c “SELECT 1”)
if [ “$result” = “1” ]; then
echo “数据库连接正常” >> “$CHECK_LOG”
else
echo “数据库连接失败” >> “$CHECK_LOG”
echo “数据库连接失败” >&2
fi
# 2. 检查表空间使用情况
echo “检查表空间使用情况…”
ksql -U system -d “$DB_NAME” -t -c ”
SELECT
spcname as tablespace,
round((pg_total_relation_size(spcname::regnamespace) / 1024 / 1024), 2) as used_mb,
round((pg_tablespace_size(spcname) / 1024 / 1024), 2) as total_mb,学习交流加群风哥微信: itpux-com
round((pg_total_relation_size(spcname::regnamespace) * 100 / pg_tablespace_size(spcname)), 2) as usage_percent
FROM pg_tablespace
WHERE spcname NOT LIKE ‘pg_%’;
” >> “$CHECK_LOG”
# 3. 检查连接数
echo “检查连接数…”
connections=$(ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_stat_activity”)
max_connections=$(ksql -U system -d “$DB_NAME” -t -c “SHOW max_connections”)
echo “当前连接数: $connections, 最大连接数: $max_connections” >> “$CHECK_LOG”
# 4. 检查慢查询
echo “检查慢查询…”
slow_queries=$(ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_stat_statements WHERE mean_exec_time > 1000”)
echo “慢查询数量: $slow_queries” >> “$CHECK_LOG”
# 5. 检查锁情况
echo “检查锁情况…”
locks=$(ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_locks WHERE granted = false”)
echo “等待锁数量: $locks” >> “$CHECK_LOG”
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 健康检查完成” >> “$CHECK_LOG”
echo “健康检查完成,详细日志请查看: $CHECK_LOG”
# Ansible playbook示例
# kingbase_backup.yml
—
– hosts: kingbase_servers
become: yes
vars:
db_name: fgedudb
backup_dir: /kingbase/backup
tasks:
– name: 创建备份目录
file:
path: “{{ backup_dir }}”
state: directory
owner: kingbase
group: kingbase
mode: ‘0755’
– name: 执行数据库备份
shell: |
kbackup -U system -d {{ db_name }} -f {{ backup_dir }}/{{ db_name }}_{{ ansible_date_time.date }}.backup
become_user: kingbase
register: backup_result
– name: 检查备份结果
debug:
msg: “备份成功: {{ backup_result.stdout }}”
when: backup_result.rc == 0
– name: 清理过期备份
shell: |
find {{ backup_dir }} -name “{{ db_name }}_*.backup” -mtime +7 -delete
become_user: kingbase
– name: 记录备份日志
lineinfile:
path: “{{ backup_dir }}/backup.log”
line: “{{ ansible_date_time.iso8601 }} – 备份 {{ db_name }} 完成”
create: yes
owner: kingbase
group: kingbase
mode: ‘0644’
# Jenkins Pipeline示例
# Jenkinsfile
pipeline {
agent any
parameters {
string(name: ‘DB_NAME’, defaultValue: ‘fgedudb’, description: ‘数据库名称’)
string(name: ‘BACKUP_DIR’, defaultValue: ‘/kingbase/backup’, description: ‘备份目录’)
}
stages {
stage(‘准备环境’) {
steps {
sh ‘mkdir -p ${BACKUP_DIR}’
sh ‘chown kingbase:kingbase ${BACKUP_DIR}’
}
}
stage(‘执行备份’) {
steps {
sh ”’
su – kingbase -c “kbackup -U system -d ${DB_NAME} -f ${BACKUP_DIR}/${DB_NAME}_$(date +%Y%m%d_%H%M%S).backup”
”’
}
}
stage(‘验证备份’) {
steps {
sh ”’
ls -la ${BACKUP_DIR}/ | grep ${DB_NAME}
”’
}
}
stage(‘清理过期备份’) {
steps {
sh ”’
find ${BACKUP_DIR} -name “${DB_NAME}_*.backup” -mtime +7 -delete
”’
}
}
}
post {
success {
echo ‘备份成功’
mail to: ‘admin@fgedu.net.cn’,
subject: ‘Kingbase数据库备份成功’,
body: ‘数据库备份已成功完成’
}
failure {
echo ‘备份失败’
mail to: ‘admin@fgedu.net.cn’,
subject: ‘Kingbase数据库备份失败’,
body: ‘数据库备份失败,请检查’
}
}
}
# Crontab配置示例
# 编辑crontab
$ crontab -e
# 每天凌晨1点执行全量备份
0 1 * * * /kingbase/scripts/backup_database.sh full
# 每小时执行增量备份
0 * * * * /kingbase/scripts/backup_database.sh incremental
# 每天凌晨2点执行健康检查
0 2 * * * /kingbase/scripts/health_check.sh
# 每周日凌晨3点执行数据库优化
0 3 * * 0 /kingbase/scripts/optimize_database.sh
# 每月1日凌晨4点执行日志清理
0 4 1 * * /kingbase/scripts/cleanup_logs.sh
脚本部署目录结构:
/kingbase/
├── scripts/ # 脚本目录
│ ├── backup/ # 备份相关脚本
│ ├── monitor/ # 监控相关脚本
│ ├── maintenance/ # 维护相关脚本
│ ├── utils/ # 工具函数脚本
│ └── config/ # 配置文件
├── log/ # 日志目录
│ ├── backup/ # 备份日志
│ ├── monitor/ # 监控日志
│ └── maintenance/ # 维护日志
└── backup/ # 备份文件目录
部署步骤:
1. 创建目录结构
2. 上传脚本文件
3. 设置执行权限
4. 配置调度任务
5. 测试脚本执行
6. 监控执行结果
#!/bin/bash
# daily_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置参数
DB_NAME=”fgedudb”
CHECK_DIR=”/kingbase/check”
LOG_FILE=”${CHECK_DIR}/daily_check_$(date +%Y%m%d).log”
# 创建检查目录
mkdir -p “$CHECK_DIR”
# 开始检查
echo “======================================” > “$LOG_FILE”
echo “金仓数据库日常巡检报告” >> “$LOG_FILE”
echo “检查时间: $(date ‘+%Y-%m-%d %H:%M:%S’)” >> “$LOG_FILE”
echo “======================================” >> “$LOG_FILE”
# 1. 系统信息
echo “\n1. 系统信息” >> “$LOG_FILE”
echo “主机名: $(hostname)” >> “$LOG_FILE”
echo “操作系统: $(cat /etc/redhat-release)” >> “$LOG_FILE”
echo “内核版本: $(uname -r)” >> “$LOG_FILE”
echo “CPU使用率: $(top -b -n 1 | grep ‘Cpu(s)’ | awk ‘{print $2 + $4}’)%” >> “$LOG_FILE”
echo “内存使用率: $(free -m | awk ‘/Mem/{print $3/$2*100}’)%” >> “$LOG_FILE”
echo “磁盘使用率: $(df -h | grep ‘/kingbase’ | awk ‘{print $5}’)” >> “$LOG_FILE”
# 2. 数据库信息
echo “\n2. 数据库信息” >> “$LOG_FILE”
echo “数据库版本: $(ksql -U system -d “$DB_NAME” -t -c “SELECT version()”)” >> “$LOG_FILE”
echo “数据库状态: $(ksql -U system -d “$DB_NAME” -t -c “SELECT pg_is_in_recovery()”)” >> “$LOG_FILE”
echo “连接数: $(ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_stat_activity”)” >> “$LOG_FILE”
# 3. 表空间使用情况
echo “\n3. 表空间使用情况” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c ”
SELECT
spcname as tablespace,
round((pg_total_relation_size(spcname::regnamespace) / 1024 / 1024), 2) as used_mb,
round((pg_tablespace_size(spcname) / 1024 / 1024), 2) as total_mb,
round((pg_total_relation_size(spcname::regnamespace) * 100 / pg_tablespace_size(spcname)), 2) as usage_percent
FROM pg_tablespace
WHERE spcname NOT LIKE ‘pg_%’;
” >> “$LOG_FILE”
# 4. 慢查询统计
echo “\n4. 慢查询统计” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c ”
SELECT
query,
round(mean_exec_time, 2) as avg_time_ms,
calls,
round(total_exec_time, 2) as total_time_ms
FROM sys_stat_statements
WHERE mean_exec_time > 1000
ORDER BY mean_exec_time DESC
LIMIT 5;
” >> “$LOG_FILE”
# 5. 锁等待情况
echo “\n5. 锁等待情况” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c ”
SELECT
blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_query,
blocking_activity.query AS blocking_query
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.GRANTED;
” >> “$LOG_FILE”
# 6. 备份状态
echo “\n6. 备份状态” >> “$LOG_FILE”
latest_backup=$(ls -lt /kingbase/backup/${DB_NAME}_*.backup 2>/dev/null | head -1 | awk ‘{print $9}’)
if [ -n “$latest_backup” ]; then
backup_time=$(stat -c %y “$latest_backup” | cut -d’ ‘ -f1,2)
backup_size=$(du -h “$latest_backup” | awk ‘{print $1}’)
echo “最新备份: $latest_backup” >> “$LOG_FILE”
echo “备份时间: $backup_time” >> “$LOG_FILE”
echo “备份大小: $backup_size” >> “$LOG_FILE”
else
echo “未找到备份文件” >> “$LOG_FILE”
fi
# 7. 结论
echo “\n7. 巡检结论” >> “$LOG_FILE”
echo “======================================” >> “$LOG_FILE”
echo “巡检完成,详细信息请查看日志文件: $LOG_FILE” >> “$LOG_FILE”
# 发送邮件
if [ -f “$LOG_FILE” ]; then
mail -s “[Kingbase] 日常巡检报告 $(date +%Y%m%d)” admin@fgedu.net.cn < "$LOG_FILE"
echo “巡检报告已发送到 admin@fgedu.net.cn”
fi
$ bash daily_check.sh
巡检报告已发送到 admin@fgedu.net.cn
# 查看日志内容
$ cat /kingbase/check/daily_check_20240115.log
======================================
金仓数据库日常巡检报告
检查时间: 2024-01-15 10:00:00
======================================
1. 系统信息
主机名: fgedu.net.cn
操作系统: Oracle Linux Server release 9.3
内核版本: 5.14.0-284.30.1.el9_2.x86_64
CPU使用率: 15.2%
内存使用率: 45.3%
磁盘使用率: 65%
2. 数据库信息
数据库版本: KingbaseES V8R6C7
数据库状态: f
连接数: 120
3. 表空间使用情况
tablespace | used_mb | total_mb | usage_percent
———–+———+———-+—————
userspace | 1250.5 | 2048.0 | 61.06
indexspace | 850.3 | 1024.0 | 83.04
4. 慢查询统计
query | avg_time_ms | calls | total_time_ms
——+————-+——-+—————
SELECT * FROM fgedu.users WHERE age > 30 | 2500.5 | 10 | 25005.0
SELECT * FROM fgedu.orders WHERE status = ‘pending’ | 1800.3 | 25 | 45007.5
5. 锁等待情况
(无锁等待)
6. 备份状态
最新备份: /kingbase/backup/fgedudb_20240115_010000.backup
备份时间: 2024-01-15 01:00:02
备份大小: 1.2G
7. 巡检结论
======================================
巡检完成,详细信息请查看日志文件: /kingbase/check/daily_check_20240115.log
#!/bin/bash
# auto_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置参数
DB_NAME=”fgedudb”
BACKUP_DIR=”/kingbase/backup”
LOG_DIR=”/kingbase/log/backup”
RETENTION_DAYS=7
MAIL_TO=”admin@fgedu.net.cn”
# 创建目录
mkdir -p “$BACKUP_DIR”
mkdir -p “$LOG_DIR”
# 生成备份文件名
TIMESTAMP=$(date +”%Y%m%d_%H%M%S”)
BACKUP_FILE=”${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.backup”
LOG_FILE=”${LOG_DIR}/backup_${TIMESTAMP}.log”
# 开始备份
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 开始备份数据库 $DB_NAME” > “$LOG_FILE”
# 执行备份
kbackup -U system -d “$DB_NAME” -f “$BACKUP_FILE” >> “$LOG_FILE” 2>&1
# 检查备份结果
if [ $? -eq 0 ]; then
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 备份成功: $BACKUP_FILE” >> “$LOG_FILE”
# 检查备份文件大小
BACKUP_SIZE=$(du -h “$BACKUP_FILE” | awk ‘{print $1}’)
echo “备份文件大小: $BACKUP_SIZE” >> “$LOG_FILE”
# 清理过期备份
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 清理 $RETENTION_DAYS 天前的备份” >> “$LOG_FILE”
find “$BACKUP_DIR” -name “${DB_NAME}_*.backup” -mtime +$RETENTION_DAYS -delete >> “$LOG_FILE” 2>&1
# 发送成功邮件
mail -s “[Kingbase] 备份成功 – $DB_NAME” “$MAIL_TO” << EOF
备份成功完成!
数据库: $DB_NAME
备份文件: $BACKUP_FILE
备份大小: $BACKUP_SIZE
备份时间: $(date ‘+%Y-%m-%d %H:%M:%S’)
详细日志请查看: $LOG_FILE
EOF
else
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 备份失败” >> “$LOG_FILE”
# 发送失败邮件
mail -s “[Kingbase] 备份失败 – $DB_NAME” “$MAIL_TO” << EOF
备份失败!
数据库: $DB_NAME
失败时间: $(date ‘+%Y-%m-%d %H:%M:%S’)
详细日志请查看: $LOG_FILE
EOF
fi
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 备份操作完成” >> “$LOG_FILE”
$ bash auto_backup.sh
# 查看日志内容
$ cat /kingbase/log/backup/backup_20240115_010000.log
2024-01-15 01:00:00 – 开始备份数据库 fgedudb
kbackup: 开始备份数据库 fgedudb
kbackup: 备份完成,共备份 102400 个数据块
kbackup: 备份文件: /kingbase/backup/fgedudb_20240115_010000.backup
2024-01-15 01:05:30 – 备份成功: /kingbase/backup/fgedudb_20240115_010000.backup
备份文件大小: 1.2G
2024-01-15 01:05:31 – 清理 7 天前的备份
2024-01-15 01:05:32 – 备份操作完成
#!/bin/bash
# performance_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置参数
DB_NAME=”fgedudb”
MONITOR_DIR=”/kingbase/monitor”
INTERVAL=60 # 监控间隔(秒)
DURATION=3600 # 监控持续时间(秒)
# 创建监控目录
mkdir -p “$MONITOR_DIR”
# 监控开始时间
START_TIME=$(date +%s)
END_TIME=$((START_TIME + DURATION))
# 监控日志文件
LOG_FILE=”${MONITOR_DIR}/performance_$(date +%Y%m%d_%H%M%S).log”
# 开始监控
echo “开始性能监控,持续时间: $DURATION 秒” > “$LOG_FILE”
echo “监控间隔: $INTERVAL 秒” >> “$LOG_FILE”
echo “======================================” >> “$LOG_FILE”
# 监控循环
while [ $(date +%s) -lt $END_TIME ]; do
# 记录时间
CURRENT_TIME=$(date ‘+%Y-%m-%d %H:%M:%S’)
echo “\n[$CURRENT_TIME] 采集性能数据” >> “$LOG_FILE”
# 1. 系统负载
echo “1. 系统负载:” >> “$LOG_FILE”
uptime >> “$LOG_FILE”
# 2. CPU使用情况
echo “2. CPU使用情况:” >> “$LOG_FILE”
top -b -n 1 | grep ‘Cpu(s)’ >> “$LOG_FILE”
# 3. 内存使用情况
echo “3. 内存使用情况:” >> “$LOG_FILE”
free -m >> “$LOG_FILE”
# 4. 磁盘I/O情况
echo “4. 磁盘I/O情况:” >> “$LOG_FILE”
iostat -x >> “$LOG_FILE”
# 5. 数据库连接数
echo “5. 数据库连接数:” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_stat_activity” >> “$LOG_FILE”
# 6. 数据库缓存命中率
echo “6. 数据库缓存命中率:” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c ”
SELECT
round((sum(blks_hit) * 100.0) / (sum(blks_hit) + sum(blks_read)), 2) as cache_hit_rate
FROM sys_stat_database;
” >> “$LOG_FILE”
# 7. 慢查询数量
echo “7. 慢查询数量:” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_stat_statements WHERE mean_exec_time > 1000” >> “$LOG_FILE”
# 8. 锁等待数量
echo “8. 锁等待数量:” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_locks WHERE granted = false” >> “$LOG_FILE”
# 等待下一次采集
sleep $INTERVAL
done
echo “\n======================================” >> “$LOG_FILE”
echo “性能监控完成,详细数据请查看: $LOG_FILE” >> “$LOG_FILE”
# 生成性能报告
echo “生成性能报告…”
python3 << 'EOF'
import re
import sys
log_file = sys.argv[1]
data = {}
with open(log_file, ‘r’) as f:
lines = f.readlines()
current_time = None
for line in lines:
time_match = re.match(r’\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\]’, line)
if time_match:
current_time = time_match.group(1)
data[current_time] = {}
elif current_time:
if ‘系统负载:’ in line:
pass
elif ‘Cpu(s)’ in line:
cpu_line = line.strip()
data[current_time][‘cpu’] = cpu_line
elif ‘Mem:’ in line:
mem_line = line.strip()
data[current_time][‘memory’] = mem_line
elif ‘数据库连接数:’ in line:
pass
elif ‘cache_hit_rate’ in line:
pass
# 简单分析
print(“性能监控报告”)
print(“==================”)
print(f”监控文件: {log_file}”)
print(f”监控时间点数量: {len(data)}”)
print(“\n系统负载趋势:”)
for time, values in data.items():
print(f”{time}: {values.get(‘cpu’, ‘N/A’)}”)
EOF
“$LOG_FILE”
$ bash performance_monitor.sh
开始性能监控,持续时间: 3600 秒
监控间隔: 60 秒
生成性能报告…
性能监控报告
==================
监控文件: /kingbase/monitor/performance_20240115_100000.log
监控时间点数量: 60
系统负载趋势:
2024-01-15 10:00:00: Cpu(s): 15.2%us, 3.5%sy, 0.0%ni, 80.3%id, 1.0%wa, 0.0%hi, 0.0%si, 0.0%st
2024-01-15 10:01:00: Cpu(s): 18.5%us, 4.2%sy, 0.0%ni, 76.3%id, 1.0%wa, 0.0%hi, 0.0%si, 0.0%st
2024-01-15 10:02:00: Cpu(s): 22.1%us, 5.3%sy, 0.0%ni, 71.6%id, 1.0%wa, 0.0%hi, 0.0%si, 0.0%st
…
- 避免硬编码密码和敏感信息
- 使用环境变量或配置文件存储敏感信息
- 设置脚本执行权限为700(仅所有者可执行)
- 验证输入参数,防止注入攻击,更多学习教程公众号风哥教程itpux_com
- 使用非特权用户执行脚本
- 定期更新脚本,修复安全漏洞
2.3.2 敏感信息处理
敏感信息处理示例:
# 不推荐:硬编码密码
# PASSWORD=”mysecretpassword”
# 推荐:使用环境变量
export KINGBASE_PASSWORD=”mysecretpassword”
ksql -U system -d fgedudb -c “SELECT 1”
# 推荐:使用配置文件(权限600)
# config.conf
# [database]
# user=system
# password=mysecretpassword
# 读取配置文件
source /path/to/config.conf
ksql -U “$DB_USER” -d “$DB_NAME” -c “SELECT 1”
Part03-生产环境项目实施方案
3.1 常用运维脚本开发
3.1.1 数据库连接脚本
#!/bin/bash
# db_connect.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 数据库连接函数
function db_connect() {
local db_name=$1
local sql=$2
ksql -U system -d “$db_name” -t -c “$sql”
}
# 测试连接
function test_connection() {
local db_name=$1
result=$(db_connect “$db_name” “SELECT 1”)
if [ “$result” = “1” ]; then
echo “数据库连接成功”
return 0
else
echo “数据库连接失败”
return 1
fi
}
# 示例使用
if test_connection “fgedudb”; then
echo “执行SQL查询…”
db_connect “fgedudb” “SELECT count(*) FROM fgedu.users”
fi
3.1.2 备份脚本
#!/bin/bash
# backup_database.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置参数
DB_NAME=”fgedudb”
BACKUP_DIR=”/kingbase/backup”
TIMESTAMP=$(date +”%Y%m%d_%H%M%S”)
BACKUP_FILE=”${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.backup”
# 创建备份目录
mkdir -p “$BACKUP_DIR”
# 执行备份
echo “开始备份数据库 $DB_NAME…”
kbackup -U system -d “$DB_NAME” -f “$BACKUP_FILE”
# 检查备份结果
if [ $? -eq 0 ]; then
echo “备份成功:$BACKUP_FILE”
# 清理过期备份(保留7天)
find “$BACKUP_DIR” -name “${DB_NAME}_*.backup” -mtime +7 -delete
echo “已清理7天前的备份文件”
else
echo “备份失败”
exit 1
fi
# 记录备份日志
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 备份 $DB_NAME 到 $BACKUP_FILE” >> “${BACKUP_DIR}/backup.log”
3.1.3 健康检查脚本
#!/bin/bash
# health_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置参数
DB_NAME=”fgedudb”
CHECK_LOG=”/kingbase/log/health_check.log”
# 创建日志目录
mkdir -p “$(dirname “$CHECK_LOG”)”
# 开始检查
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 开始健康检查” >> “$CHECK_LOG”
# 1. 检查数据库连接
echo “检查数据库连接…”
result=$(ksql -U system -d “$DB_NAME” -t -c “SELECT 1”)
if [ “$result” = “1” ]; then
echo “数据库连接正常” >> “$CHECK_LOG”
else
echo “数据库连接失败” >> “$CHECK_LOG”
echo “数据库连接失败” >&2
fi
# 2. 检查表空间使用情况
echo “检查表空间使用情况…”
ksql -U system -d “$DB_NAME” -t -c ”
SELECT
spcname as tablespace,
round((pg_total_relation_size(spcname::regnamespace) / 1024 / 1024), 2) as used_mb,
round((pg_tablespace_size(spcname) / 1024 / 1024), 2) as total_mb,学习交流加群风哥微信: itpux-com
round((pg_total_relation_size(spcname::regnamespace) * 100 / pg_tablespace_size(spcname)), 2) as usage_percent
FROM pg_tablespace
WHERE spcname NOT LIKE ‘pg_%’;
” >> “$CHECK_LOG”
# 3. 检查连接数
echo “检查连接数…”
connections=$(ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_stat_activity”)
max_connections=$(ksql -U system -d “$DB_NAME” -t -c “SHOW max_connections”)
echo “当前连接数: $connections, 最大连接数: $max_connections” >> “$CHECK_LOG”
# 4. 检查慢查询
echo “检查慢查询…”
slow_queries=$(ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_stat_statements WHERE mean_exec_time > 1000”)
echo “慢查询数量: $slow_queries” >> “$CHECK_LOG”
# 5. 检查锁情况
echo “检查锁情况…”
locks=$(ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_locks WHERE granted = false”)
echo “等待锁数量: $locks” >> “$CHECK_LOG”
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 健康检查完成” >> “$CHECK_LOG”
echo “健康检查完成,详细日志请查看: $CHECK_LOG”
3.2 自动化工具集成
3.2.1 Ansible集成
# Ansible playbook示例
# kingbase_backup.yml
—
– hosts: kingbase_servers
become: yes
vars:
db_name: fgedudb
backup_dir: /kingbase/backup
tasks:
– name: 创建备份目录
file:
path: “{{ backup_dir }}”
state: directory
owner: kingbase
group: kingbase
mode: ‘0755’
– name: 执行数据库备份
shell: |
kbackup -U system -d {{ db_name }} -f {{ backup_dir }}/{{ db_name }}_{{ ansible_date_time.date }}.backup
become_user: kingbase
register: backup_result
– name: 检查备份结果
debug:
msg: “备份成功: {{ backup_result.stdout }}”
when: backup_result.rc == 0
– name: 清理过期备份
shell: |
find {{ backup_dir }} -name “{{ db_name }}_*.backup” -mtime +7 -delete
become_user: kingbase
– name: 记录备份日志
lineinfile:
path: “{{ backup_dir }}/backup.log”
line: “{{ ansible_date_time.iso8601 }} – 备份 {{ db_name }} 完成”
create: yes
owner: kingbase
group: kingbase
mode: ‘0644’
3.2.2 Jenkins集成
# Jenkins Pipeline示例
# Jenkinsfile
pipeline {
agent any
parameters {
string(name: ‘DB_NAME’, defaultValue: ‘fgedudb’, description: ‘数据库名称’)
string(name: ‘BACKUP_DIR’, defaultValue: ‘/kingbase/backup’, description: ‘备份目录’)
}
stages {
stage(‘准备环境’) {
steps {
sh ‘mkdir -p ${BACKUP_DIR}’
sh ‘chown kingbase:kingbase ${BACKUP_DIR}’
}
}
stage(‘执行备份’) {
steps {
sh ”’
su – kingbase -c “kbackup -U system -d ${DB_NAME} -f ${BACKUP_DIR}/${DB_NAME}_$(date +%Y%m%d_%H%M%S).backup”
”’
}
}
stage(‘验证备份’) {
steps {
sh ”’
ls -la ${BACKUP_DIR}/ | grep ${DB_NAME}
”’
}
}
stage(‘清理过期备份’) {
steps {
sh ”’
find ${BACKUP_DIR} -name “${DB_NAME}_*.backup” -mtime +7 -delete
”’
}
}
}
post {
success {
echo ‘备份成功’
mail to: ‘admin@fgedu.net.cn’,
subject: ‘Kingbase数据库备份成功’,
body: ‘数据库备份已成功完成’
}
failure {
echo ‘备份失败’
mail to: ‘admin@fgedu.net.cn’,
subject: ‘Kingbase数据库备份失败’,
body: ‘数据库备份失败,请检查’
}
}
}
3.3 脚本部署与调度
3.3.1 Crontab调度
# Crontab配置示例
# 编辑crontab
$ crontab -e
# 每天凌晨1点执行全量备份
0 1 * * * /kingbase/scripts/backup_database.sh full
# 每小时执行增量备份
0 * * * * /kingbase/scripts/backup_database.sh incremental
# 每天凌晨2点执行健康检查
0 2 * * * /kingbase/scripts/health_check.sh
# 每周日凌晨3点执行数据库优化
0 3 * * 0 /kingbase/scripts/optimize_database.sh
# 每月1日凌晨4点执行日志清理
0 4 1 * * /kingbase/scripts/cleanup_logs.sh
3.3.2 脚本部署规范
脚本部署目录结构:
/kingbase/
├── scripts/ # 脚本目录
│ ├── backup/ # 备份相关脚本
│ ├── monitor/ # 监控相关脚本
│ ├── maintenance/ # 维护相关脚本
│ ├── utils/ # 工具函数脚本
│ └── config/ # 配置文件
├── log/ # 日志目录
│ ├── backup/ # 备份日志
│ ├── monitor/ # 监控日志
│ └── maintenance/ # 维护日志
└── backup/ # 备份文件目录
部署步骤:
1. 创建目录结构
2. 上传脚本文件
3. 设置执行权限
4. 配置调度任务
5. 测试脚本执行
6. 监控执行结果
Part04-生产案例与实战讲解
4.1 日常巡检脚本
4.1.1 综合巡检脚本
#!/bin/bash
# daily_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置参数
DB_NAME=”fgedudb”
CHECK_DIR=”/kingbase/check”
LOG_FILE=”${CHECK_DIR}/daily_check_$(date +%Y%m%d).log”
# 创建检查目录
mkdir -p “$CHECK_DIR”
# 开始检查
echo “======================================” > “$LOG_FILE”
echo “金仓数据库日常巡检报告” >> “$LOG_FILE”
echo “检查时间: $(date ‘+%Y-%m-%d %H:%M:%S’)” >> “$LOG_FILE”
echo “======================================” >> “$LOG_FILE”
# 1. 系统信息
echo “\n1. 系统信息” >> “$LOG_FILE”
echo “主机名: $(hostname)” >> “$LOG_FILE”
echo “操作系统: $(cat /etc/redhat-release)” >> “$LOG_FILE”
echo “内核版本: $(uname -r)” >> “$LOG_FILE”
echo “CPU使用率: $(top -b -n 1 | grep ‘Cpu(s)’ | awk ‘{print $2 + $4}’)%” >> “$LOG_FILE”
echo “内存使用率: $(free -m | awk ‘/Mem/{print $3/$2*100}’)%” >> “$LOG_FILE”
echo “磁盘使用率: $(df -h | grep ‘/kingbase’ | awk ‘{print $5}’)” >> “$LOG_FILE”
# 2. 数据库信息
echo “\n2. 数据库信息” >> “$LOG_FILE”
echo “数据库版本: $(ksql -U system -d “$DB_NAME” -t -c “SELECT version()”)” >> “$LOG_FILE”
echo “数据库状态: $(ksql -U system -d “$DB_NAME” -t -c “SELECT pg_is_in_recovery()”)” >> “$LOG_FILE”
echo “连接数: $(ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_stat_activity”)” >> “$LOG_FILE”
# 3. 表空间使用情况
echo “\n3. 表空间使用情况” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c ”
SELECT
spcname as tablespace,
round((pg_total_relation_size(spcname::regnamespace) / 1024 / 1024), 2) as used_mb,
round((pg_tablespace_size(spcname) / 1024 / 1024), 2) as total_mb,
round((pg_total_relation_size(spcname::regnamespace) * 100 / pg_tablespace_size(spcname)), 2) as usage_percent
FROM pg_tablespace
WHERE spcname NOT LIKE ‘pg_%’;
” >> “$LOG_FILE”
# 4. 慢查询统计
echo “\n4. 慢查询统计” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c ”
SELECT
query,
round(mean_exec_time, 2) as avg_time_ms,
calls,
round(total_exec_time, 2) as total_time_ms
FROM sys_stat_statements
WHERE mean_exec_time > 1000
ORDER BY mean_exec_time DESC
LIMIT 5;
” >> “$LOG_FILE”
# 5. 锁等待情况
echo “\n5. 锁等待情况” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c ”
SELECT
blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_query,
blocking_activity.query AS blocking_query
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.GRANTED;
” >> “$LOG_FILE”
# 6. 备份状态
echo “\n6. 备份状态” >> “$LOG_FILE”
latest_backup=$(ls -lt /kingbase/backup/${DB_NAME}_*.backup 2>/dev/null | head -1 | awk ‘{print $9}’)
if [ -n “$latest_backup” ]; then
backup_time=$(stat -c %y “$latest_backup” | cut -d’ ‘ -f1,2)
backup_size=$(du -h “$latest_backup” | awk ‘{print $1}’)
echo “最新备份: $latest_backup” >> “$LOG_FILE”
echo “备份时间: $backup_time” >> “$LOG_FILE”
echo “备份大小: $backup_size” >> “$LOG_FILE”
else
echo “未找到备份文件” >> “$LOG_FILE”
fi
# 7. 结论
echo “\n7. 巡检结论” >> “$LOG_FILE”
echo “======================================” >> “$LOG_FILE”
echo “巡检完成,详细信息请查看日志文件: $LOG_FILE” >> “$LOG_FILE”
# 发送邮件
if [ -f “$LOG_FILE” ]; then
mail -s “[Kingbase] 日常巡检报告 $(date +%Y%m%d)” admin@fgedu.net.cn < "$LOG_FILE"
echo “巡检报告已发送到 admin@fgedu.net.cn”
fi
4.1.2 执行结果
$ bash daily_check.sh
巡检报告已发送到 admin@fgedu.net.cn
# 查看日志内容
$ cat /kingbase/check/daily_check_20240115.log
======================================
金仓数据库日常巡检报告
检查时间: 2024-01-15 10:00:00
======================================
1. 系统信息
主机名: fgedu.net.cn
操作系统: Oracle Linux Server release 9.3
内核版本: 5.14.0-284.30.1.el9_2.x86_64
CPU使用率: 15.2%
内存使用率: 45.3%
磁盘使用率: 65%
2. 数据库信息
数据库版本: KingbaseES V8R6C7
数据库状态: f
连接数: 120
3. 表空间使用情况
tablespace | used_mb | total_mb | usage_percent
———–+———+———-+—————
userspace | 1250.5 | 2048.0 | 61.06
indexspace | 850.3 | 1024.0 | 83.04
4. 慢查询统计
query | avg_time_ms | calls | total_time_ms
——+————-+——-+—————
SELECT * FROM fgedu.users WHERE age > 30 | 2500.5 | 10 | 25005.0
SELECT * FROM fgedu.orders WHERE status = ‘pending’ | 1800.3 | 25 | 45007.5
5. 锁等待情况
(无锁等待)
6. 备份状态
最新备份: /kingbase/backup/fgedudb_20240115_010000.backup
备份时间: 2024-01-15 01:00:02
备份大小: 1.2G
7. 巡检结论
======================================
巡检完成,详细信息请查看日志文件: /kingbase/check/daily_check_20240115.log
4.2 备份自动化脚本
4.2.1 备份脚本
#!/bin/bash
# auto_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置参数
DB_NAME=”fgedudb”
BACKUP_DIR=”/kingbase/backup”
LOG_DIR=”/kingbase/log/backup”
RETENTION_DAYS=7
MAIL_TO=”admin@fgedu.net.cn”
# 创建目录
mkdir -p “$BACKUP_DIR”
mkdir -p “$LOG_DIR”
# 生成备份文件名
TIMESTAMP=$(date +”%Y%m%d_%H%M%S”)
BACKUP_FILE=”${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.backup”
LOG_FILE=”${LOG_DIR}/backup_${TIMESTAMP}.log”
# 开始备份
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 开始备份数据库 $DB_NAME” > “$LOG_FILE”
# 执行备份
kbackup -U system -d “$DB_NAME” -f “$BACKUP_FILE” >> “$LOG_FILE” 2>&1
# 检查备份结果
if [ $? -eq 0 ]; then
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 备份成功: $BACKUP_FILE” >> “$LOG_FILE”
# 检查备份文件大小
BACKUP_SIZE=$(du -h “$BACKUP_FILE” | awk ‘{print $1}’)
echo “备份文件大小: $BACKUP_SIZE” >> “$LOG_FILE”
# 清理过期备份
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 清理 $RETENTION_DAYS 天前的备份” >> “$LOG_FILE”
find “$BACKUP_DIR” -name “${DB_NAME}_*.backup” -mtime +$RETENTION_DAYS -delete >> “$LOG_FILE” 2>&1
# 发送成功邮件
mail -s “[Kingbase] 备份成功 – $DB_NAME” “$MAIL_TO” << EOF
备份成功完成!
数据库: $DB_NAME
备份文件: $BACKUP_FILE
备份大小: $BACKUP_SIZE
备份时间: $(date ‘+%Y-%m-%d %H:%M:%S’)
详细日志请查看: $LOG_FILE
EOF
else
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 备份失败” >> “$LOG_FILE”
# 发送失败邮件
mail -s “[Kingbase] 备份失败 – $DB_NAME” “$MAIL_TO” << EOF
备份失败!
数据库: $DB_NAME
失败时间: $(date ‘+%Y-%m-%d %H:%M:%S’)
详细日志请查看: $LOG_FILE
EOF
fi
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 备份操作完成” >> “$LOG_FILE”
4.2.2 执行结果
$ bash auto_backup.sh
# 查看日志内容
$ cat /kingbase/log/backup/backup_20240115_010000.log
2024-01-15 01:00:00 – 开始备份数据库 fgedudb
kbackup: 开始备份数据库 fgedudb
kbackup: 备份完成,共备份 102400 个数据块
kbackup: 备份文件: /kingbase/backup/fgedudb_20240115_010000.backup
2024-01-15 01:05:30 – 备份成功: /kingbase/backup/fgedudb_20240115_010000.backup
备份文件大小: 1.2G
2024-01-15 01:05:31 – 清理 7 天前的备份
2024-01-15 01:05:32 – 备份操作完成
4.3 性能监控脚本
4.3.1 性能监控脚本
#!/bin/bash
# performance_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置参数
DB_NAME=”fgedudb”
MONITOR_DIR=”/kingbase/monitor”
INTERVAL=60 # 监控间隔(秒)
DURATION=3600 # 监控持续时间(秒)
# 创建监控目录
mkdir -p “$MONITOR_DIR”
# 监控开始时间
START_TIME=$(date +%s)
END_TIME=$((START_TIME + DURATION))
# 监控日志文件
LOG_FILE=”${MONITOR_DIR}/performance_$(date +%Y%m%d_%H%M%S).log”
# 开始监控
echo “开始性能监控,持续时间: $DURATION 秒” > “$LOG_FILE”
echo “监控间隔: $INTERVAL 秒” >> “$LOG_FILE”
echo “======================================” >> “$LOG_FILE”
# 监控循环
while [ $(date +%s) -lt $END_TIME ]; do
# 记录时间
CURRENT_TIME=$(date ‘+%Y-%m-%d %H:%M:%S’)
echo “\n[$CURRENT_TIME] 采集性能数据” >> “$LOG_FILE”
# 1. 系统负载
echo “1. 系统负载:” >> “$LOG_FILE”
uptime >> “$LOG_FILE”
# 2. CPU使用情况
echo “2. CPU使用情况:” >> “$LOG_FILE”
top -b -n 1 | grep ‘Cpu(s)’ >> “$LOG_FILE”
# 3. 内存使用情况
echo “3. 内存使用情况:” >> “$LOG_FILE”
free -m >> “$LOG_FILE”
# 4. 磁盘I/O情况
echo “4. 磁盘I/O情况:” >> “$LOG_FILE”
iostat -x >> “$LOG_FILE”
# 5. 数据库连接数
echo “5. 数据库连接数:” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_stat_activity” >> “$LOG_FILE”
# 6. 数据库缓存命中率
echo “6. 数据库缓存命中率:” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c ”
SELECT
round((sum(blks_hit) * 100.0) / (sum(blks_hit) + sum(blks_read)), 2) as cache_hit_rate
FROM sys_stat_database;
” >> “$LOG_FILE”
# 7. 慢查询数量
echo “7. 慢查询数量:” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_stat_statements WHERE mean_exec_time > 1000” >> “$LOG_FILE”
# 8. 锁等待数量
echo “8. 锁等待数量:” >> “$LOG_FILE”
ksql -U system -d “$DB_NAME” -t -c “SELECT count(*) FROM sys_locks WHERE granted = false” >> “$LOG_FILE”
# 等待下一次采集
sleep $INTERVAL
done
echo “\n======================================” >> “$LOG_FILE”
echo “性能监控完成,详细数据请查看: $LOG_FILE” >> “$LOG_FILE”
# 生成性能报告
echo “生成性能报告…”
python3 << 'EOF'
import re
import sys
log_file = sys.argv[1]
data = {}
with open(log_file, ‘r’) as f:
lines = f.readlines()
current_time = None
for line in lines:
time_match = re.match(r’\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\]’, line)
if time_match:
current_time = time_match.group(1)
data[current_time] = {}
elif current_time:
if ‘系统负载:’ in line:
pass
elif ‘Cpu(s)’ in line:
cpu_line = line.strip()
data[current_time][‘cpu’] = cpu_line
elif ‘Mem:’ in line:
mem_line = line.strip()
data[current_time][‘memory’] = mem_line
elif ‘数据库连接数:’ in line:
pass
elif ‘cache_hit_rate’ in line:
pass
# 简单分析
print(“性能监控报告”)
print(“==================”)
print(f”监控文件: {log_file}”)
print(f”监控时间点数量: {len(data)}”)
print(“\n系统负载趋势:”)
for time, values in data.items():
print(f”{time}: {values.get(‘cpu’, ‘N/A’)}”)
EOF
“$LOG_FILE”
4.3.2 执行结果
$ bash performance_monitor.sh
开始性能监控,持续时间: 3600 秒
监控间隔: 60 秒
生成性能报告…
性能监控报告
==================
监控文件: /kingbase/monitor/performance_20240115_100000.log
监控时间点数量: 60
系统负载趋势:
2024-01-15 10:00:00: Cpu(s): 15.2%us, 3.5%sy, 0.0%ni, 80.3%id, 1.0%wa, 0.0%hi, 0.0%si, 0.0%st
2024-01-15 10:01:00: Cpu(s): 18.5%us, 4.2%sy, 0.0%ni, 76.3%id, 1.0%wa, 0.0%hi, 0.0%si, 0.0%st
2024-01-15 10:02:00: Cpu(s): 22.1%us, 5.3%sy, 0.0%ni, 71.6%id, 1.0%wa, 0.0%hi, 0.0%si, 0.0%st
…
Part05-风哥经验总结与分享
5.1 脚本开发最佳实践
5.1.1 脚本开发原则
- 可读性:代码清晰易读,便于维护
- 可维护性:模块化设计,易于扩展
- 可靠性:错误处理完善,运行稳定
- 安全性:保护敏感信息,防止安全漏洞
- 效率:执行高效,资源占用合理
- 可移植性:适应不同环境,易于部署,from DB视频:www.itpux.com
5.1.2 脚本测试策略
脚本测试策略:
# 问题:脚本执行权限不足
# 解决方案:
$ chmod +x script.sh
# 最佳实践:
# 脚本上传后立即设置执行权限
$ chmod 700 script.sh
# 检查权限
$ ls -la script.sh
-rwx—— 1 kingbase kingbase 1024 Jan 15 10:00 script.sh
# 问题:脚本依赖的环境变量未设置
# 解决方案:
# 在脚本中设置环境变量
export KINGBASE_HOME=/kingbase/app
export PATH=$PATH:$KINGBASE_HOME/bin
# 或者在crontab中设置
$ crontab -e
KINGBASE_HOME=/kingbase/app
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:$KINGBASE_HOME/bin
0 1 * * * /kingbase/scripts/backup.sh
# 问题:日志文件过大,占用磁盘空间
# 解决方案:
# 1. 日志轮转
$ logrotate -f /etc/logrotate.d/kingbase
# 2. 日志清理
$ find /kingbase/log -name “*.log” -mtime +30 -delete
# 3. 日志压缩
$ gzip /kingbase/log/*.log
# 4. 配置示例
# /etc/logrotate.d/kingbase
/kingbase/log/*.log {
daily
rotate 7
compress
missingok
notifempty
create 644 kingbase kingbase
}
自动化运维体系架构:
┌─────────────────────────────────────────────────────────────┐
│ 监控层 │
│ Prometheus/Grafana/Zabbix │
├─────────────────────────────────────────────────────────────┤
│ 调度层 │
│ Crontab/Airflow/Jenkins │
├─────────────────────────────────────────────────────────────┤
│ 执行层 │
│ Shell/Python脚本 │
├─────────────────────────────────────────────────────────────┤
│ 配置层 │
│ 配置文件/环境变量 │
├─────────────────────────────────────────────────────────────┤
│ 存储层 │
│ 日志/备份/配置存储 │
└─────────────────────────────────────────────────────────────┘
- 单元测试:测试单个函数或模块
- 集成测试:测试脚本与其他系统的交互
- 回归测试:确保修改不会破坏现有功能
- 性能测试:测试脚本执行效率
- 安全测试:检查脚本的安全性
5.2 常见问题与解决方案
5.2.1 脚本执行权限问题
# 问题:脚本执行权限不足
# 解决方案:
$ chmod +x script.sh
# 最佳实践:
# 脚本上传后立即设置执行权限
$ chmod 700 script.sh
# 检查权限
$ ls -la script.sh
-rwx—— 1 kingbase kingbase 1024 Jan 15 10:00 script.sh
5.2.2 环境变量问题
# 问题:脚本依赖的环境变量未设置
# 解决方案:
# 在脚本中设置环境变量
export KINGBASE_HOME=/kingbase/app
export PATH=$PATH:$KINGBASE_HOME/bin
# 或者在crontab中设置
$ crontab -e
KINGBASE_HOME=/kingbase/app
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:$KINGBASE_HOME/bin
0 1 * * * /kingbase/scripts/backup.sh
5.2.3 日志管理问题
# 问题:日志文件过大,占用磁盘空间
# 解决方案:
# 1. 日志轮转
$ logrotate -f /etc/logrotate.d/kingbase
# 2. 日志清理
$ find /kingbase/log -name “*.log” -mtime +30 -delete
# 3. 日志压缩
$ gzip /kingbase/log/*.log
# 4. 配置示例
# /etc/logrotate.d/kingbase
/kingbase/log/*.log {
daily
rotate 7
compress
missingok
notifempty
create 644 kingbase kingbase
}
5.3 自动化运维体系建设
5.3.1 自动化运维体系架构
自动化运维体系架构:
┌─────────────────────────────────────────────────────────────┐
│ 监控层 │
│ Prometheus/Grafana/Zabbix │
├─────────────────────────────────────────────────────────────┤
│ 调度层 │
│ Crontab/Airflow/Jenkins │
├─────────────────────────────────────────────────────────────┤
│ 执行层 │
│ Shell/Python脚本 │
├─────────────────────────────────────────────────────────────┤
│ 配置层 │
│ 配置文件/环境变量 │
├─────────────────────────────────────────────────────────────┤
│ 存储层 │
│ 日志/备份/配置存储 │
└─────────────────────────────────────────────────────────────┘
5.3.2 自动化运维最佳实践
- 标准化:建立标准化的运维流程和脚本
- 自动化:尽可能自动化所有重复任务
- 监控化:建立完善的监控体系
- 可视化:通过可视化工具展示运维数据
- 智能化:利用AI技术预测和分析问题
- 持续改进:不断优化自动化流程
风哥提示:自动化运维是提高数据库管理效率的关键,通过开发和部署自动化脚本,可以减少人工操作,降低错误率,提高系统稳定性。在实际运维中,应根据业务需求和系统特点,开发适合的自动化脚本,逐步构建完善的自动化运维体系。
通过本文档的学习,您应该掌握了金仓数据库自动化运维脚本的开发方法和最佳实践。在实际生产环境中,应根据具体需求开发适合的自动化脚本,提高运维效率和系统稳定性。
本文档风哥教程参考金仓官方文档运维管理、自动化工具等内容,结合实际生产经验编写,希望对您的工作有所帮助。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
