/*******************************************************************************
* Licensed Materials - Property of IBM
* (c) Copyright IBM Corporation 2019, 2022. All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* Use, duplication or disclosure restricted by GSA ADP Schedule
* Contract with IBM Corp.
*******************************************************************************/
--<ScriptOptions statementTerminator=";"/>
SET SCHEMA DBBGITLAB;
-- Create tables
CREATE TABLE LOGICAL_FILE (
C_ID BIGINT NOT NULL,
LF_FILE VARCHAR(1024) NOT NULL,
LF_LNAME CHARACTER(32) NOT NULL,
LANG_ID BIGINT,
LF_CICS CHAR(1) NOT NULL,
LF_SQL CHAR(1) NOT NULL,
LF_DLI CHAR(1) NOT NULL,
LF_MQ CHAR(1) NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX LF_FILE_NDX ON LOGICAL_FILE (LF_FILE ASC);
ALTER TABLE LOGICAL_FILE ADD CONSTRAINT LF_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE LOGICAL_DEPENDENCY (
C_ID BIGINT NOT NULL,
C_LNAME CHARACTER(32) NOT NULL,
CATEGORY_ID BIGINT,
LIBRARY_ID BIGINT
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX LD_C_LNAME_NDX ON LOGICAL_DEPENDENCY (C_LNAME ASC);
CREATE INDEX LD_ALL_NDX ON LOGICAL_DEPENDENCY (C_LNAME ASC, CATEGORY_ID ASC, LIBRARY_ID ASC);
ALTER TABLE LOGICAL_DEPENDENCY ADD CONSTRAINT LD_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE COLLECTION (
C_ID BIGINT NOT NULL,
C_CREATED TIMESTAMP NOT NULL WITH DEFAULT,
C_CREATED_BY CHARACTER(30),
C_LAST_UPDATED TIMESTAMP NOT NULL WITH DEFAULT,
C_LAST_UPDATED_BY CHARACTER(30),
C_NAME CHARACTER(128) NOT NULL,
PERMISSIONS_C_ID BIGINT
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
ALTER TABLE COLLECTION ADD CONSTRAINT COL_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE LF_LANGUAGES (
C_ID BIGINT NOT NULL,
C_LANGUAGE CHARACTER(32) NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX LANG_LANGUAGE_NDX ON LF_LANGUAGES (C_LANGUAGE ASC);
ALTER TABLE LF_LANGUAGES ADD CONSTRAINT LANG_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE LD_LIBRARIES (
C_ID BIGINT NOT NULL,
C_LIBRARY CHARACTER(44) NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX LIB_LIBRARY_NDX ON LD_LIBRARIES (C_LIBRARY ASC);
ALTER TABLE LD_LIBRARIES ADD CONSTRAINT LIB_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE LD_CATEGORIES (
C_ID BIGINT NOT NULL,
C_CATEGORY CHARACTER(32) NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX CAT_CATEGORY_NDX ON LD_CATEGORIES (C_CATEGORY ASC);
ALTER TABLE LD_CATEGORIES ADD CONSTRAINT CAT_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE DBB_TABLE_VERSIONS (
DBB_TBL_NAME VARCHAR(50) NOT NULL,
DBB_TBL_VERSION int
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE UNIQUE INDEX DBB_TBL_NAME_NDX ON DBB_TABLE_VERSIONS (DBB_TBL_NAME ASC);
ALTER TABLE DBB_TABLE_VERSIONS ADD CONSTRAINT DBB_TBL_NAME_NDX PRIMARY KEY (DBB_TBL_NAME);
CREATE TABLE BUILD_RESULT (
C_ID BIGINT NOT NULL,
C_CREATED TIMESTAMP NOT NULL WITH DEFAULT,
C_CREATED_BY CHARACTER(30),
BR_GROUP CHARACTER(128) NOT NULL,
BR_LABEL CHARACTER(128) NOT NULL,
BR_STATUS SMALLINT,
BR_STATE SMALLINT,
C_LAST_UPDATED TIMESTAMP NOT NULL WITH DEFAULT,
C_LAST_UPDATED_BY CHARACTER(30),
PERMISSIONS_C_ID BIGINT
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX BR_GROUP_NDX ON BUILD_RESULT (BR_GROUP ASC);
ALTER TABLE BUILD_RESULT ADD CONSTRAINT BR_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE BUILD_RESULT_PROPERTY (
C_ID BIGINT NOT NULL,
PROPERTY_NAME CHARACTER(128) NOT NULL,
PROPERTY_VALUE VARCHAR(1024) NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX PROPERTY_NAME_NDX ON BUILD_RESULT_PROPERTY (PROPERTY_NAME ASC);
CREATE INDEX PROPERTY_VALUE_NDX ON BUILD_RESULT_PROPERTY (PROPERTY_VALUE ASC);
ALTER TABLE BUILD_RESULT_PROPERTY ADD CONSTRAINT PROPERTY_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE ARTIFACT (
C_ID BIGINT NOT NULL,
A_CHECKSUM BIGINT,
A_TYPE VARCHAR(256) NOT NULL,
A_NAME CHARACTER(128) NOT NULL,
A_SIZE BIGINT
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX A_NAME_TYPE_NDX ON ARTIFACT (A_NAME ASC, A_TYPE ASC);
CREATE INDEX A_NAME_NDX ON ARTIFACT (A_NAME ASC);
ALTER TABLE ARTIFACT ADD CONSTRAINT A_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE ARTIFACT_CONTENT (
C_ID BIGINT NOT NULL,
CONTENT_DATA BLOB(100M)
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
ALTER TABLE ARTIFACT_CONTENT ADD CONSTRAINT CONTENT_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE PERMISSIONS (
C_ID BIGINT NOT NULL,
P_MANAGED_ID BIGINT NOT NULL,
P_OWNER CHARACTER(30) NOT NULL,
P_PERMISSION int,
P_TEAM CHARACTER(30)
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
ALTER TABLE PERMISSIONS ADD CONSTRAINT P_CID_NDX PRIMARY KEY (C_ID);
CREATE TABLE LF_DEP_MAPPING (
LF_ID BIGINT NOT NULL,
DEP_ID BIGINT NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX LF_DEP_MAP_LFID_NDX ON LF_DEP_MAPPING (LF_ID ASC);
CREATE INDEX LF_DEP_MAP_DEPID_NDX ON LF_DEP_MAPPING (DEP_ID ASC);
ALTER TABLE LF_DEP_MAPPING ADD CONSTRAINT LF_DEP_MAP_NDX PRIMARY KEY (LF_ID, DEP_ID);
CREATE TABLE COL_LF_MAPPING (
COLLECTION_ID BIGINT NOT NULL,
LF_ID BIGINT NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX COL_LF_MAP_COLID_NDX ON COL_LF_MAPPING (COLLECTION_ID ASC);
CREATE INDEX COL_LF_MAP_LFID_NDX ON COL_LF_MAPPING (LF_ID ASC);
ALTER TABLE COL_LF_MAPPING ADD CONSTRAINT COL_LF_MAP_NDX PRIMARY KEY (COLLECTION_ID, LF_ID);
CREATE TABLE BR_REPORT_MAPPING (
BR_ID BIGINT NOT NULL,
REP_ID BIGINT NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX BR_REP_MAP_BRID_NDX ON BR_REPORT_MAPPING (BR_ID ASC);
CREATE INDEX BR_REP_MAP_REPID_NDX ON BR_REPORT_MAPPING (REP_ID ASC);
ALTER TABLE BR_REPORT_MAPPING ADD CONSTRAINT BR_REP_MAP_NDX PRIMARY KEY (BR_ID, REP_ID);
CREATE TABLE BR_REPORT_DATA_MAPPING (
BR_ID BIGINT NOT NULL,
REP_D_ID BIGINT NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX BR_REP_D_MAP_BRID_NDX ON BR_REPORT_DATA_MAPPING (BR_ID ASC);
CREATE INDEX BR_REP_D_MAP_REPDID_NDX ON BR_REPORT_DATA_MAPPING (REP_D_ID ASC);
ALTER TABLE BR_REPORT_DATA_MAPPING ADD CONSTRAINT BR_REP_D_MAP_NDX PRIMARY KEY (BR_ID, REP_D_ID);
CREATE TABLE BR_ATTACHMENT_MAPPING (
BR_ID BIGINT NOT NULL,
ATTACHMENT_ID BIGINT NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX BR_ATTACHMENT_MAP_BRID_NDX ON BR_ATTACHMENT_MAPPING (BR_ID ASC);
CREATE INDEX BR_ATTACHMENT_MAP_ATTACHMENTID_NDX ON BR_ATTACHMENT_MAPPING (ATTACHMENT_ID ASC);
ALTER TABLE BR_ATTACHMENT_MAPPING ADD CONSTRAINT BR_ATTACHMENT_MAP_NDX PRIMARY KEY (BR_ID, ATTACHMENT_ID);
CREATE TABLE BR_PROP_MAPPING (
BR_ID BIGINT NOT NULL,
PROP_ID BIGINT NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX BR_PROP_MAP_BRID_NDX ON BR_PROP_MAPPING (BR_ID ASC);
CREATE INDEX BR_PROP_MAP_PROPID_NDX ON BR_PROP_MAPPING (PROP_ID ASC);
ALTER TABLE BR_PROP_MAPPING ADD CONSTRAINT BR_PROP_MAP_NDX PRIMARY KEY (BR_ID, PROP_ID);
CREATE TABLE A_CONTENT_MAPPING (
A_ID BIGINT NOT NULL,
CONTENT_ID BIGINT NOT NULL
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
CREATE INDEX A_CONTENT_MAP_AID_NDX ON A_CONTENT_MAPPING (A_ID ASC);
CREATE INDEX A_CONTENT_MAP_CONTENTID_NDX ON A_CONTENT_MAPPING (CONTENT_ID ASC);
ALTER TABLE A_CONTENT_MAPPING ADD CONSTRAINT A_CONTENT_MAP_NDX PRIMARY KEY (A_ID, CONTENT_ID);
ALTER TABLE COLLECTION ADD CONSTRAINT UNQ_COLLECTION_0 UNIQUE (C_NAME);
ALTER TABLE BUILD_RESULT ADD CONSTRAINT UNQ_BUILD_RESULT_0 UNIQUE (BR_GROUP, BR_LABEL);
ALTER TABLE PERMISSIONS ADD CONSTRAINT UNQ_PERMISSIONS_0 UNIQUE (P_MANAGED_ID);
ALTER TABLE COLLECTION ADD CONSTRAINT CLLCTONPRMSSONSCID FOREIGN KEY (PERMISSIONS_C_ID) REFERENCES PERMISSIONS (C_ID);
ALTER TABLE BUILD_RESULT ADD CONSTRAINT BLDRSLTPRMSSONSCID FOREIGN KEY (PERMISSIONS_C_ID) REFERENCES PERMISSIONS (C_ID);
ALTER TABLE LOGICAL_FILE ADD CONSTRAINT LOGICALFILELANG_ID FOREIGN KEY (LANG_ID) REFERENCES LF_LANGUAGES (C_ID);
ALTER TABLE LOGICAL_DEPENDENCY ADD CONSTRAINT LGCLDPNDENCYLBRRYD FOREIGN KEY (LIBRARY_ID) REFERENCES LD_LIBRARIES (C_ID);
ALTER TABLE LOGICAL_DEPENDENCY ADD CONSTRAINT LGCLDPNDENCYCTGRYD FOREIGN KEY (CATEGORY_ID) REFERENCES LD_CATEGORIES (C_ID);
ALTER TABLE LF_DEP_MAPPING ADD CONSTRAINT LFDEPMAPPINGDEP_ID FOREIGN KEY (DEP_ID) REFERENCES LOGICAL_DEPENDENCY (C_ID);
ALTER TABLE LF_DEP_MAPPING ADD CONSTRAINT LFDEP_MAPPINGLF_ID FOREIGN KEY (LF_ID) REFERENCES LOGICAL_FILE (C_ID);
ALTER TABLE COL_LF_MAPPING ADD CONSTRAINT CLLFMPPINGCLLCTNID FOREIGN KEY (COLLECTION_ID) REFERENCES COLLECTION (C_ID);
ALTER TABLE COL_LF_MAPPING ADD CONSTRAINT COLLF_MAPPINGLF_ID FOREIGN KEY (LF_ID) REFERENCES LOGICAL_FILE (C_ID);
ALTER TABLE BR_REPORT_MAPPING ADD CONSTRAINT BRRPORTMAPPINGRPID FOREIGN KEY (REP_ID) REFERENCES ARTIFACT (C_ID);
ALTER TABLE BR_REPORT_MAPPING ADD CONSTRAINT BRREPORTMAPPINGBRD FOREIGN KEY (BR_ID) REFERENCES BUILD_RESULT (C_ID);
ALTER TABLE BR_REPORT_DATA_MAPPING ADD CONSTRAINT BRRPRTDTMPPINGRPDD FOREIGN KEY (REP_D_ID) REFERENCES ARTIFACT (C_ID);
ALTER TABLE BR_REPORT_DATA_MAPPING ADD CONSTRAINT BRRPRTDTMAPPINGBRD FOREIGN KEY (BR_ID) REFERENCES BUILD_RESULT (C_ID);
ALTER TABLE BR_ATTACHMENT_MAPPING ADD CONSTRAINT BRATTACHMENTMAPPINGATTACHMENT_ID FOREIGN KEY (ATTACHMENT_ID) REFERENCES ARTIFACT (C_ID);
ALTER TABLE BR_ATTACHMENT_MAPPING ADD CONSTRAINT BRATTACHMENT_MAPPINGBR_ID FOREIGN KEY (BR_ID) REFERENCES BUILD_RESULT (C_ID);
ALTER TABLE BR_PROP_MAPPING ADD CONSTRAINT BRPROPMAPPINGPRPID FOREIGN KEY (PROP_ID) REFERENCES BUILD_RESULT_PROPERTY (C_ID);
ALTER TABLE BR_PROP_MAPPING ADD CONSTRAINT BRPROPMAPPINGBR_ID FOREIGN KEY (BR_ID) REFERENCES BUILD_RESULT (C_ID);
ALTER TABLE A_CONTENT_MAPPING ADD CONSTRAINT CNTNTMAPPINGCNTNTD FOREIGN KEY (CONTENT_ID) REFERENCES ARTIFACT_CONTENT (C_ID);
ALTER TABLE A_CONTENT_MAPPING ADD CONSTRAINT ACONTENTMAPPINGAID FOREIGN KEY (A_ID) REFERENCES ARTIFACT (C_ID);
CREATE TABLE DBB_SEQ_TABLE (
DBB_SEQ_NAME VARCHAR(50) NOT NULL,
DBB_SEQ_VALUE DECIMAL(15),
PRIMARY KEY (DBB_SEQ_NAME)
)
DATA CAPTURE NONE
IN DATABASE DBBZGLB;
INSERT INTO DBB_SEQ_TABLE(DBB_SEQ_NAME, DBB_SEQ_VALUE) values ('DBB_ID_SEQ', 0);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('COLLECTION', 2);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('LOGICAL_FILE', 2);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('LOGICAL_DEPENDENCY', 1);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('ARTIFACT', 2);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('BUILD_RESULT', 2);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('PERMISSIONS', 2);
We then submitted the script for the database creation through the data perspective in IBM Developer for z/OS (IDz).
Additionally, the new DBB metadata store API required us to grant permissions to the user connecting to the Db2z database. We achieved this with the SQL script provided in section 1.3 ("Authorize user access to the database") of the documentation page Setting up Db2 as the build metadata database.
Migrate existing database contents
To support the database migration between different flavors of database managers, IBM provides a new DBB database migration utility on request to move the content of DBB tables from one database to another. You can access this new utility by reaching out to your IBM support team. We leveraged this new utility to migrate our existing data (DBB collections and build results) from Derby to our Db2z instance.
The utility is a Java application that reads the contents from the source database system and stores them in the provided target database via the JDBC driver. When you are considering a Db2 to Db2 migration, we recommend leveraging the Db2 migration capabilities. Below is our output from running the DBB database migration utility on z/OS.
Note: In our case, we are defining the correct target database schema by using the currentSchema
property specified via the JDBC connection URL.
java -cp dbb.database.migration.util-0.9.0.jar::/opt/DBB-1.1.3-GitLab/wlp/usr/shared/resources/db2/*:/opt/DBB-1.1.3-GitLab/wlp/usr/shared/resources/derby/lib/* com.ibm.dbb.database.migration.MigrateDatabase
* DBB Database migration util *
* -------------------------- *
** Prompting to specify source and target dbms information
Enter your source dbms information
Source dbms [Derby, Db2]: Derby
url: jdbc:derby://10.3.20.96:1527//opt/DBB-1.1.3-GitLab/wlp/usr/servers/dbb/DBB_DATABASE
userid:
password:
Enter your target dbms information
Target dbms [Derby, Db2]: Db2
url: jdbc:db2://10.3.20.201:4740/MOPDBC0:currentSchema=DBBGITLAB;
userid: DBEHM
password: xxxxxx
** Establishing JDBC connections
**** Create the connection to Derby database using: jdbc:derby://10.3.20.96:1527//opt/DBB-1.1.3-GitLab/wlp/usr/servers/dbb/DBB_DATABASE
**** Create the connection to DB2z database using: jdbc:db2://10.3.20.201:4740/MOPDBC0:currentSchema=DBBGITLAB;
** Starting Database Migration
DBB_TABLE_VERSIONS
Updating table
PERMISSISONS
Updating table
LF_LANGUAGES
Updating table
LD_LIBRARIES
Updating table
LD_CATEGORIES
Updating table
LOGICAL_DEPENDENCY
Updating table
LOGICAL_FILE
Updating table
LF_DEP_MAPPING
Updating table
COLLECTION
Updating table
COL_LF_MAPPING
Updating table
ARTIFACT
Updating Table
BUILD_RESULT
Updating table
BR_REPORT_MAPPING
Updating table
BR_REPORT_DATA_MAPPING
Updating Table
BR_ATTACHMENT_MAPPING
Updating Table
BUILD_RESULT_PROPERTY
Updating table
BR_PROP_MAPPING
Updating table
ARTIFACT_CONTENT
Updating Table
A_CONTENT_MAPPING
Updating Table
** Migration Summary
Added table elements: 47826
Updated table elements: 0
Skipped table elements: 6
** Closing JDBC connections
** Database Migration Completed
Configure the DBB WebApp to leverage Db2z as the datastore
For the last step of the datastore migration process, we needed to reconfigure the DBB WebApp to point to the Db2z instance that we just migrated to. This step is documented in DBB's 1.1 documentation in the chapter Setting up Db2 as DBB server database.
To implement this change, we stepped through the following process:
- Log on to the Linux machine that hosts the DBB WebApp server, preferably with SSH or any other facility that allows you to edit file content.
- Create a configuration file
<server>/wlp/usr/servers/dbb/configDropins/overrides/databaseConfig.xml
that defines the connection to Db2z. A sample is located in <server>/wlp/usr/servers/dbb/config_samples/db2zDatabaseConfig.xml
and we used the following snippet in our environment setup:
<jdbcDriver id="db2zJDBCdriver">
<library name="DB2Lib">
<fileset dir="${shared.resource.dir}/db2" includes="*.jar"/>
</library>
</jdbcDriver>
<dataSource id="dbbConnection" jdbcDriverRef="db2zJDBCdriver" jndiName="jdbc/dbbConnection" transactional="false">
<properties.db2.jcc driverType="4" serverName="10.3.20.201" portNumber="4740" user="DBUSER" password="DBPWD" databaseName="MOPDBC0" />
</dataSource>
...
- If you choose to use a different database schema than the default
DBBZ
schema, don't forget to add your custom schema name to the dbb.properties
file located at <server>/wlp/usr/servers/dbb/dbb.properties
. The following snippet shows how we set our DBB database schema to the same `DBBGITLAB` schema we used when creating the new DB2z datastore.
#com.ibm.dbb.persistence.dbSchema defines the customized schema for the DBB database. By default, the schema is DBBZ.
#This value along with the dbSchemaPrefix must match the value used in the create sql scripts.
com.ibm.dbb.persistence.dbSchema = DBBGITLAB
We then restarted the DBB WebApp server, enabling it to now use the Db2z database to store the DBB high-level objects.
Conclusion
In this blog post, we explained how we migrated our existing DBB metadata from DBB 1.1.3's built-in Derby database to a Db2z instance. So far, CI/CD pipelines and applications would not notice any difference, as we are still using DBB 1.1.3 as our build engine.
In our next blog post, we will discuss the analysis and steps we took to understand the required changes to be implemented to our existing CI/CD environment.
Authors of this post
Lauren Li, DevOps Acceleration Team
Mathieu Dalbin, DevOps Acceleration Team
Dennis Behm, DevOps Acceleration Team