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

PostgreSQL数据库中Linux系统利用率导入,linux,postgresql,redhat,Linux,Postgresql,Redhat,我想在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_

我想在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

任何解决方案

首先,您需要清除前两行中的文件: 然后您将创建一个表。 最后,将插入到表中

有很多方法可以清理文件,但您可以运行以下操作

cat /tmp/test.csv|awk 'NR>2' > /tmp/test_clean.csv
然后需要创建一个表: 问题是这样的:

CREATE TABLE system_utilzation (
    ts       TIME,
    cpu      TEXT,
    user     NUMERIC,
    nice     NUMERIC,
    system     NUMERIC,
    iowait      NUMERIC, 
    steal      NUMERIC,
    idle     NUMERIC
);
如果是第一次填充表格,可以使用COPY或\COPY将CSV文件插入表格。如果希望此作业作为常规作业运行,则需要[插入][3]它

您可以使用一个空的临时表来实现这一点。每个连接的临时表都是唯一的,并且在您断开与Posgres的连接后将自动删除: 创建TEMP TABLE TEMP_system_utilization作为SELECT*FROM system_utilization,其中1=2; 然后您将使用psql和\COPY填充它

最后,您可以使用以下方法将临时表插入完整表: 在系统使用中插入从临时系统使用中选择*

工作答案:

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

sadf -dh -- -p| tr ';' ','| awk 'NR>1{print $0}' > /tmp/test_clean.csv
然后,创建表

CREATE TABLE system_utilzation (
     hostname  text,
     interval  text,
     ts       TIME,
     cpu      TEXT,
     users     NUMERIC,
     nice     NUMERIC,
     system     NUMERIC,
     iowait      NUMERIC, 
     steal      NUMERIC,
     idle     NUMERIC
    );
使用以下命令创建临时表

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

copy temp_system_utilzation from '/tmp/test_clean.csv' with CSV HEADER;
然后将数据插入名为system_Utilization的主表中


demo=使用csv头从“/tmp/test\u clean.csv”复制临时系统使用;错误:类型时间戳的输入语法无效:12:10:01 AM all 0.10 0.00 0.05 0.02 0.00 99.83上下文:复制临时系统使用,第2行,列ts:12:10:01 AM all 0.10 0.00 0.05 0.02 0.00 99.83演示=最好将其从时间戳更改为时间戳这可能意味着您没有csv文件。试着按照这个方法来确保你有一个csv文件,因为你可能有一个带有空格的文件awk'NR>3{print$0}感谢它对我有用,但在CPU列中它显示的是-1而不是全部。这不是csv文件,请更新问题以显示文件的实际格式,提供
copy temp_system_utilzation from '/tmp/test_clean.csv' with CSV HEADER;
INSERT INTO system_utilzation SELECT * FROM temp_system_utilzation;