Setting up a History slave
(Updated Edited template to July 12, 2025.)
No edit summary
 
Line 1: Line 1:
<message>Write the content here to display this box</message>
<message>Write the content here to display this box</message>
Read here on why you may want a History slave server: [[Purpose of History Server]]
Read here on why you may want a History slave server: [[Documentation:Purpose of History Server|Purpose of History Server]]


Recent changes make it possible to use SQLCompact to test the MDriven History Server, but you will most likely need more space than SQL compact can handle.
Recent changes make it possible to use SQLCompact to test the MDriven History Server, but you will most likely need more space than SQL compact can handle.
Line 15: Line 15:


==== Thinning, Culling, and Truncating a History Server ====
==== Thinning, Culling, and Truncating a History Server ====
On classes, set the tagged value <code>NoHistory=true</code> to make HistoryServer skip this class for versioning. This may be desirable when having fast-moving reference data you do not own - like daily imports from other systems that you do not deem important enough to track. It is currently not supported to evolve from Versioned to not Versioned. To use NoHistory in History, make sure you have this set from the start or recreate the table to force it through.
On classes, set the tagged value <code><span class="col-black">'''NoHistory=true'''</span></code> to make HistoryServer skip this class for versioning. This may be desirable when having fast-moving reference data you do not own - like daily imports from other systems that you do not deem important enough to track. It is currently not supported to evolve from Versioned to not Versioned. To use NoHistory in History, make sure you have this set from the start or recreate the table to force it through.


Also, the tagged value <code>HistoryKeepWeeks=NoOfWeeks(int)</code> can be used on Classes. This may be good to keep shorter history on some than on others. This may lead to a false history perspective - if the old version references another object that has been culled by a shorter HistoryKeepWeeks link that will turn up as null when in fact it had a value at the time.
Also, the tagged value <code><span class="col-black">'''HistoryKeepWeeks=NoOfWeeks(int)'''</span></code> can be used on Classes. This may be good to keep shorter history on some than on others. This may lead to a false history perspective - if the old version references another object that has been culled by a shorter HistoryKeepWeeks link that will turn up as null when in fact it had a value at the time.


The history is culled via pressing a button in <code>admin/MasterSlave/TruncHistory3Years(156 weeks)</code> - this will change and become automatic in later releases.
The history is culled via pressing a button in <code><span class="col-black">'''admin/MasterSlave/TruncHistory3Years(156 weeks)'''</span></code> - this will change and become automatic in later releases.


In SQLServer, you can use this script to find where you have the most rows in your History server - this may be a good indicator if you need thinning:
In SQLServer, you can use this script to find where you have the most rows in your History server - this may be a good indicator if you need thinning:

Latest revision as of 05:10, 18 February 2025

This page was created by Hans.karlsen@mdriven.net on 2021-04-08. Last edited by Stephanie@mdriven.net on 2025-02-18.

Read here on why you may want a History slave server: Purpose of History Server

Recent changes make it possible to use SQLCompact to test the MDriven History Server, but you will most likely need more space than SQL compact can handle.

Steps:

  1. On the main MDrivenServer:
    • Ensure MDrivenServerSynk
    • Switch from "Normal" to "Master"
    • Copy/backup the database from the master - restore it in the second MDrivenServer.
  2. In Second MDrivenServer, change the mode to "History Slave":
    • In History Slave, ensure Version is compatible
    • In History, point out the master MDrivenServer and set the user and password for the master.

Test by making changes towards Master, within short changes show up in History slave.

Thinning, Culling, and Truncating a History Server

On classes, set the tagged value NoHistory=true to make HistoryServer skip this class for versioning. This may be desirable when having fast-moving reference data you do not own - like daily imports from other systems that you do not deem important enough to track. It is currently not supported to evolve from Versioned to not Versioned. To use NoHistory in History, make sure you have this set from the start or recreate the table to force it through.

Also, the tagged value HistoryKeepWeeks=NoOfWeeks(int) can be used on Classes. This may be good to keep shorter history on some than on others. This may lead to a false history perspective - if the old version references another object that has been culled by a shorter HistoryKeepWeeks link that will turn up as null when in fact it had a value at the time.

The history is culled via pressing a button in admin/MasterSlave/TruncHistory3Years(156 weeks) - this will change and become automatic in later releases.

In SQLServer, you can use this script to find where you have the most rows in your History server - this may be a good indicator if you need thinning:

SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    p.rows DESC, t.Name