【问题标题】:Optimize informix update优化informix更新
【发布时间】:2017-04-27 20:48:31
【问题描述】:

我有一个 bash 脚本,它将根据文件更新表。我拥有它的方式为文件中的每一行打开和关闭,并想了解如何打开、执行所有更新,然后关闭。几次更新就可以了,但如果它需要超过几百次更新,可能会对系统造成很大的负担。

    #!/bin/bash

    file=/export/home/dncs/tmp/file.csv
    dateFormat=$(date +"%m-%d-%y-%T")
    LOGFILE=/export/home/dncs/tmp/Log_${dateFormat}.log

    echo "${dateFormat} : Starting work" >> $LOGFILE 2>&1

    while IFS="," read mac loc; do
      if [[ "$mac" =~ ^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$ ]]; then


    dbaccess thedb <<EndOfUpdate >> $LOGFILE 2>&1
    UPDATE profile
    SET local_code= '$loc'
    WHERE mac_address = '$mac';
    EndOfUpdate
      else
    echo "Error: $mac not valid format" >> $LOGFILE 2>&1
    fi
    IIH -i $mac >> $LOGFILE 2>&1


    done <"$file"

源文件。

12:BF:20:04:BB:30,POR-4
12:BF:21:1C:02:B1,POR-10
12:BF:20:04:72:FD,POR-4
12:BF:20:01:5B:4F,POR-10
12:BF:20:C2:71:42,POR-7

【问题讨论】:

  • IIH -i $mac 在做什么?这是否需要与单个更新同步完成?所以序列需要'更新;为每个 MAC 地址运行 IIH`?
  • 不可以在完全更新后运行
  • 您能否提供 2 行好的数据和 1 行不好的数据用于说明目的?编辑问题以添加它——你可以在那里格式化它。
  • 没有坏处,只是翻阅 1000 人的列表比想要的要长。我知道逐行打开和关闭并不理想。
  • 所以“错误:$mac 无效格式”消息是用于装饰,从未使用过?它确实让生活更轻松。

标签: sql informix


【解决方案1】:

这或多或少是我会做的:

#!/bin/bash

fmt_date() { date +"%Y-%m-%d.%T"; }

file=/export/home/dncs/tmp/file.csv
dateFormat=$(fmt_date)
LOGFILE="/export/home/dncs/tmp/Log_${dateFormat}.log"

exec >> $LOGFILE 2>&1

echo "${dateFormat} : Starting work"

valid_mac='/^\(\([0-9a-fA-F]\{2\}:\)\{5\}[0-9a-fA-F]\{2\}\),\([^,]*\)$/'
update_stmt="UPDATE profile SET local_code = '\3' WHERE mac_address = '\1';"

sed -n -e "$valid_mac s//$update_stmt/p" "$file" |
dbaccess thedb -

sed -n -e "$valid_mac d; s/.*/Error: invalid format: &/p" "$file"

sed -n -e "$valid_mac s//IIH -i \1/p" "$file" | sh

echo "$(fmt_date) : Finished work"

我将日期格式更改为 ISO 8601 的变体;它更容易解析。如果您愿意,您可以坚持使用不符合 Y2K 标准的 US-ish 格式。 exec 行从这里开始安排标准输出和标准错误到日志文件。 sed 命令都使用相同的结构,并且都使用存储在变量中的相同模式匹配。这使得一致性更容易。第一个sed 脚本将数据转换为UPDATE 语句(馈送到dbaccess)。第二个脚本识别无效的 MAC 地址;它删除有效行并将无效行映射到错误消息中。第三个脚本忽略无效的 MAC 地址,但为每个有效的 MAC 地址生成一个IIH 命令。该脚本记录了一个结束时间——它将允许您评估处理需要多长时间。同样,通过创建和使用 fmt_date 函数来避免重复。

对此进行测试要谨慎。我有一个文件data,其中包含:

87:36:E6:5E:AC:41,loc-OYNK
B2:4D:65:70:32:26,loc-DQLO
ZD:D9:BA:34:FD:97,loc-PLBI
04:EB:71:0D:29:D0,loc-LMEE
DA:67:53:4B:EC:C4,loc-SFUU

我将dbaccess 替换为cat,将sh 替换为cat。我重定位到当前目录的日志文件——导致:

#!/bin/bash

fmt_date() { date +"%Y-%m-%d.%T"; }

#file=/export/home/dncs/tmp/file.csv
file=data
dateFormat=$(fmt_date)
#LOGFILE="/export/home/dncs/tmp/Log_${dateFormat}.log"
LOGFILE="Log-${dateFormat}.log"

exec >> $LOGFILE 2>&1

echo "${dateFormat} : Starting work"

valid_mac='/^\(\([0-9a-fA-F]\{2\}:\)\{5\}[0-9a-fA-F]\{2\}\),\([^,]*\)$/'
update_stmt="UPDATE profile SET local_code = '\3' WHERE mac_address = '\1';"

sed -n -e "$valid_mac s//$update_stmt/p" "$file" |
cat
#dbaccess thedb -

sed -n -e "$valid_mac d; s/.*/Error: invalid format: &/p" "$file"

#sed -n -e "$valid_mac s//IIH -i \1/p" "$file" | sh
sed -n -e "$valid_mac s//IIH -i \1/p" "$file" | cat

echo "$(fmt_date) : Finished work"

我运行后,日志文件包含:

2017-04-27.14:58:20 : Starting work
UPDATE profile SET local_code = 'loc-OYNK' WHERE mac_address = '87:36:E6:5E:AC:41';
UPDATE profile SET local_code = 'loc-DQLO' WHERE mac_address = 'B2:4D:65:70:32:26';
UPDATE profile SET local_code = 'loc-LMEE' WHERE mac_address = '04:EB:71:0D:29:D0';
UPDATE profile SET local_code = 'loc-SFUU' WHERE mac_address = 'DA:67:53:4B:EC:C4';
Error: invalid format: ZD:D9:BA:34:FD:97,loc-PLBI
IIH -i 87:36:E6:5E:AC:41
IIH -i B2:4D:65:70:32:26
IIH -i 04:EB:71:0D:29:D0
IIH -i DA:67:53:4B:EC:C4
2017-04-27.14:58:20 : Finished work

UPDATE 语句会发送到 DB-Access。识别出伪造的 MAC 地址。正确的IIH 命令将被运行。

请注意,将输出传送到 sh 需要确信您生成的数据(IIH 命令)是干净的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2015-11-08
    相关资源
    最近更新 更多