运维视角:在统信UOS服务器上部署达梦8数据库的自动化脚本与监控告警配置
企业级自动化:统信UOS服务器上达梦8数据库的运维实践
在国产化替代浪潮中,统信UOS操作系统与达梦8数据库的组合正成为越来越多企业的选择。但传统的手动部署方式在面对大规模生产环境时,往往显得力不从心——耗时耗力且难以保证一致性。本文将分享一套经过实战检验的自动化方案,从脚本编写到监控告警,帮助运维团队实现高效、可靠的数据库部署与管理。
1. 环境准备与自动化部署框架
在开始编写自动化脚本前,需要先搭建一个可重复、可靠的部署环境。与手动安装不同,自动化部署要求我们对每一个步骤都进行严格的异常处理和状态检查。
1.1 系统环境预检自动化
一个健壮的部署脚本应该能够在执行前自动检查系统环境是否满足要求。以下是一个检查系统资源的Shell函数示例:
check_system_resources() { local mem_needed=1000000 # 1GB in KB local disk_needed=1000000 # 1GB in KB local open_files_needed=65536 # 检查内存 local free_mem=$(grep MemAvailable /proc/meminfo | awk '{print $2}') if [ "$free_mem" -lt "$mem_needed" ]; then echo "错误:可用内存不足,需要至少1GB" return 1 fi # 检查文件描述符限制 local open_files=$(ulimit -n) if [ "$open_files" -lt "$open_files_needed" ]; then echo "警告:文件描述符限制($open_files)低于推荐值($open_files_needed)" # 自动尝试设置临时限制 ulimit -n $open_files_needed || { echo "无法设置文件描述符限制,可能需要root权限" return 1 } fi # 检查磁盘空间 local install_dir="/home/dmdba" local free_disk=$(df -k --output=avail "$install_dir" | tail -1) if [ "$free_disk" -lt "$disk_needed" ]; then echo "错误:安装目录磁盘空间不足" return 1 fi echo "系统资源检查通过" return 0 }提示:在实际生产环境中,建议将这些检查封装到Ansible的pre-task中,这样可以在playbook执行前就发现问题。
1.2 用户与权限管理自动化
数据库安装用户创建也需要自动化处理,以下是一个创建dmdba用户并设置必要权限的Ansible任务示例:
- name: 创建dinstall用户组 group: name: dinstall state: present - name: 创建dmdba用户 user: name: dmdba group: dinstall home: /home/dmdba shell: /bin/bash append: yes - name: 设置dmdba用户密码 shell: echo "dmdba:{{ dm_password }}" | chpasswd no_log: true # 避免密码泄露到日志 - name: 配置系统限制 lineinfile: path: /etc/security/limits.conf line: "{{ item }}" state: present with_items: - "* soft nofile 65536" - "* hard nofile 65536" - "* soft nproc 65536" - "* hard nproc 65536"2. 达梦8数据库自动化安装
2.1 安装包处理与校验
自动化安装首先要解决的是安装包的获取与验证问题。我们可以通过以下步骤实现:
- 下载验证:使用wget或curl下载安装包,并校验MD5/SHA256
- 挂载处理:自动挂载ISO镜像文件
- 权限设置:确保安装文件有正确的执行权限
#!/bin/bash DM_ISO_URL="http://example.com/dm8_20220304_x86_rh6_64_ent_8.1.2.114.iso" DM_ISO_SHA256="a1b2c3d4e5f6..." # 实际SHA256值 ISO_FILE="/tmp/dm8.iso" MOUNT_DIR="/media/cdrom" # 下载ISO文件 if [ ! -f "$ISO_FILE" ]; then echo "正在下载达梦8安装包..." wget -O "$ISO_FILE" "$DM_ISO_URL" || { echo "下载失败"; exit 1 } fi # 校验文件完整性 echo "正在校验安装包..." sha256sum -c <<<"$DM_ISO_SHA256 $ISO_FILE" || { echo "校验失败,文件可能已损坏"; exit 1 } # 准备挂载点 mkdir -p "$MOUNT_DIR" # 挂载ISO mount -o loop "$ISO_FILE" "$MOUNT_DIR" || { echo "挂载失败"; exit 1 } # 设置执行权限 DM_INSTALL_BIN="$MOUNT_DIR/DMInstall.bin" chmod 755 "$DM_INSTALL_BIN" || { echo "权限设置失败"; exit 1 }2.2 静默安装配置
达梦8支持静默安装模式,我们可以通过响应文件实现完全自动化的安装过程。创建一个安装配置文件dm_install.xml:
<?xml version="1.0"?> <DATABASE> <!-- 安装语言 --> <LANGUAGE>zh_CN</LANGUAGE> <!-- 安装类型:典型/完全/自定义 --> <INSTALL_TYPE>typical</INSTALL_TYPE> <!-- 安装目录 --> <INSTALL_PATH>/home/dmdba/dmdbms</INSTALL_PATH> <!-- 是否初始化数据库 --> <INIT_DB>true</INIT_DB> <!-- 数据库实例参数 --> <DB> <PORT>5236</PORT> <DB_NAME>DMDB</DB_NAME> <INSTANCE_NAME>DMSERVER</INSTANCE_NAME> <CHARSET>UTF-8</CHARSET> <CASE_SENSITIVE>Y</CASE_SENSITIVE> <PAGE_SIZE>8</PAGE_SIZE> <SYSDBA_PWD>Dameng123</SYSDBA_PWD> <SYSAUDITOR_PWD>Dameng123</SYSAUDITOR_PWD> <BUFFER_POOL_SIZE>500</BUFFER_POOL_SIZE> </DB> </DATABASE>然后使用以下命令执行静默安装:
su - dmdba -c "$MOUNT_DIR/DMInstall.bin -q $PWD/dm_install.xml"3. 数据库参数优化自动化
3.1 关键性能参数调优
达梦8数据库安装后,需要根据服务器配置调整关键参数。我们可以编写一个自动优化脚本:
#!/bin/bash DM_INI="/home/dmdba/dmdbms/data/DAMENG/dm.ini" # 备份原始配置文件 cp "$DM_INI" "${DM_INI}.bak_$(date +%Y%m%d)" # 根据内存大小自动计算参数值 total_mem=$(free -k | awk '/Mem:/ {print $2}') buffer_pool=$(($total_mem * 70 / 100 / 1024)) # 70%内存用作缓冲池(MB) sort_buffer=$(($total_mem * 5 / 100 / 1024)) # 5%内存用作排序区(MB) # 使用sed动态修改参数 sed -i "/^BUFFER.*/c\BUFFER = $buffer_pool" "$DM_INI" sed -i "/^SORT_BUF_SIZE.*/c\SORT_BUF_SIZE = $sort_buffer" "$DM_INI" sed -i "/^MAX_SESSIONS.*/c\MAX_SESSIONS = 1000" "$DM_INI" sed -i "/^CACHE_POOL_SIZE.*/c\CACHE_POOL_SIZE = 200" "$DM_INI" # 重启数据库使配置生效 systemctl restart DmServiceDMSERVER3.2 定期维护任务设置
数据库长期稳定运行需要定期维护,我们可以通过cron设置自动维护任务:
# 每天凌晨2点执行统计信息收集 0 2 * * * /home/dmdba/dmdbms/bin/disql SYSDBA/Dameng123@localhost:5236 -e "SP_REFRESH_SYS_STATS();" # 每周日凌晨3点执行全量备份 0 3 * * 0 /home/dmdba/dmdbms/bin/dmrman CTLSTMT="BACKUP DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' FULL TO BACKUP_FILE BACKUPSET '/home/dmdba/backup/full_$(date +\%Y\%m\%d)'" # 每月1日凌晨4点执行归档日志清理 0 4 1 * * /home/dmdba/dmdbms/bin/dmrman CTLSTMT="ARCHIVE LOG DELETE BEFORE '$(date -d '-1 month' +\%Y-\%m-\%d)'"4. 监控告警系统集成
4.1 Prometheus监控配置
达梦8提供了丰富的系统视图,我们可以通过Prometheus+Grafana实现可视化监控。首先配置Prometheus exporter:
# dm_exporter.yml global: scrape_interval: 15s scrape_configs: - job_name: 'dm8' static_configs: - targets: ['localhost:5236'] metrics_path: '/metrics' params: user: ['SYSDBA'] password: ['Dameng123']然后创建一个Grafana仪表板,监控以下关键指标:
| 指标名称 | 告警阈值 | 说明 |
|---|---|---|
| 活跃会话数 | > 80%最大连接数 | 可能遭遇连接池耗尽 |
| 缓冲区命中率 | < 90% | 内存不足或SQL效率低下 |
| 磁盘I/O等待时间 | > 50ms | 存储性能瓶颈 |
| CPU使用率 | > 80%持续5分钟 | 需要优化查询或扩展资源 |
| 锁等待时间 | > 1秒 | 事务冲突或锁资源不足 |
4.2 Zabbix监控模板
对于使用Zabbix的企业,可以创建达梦8专用监控模板。以下是一些关键监控项:
数据库可用性监控
#!/bin/bash /home/dmdba/dmdbms/bin/disql SYSDBA/Dameng123@localhost:5236 -e "SELECT 1 FROM DUAL;" >/dev/null 2>&1 && echo 1 || echo 0表空间使用率监控
SELECT TABLESPACE_NAME, ROUND(USED_SIZE/1024/1024,2) USED_MB, ROUND(TOTAL_SIZE/1024/1024,2) TOTAL_MB, ROUND(USED_PERCENT,2) USED_PERCENT FROM V$TABLESPACE WHERE USED_PERCENT > 80; # 超过80%使用率告警性能指标采集
-- 缓冲区命中率 SELECT ROUND((1-PHYSICAL_READS/(MEMORY_READS+PHYSICAL_READS))*100,2) BUFFER_HIT_RATIO FROM V$SYSSTAT WHERE NAME='BUFFER HIT RATIO'; -- 平均SQL执行时间 SELECT ROUND(AVG(ELAPSED_TIME)/1000,2) AVG_MS FROM V$SQL_STAT WHERE EXECUTIONS>0;
5. CI/CD流水线集成
5.1 Ansible Playbook完整示例
将达梦8部署集成到现有CI/CD流程中,可以使用以下Ansible playbook:
--- - name: 部署达梦8数据库 hosts: db_servers become: yes vars: dm_version: "8.1.2.114" dm_install_dir: "/home/dmdba/dmdbms" dm_data_dir: "{{ dm_install_dir }}/data/DAMENG" dm_port: 5236 sysdba_password: "Dameng123" tasks: - name: 安装依赖包 apt: name: "{{ item }}" state: present with_items: - libaio1 - libncurses5 - unixodbc - name: 创建安装用户 include_tasks: create_dm_user.yml - name: 下载达梦安装包 get_url: url: "http://mirrors.dameng.com/{{ dm_version }}/dm8_{{ dm_version }}_x86_rh6_64_ent.iso" dest: "/tmp/dm8.iso" checksum: "sha256:a1b2c3d4e5f6..." - name: 挂载ISO mount: path: /mnt/dm8 src: "/tmp/dm8.iso" fstype: iso9660 opts: loop,ro state: mounted - name: 准备静默安装文件 template: src: templates/dm_install.xml.j2 dest: "/home/dmdba/dm_install.xml" become_user: dmdba - name: 执行静默安装 command: "/mnt/dm8/DMInstall.bin -q /home/dmdba/dm_install.xml" become_user: dmdba args: creates: "{{ dm_install_dir }}/bin/dmserver" - name: 优化数据库参数 template: src: templates/dm_optimize.sql.j2 dest: "/home/dmdba/dm_optimize.sql" become_user: dmdba - name: 执行优化脚本 command: "{{ dm_install_dir }}/bin/disql SYSDBA/{{ sysdba_password }}@localhost:{{ dm_port }} /home/dmdba/dm_optimize.sql" become_user: dmdba - name: 注册系统服务 template: src: templates/DmServiceDMSERVER.service.j2 dest: /etc/systemd/system/DmServiceDMSERVER.service notify: reload systemd - name: 启动数据库服务 service: name: DmServiceDMSERVER state: started enabled: yes handlers: - name: reload systemd systemd: daemon_reload: yes5.2 数据库变更自动化
对于数据库schema变更,可以使用Flyway或Liquibase等工具实现版本控制。示例Flyway配置:
# flyway.conf flyway.url=jdbc:dm://localhost:5236 flyway.user=SYSDBA flyway.password=Dameng123 flyway.schemas=DMDB flyway.locations=filesystem:/opt/sql/migrations flyway.sqlMigrationPrefix=V flyway.sqlMigrationSeparator=__ flyway.sqlMigrationSuffix=.sql对应的SQL迁移文件示例:
-- V1__Initial_schema.sql CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- V2__Add_email_column.sql ALTER TABLE users ADD COLUMN email VARCHAR(100); -- V3__Create_indexes.sql CREATE INDEX idx_users_username ON users(username); CREATE INDEX idx_users_email ON users(email);6. 高可用与灾备方案
6.1 主从复制配置
达梦8支持多种高可用方案,以下是配置主从复制的自动化脚本:
#!/bin/bash # 主库配置 PRIMARY_IP="192.168.1.100" STANDBY_IP="192.168.1.101" REPL_USER="repl_user" REPL_PASS="Repl123456" ARCH_DEST="/home/dmdba/archivelog" # 主库设置 echo "配置主库..." /home/dmdba/dmdbms/bin/disql SYSDBA/Dameng123@localhost:5236 <<EOF -- 启用归档 ALTER DATABASE MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE ADD ARCHIVELOG 'DEST=${ARCH_DEST},TYPE=LOCAL,FILE_SIZE=1024,SPACE_LIMIT=10240'; ALTER DATABASE OPEN; -- 创建复制用户 CREATE USER ${REPL_USER} IDENTIFIED BY "${REPL_PASS}"; GRANT SELECT ON V\$DATABASE TO ${REPL_USER}; GRANT SELECT ON V\$ARCHIVED_LOG TO ${REPL_USER}; GRANT SELECT ON V\$LOG_HISTORY TO ${REPL_USER}; GRANT SELECT ON V\$LOGFILE TO ${REPL_USER}; EOF # 生成备库初始化参数文件 cat > /tmp/standby.ini <<EOF [STANDBY_CONFIG] PRIMARY_IP=${PRIMARY_IP} PRIMARY_PORT=5236 STANDBY_IP=${STANDBY_IP} STANDBY_PORT=5236 REPL_USER=${REPL_USER} REPL_PASS=${REPL_PASS} ARCH_DEST=${ARCH_DEST} EOF6.2 自动备份策略
结合达梦8的dmrman工具,我们可以实现多级备份策略:
#!/bin/bash # 备份配置 BACKUP_DIR="/home/dmdba/backup" LOG_DIR="/home/dmdba/logs" DATA_DIR="/home/dmdba/dmdbms/data/DAMENG" DATE=$(date +%Y%m%d) KEEP_DAYS=7 # 创建目录 mkdir -p ${BACKUP_DIR}/{full,incr,arch} ${LOG_DIR} # 全量备份(每周日执行) if [ $(date +%u) -eq 7 ]; then echo "$(date) 开始全量备份..." >> ${LOG_DIR}/backup.log /home/dmdba/dmdbms/bin/dmrman CTLSTMT="BACKUP DATABASE '${DATA_DIR}/dm.ini' FULL TO FULL_${DATE} BACKUPSET '${BACKUP_DIR}/full/FULL_${DATE}'" >> ${LOG_DIR}/backup.log 2>&1 # 清理过期备份 find ${BACKUP_DIR}/full -name "FULL_*" -mtime +${KEEP_DAYS} -exec rm -rf {} \; fi # 增量备份(每天执行) echo "$(date) 开始增量备份..." >> ${LOG_DIR}/backup.log /home/dmdba/dmdbms/bin/dmrman CTLSTMT="BACKUP DATABASE '${DATA_DIR}/dm.ini' INCREMENT WITH BACKUPDIR '${BACKUP_DIR}/full' TO INCR_${DATE} BACKUPSET '${BACKUP_DIR}/incr/INCR_${DATE}'" >> ${LOG_DIR}/backup.log 2>&1 # 清理过期增量备份 find ${BACKUP_DIR}/incr -name "INCR_*" -mtime +${KEEP_DAYS} -exec rm -rf {} \; # 归档日志备份(每小时执行) echo "$(date) 开始归档日志备份..." >> ${LOG_DIR}/backup.log /home/dmdba/dmdbms/bin/dmrman CTLSTMT="BACKUP ARCHIVELOG ALL TO ARCH_$(date +%Y%m%d%H) BACKUPSET '${BACKUP_DIR}/arch/ARCH_$(date +%Y%m%d%H)'" >> ${LOG_DIR}/backup.log 2>&1 # 清理过期归档备份 find ${BACKUP_DIR}/arch -name "ARCH_*" -mtime +${KEEP_DAYS} -exec rm -rf {} \;