Linux PostgreSQL 数据库中的系统利用率导入

Linux system utilization import in PostgreSQL Database

我想在 PostgreSQL 数据库中导入每日 Linux 系统使用率文件。

# ls /var/log/sa
sar -f sa13 >>/tmp/test_clean.csv

我可以使用上面的命令生成 .csv 文件,但这种格式允许我导入到 PostgreSQL 数据库中。

root#> less /tmp/test_clean.csv
<Linux redhat version> (servername)      <date>      _x86_64_        (2 CPU)

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:10:01 AM     all      0.10      0.00      0.05      0.02      0.00     99.83
12:20:01 AM     all      0.12      0.00      0.06      0.02      0.00     99.80
12:30:01 AM     all      0.08      0.00      0.05      0.02      0.00     99.85
12:40:01 AM     all      0.06      0.00      0.05      0.02      0.00     99.88
12:50:01 AM     all      0.07      0.00      0.05      0.02      0.00     99.86
01:00:01 AM     all      0.09      0.00      0.05      0.02      0.00     99.84
01:10:01 AM     all      0.07      0.00      0.05      0.02      0.00     99.86

任何解决方案..!!

首先你需要清理前两行的文件: 那么您将创建一个 table。 最后,您将插入 table.

a few ways 清理文件,但您可以 运行 类似

cat /tmp/test.csv|awk 'NR>2' > /tmp/test_clean.csv

然后您需要创建一个 table: syntax 是这样的:

CREATE TABLE system_utilzation (
    ts       TIME,
    cpu      TEXT,
    user     NUMERIC,
    nice     NUMERIC,
    system     NUMERIC,
    iowait      NUMERIC, 
    steal      NUMERIC,
    idle     NUMERIC
);

如果这是您第一次填充 table,可以使用 COPY\COPY 将 CSV 文件插入您的 table。如果你想 运行 作为日常工作,你会想要 [INSERT][3] 它。

您可以使用空的临时文件 table 来做到这一点。 temp table 每个连接都是唯一的,在您与 Posgres 断开连接后将自动删除: CREATE TEMP TABLE temp_system_utilzation AS SELECT * FROM system_utilzation WHERE 1=2; 然后您将使用 psql\COPY.

填充它
psql -h remotehost -d remote_mydb -U myuser -c "\copy temp_system_utilzation from '/tmp/test_clean.csv' with CSV HEADER"

最后,您可以使用如下方式从临时 table 插入完整 table: INSERT INTO ystem_utilzation SELECT * FROM temp_system_utilzation;

有效答案:

  1. 使用以下命令创建 .csv 文件。

    sadf -dh -- -p| tr ';' ','| awk 'NR>1{print [=10=]}' > /tmp/test_clean.csv
    
  2. 然后,创建 table

    CREATE TABLE system_utilzation (
         hostname  text,
         interval  text,
         ts       TIME,
         cpu      TEXT,
         users     NUMERIC,
         nice     NUMERIC,
         system     NUMERIC,
         iowait      NUMERIC, 
         steal      NUMERIC,
         idle     NUMERIC
        );
    
  3. 使用以下命令创建一个临时文件 table。

     CREATE TEMP TABLE temp_system_utilzation AS SELECT * FROM system_utilzation WHERE 1=2;
    
  4. 将数据从 .csv 文件导入到 table。

    copy temp_system_utilzation from '/tmp/test_clean.csv' with CSV HEADER;
    
  5. 然后插入数据到主table调用system_utilzation

    INSERT INTO system_utilzation SELECT * FROM temp_system_utilzation;