温馨提示×

Ubuntu Informix如何使用脚本

小樊
32
2025-12-28 20:18:23
栏目: 智能运维

Ubuntu 上使用 Informix 的脚本化操作指南

一 环境准备与变量配置

  • 创建专用用户与目录
    • 执行:sudo groupadd informix && sudo useradd -g informix -d /opt/informix -m informix
    • 建议目录:/opt/informix,权限:chown -R informix:informix /opt/informix
  • 配置环境变量(写入 informix 用户的 ~/.bash_profile 或 ~/.profile)
    • 示例:
      export INFORMIXDIR=/opt/informix
      export INFORMIXSERVER=ifxserver
      export ONCONFIG=onconfig.ifxserver
      export INFORMIXSQLHOSTS=$INFORMIXDIR/etc/sqlhosts
      export PATH=$INFORMIXDIR/bin:$PATH
      export LD_LIBRARY_PATH=$INFORMIXDIR/lib:$LD_LIBRARY_PATH
      
    • 使生效:source ~/.bash_profile
  • 安装与初始化要点
    • 解压安装包并运行安装脚本(示例:./ids_install./installserver
    • 复制并编辑配置文件:cp $INFORMIXDIR/etc/onconfig.std $INFORMIXDIR/etc/onconfig.ifxserver
    • 配置 $INFORMIXDIR/etc/sqlhosts(示例:ifxserver onsoctcp your_host your_service
    • 初始化与启动:oninit -ivy,必要时 onmode -ky 后再启动
    • 网络端口:在 /etc/services 增加如 sqlexec 1526/tcp 的条目(端口以实际规划为准)

二 SQL 脚本与批量执行

  • 方式一 dbaccess 内联 Here Document(适合简单脚本)
    #!/usr/bin/env bash
    source /opt/informix/.bash_profile
    
    dbaccess testdb <<'EOF'
    CREATE TABLE IF NOT EXISTS t(id INT, name VARCHAR(50));
    INSERT INTO t VALUES (1, 'Alice'), (2, 'Bob');
    SELECT * FROM t;
    EOF
    
  • 方式二 外部 .sql 文件配合 dbaccess
    • 文件:init.sql
      CREATE TABLE IF NOT EXISTS t(id INT, name VARCHAR(50));
      INSERT INTO t VALUES (1, 'Alice'), (2, 'Bob');
      SELECT * FROM t;
      
    • 执行:dbaccess testdb init.sql
  • 方式三 使用 SQL 客户端工具(如 isql)执行脚本
    • 示例:isql -v your_database your_user your_password < init.sql
  • 数据导入示例(CSV 到表)
    dbaccess testdb <<'EOF'
    LOAD FROM '/path/employees.csv' DELIMITER ',' INSERT INTO employees;
    EOF
    
  • 说明
    • 生产脚本建议显式提交/回滚,必要时在脚本前后添加 BEGIN WORK; ... COMMIT;ROLLBACK;
    • 长事务与锁等待需结合业务控制,避免脚本阻塞线上业务

三 Shell 运维脚本示例

  • 启停脚本 start_stop.sh
    #!/usr/bin/env bash
    source /opt/informix/.bash_profile
    
    case "$1" in
      start)
        oninit -v
        ;;
      stop)
        onmode -ky
        ;;
      status)
        onstat -
        ;;
      *)
        echo "Usage: $0 {start|stop|status}"
        exit 1
        ;;
    esac
    
  • 监控脚本 monitor.sh(每小时记录关键指标)
    #!/usr/bin/env bash
    source /opt/informix/.bash_profile
    LOG=/opt/informix/log/monitor_$(date +%F).log
    
    {
      echo "=== $(date) ==="
      onstat -g seg
      onstat -g sql
      onstat -l
    } >> "$LOG" 2>&1
    
  • 定时任务
    • 赋权:chmod +x monitor.sh
    • 加入计划任务:crontab -e,示例(每小时执行):0 * * * * /opt/informix/monitor.sh
  • 备份脚本示例(使用 ontape 做逻辑备份)
    #!/usr/bin/env bash
    source /opt/informix/.bash_profile
    BACKUP_DIR=/opt/informix/backup
    mkdir -p "$BACKUP_DIR"
    ontape -s -L 0 -t STDIO > "$BACKUP_DIR/backup_$(date +%F).tar"
    
  • 提示
    • 备份策略与保留周期请结合 RPO/RTO 制定,定期做恢复演练验证可用性

四 存储过程脚本示例

  • 基本存储过程(SQL PL)
    CREATE PROCEDURE get_employee_name (
      IN  p_emp_id   INT,
      OUT p_emp_name VARCHAR(100)
    )
    RETURNING INT
    AS
    BEGIN
      SELECT name INTO p_emp_name FROM employees WHERE id = p_emp_id;
      IF SQLCODE = 0 THEN
        RETURN 0;
      ELSE
        RETURN -1;
      END IF;
    END PROCEDURE;
    
  • 调用示例
    CALL get_employee_name(101, ?);
    
  • 说明
    • 存储过程支持 IF/WHILE/FOR 等控制结构,可用 ALTER PROCEDURE ... COMPILE 重新编译
    • 调试时结合 SQLCODE/SQLSTATE 判断执行结果,必要时打印日志或返回值

五 常见问题与排查要点

  • 连接失败
    • 检查:INFORMIXSERVERsqlhosts 配置、网络与端口(如 1526/tcp)、实例是否运行(onstat -
  • 命令找不到或库加载失败
    • 检查:INFORMIXDIRPATHLD_LIBRARY_PATH 是否正确加载
  • 权限与目录
    • 数据目录与文件属主应为 informix:informix,权限建议 660/755
  • 导入导出
    • 确认表结构已存在、字段顺序与分隔符匹配,CSV 路径对数据库进程可读
  • 日志与诊断
    • 查看 online.logMSGPATH 指定文件,配合 onstat -g sesonstat -g sql 定位会话与 SQL 问题

0