简介
本文档介绍如何为运行时间更长的思科能源管理(CEM)安装保持捆绑的PostgreSQL数据库(DB)干净。
背景信息
CEM将从资产收集的数据存储在PostgreSQL数据库中。DB与CEM一起安装。在您使用CEM更长时间后,许多数据将存储在DB中,系统或用户可能不再需要这些数据。
随着时间的推移,这可能会导致数据库增长非常大,从而对磁盘空间的使用和总体性能产生影响。本文档有助于了解如何通过运行几个批处理脚本使数据库保持干净状态。
问题
从第5版开始的CEM没有开箱即用的清理机制,因此可以定期手动清理数据库。您可以在此处找到的示例批处理作业可以与Windows中的计划任务定期执行。
解决方案
清理每小时数据
CEM定期汇聚(每小时、每天、每月、每年)收集的数据。可以删除较旧的源数据(例如每小时),该数据的时间比此详细级别不再与用户相关的时间段要早。数据越旧,将详细数据保留在数据库中的相关性就越低。
删除此每小时数据时,表示在删除数据的期间不再可能以每小时为单位的粒度生成报告。这取决于需求,通常对于较旧的数据来说不是问题。
您可以使用此脚本执行此操作:
@echo off
REM +++++++++++++++ CONFIG ++++++++++++++++
REM set days to keep hourly data
set KEEPDAYS=365
REM set password for DB auth
set PGPASSWORD=zzzzzzzzz
REM set tenant id
set tenant=t_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
REM set psql.exe location
set pgbin="C:\Program Files (x86)\Cisco Energy Management\pgsql\bin"
REM +++++++++++++ END CONFIG ++++++++++++++
REM list of metric suffixes
set suffixes=(power,carbon,devicestatus,power_cost,powerdemand,utilization)
REM get current date/time for logfile
for /f "delims=" %%# in ('powershell get-date -format "{yyyy-MM-dd_HH-mm}"') do @set logtimestamp=%%#
REM calculate oldest date that should be kept in DB
for /f "delims=" %%# in ('powershell get-date -date "$(get-date).adddays(-%KEEPDAYS%)" -format "{yyyyMMdd}"') do @set dbdate=%%#
echo Starting hourly data cleanup on %logtimestamp% >%logtimestamp%.txt
REM remove tmp file if it exists already
if exist %TEMP%\cemscleantmp.txt del /f %TEMP%\cemscleantmp.txt
REM find and store tables that need to be deleted in tmp file
for %%s in %suffixes% do (
%pgbin%\psql.exe -q -t -A -w -U postgres -d cloud -c "SELECT table_name FROM information_schema.tables where table_name < 'd%dbdate%_%%s' AND table_name LIKE 'd2%%_%%s';">>%TEMP%\cemscleantmp.txt
)
REM drop that table
for /f "tokens=*" %%t in (%TEMP%\cemscleantmp.txt) do (
echo -- dropping table %tenant%.%%t>>%logtimestamp%.txt
%pgbin%\psql.exe -w -U postgres -d cloud -c "DROP TABLE IF EXISTS %tenant%.%%t CASCADE">>%logtimestamp%.txt 2>&1
)
REM clean tmp file
if exist %TEMP%\cemscleantmp.txt del /f %TEMP%\cemscleantmp.txt
REM end logfile
for /f "delims=" %%# in ('powershell get-date -format "{yyyy-MM-dd_HH-mm}"') do @set endtimestamp=%%#
echo Finished hourly data cleanup on %endtimestamp% >>%logtimestamp%.txt
脚本的第一部分需要根据环境定制。应更改以下值:
- KEEPDAYS:应保留每小时数据的天数(例如:KEEPDAYS=365保留一年的小时详细信息,并删除一年以前的小时详细信息)
- PGPASSWORD:数据库的postgres-user密码
— 租户:用于此安装的tenant-id(可在EnergyWiseProcessor.log中找到)
- pgbin:PostgreSQL二进制文件的安装位置
Clean Objectstore日记
CEM对象库包含与CEM相关的所有对象及其最新状态。为了能够查看历史记录并审核所有对象的状态,甚至还能恢复到上一个时间点,CEM会保留对对象库中对象执行的所有操作的日志。此信息非常有用,但随着时间的推移,其相关性会降低。与每小时的详细信息类似,最好清理日志中的旧条目。
您可以使用此脚本执行此操作:
@echo off
REM +++++++++++++++ CONFIG ++++++++++++++++
REM set days to keep journal data
set KEEPDAYS=365
REM set password for DB auth
set PGPASSWORD=xxxyyyzzz
REM set tenant id
set tenant=t_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
REM set psql.exe location
set pgbin="C:\Program Files (x86)\Cisco Energy Management\pgsql\bin"
REM +++++++++++++ END CONFIG ++++++++++++++
REM get current date/time for logfile
for /f "delims=" %%# in ('powershell get-date -format "{yyyy-MM-dd_HH-mm}"') do @set logtimestamp=%%#
REM calculate oldest date that should be kept in DB
for /f "delims=" %%# in ('powershell get-date -date "$(get-date).adddays(-%KEEPDAYS%)" -format "{yyyy-MM-dd}"') do @set dbdate=%%#
echo Starting jx_objectstore_journal cleanup script on %logtimestamp% >%logtimestamp%.txt
REM clean journal
%pgbin%\psql.exe -w -U postgres -d cloud -c "DELETE FROM %tenant%.jx_objectstore_journal where start <= '%dbdate%'" >>%logtimestamp%.txt 2>&1
REM end logfile
for /f "delims=" %%# in ('powershell get-date -format "{yyyy-MM-dd_HH-mm}"') do @set endtimestamp=%%#
echo Finished jx_objectstore_journal cleanup script on %endtimestamp% >>%logtimestamp%.txt
脚本的第一部分需要根据环境定制。应更改以下值:
- KEEPDAYS:对象存储日记帐数据应保留的天数(例如:KEEPDAYS=365将日志数据保留一年,并删除一年以前的日志数据)
- PGPASSWORD:数据库的postgres-user密码
— 租户:用于此安装的tenant-id(可在EnergyWiseProcessor.log中找到)
- pgbin:PostgreSQL二进制文件的安装位置
如果定期运行这些脚本,它将使数据库保持健康状态,并且肯定会提高性能(例如:自动真空速度、目录请求……)