Primavera P6数据库已经发展到非常大的规模

时间:2014-11-25 20:58:47

标签: sql-server primavera

我不是P6管理员,也不是(SQL Server)DBA。我只是一个Winforms开发人员(使用T-SQL),他同意对调度组进行一些研究。

我相信他们运行的版本是8.2,桌面版(非Citrix)。后端是SQL Server。后端已增长到36GB,每晚备份定期将驱动器填充到极限。

REFRDEL拥有1.35亿条记录,可以追溯到2012年的某个时间。 UDFVALUE拥有2600万条记录

所有其他表格都有合理的记录数。

有人可以告诉我们要运行的几个面向清理的存储过程中的哪一个(如果有的话),或者提供一些合理的建议,以便我们可以将后端降低到可管理的大小,好吗?请不要违反最佳做法并认为非常安全的事情。

3 个答案:

答案 0 :(得分:1)

UDFVALUE保存大量记录是正常的。附加到P6中任何对象的任何用户定义字段的每个值都将表示为此表中的记录。

另一方面,在健康的系统中,REFRDEL应该在正常操作期间自动清理。在P6 8.x中,它们应该由data_monitor进程清理,默认情况下,该进程被配置为每周运行一次(星期六)。

你应该能够手动执行它,但要预先警告:如果自2012年以来没有正确执行,可能需要很长时间才能完成。

36gb仍然是一个非常非常大的数据库。对于某些客户,根据活动的总数,特别是存储的数据类型,这种程度的数据库可能并非不合理。例如,笔记本占用相对较大的空间。

在您的情况下,由于您已经知道data_monitor暂时没有正确执行,因此表格中更多可能是已经被软删除的记录但却没有但是被清除了。您可以通过运行查询来查看此类记录,例如:

select count(*) from task where delete_session_id is not null;

请注意,您必须从任务表中选择,而不是视图,因为视图会自动过滤这些软删除的记录。

您不应手动删除此类记录。由于运行data_monitor,它们应与REFRDEL中的记录一起清理。

答案 1 :(得分:0)

当你查看数据库中的数据时,会有一个列名" delete_session_id"。你看到任何值为-99?如果是这样,那么就有一个未解决的问题。如果没有,则继续执行以下操作以使清理作业再次运行...

如果您使用的是SQL Server(完整版),请执行以下步骤来解决此问题:

  1. 验证SQL Server代理服务是否已在服务器上启动,并且启动类型为automatic。

    • 可以在以下位置找到此服务的日志:
    • C:\ Program Files \ Microsoft SQL Server \\ LOG \ SQLAGENT.x
    • 此日志包含有关服务何时停止/启动的信息
  2. 如果启动了SQL代理,则可以通过SQL查询分析器(2000)或Microsoft SQL Server Management Studio发出以下命令作为SA来检查SQL Server数据库上存在的作业:

    • 从msdb.dbo.sysjobs
    • 中选择*
  3. 如果未列出Primavera后台进程(SYMON和DAMON),或者未启动SQL代理,则可以通过对项目管理数据库以SA用户身份运行以下命令来重新初始化这些后台进程: / p>

    • exec initialize_background_procs
    • exec system_monitor
    • exec data_monitor

答案 2 :(得分:0)

有点迟到,但认为以下内容可能对某些人有用。 我们注意到REFRDEL已经发展到一个很大的尺寸,经过一些调查后发现了以下内容......

DAMON运行以下程序进行清理:

  • BGPLOG_CLEANUP
  • REFRDEL_CLEANUP
  • REFRDEL Bypass
  • CLEANUP_PRMQUEUE
  • USESSION_CLEAR_LOGICAL_DELETES
  • CLEANUP_LOGICAL_DELETES
  • PRMAUDIT_CLEANUP
  • CLEANUP_USESSAUD
  • USER_DEFINED_BACKGROUND

DAMON配置为每周六下午4点左右运行,但我们注意到它一直在失败。这是由于下午10点开始的离线备份过程。我们首先假设这阻止了REFRDEL_CLEANUP的运行 但是,在监视REFRDEL几周之后,我们发现REFRDEL_CLEANUP 实际上正在运行并从表中删除数据。您可以在第1周运行以下查询,然后在第2周再次检查您的表,以验证是否删除了最旧的记录。

select min(delete_date), max(delete_date), count(*) from admuser.refrdel;


问题在于REFRDEL_CLEANUP过程使用的默认参数。这些描述为here,但总的来说,该过程设置为保留最近5天的记录,并删除仅1天的记录。这就是造成这个问题的原因...... DAMON每周只运行一次......当它运行清理工作时,它只删除了1天的数据但累积了一周的价值...因此数据量会变得更大更大。
可以在SETTINGS表中覆盖默认参数 以下是我采取的纠正问题的步骤:
首先,清理桌子..

-- 1. create backup table
CREATE TABLE ADMUSER.REFRDEL_BACKUP TABLESPACE PMDB_DAT1 NOLOGGING AS
Select * from admuser.refrdel where delete_date >= (sysdate - 5);

-- CHECK DATA HAS BEEN COPIED


-- 2. disable indexes on REFRDEL
alter index NDX_REFRDEL_DELETE_DATE unusable;
alter index NDX_REFRDEL_TABLE_PK unusable;

-- 3. truncate REFRDEL table
truncate table admuser.refrdel;

-- 4. restore backed up data
ALTER TABLE ADMUSER.REFRDEL NOLOGGING;
insert /*# append */ into admuser.refrdel select * from admuser.refrdel_backup;
--verify number of rows copied
ALTER TABLE ADMUSER.REFRDEL LOGGING;

commit;

-- 5. rebuild indexes on REFRDEL
alter index NDX_REFRDEL_DELETE_DATE rebuild;
alter index NDX_REFRDEL_TABLE_PK rebuild;

-- 6. gather table stats
exec dbms_stats.gather_table_stats(ownname => 'ADMUSER', tabname => 'REFRDEL', cascade => TRUE);

-- 7. drop backup table
drop table admuser.refrdel_backup purge;

接下来,覆盖参数,以便我们尝试删除至少10天的数据。保留期将始终保持5天的数据。

exec settings_write_string(‘10',’database.cleanup.Refrdel’,’DaysToDelete’);   -- delete the oldest 10 days of data
exec settings_write_string(’15’,’database.cleanup.Refrdel’,’IntervalStep’);   -- commit after deleting every 15 minutes of data
exec settings_write_string(‘5d’,’database.cleanup.Refrdel’,’KeepInterval’);   -- only keep 5 most recent days of data

此最后一步仅与我的环境相关,除非您遇到类似问题,否则不适用于您。这是为了改变DAMON的开始时间,以便在我们的离线备份过程开始之前完成它。所以在这种情况下我将开始时间从下午4点改为午夜。

BEGIN
  DBMS_SCHEDULER.SET_ATTRIBUTE (
   name         =>  'BGJOBUSER.DAMON',
   attribute    =>  'start_date',
   value        =>  TO_TIMESTAMP_TZ('2016/08/13 00:00:00.000000 +00:00','yyyy/mm/dd hh24:mi:ss.ff tzr'));
END;
/