Maximo Application Suite

MAS – Techno‑Functional

Search This Blog

Monday, May 18, 2026

MAS - Offline DB2 Backup on OpenShift: A Field-Tested Runbook for Maximo Architects

 

Offline DB2 Backup on OpenShift: A Field-Tested Runbook for Maximo Architects

Why This Is Different From Every DB2 Backup Guide You've Read Before

If you've spent years managing Db2 on traditional bare-metal or VM-based Maximo deployments, the mental model you've built — SSH to the server, switch to the instance owner, run db2 backup — is mostly intact when moving to MAS on OpenShift (OCP). What changes, subtly but critically, is where you run each command. Get this wrong and you'll see cryptic permission errors, SQL1092N, or worse, a backup that completes without error but is internally corrupted.

This article builds a precise mental model around the three execution contexts that govern every DB2 operation on OCP, then walks through a complete offline backup runbook — with the kind of operational nuance that doesn't make it into official IBM documentation.


The Mental Model: Three Domains, Three Identities

The single most common mistake when operating DB2 on OCP is domain confusion — running a DB2 command in the OCP control plane, or trying to use oc commands from inside the container. Understanding the three distinct execution domains is the prerequisite for everything else.

┌─────────────────────┐     oc exec     ┌──────────────────────┐     su -     ┌─────────────────┐
│  Domain 1           │ ──────────────► │  Domain 2            │ ───────────► │  Domain 3       │
│  OCP Control Plane  │                 │  Container OS        │              │  DB2 Engine     │
│  Role: cluster-admin│                 │  Role: root →        │              │  Role: db2inst1 │
│  Tools: oc get,     │                 │        db2inst1      │              │  Tools: db2,    │
│         oc exec     │                 │  Tools: su, cd, ls   │              │         db2ckbkp│
└─────────────────────┘                 └──────────────────────┘              └─────────────────┘

Domain 1 — OCP Control Plane: Your local terminal where oc commands are authoritative. This domain manages Kubernetes/OpenShift objects: namespaces, pods, PVCs. It has zero awareness of DB2 semantics. Running db2 list db directory here simply results in "command not found."

Domain 2 — Container OS: The shell session inside the DB2 pod, reached via oc exec. You land here as root (or a restricted UID depending on your SCC configuration). DB2 binaries exist here, but the DB2 environment variables, profile, and instance permissions are only loaded after you switch to the instance owner.

Domain 3 — DB2 Engine: The shell session after running su - db2inst1. The hyphen (-) is not optional — it performs a full login shell switch, sourcing ~/.bash_profile which loads DB2INSTANCE, DB2DIR, library paths, and the rest of the DB2 environment. Without the hyphen, you'll have the wrong PATH and DB2 commands will either fail or behave unpredictably.

Critical nuance for MAS environments: In some MAS DB2U operator deployments, the instance owner may not be named db2inst1. Always verify with cat /etc/passwd | grep db2 from within the container before proceeding.


Pre-Flight: Locating the Right Pod

MAS on OCP deploys DB2 via the DB2U operator, which creates a StatefulSet. Understanding the naming convention saves you from running the backup against a standby or an auxiliary pod.

Step 1 — Identify the namespace

oc get namespaces | grep -i db2

In a standard MAS deployment, the DB2 namespace typically follows the pattern db2u-<suffix> or may be deployed within the MAS instance namespace (e.g., mas-<instanceid>-core). In HA configurations, DB2U may have its own dedicated namespace.

# List all pods across all namespaces matching DB2 patterns
oc get pods -A | grep db2u

Step 2 — Identify the primary engine pod

oc get pods -n <NAMESPACE> | grep db2u

The pod naming convention for DB2U StatefulSets appends -db2u-0 to the release name. For example: c-db2oltp-wh-db2u-0.

Why -db2u-0 matters: In a high-availability or HADR configuration, -db2u-0 designates the primary (active) database engine. Pods with higher ordinal suffixes (e.g., -db2u-1) are standby nodes. Running an offline backup against a standby is not only ineffective — it can cause the primary to behave unexpectedly if the standby transitions to a primary role mid-backup.

# Confirm pod status and readiness before proceeding
oc get pod c-db2oltp-wh-db2u-0 -n <NAMESPACE> -o wide

Verify the pod shows Running with all containers in Ready state. A pod in CrashLoopBackOff or with degraded readiness containers indicates a pre-existing issue that must be resolved before attempting any backup.


Entering the Engine: Shell Access and Identity Switching

Step 3 — Open an interactive session in the DB2 pod

oc exec -it c-db2oltp-wh-db2u-0 -n <NAMESPACE> -- bash

The -- separator is important when your pod name or namespace contains characters that could be misinterpreted by the shell. After this command, you are inside Domain 2 (Container OS).

Security context consideration: Depending on your OCP Security Context Constraints (SCC), you may land as a non-root UID. Check with whoami and id. You need the ability to su to the DB2 instance owner. If your SCC restricts this, work with your OCP cluster administrator to use a service account with the anyuid SCC or equivalent — this is standard for DB2U deployments.

Step 4 — Switch to the DB2 instance owner

su - db2inst1

After this switch, confirm the environment is correctly loaded:

# These should all return valid paths
echo $DB2INSTANCE
echo $DB2DIR
db2 get instance

Expected output from db2 get instance:

 The current database manager instance is:  db2inst1

If db2 get instance returns an error at this stage, the DB2 instance is not running. You'll need to start it with db2start before proceeding.


Target Acquisition: Confirming the Database Name

Step 5 — List all databases managed by the instance

db2 list db directory

This command queries the system database directory and lists every database catalogued on this instance. In a MAS environment you will typically see:

  • BLUDB — the primary Maximo application database (default name used by DB2U)
  • Potentially TESTDB or staging databases if the instance hosts multiple environments

Sample output:

 System Database Directory

 Number of entries in the directory = 1

Entry 1:
 Database alias                       = BLUDB
 Database name                        = BLUDB
 Local database directory             = /mnt/blumeta0
 Database release level               = f.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =

Note the Local database directory — this is the path inside the container where DB2 metadata and configuration files live. It is separate from the persistent volume path where backup images will be written.

Architectural note for MAS: In DB2U deployments, the database storage is backed by Persistent Volume Claims (PVCs). The database directory (/mnt/blumeta0) and the data tablespace paths are all mounted PVs. This means the data persists across pod restarts, but the backup destination must also be on a mounted PV, not on ephemeral container storage — otherwise your backup disappears when the pod is recycled.


The Quiesce Phase: Achieving a Consistent Offline State

An offline backup requires the database to be fully deactivated — no active connections, no in-flight transactions, and all buffer pool pages flushed to disk. This is a two-step process.

Step 6 — Disconnect all active applications

db2 force applications all

This immediately terminates all connections to all databases on this instance. In a production Maximo environment, this means all MAS/Maximo application pods lose their DB2 connections simultaneously.

What happens to MAS pods when you do this:
Maximo application pods will begin logging connection errors and may start failing readiness/liveness probes. Depending on your MAS configuration, Kubernetes may begin restarting application pods. This is expected behaviour during a maintenance window. Ensure that:

  1. A change window has been communicated and MAS application pods are scaled down, or
  2. You have confirmed MAS is in maintenance mode with no active user sessions

To scale down MAS application components before backup (recommended approach):

# Scale down Maximo Manage server bundle (from Domain 1, OCP Control Plane)
# Run this BEFORE entering the DB2 pod
oc scale deployment <manage-deployment-name> --replicas=0 -n <MAS_NAMESPACE>

Step 7 — Deactivate the database

db2 deactivate db BLUDB

This command does more than just disconnect users — it triggers a clean shutdown of the database engine's services for BLUDB specifically:

  • All dirty pages in buffer pools are written (flushed) to the tablespace containers on disk
  • Database services (log writer, page cleaner, prefetcher threads) are stopped
  • The database transitions to a fully consistent, offline state

What distinguishes deactivate from simply disconnecting: A database can be "inactive" from a connection standpoint but still have a dirty buffer pool. deactivate guarantees the on-disk state is consistent — which is the whole point of an offline backup. You're capturing a clean, point-in-time snapshot with no recovery required upon restore.

Verify the database is offline:

db2 get db cfg for BLUDB | grep -i "First active log"

If the database is properly deactivated, attempting to connect should return SQL1032N ("No start database manager command was issued").


The Extraction: Running the Backup

Step 8 — Execute the backup

db2 backup database BLUDB to /mnt/backup/

Critical prerequisite — the backup destination must be a mounted PV:

Before running this command, verify the backup target directory:

# Confirm the path exists and is writable by db2inst1
ls -la /mnt/backup/
df -h /mnt/backup/

If /mnt/backup/ is not mounted to a PVC, your backup will be written to the container's ephemeral overlay filesystem and will be permanently lost when the pod restarts. In MAS/DB2U deployments, a backup PVC is typically pre-configured and mounted at a path like /mnt/backup — but verify this in your specific deployment.

To check PVC mounts for the pod (from Domain 1):

oc describe pod c-db2oltp-wh-db2u-0 -n <NAMESPACE> | grep -A5 "Volumes:"

Understanding the backup output:

A successful backup produces a timestamped image file. The filename format is:

BLUDB.0.db2inst1.DBPART000.YYYYMMDDHHMMSS.001

The components: database name, instance number, instance owner, partition identifier, timestamp, and sequence number. This naming is automatically generated by DB2 — do not rename backup files as DB2 uses this naming convention during recovery operations.

Backup duration considerations for MAS databases:
For active Maximo environments with years of work order, asset, and inspection data, database sizes of 50–500+ GB are common. An offline backup to a local PV is typically faster than network-based methods, but plan your maintenance window accordingly. Monitor progress:

# In another terminal/session, from Domain 1
oc exec c-db2oltp-wh-db2u-0 -n <NAMESPACE> -- du -sh /mnt/backup/

Verification: Never Trust an Unverified Backup

The instinct to consider the job done when db2 backup returns "completed successfully" is a dangerous one. The DB2 backup utility writes a backup image header and data pages, but file system or storage-layer issues can produce a file that appears complete but is internally corrupt. The only way to know for certain is to validate the image.

Step 9 — Confirm the backup file exists on disk

cd /mnt/backup && ls -lh

Note the full filename — you'll need it for the next step. Confirm the file size is non-zero and appears consistent with your database size.

Step 10 — Validate the backup image integrity

db2ckbkp /mnt/backup/BLUDB.0.db2inst1.DBPART000.YYYYMMDDHHMMSS.001

Replace the filename with the actual timestamped filename from Step 9.

db2ckbkp (DB2 Check Backup) scans the internal structure of the backup image and validates:

  • The backup header is intact and parseable
  • The image was written completely (no truncation)
  • Internal checksums match across data pages
  • The backup type, database name, and timestamp metadata are consistent

Successful output looks like:

[extract log header]
[extract database configuration]
...
The backup image /mnt/backup/BLUDB.0.db2inst1.DBPART000.YYYYMMDDHHMMSS.001 is valid.

The db2ckbkp utility exited successfully.

Any output containing "invalid", "corrupted", or a non-zero exit code means the backup cannot be trusted. In that case: do not reactivate the database, investigate the storage layer, and re-run the backup.

Operational best practice: Integrate db2ckbkp into your backup automation or runbook as a mandatory step. A backup without integrity validation is a liability, not an asset.


Reactivation: Bringing the Database Back Online

Step 11 — Reactivate the database

db2 activate db BLUDB

This performs the inverse of deactivate: it allocates buffer pool memory, starts background threads, and makes the database available for new connections.

Verify the database is active and accepting connections:

db2 connect to BLUDB
db2 "select count(*) from syscat.tables"
db2 disconnect BLUDB

A successful SELECT confirms the database engine is running and the data is accessible. Once verified, scale MAS application pods back up (from Domain 1):

oc scale deployment <manage-deployment-name> --replicas=<original-count> -n <MAS_NAMESPACE>

Cluster-Level Confirmation: Querying the DB2 History File

After reactivation, perform a final confirmation from the OCP control plane level — without re-entering the pod interactively. This is useful for automation, auditing, and confirming that the backup is formally registered in DB2's internal recovery history.

Step 12 — Query the DB2 backup history from Domain 1

oc exec c-db2oltp-wh-db2u-0 -n <NAMESPACE> -- \
  su - db2inst1 -c "db2 list history backup all for BLUDB"

This single command chains through all three domains in one shot: oc exec enters Domain 2, su - transitions to Domain 3, and db2 list history queries the recovery history file.

A registered backup entry in the history file confirms that DB2 itself recognises the backup as valid and available for restore operations. This is distinct from file-level existence — the history file is what DB2's restore and rollforward commands consult when building a recovery plan.

Sample output showing a confirmed backup:

                    List History File for BLUDB

 Number of matching file entries = 1

 Op  Obj  Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
 --- ---- ------------------ ---- --- ------------ ----------- --------------
  B  D  20250518120000001   F                                  
 ----------------------------------------------------------------------------
  Contains 4 tablespace(s):
  ...
  Comment: DB2 BACKUP BLUDB OFFLINE
  Start Time: 20250518120000
  End Time:   20250518121532
  Status: A
 ----------------------------------------------------------------------------
   EID: 1 Location: /mnt/backup

The Status: A (Active) confirms this is a usable backup. F under Type indicates a Full offline backup.


The Complete Runbook: At a Glance

Phase Domain Command Purpose
LOCATE OCP Control Plane oc get namespaces Find the DB2 namespace
LOCATE OCP Control Plane oc get pods -n <NS> | grep db2u Identify the primary pod
ISOLATE Container OS oc exec -it <POD> -n <NS> -- bash Enter the container
ISOLATE Container OS su - db2inst1 Switch to instance owner
ISOLATE DB2 Engine db2 list db directory Confirm database name
ISOLATE DB2 Engine db2 force applications all Disconnect all users
ISOLATE DB2 Engine db2 deactivate db BLUDB Quiesce the database
EXTRACT DB2 Engine db2 backup database BLUDB to /mnt/backup/ Run the backup
VERIFY DB2 Engine cd /mnt/backup && ls -lh Confirm file exists
VERIFY DB2 Engine db2ckbkp /mnt/backup/<FILENAME> Validate image integrity
RESTORE DB2 Engine db2 activate db BLUDB Bring database online
CONFIRM OCP Control Plane oc exec ... -c 'db2 list history backup all for BLUDB' Verify history registration

Common Failure Scenarios and Remediation

SQL1035N: The database is currently in use when running deactivate
Cause: force applications all didn't terminate all connections cleanly — possibly due to a connection with CONNECT_TIMEOUT retrying. Wait 30–60 seconds and rerun db2 force applications all before re-attempting deactivate.

SQL2062N: An error occurred while accessing media during backup
Cause: The backup destination path is not writable, the filesystem is full, or the PVC mount is unavailable. Verify with df -h /mnt/backup/ and check PVC binding status from the OCP control plane.

db2ckbkp reports corrupt image
Cause: Storage I/O errors during write, pod resource constraints, or a storage class without proper write guarantees. Check the pod's events (oc describe pod) and the underlying storage class. Do not use this backup for restore. Re-run from Step 7.

su - db2inst1 fails with "authentication failure"
Cause: SCC restrictions on UID switching. The DB2U pod requires the anyuid SCC. Verify with oc get pod <POD> -o yaml | grep -i scc and engage your OCP administrator.


Architectural Considerations for MAS Production Environments

Backup frequency and log management: Offline backups capture a consistent point-in-time image but require downtime. For production MAS environments where zero downtime is required, consider online backups with archive logging — this allows backup during active workloads but requires log archiving to be configured (LOGARCHMETH1). The offline procedure above is ideal for scheduled maintenance windows, DR testing, and pre-upgrade snapshots.

Backup image externalisation: The backup image on /mnt/backup/ is still inside your OCP cluster. For true DR capability, the backup must be copied to an external target — object storage (IBM Cloud Object Storage, S3-compatible), a network filesystem, or a dedicated backup appliance. Automate this with a Kubernetes Job or a CronJob that runs oc exec to trigger the backup and then mounts an S3-compatible volume for externalisation.

Pre-upgrade snapshot strategy: Before applying any MAS or DB2U operator upgrade, an offline backup is your rollback safety net. Combine this with an OCP oc get export of all relevant Custom Resources (the MAS, ManageApp, and Db2uCluster CRs) to ensure full recovery capability if the upgrade fails mid-flight.

HADR considerations: If your deployment uses DB2 HADR, an offline backup against the primary (-db2u-0) also serves as the basis for re-initialising a standby from scratch. After a primary restore from backup, the standby must be re-seeded from the primary using the standard HADR initialisation procedure — the old standby's data files are no longer consistent with the restored primary.


This runbook reflects field experience with MAS 8.x and 9.x on OCP 4.x deployments. Always validate procedures against your specific DB2U operator version and test restore procedures in a non-production environment before relying on them for production recovery.

Monday, April 13, 2026

MAS : Architecting the Modern Airport: Integrating BHS with IBM Maximo Monitor

Architecting the Modern Airport: Integrating BHS with IBM Maximo Monitor

A deep dive into bridging Operational Technology (OT) with AI-driven Cloud Analytics.

In the high-stakes environment of airport operations, the Baggage Handling System (BHS) is the heartbeat of the terminal. For a Maximo Architect, the challenge lies in successfully bridging the gap between heavy industrial machinery (SCADA) and cloud-based AI analytics (IoT).

This post breaks down the end-to-end integration architecture between Pteris Global BHS and IBM Maximo Monitor, utilizing OPC-UA, MQTT, and containerized gateways.

I. The Architectural Blueprint

The integration follows a secure multi-zone pattern, moving data from the physical shop floor through a secure DMZ and finally into the Enterprise IoT Platform (Azure/Cloud).



Visualizing the flow from On-Prem BHS → OT DMZ → Maximo Monitor (Red Hat OpenShift)

II. Deep Dive into Underlying Terminology

1. Pteris Global BHS & MDS

The Baggage Handling System (BHS) relies on a Main Deck System (MDS) driven by PLCs. These are the physical sources of truth for every bag's location and every motor's health.

2. KEPWARE Server (The Protocol Converter)

Industrial hardware often speaks proprietary languages. Kepware acts as the universal translator, aggregating PLC data and exposing it via a standardized OPC-UA interface.

3. OT DMZ & Podman

The OT DMZ is a secure buffer zone. Here, we host the Managed Gateway inside a container. We use Podman because it is a daemonless engine, providing the high security required for industrial networks compared to traditional Docker setups.

4. MQTT (The IoT Standard)

While OPC-UA handles the internal wired integration, MQTT handles the wireless cloud integration. It is a lightweight, publish-subscribe protocol that pushes data through the firewall to the Maximo IoT platform.

III. Configuration & Implementation Roadmap

  1. On-Prem Connectivity: Map PLC memory addresses in the BHS to Kepware tags (e.g., vibration, temperature, belt status).
  2. Infrastructure Readiness: Provision a Linux VM in the OT DMZ. Install Podman and ensure the Infra team whitelists the necessary URLs for outbound communication to the IT network.
  3. Managed Gateway Deployment: Deploy the containerized gateway. Configure it as an OPC-UA client to Kepware and an MQTT publisher to Maximo Monitor.
  4. Maximo Monitor Logic: In the IBM Maximo Application Suite (MAS), define Device Types and Physical Interfaces. Use the Analytica Engine to set up AI functions for anomaly detection.
  5. Dashboard Integration: Build integrated dashboards in Maximo Monitor that visualize real-time BHS health and trigger Work Orders in Maximo Manage when thresholds are breached.

The Architect's Verdict

By integrating SCADA systems with Maximo Monitor, we move from reactive "fix-on-fail" maintenance to a proactive, data-driven strategy. This architecture ensures that even with complex BHS hardware, the operations team has a single pane of glass for asset health across the entire airport.

Expert Insights for Maximo & IoT Architects

Tuesday, March 24, 2026

MAS - A Hidden Maximo MAS Tip: Restore Advanced Search in Self Service Requests

Restore Advanced Search in Self Service Requests

If you are using IBM Maximo Application Suite (MAS) and have enabled Self Service Service Requests, you may have noticed that the Advanced Search and Save Query options are no longer visible.

This can be frustrating because Advanced Search is essential for filtering records by date ranges, especially when users want to review service requests for a specific period.

The good news is that this is not a defect. There is a simple system-level configuration that restores both options.


The Problem

In MAS, when users access:

Self Service → Service Requests

the UI no longer shows:

  • Advanced Search
  • Save Query

This limits the ability to:

  • Search using date ranges
  • Create reusable queries
  • Analyze historical service request data without custom reports

The Solution – Enable the Search Menu Bar

You can bring back both Advanced Search and Save Query by configuring a system property.

Configuration Steps

  1. Go to System Configuration → Platform Configuration → System Properties
  2. Click New Row
  3. Configure the property as shown below

Property Name   : mxe.webclient.searchMenubar
Description     : Search Menu Bar
Global Value    : 0
Maximo Default  : 0
  1. Save the property
  2. From the Select Action menu, click Live Refresh
  3. Log out and log back into Maximo

Result

After logging back in:

  • Advanced Search is visible again
  • Save Query is available
  • Users can perform date-range searches in Self Service Service Requests

No UI customization, no JavaScript changes, and no redeployment are required.


Why This Matters

For operational teams such as ITSM, facilities, airports, or utilities, date-based filtering is critical for:

  • SLA tracking
  • Monthly and weekly trend analysis
  • Operational reporting and reviews

This small configuration change can significantly improve usability and productivity for self-service users.


Credits

Thanks to the excellent IBM Support team for this tip. It came just in time, as I was preparing to record a podcast episode on Self Service Service Requests and was able to update the content accordingly.

If you are working with MAS and Self Service, this is one of those hidden but high-impact settings every Maximo administrator should be aware of.

Wednesday, February 25, 2026

MAS - Creating and configuring API keys for push notifications

Push notifications in IBM Maximo Application Suite (MAS) Manage allow field technicians and users to receive real-time alerts on their mobile devices — without having to manually refresh or stay logged in. Before any notification can be delivered, you need to generate an API Key from IBM's Push Notification service and then configure it inside MAS Administration. This article walks you through every step with full explanation of what each setting does and why it matters.

💡 Who needs this? MAS Administrators setting up mobile push notifications for Maximo Manage users on iOS or Android devices. This is a one-time setup per MAS environment (DEV / TEST / PROD each need their own API Key).

🔔 What Are Push Notifications in MAS Manage?

MAS Manage supports sending push notifications directly to users' mobile devices via the IBM MAS Mobile app. These can include workflow approvals, assignment alerts, work order updates, and service request status changes. The mechanism relies on IBM's hosted Push Notification service, which acts as the delivery bridge between MAS and the device.

The integration requires two things to be in place:

  1. An API Key generated from the IBM Push Notification portal, which authorises MAS to send messages via the service.
  2. The API Key and endpoint URL configured inside MAS Administration so the platform knows where and how to route notification requests.
⚠️ Upgrading from a Previous Version?
If you are upgrading from an older version of Maximo Manage, you may have a saved (bookmarked) URL that is no longer valid. Always double-check any previously saved portal URLs before following the steps below — IBM may have updated the endpoint.

🔑 Part 1 — Generating the API Key

The first part of the process is performed outside of MAS, directly on IBM's Push Notification portal. You will need a valid IBM ID to authenticate.

Step 1 — Open the Push Notification Portal

Open a browser and navigate to the IBM Push Notification authentication page:

https://pushnotification.suite.maximo.com/pushnotification/auth
📌 Tip: Use a browser that is not behind a strict corporate proxy for this step. Some enterprise proxies block external IBM portal traffic. If the page doesn't load, try from an alternate network or raise it with your network team.
Step 2 — Sign In with IBM ID

On the portal page, click "Sign in or up". You will be redirected to IBM's identity provider (IBMid). Log in using your registered IBM ID credentials. If you don't have one, you can register for free at ibm.com.

Step 3 — Create and Generate the API Key

Once authenticated:

  1. Enter a meaningful name for your API Key (e.g., MAS-PROD-PushNotif or MAS-TEST-PushNotif). Using environment-specific names makes key management easier if you're running multiple MAS instances.
  2. Click "Generate API Key".
  3. The portal will display the generated API Key value. Copy this immediately — the key will not be shown again once you leave the page.
⚠️ Important: Store the copied API Key securely (e.g., in a password manager or your organisation's secrets vault). If you lose it, you will need to generate a new one and reconfigure MAS.

⚙️ Part 2 — Configuring the API Key in MAS Administration

With the API Key copied, switch over to your MAS environment to complete the configuration.

Step 1 — Log in to Maximo Application Suite

Log in to your MAS environment with an account that has Suite Administration privileges.

Step 2 — Navigate to Push Notification Settings
  1. Click the Administration icon (the gear/cog icon) from the MAS home screen.
  2. Select Configurations from the left-hand navigation.
  3. Under the "Users and identity" section, click "Push Notification".
Step 3 — Enter the Push Notification Configuration

Click "Edit" and populate the three fields as follows:

Field Value to Enter Notes
Bundle Identifier com.ibm.iot.maximo.mobile This is the iOS/Android app bundle ID for the IBM MAS Mobile app. Do not change this value.
URL https://pushnotification.suite.maximo.com/pushnotification/sendMessage IBM's hosted push notification delivery endpoint. This is the URL MAS will POST messages to.
API Key Your generated API Key value Paste the key you copied from the IBM Push Notification portal in Part 1.
Step 4 — Save the Configuration

Click "OK" to save the configuration. MAS will now use these credentials to dispatch push notifications to mobile users.

Tip: After saving, ask a test user to log in via the MAS Mobile app and trigger a notification (e.g., a workflow assignment). Verify that the notification arrives on their device within a few seconds to confirm the integration is working end-to-end.

📋 Quick Reference Summary

Activity Where Who
Generate API Key pushnotification.suite.maximo.com IBM ID account holder
Configure Push Notification MAS Admin → Configurations → Users & Identity MAS Suite Administrator
Bundle Identifier com.ibm.iot.maximo.mobile Fixed value — do not change
Push URL pushnotification.suite.maximo.com/pushnotification/sendMessage IBM hosted endpoint

🔍 Things to Watch Out For

API Key Rotation: IBM does not enforce automatic expiry on these keys, but it is good security practice to rotate them periodically (e.g., annually) or immediately after a staff change where someone who held the key leaves the organisation. After rotation, you must update the API Key in MAS Administration.

Multiple Environments: If you run separate DEV, TEST, and PROD MAS environments, generate a separate API Key for each. This ensures notifications from a test environment don't inadvertently route through your production key.

Firewall / Outbound Connectivity: MAS needs outbound HTTPS access to pushnotification.suite.maximo.com on port 443. Ensure your MAS Manage pods / nodes are not blocked by network policies or firewall rules from reaching this endpoint.

Mobile App Version: Ensure your users have a version of the IBM MAS Mobile app that supports push notifications for your version of MAS Manage. Older app versions on older MAS releases may not fully support the push service.

📖 Official IBM Documentation: This article is based on the IBM Maximo Application Suite documentation for Maximo Manage (Continuous Delivery). For the latest updates, always refer to the official IBM Docs page:
IBM Docs – Creating and configuring API keys for push notifications

Tuesday, February 24, 2026

MAS : Estimating MAS AppPoints Using current Maximo 7.6 DB2 – A Complete SQL-Based Approach

Migrating from IBM Maximo Asset Management 7.6 to IBM Maximo Application Suite (MAS) requires a clear understanding of AppPoints, user persona classification, and peak concurrency. Many organizations struggle with this during modernization because licensing depends not only on the number of Maximo users, but also on: Peak concurrent usage User security profiles Installed Industry Solutions / Add-ons Required personas (Admin, Practitioner, Viewer) A reasonable buffer to avoid under-licensing This article simplifies the entire approach by providing a ready-to-run SQL script for DB2, which analyzes your Maximo 7.6 environment and produces: ✔ Peak concurrent users ✔ User-type suggestion ✔ AppPoints estimate ✔ AppPoints with 25% buffer ✔ Impact of Industry/Add-on Solutions (Transportation, SP, HSE, O&G, BIM, etc.) 💡 Why You Should Calculate AppPoints From Actual Maximo Usage IBM recommends sizing MAS AppPoints based on real historical data, not just user list counts. Relying on license seats or security groups often leads to: Overestimation → unnecessary licensing cost Underestimation → compliance risk during audits Incorrect persona mapping → Admins vs Practitioners vs Viewers not understood This SQL solves these problems by: Measuring actual concurrency using LOGINTRACKING Understanding what applications users really access Mapping them automatically into user personas Applying dynamic add‑on multipliers based on installed Industry Solutions 📌 Full DB2 SQL – MAS AppPoints Estimator for Maximo 7.6 Copy and paste directly into DB2 or Maximo Report/DB tool. -- ============================================ -- Maximo 7.6 (DB2) → MAS AppPoints Estimator -- ============================================ WITH CONFIG_PERIOD AS ( SELECT CURRENT TIMESTAMP - 90 DAYS AS START_TS, CURRENT TIMESTAMP AS END_TS FROM SYSIBM.SYSDUMMY1 ), CONFIG_USER_POINTS AS ( SELECT 'ADMIN' AS USER_TYPE, 10 AS POINTS_PER_USER FROM SYSIBM.SYSDUMMY1 UNION ALL SELECT 'PRACTITIONER', 5 UNION ALL SELECT 'VIEWER', 1 ), TXN_APPS AS ( SELECT 'WOTRACK' AS APP FROM SYSIBM.SYSDUMMY1 UNION ALL SELECT 'ASSET' UNION ALL SELECT 'INVENTOR' UNION ALL SELECT 'INVUSE' UNION ALL SELECT 'PO' UNION ALL SELECT 'PR' UNION ALL SELECT 'MR' UNION ALL SELECT 'LABREP' UNION ALL SELECT 'SR' ), HOURS_SERIES (TS) AS ( SELECT START_TS FROM CONFIG_PERIOD UNION ALL SELECT TS + 1 HOUR FROM HOURS_SERIES, CONFIG_PERIOD WHERE TS + 1 HOUR <= (SELECT END_TS FROM CONFIG_PERIOD) ), SESSIONS AS ( SELECT LT.USERID, LT.LOGINTIME AS LOGIN_TS, COALESCE(LT.LOGOUTTIME, CURRENT TIMESTAMP) AS LOGOUT_TS FROM LOGINTRACKING LT JOIN CONFIG_PERIOD P ON LT.LOGINTIME BETWEEN P.START_TS AND P.END_TS WHERE LT.ATTEMPTRESULT = 'SUCCESS' ), CONC_BY_HOUR AS ( SELECT H.TS AS HOUR_TS, COUNT(DISTINCT S.USERID) AS CONCURRENT_USERS FROM HOURS_SERIES H JOIN SESSIONS S ON S.LOGIN_TS <= H.TS + 1 HOUR AND S.LOGOUT_TS > H.TS GROUP BY H.TS ), PEAK_CONC AS ( SELECT COALESCE(MAX(CONCURRENT_USERS), 0) AS PEAK_CONCURRENT FROM CONC_BY_HOUR ), ACTIVE_USERS AS ( SELECT DISTINCT MU.USERID FROM MAXUSER MU WHERE MU.STATUS = 'ACTIVE' AND COALESCE(MU.LOGIN, 1) = 1 AND MU.USERID NOT IN ('MAXADMIN','MXINTADM','MXINTSYS','SPDEMO','WILSON') ), USER_GROUPS AS ( SELECT DISTINCT AU.USERID, GU.GROUPNAME FROM ACTIVE_USERS AU JOIN GROUPUSER GU ON AU.USERID = GU.USERID ), ADMINS AS ( SELECT DISTINCT USERID FROM USER_GROUPS WHERE UPPER(GROUPNAME) = 'MAXADMIN' ), GRP_HAS_TXN AS ( SELECT DISTINCT AA.GROUPNAME FROM APPLICATIONAUTH AA WHERE AA.APP IN (SELECT APP FROM TXN_APPS) ), PRACT_USERS AS ( SELECT DISTINCT UG.USERID FROM USER_GROUPS UG WHERE UG.GROUPNAME IN (SELECT GROUPNAME FROM GRP_HAS_TXN) ), USER_ROLES AS ( SELECT U.USERID, CASE WHEN EXISTS (SELECT 1 FROM ADMINS A WHERE A.USERID = U.USERID) THEN 'ADMIN' WHEN EXISTS (SELECT 1 FROM PRACT_USERS P WHERE P.USERID = U.USERID) THEN 'PRACTITIONER' ELSE 'VIEWER' END AS USER_TYPE FROM ACTIVE_USERS U ), TYPE_TOTALS AS ( SELECT USER_TYPE, COUNT(*) AS TOTAL_USERS FROM USER_ROLES GROUP BY USER_TYPE ), ALLOC_CONC AS ( SELECT T.USER_TYPE, T.TOTAL_USERS, (SELECT PEAK_CONCURRENT FROM PEAK_CONC) AS PEAK_CONCURRENT, DECIMAL( (T.TOTAL_USERS * 1.0) / NULLIF(SUM(T.TOTAL_USERS) OVER (), 0) * (SELECT PEAK_CONCURRENT FROM PEAK_CONC), 18, 4 ) AS CONCURRENT_EST FROM TYPE_TOTALS T ), ALLOC_CONC_R AS ( SELECT USER_TYPE, TOTAL_USERS, INTEGER(CEIL(CONCURRENT_EST)) AS CONCURRENT_USERS FROM ALLOC_CONC ), ADDON_MULTS AS ( SELECT 'MANAGE_CORE' AS ADDON, 1.00 AS MULTIPLIER FROM SYSIBM.SYSDUMMY1 UNION ALL SELECT 'SERVICE_PROVIDER', 1.15 WHERE EXISTS (SELECT 1 FROM MAXAPPS WHERE APP LIKE 'SP%') UNION ALL SELECT 'TRANSPORTATION', 1.10 WHERE EXISTS (SELECT 1 FROM MAXAPPS WHERE APP LIKE 'TR%') UNION ALL SELECT 'OIL_GAS', 1.10 WHERE EXISTS (SELECT 1 FROM MAXAPPS WHERE APP LIKE 'OIL%') UNION ALL SELECT 'HSE', 1.10 WHERE EXISTS (SELECT 1 FROM MAXAPPS WHERE APP LIKE 'HSE%') UNION ALL SELECT 'BIM', 1.05 WHERE EXISTS (SELECT 1 FROM MAXAPPS WHERE APP LIKE 'BIM%') ), PRODUCT_MULT AS ( SELECT MAX(MULTIPLIER) AS MULTIPLIER FROM ADDON_MULTS ), POINTS_BASE AS ( SELECT A.USER_TYPE, A.TOTAL_USERS, A.CONCURRENT_USERS, CUP.POINTS_PER_USER, (A.CONCURRENT_USERS * CUP.POINTS_PER_USER) AS BASE_POINTS FROM ALLOC_CONC_R A JOIN CONFIG_USER_POINTS CUP ON CUP.USER_TYPE = A.USER_TYPE ), POINTS_FINAL AS ( SELECT PB.USER_TYPE, PB.TOTAL_USERS, PB.CONCURRENT_USERS, INTEGER(CEIL(PB.BASE_POINTS * (SELECT MULTIPLIER FROM PRODUCT_MULT))) AS APP_POINTS, INTEGER(CEIL(PB.BASE_POINTS * (SELECT MULTIPLIER FROM PRODUCT_MULT) * 1.25)) AS APP_POINTS_WITH_25PC_BUFFER FROM POINTS_BASE PB ) SELECT PB.USER_TYPE, PB.TOTAL_USERS, PB.CONCURRENT_USERS, PB.APP_POINTS, PB.APP_POINTS_WITH_25PC_BUFFER FROM POINTS_FINAL PB UNION ALL SELECT 'TOTAL' AS USER_TYPE, SUM(PB.TOTAL_USERS), SUM(PB.CONCURRENT_USERS), SUM(PB.APP_POINTS), SUM(PB.APP_POINTS_WITH_25PC_BUFFER) FROM POINTS_FINAL PB WITH UR; 🔍 What This SQL Tells You 1. Peak Concurrent Users (PCU)Based on real login sessions from LOGINTRACKING. 2. Automatic Persona Mapping Admin → MAXADMIN or equivalent Practitioner → users with access to Work, Asset, Inventory, Purchasing Viewer → everyone else 3. Add-on/Industry Solution Detection The SQL automatically checks for: Service Provider Transportation Oil & Gas HSE BIM …and applies safe multipliers. 4. AppPoints Estimation With 25% Buffer Output includes: User TypeTotal UsersConcurrent UsersAppPointsAppPoints + 25% …plus a TOTAL row. 🚀 How to Use This as Part of MAS Upgrade Planning Step 1 — Run SQL in Maximo 7.6 Use DBViewer, DBeaver, or even BIRT query viewer. Step 2 — Review Persona Distribution Identify if too many users have practitioner-level access. Step 3 — Optimize Groups Before Migrating This is where MAS savings usually come from. Step 4 — Validate Peak Concurrency Confirm PCU with business teams. Step 5 — Size MAS AppPoints Correctly Use IBM’s MAS licensing matrix with SQL output. This SQL method gives organizations a data-driven, defendable, audit-ready way to size MAS AppPoints. It avoids guesswork, provides clarity to procurement teams, and supports architecture decisions during MAS migration.