Creating and managing test data for Db2 application development and testing requirements can be a significant challenge. To enable not only the development of new programs, but to be able to maintain existing ones, organizations must ensure that there is an adequate amount of accurate test data always available. Without relevant, useful data, there is no way to test applications to make sure they are operating correctly.
Although this duty must be a shared one between the application developers and the DBAs, managing and controlling all of the data movement tasks typically falls on the DBAs. And keeping track of what data moved where, when it moved, and why can at times be as much of a challenge as moving the data itself.
Fortunately, there are test data management tools available to not only move the data, but to keep track of it. I’ve written about one of the better Db2 for z/OS data movement tools here in the blog before:
Fast and Effective Db2 for z/OS Test Data Management with BCV5. I hope you'll take a moment to click and read that post.
Now BCV5 has been improved with a new reporting feature, to enable users to track the movement of data across their Db2 subsystems. This is a significant new feature that can be used to glean useful information for DBAs, storage administrators, and even by data stewards for data governance.
There are six tables of metadata that BCV5 populates to track the data movement and the copy tasks it performs. These tables are:
- BCV531.TASK_EXECUTIONS
- BCV531.TASK_EXECUTIONS_OBJECTS
- BCV531.TASK_EXECUTIONS_PARAMETERS
- BCV531.TASK_EXECUTIONS_JOBS
- BCV531.TASK_EXECUTIONS_RULES
- BCV531.TASK_EXECUTIONS_MASKING
The information in these tables is updated whenever BCV5 runs a task to copy Db2 data. Users can query these tables just like any other Db2 tables to monitor the details of the BCV5 tasks you have run. This information may be useful for many different IT and business professionals, but let’s take a look at three specific use cases:
- database administration (DBA),
- storage administration, and
- data governance.
DBA tracking
DBAs tasked with moving and refreshing data from one Db2 environment to another are the typical users of BCV5, and therefore they will be one of the primary users of the new reporting tables. Most sites that use BCV5 use it to refresh test data, for example, copying production data to test, or copying unit test data to an integration test set of tables.
Regardless of the type of data movement that is being undertaken, it is usually being done for multiple tables, tablespaces, and databases. Usually, there will be regularly scheduled processes that copy some of the data, but this is rarely sufficient as there will be on-off requests, special situations, and emergency data refreshes happening all the time. Keeping track of such a hectic morass of copying and refreshing data can be difficult.
Fortunately, if you are using BCV5 the new Usage Tracker tables can simplify keeping track of data refreshes for DBAs. For example, a DBA looking to find out which BCV5 copy tasks were run during the month of May could code a query like:
SELECT T.ROWDATE, T.USER, T.TASKNAME
FROM BCV531.TASK_EXECUTIONS T
WHERE T.ROWDATE BETWEEN ´2021-05-01´ AND ´2021-05-31´
ORDER BY T.ROWDATE ;
This will show all the BCV5 copy tasks that ran during that timeframe, and will look something like this:
ROWDATE USER TASKNAME
---------+---------+---------+---------+---------
2021-05-12 USERID1 TSK0001
2021-05-12 USERID1 TSK0002
2021-05-20 USERID5 TSKPROD1
2021-05-21 USERID9 TSKPROD4
…
The results shown here are just a sample and will likely be a subset of the actual results of running such a query.
Of course, this is rudimentary information and it is likely that the DBA will want to know more, such as which objects were impacted by these tasks. A query such as the following will come in handy:
SELECT SUBSTR(SRCSCHEMA,1,8) AS SS,
SUBSTR(SRCNAME,1,12) AS SN,
SUBSTR(TGTSCHEMA,1,8) AS TS,
SUBSTR(TGTNAME,1,12) AS TN,
SUBSTR(OBJTYPE,1,1),
ROWDATE AS DATE_COPIED,
SIZEKB
FROM BCV531.TASK_EXECUTIONS_OBJECTS
ORDER BY DATE_COPIED ;
The results here show all the Db2 objects copied by BCV5 showing the source and target names as well as the object type, date copied, and amount of data (in KB) copied:
SS SN TS TN DATE_COPIED SIZEKB
---------+---------+---------+---------+---------+-----
DB500XA TS500X01 DBA001 TS500XA1 S 2021-05-17 1462480
QUALID XCL59011 TESTID XCL59011 X 2021-05-17 325040
QUALID XCL59012 TESTID XCL59012 X 2021-05-17 125200
QUALID XCL59013 TESTID XCL59013 X 2021-05-17 301460
QUALID XCL5901C TESTID XCL5901C X 2021-05-17 98400
QUALID TEST_TBL TESTID TEST_TBL T 2021-05-17 20
…
Again, the results have been truncated as this is intended as an example.
A DBA looking to track down the results of a specific copy task that ran on a specific date might want to run a query like this, to verify which objects were copied. Simply plug in the name of your task and the date it ran:
SELECT T.TASKNAME, O.OBJTYPE, O.SRCSCHEMA, O.SRCNAME,
O.TGTSCHEMA, O.TGTNAME, O.PARTITIONS
FROM BCV531.TASK_EXECUTIONS T,
BCV531.TASK_EXECUTIONS_OBJECTS O
WHERE T.ID = O.EXECID
AND T.TASKNAME = ?
AND T.ROWDATE = ? ;
Storage Administration Tracking
Another type of user who might find the Usage Tracker capabilities of BCV5 useful is the storage administrator. Storage administrators are responsible for managing an organization’s disk and tape systems. Additionally, they are also responsible for monitoring storage usage and capacity to ensure that sufficient storage is available for the organization’s IT requirements.
As such, the storage administrator will likely want to keep an eye on the data movement activities of BCV5. For example, a query such as this one can be used to report on the total amount of data (TS and IX) copied by date:
SELECT ROWDATE AS DATE_COPIED,
SUM(SIZEKB) AS TOTAL_KB_COPIED
FROM BCV531.TASK_EXECUTIONS_OBJECTS
WHERE OBJTYPE IN ('S', 'X')
GROUP BY ROWDATE ;
Which will return data similar to this:
DATE_COPIED TOTAL_KB_COPIED
---------+---------+---------+---------+------
2021-06-12 106231270
2021-06-19 106231270
2021-06-21 4451457810
2021-06-26 106231270
…
Another potentially useful query, not only for storage administrators and DBAs, but also for application managers, is tracking the amount of actual (tablespace) data copied by date and application. Finding the application name or identifier can be tricky, but if we assume that an application identifier is embedded in the second 2 chars of database name then a query like this can be run:
WITH SIZEBYAPP AS (
SELECT ROWDATE AS DATE_COPIED,
SUBSTR(TGTSCHEMA,2,2) AS APPL_NAME,
SIZEKB AS SIZE_IN_KB
FROM BCV531.TASK_EXECUTIONS_OBJECTS
WHERE OBJTYPE = 'S'
)
SELECT DATE_COPIED, APPL_NAME,
SUM(SIZE_IN_KB) AS TOTAL_KB_COPIED
FROM SIZEBYAPP
GROUP BY DATE_COPIED, APPL_NAME ;
Which might return a report looking something like this:
DATE_COPIED APPL_NAME TOTAL_KB_COPIED
---------+------------------+---------+-------
2021-05-11 EN 46805760
2021-05-22 BA 242791056
2021-05-22 BX 4094640
2021-05-22 CM 1008720
2021-05-22 DA 270390816
2021-05-22 OR 90528
2021-05-26 PR 55737376
2021-05-26 XX 537647328
…
You can adjust this query if you want to know the amount of index data copied by data and application like so (under the same assumption as above for application identifier):
WITH SIZEBYAPP AS (
SELECT B.ROWDATE AS DATE_COPIED,
SUBSTR(T.DBNAME,2,2) AS APPL_NAME,
B.SIZEKB AS SIZE_IN_KB
FROM BCV531.TASK_EXECUTIONS_OBJECTS B,
SYSIBM.SYSINDEXES X,
SYSIBM.SYSTABLES T
WHERE B.OBJTYPE = 'X'
AND B.TGTNAME = X.NAME
AND B.TGTSCHEMA = X.CREATOR
AND X.TBNAME = T.NAME
AND X.TBCREATOR = T.CREATOR
)
SELECT DATE_COPIED, APPL_NAME,
SUM(SIZE_IN_KB) AS TOTAL_KB_COPIED
FROM SIZEBYAPP
GROUP BY DATE_COPIED, APPL_NAME ;
Data Governance Tracking
Although tracking data movement activities is useful for DBAs, it is also important for data governance reporting. Data governance refers to the processes and standards of ensuring access to high-quality data throughout an organization. Data governance encompasses all aspects of data quality including its accuracy, availability, consistency, integrity, security, and usability. The role of data governance has expanded as data privacy rules and regulations have expanded in response to an increasing number of data breaches and hacker attacks. For example, in early July 2021, Colorado passed the
Colorado Privacy Act, meaning that now Colorado, Virginia, and California have passed data privacy legislation that impacts how personal data must be governed. More states are certain to follow their lead… and let’s not forget the
European GDPR act!
These type of regulations provide rights for access, deletion, correction, portability, and protection for
personally identifiable information, or PII. Note that “portability” is one aspect of data protection covered under the auspices of such regulations… and BCV5 is a mover of data, so you need to be able to track what data moved where, especially when the data that moved contains any PII.
So, what types of queries can be run using the new BCV5 reporting tables to help satisfy the needs of data governance?
Well, if you have identified specific tables that have personally identifiable information, and therefore requires specific policies to ensure its privacy and protection, a data steward might want to run a query that shows all of the times that a specific protected table was copied:
SELECT SUBSTR(SRCSCHEMA,1,8) AS SS,
SUBSTR(SRCNAME,1,12) AS SN,
SUBSTR(TGTSCHEMA,1,8) AS TS,
SUBSTR(TGTNAME,1,12) AS TN,
ROWDATE AS DATE_COPIED,
SIZEKB
FROM BCV531.TASK_EXECUTIONS_OBJECTS
WHERE OBJTYPE = 'T'
AND SRCSCHEMA = ?
AND SRCNAME = ?
ORDER BY DATE_COPIED ;
Simply code the appropriate schema (SRCSCHEMA) and table name (SRCNAME) and this query will show all the times that the particular table (say PROD.CUSTOMERS) was copied. A data governance professional with a list of tables that contains PII could alter this query to accept that list as an IN clause instead of the simple equality clause shown here.
Additionally, BCV5 can de-identify sensitive data using masking. Whenever a task that requires data to be masked is run, information is captured in the TASK_EXECUTIONS_MASKING table. So, a data governance professional might want to run a query like this one to report on all the masking of sensitive data.
SELECT SUBSTR(TBCREATOR,1,8) AS TBCREATOR,
SUBSTR(TBNAME,1,12) AS TBNAME,
SUBSTR(COLNAME,1,18) AS COLNNAME,
METHOD AS MASKING_METHOD,
SQLEXPR
FROM BCV531.TASK_EXECUTIONS_MASKING
ORDER BY ROWDATE ;
This can always be modified to join it to the TASK_EXECUTIONS table to obtain the task name if that is important. And with a little manipulation of the query it is possible to look for tables that contain sensitive data that have been copied using BCV5, but have not had masking applied.
Summary
BCV5 has offered powerful data movement and masking capabilities for Db2 data for a long time, but now it also offers the ability to track and report on your organization’s Db2 data movement and copy tasks. This new functionality opens a plethora of useful information for BCV5 users.