【问题标题】:vsql error handling (No such file or directory)vsql 错误处理(没有这样的文件或目录)
【发布时间】:2013-09-11 02:30:35
【问题描述】:

我正在使用 shell 脚本将查询结果上传到我的数据库。在脚本中,首先我将查询结果保存到 csv 文件中,然后将文件上传到另一个数据库中。在每一步之后,我都会向用户发送一封通知电子邮件。我面临的问题是我无法进行正确的错误处理。例如,我使用类似下面的命令来生成 csv 文件:

/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -o "/data/test.csv" -c "select count(*), month from table1 group by month" 

如果目录“data”不存在,则在Unix中的退出状态仍然返回0(即使发生错误也操作成功),因为屏幕上显示了查询结果。我该如何处理这样的错误?我应该在脚本中使用哪种 IF 语句来捕获它?

非常感谢!

【问题讨论】:

    标签: bash shell vertica vsql


    【解决方案1】:

    这是一个棘手的问题。

    Vertica vsql 有一个变量 ON_ERROR_STOP,如果设置该变量将停止脚本并返回错误代码 3。

    \set ON_ERROR_STOP on
    

    也就是说,使用 -o 选项似乎不会触发此行为,因为错误不在 SQL 端。

    我的建议是作弊,重定向输出,而不是要求 Vertica 这样做:

    /apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -A -F, -c "select count(*), month from table1 group by month" > /data/test.csv
    

    注意 -F 和 -A 选项以创建类似 csv 的输出。您可能还希望 -q(安静)只有查询输出,没有消息。

    那么如果目标文件不存在,你确实有一个 bash 非空退出状态:

    [me@server ~]$/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -A -F, -c "select count(*), month from table1 group by month" > /data/test.csv
    -bash: /data/test.csv: No such file or directory
    [me@server ~]$ echo $?
    1
    

    从那时起,检查返回码就很容易了,同时捕获 bash 和 Vertica

    # your vsql command....
    STATUS=$?
    if [[ $STATUS -gt 0 ]]
    then
        echo oops
        exit
    fi
    

    如果您有很多这样的查询和输出文件,您甚至可能会创建一个以查询和输出文件为参数的函数。

    【讨论】:

      【解决方案2】:

      使用mkdir -p /data 确保该目录在您的查询之前存在。

      【讨论】:

      • 是的,但我的问题更多是关于如何正确处理错误以及 vsql 是否将任何消息传递给 Unix。可能还有其他一些错误,我想知道如何管理它们。
      • 您可以根据vsql的输出来管理错误。使用output=$(your command) 捕获vhost 的输出。
      • 那么,$output 将是查询结果。它对错误处理有何帮助?
      【解决方案3】:

      我有类似的问题,并找到了一种简单的方法来解决它。我注意到,当查询失败时,结果 csv 文件大小实际上变为 0。您可以检查结果 csv 文件大小是否为 0。

      vsql -c "你的查询命令" -o "/location/of/results" 如果 [[ -s "/location/of/results" ]];然后 some_other_command 菲

      【讨论】:

        【解决方案4】:

        此外,如果您收到此错误:ERROR 5286: Unsupported SET option ON_ERROR_STOP

        您可以使用vsql 选项:vsql -v ON_ERROR_STOP=on

        【讨论】:

        • 这对你有用吗?我已经设置了这个选项,但它仍然没有发现错误
        猜你喜欢
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        • 2013-08-08
        • 2013-11-04
        • 2012-02-18
        • 2012-10-21
        • 2011-03-22
        • 2015-12-29
        相关资源
        最近更新 更多