SIMRS Data Migration Guide Without Downtime: Strategy & Implementation
T
Kembali ke Blog

SIMRS Data Migration Guide Without Downtime: Strategy & Implementation

Tutorial
Tim Pilar Inovasi 16 Jun 2026 6 min baca 3,450 kata 211
SIMRS data migration is often a daunting prospect due to the risks of downtime and data loss. This article provides an in-depth guide to the strategy and implementation of SIMRS data migration without interrupting hospital operations, complete with technical examples and best practices.

Hospital Information Management (SIMRS) is the backbone of modern healthcare facility operations. Over time, the need to update or replace an old SIMRS with a more advanced system, integrated with standards such as FHIR, or with better performance, becomes inevitable. However, the process of migrating data from the old system to the new system is often faced with major challenges, especially concerns about downtime that can disrupt patient services, potentially cause financial losses, and damage reputation. Imagine a scenario where patient registration, medical record entry, or pharmacy processes are halted for hours or even days. Based on a survey by TechRepublic, 78% of organizations consider downtime a serious problem that directly impacts revenue and customer satisfaction. This article will guide you through strategies and practical implementation for migrating SIMRS data without significant downtime, ensuring a smooth operational transition. We will discuss basic concepts, implementation details with specific tools, code examples, error handling, best practices, and FAQs to help you plan and execute a successful migration.

Basic Concepts of Zero Downtime Data Migration

Zero downtime data migration in the context of SIMRS is not merely copying data. It is a complex process that demands careful planning, phased execution, and continuous validation. The goal is to move data from the source system (old SIMRS) to the target system (new SIMRS) while keeping both systems operating in parallel or with minimal interruption. There are several main approaches that can be used. First, the Big Bang Approach, in which all data is migrated at once, usually during non-operational hours. This has a high risk if a failure occurs and requires a large downtime window. Second, the Phased Approach, in which data is migrated per module or per department. This reduces risk but takes longer and adds complexity in integration between systems.

To achieve zero downtime migration, we need to focus on the Near Zero Downtime (N-ZDT) or Zero Downtime Migration (ZDM) strategy. This involves synchronizing data in real-time or near real-time between the source and target systems during the transition period. The key concept is Change Data Capture (CDC). CDC is the process of identifying and capturing data changes (insert, update, delete) on the source system, then replicating those changes to the target system. With CDC, data newly created or changed in the old SIMRS will automatically be replicated to the new SIMRS, keeping both systems in sync.

In addition to CDC, the Dual Write concept is also highly relevant. In this strategy, during the transition period, every transaction that occurs in the old SIMRS is also written simultaneously to the new SIMRS. This ensures that data is always up-to-date in both systems. However, dual write adds complexity to the application and requires strong conflict handling logic. The combination of CDC for historical data and dual write for active data is often the most effective approach.

It is also important to understand the role of a Data Staging Area or Data Lake. Before data is entered into the new SIMRS, it often needs to go through a transformation and cleansing process. The data staging area serves as a temporary place to store data extracted from the old SIMRS, undergo the ETL (Extract, Transform, Load) process, and be validated before being injected into the new SIMRS. This helps ensure data quality and schema consistency between the two systems. For example, if the old SIMRS uses ICD-9 codes and the new SIMRS uses ICD-10, the transformation process will be carried out in the staging area.

Finally, the Rollback Plan strategy is crucial. Although we aim for zero downtime, failures can still occur. Having a clear fallback plan to return to the old system if the migration fails is mandatory. This includes comprehensive data backup from the old SIMRS before migration begins and well-defined procedures to reactivate the old system quickly if needed. Without a solid rollback plan, the risk faced by the hospital will be very high. Therefore, testing the rollback plan is an integral part of the migration testing phase.

Technical Implementation Details & Tool Selection

Implementing zero downtime SIMRS data migration requires the right combination of tools and technologies. First, for the database, most modern SIMRS use PostgreSQL 16 or MySQL 8.x. Both databases support log-based replication features that are essential for CDC. For example, PostgreSQL offers Logical Decoding that allows extracting data changes from the WAL (Write-Ahead Log) in real-time. For MySQL, the binlog feature can be utilized.

To perform CDC effectively, we can utilize tools such as Debezium (version 2.4.x) that runs on top of Apache Kafka. Debezium is an open-source distributed CDC platform that can monitor databases and record all data changes into Kafka transaction logs. From Kafka, data changes can be consumed by our migration application and injected into the new SIMRS. Another alternative is to use the database's built-in replication features or write custom CDC scripts. However, Debezium is highly recommended for scalability and reliability.

On the integration side, Mirth Connect (version 4.4.x) is a very popular integration engine in healthcare environments. Mirth Connect can serve as a bridge to receive data from the old SIMRS (for example via HL7 v2.5.1 or REST API), perform data transformation as needed by the new SIMRS, and send it to the target system (for example in FHIR R4 format or REST API). Mirth Connect also supports database connectors, so it can be used to read and write directly to the database if needed.

For developing custom migration or data transformation applications, frameworks such as Laravel 11.x (using PHP 8.2+) or Node.js 20 LTS (with Express.js) are very suitable. This application can act as a data consumer from Kafka (if using Debezium) or receive data from Mirth Connect, perform complex data validation and transformation, and then call the new SIMRS API to insert data. For example, for BPJS or SatuSehat integration, this application will call the appropriate API endpoint after the data is transformed into the correct format.

In the SIMRS scenario, data standards are very important. Ensure the new SIMRS supports standards such as FHIR R4 (Fast Healthcare Interoperability Resources Release 4) and, if still needed, HL7 v2.5.1. If the old SIMRS only outputs data in a proprietary format, the migration application must be able to perform mapping and transformation to FHIR R4 or the new SIMRS database schema. Use libraries such as HAPI FHIR (version 6.8.x) for Java or fhir.js for Node.js to validate and manipulate FHIR resources.

The migration process will begin with batch historical data migration, followed by CDC to maintain synchronization. After the historical data is migrated and validated, the system will switch to dual write mode or continue using CDC for active data until all new SIMRS modules are fully operational. Strict monitoring using tools such as Prometheus and Grafana will ensure performance and data integrity during the process.

Code Example: Patient Data Synchronization via API & Data Transformation

In this section, we will look at a simple implementation example for patient data synchronization using API and data transformation. Assume the old SIMRS exposes an API to get patient data, and the new SIMRS has an API to receive FHIR Patient data. We will use Node.js (with Axios for HTTP requests) as the bridge.

Example 1: Script for Pulling and Transforming Patient Data from the Old SIMRS

const axios = require('axios');const fhir = require('fhir.js'); // Using the fhir.js library for FHIR validationconst oldSimrsApiUrl = 'http://api.simrs-lama.com/pasien';const newSimrsApiUrl = 'http://api.simrs-baru.com/fhir/Patient';const apiKeyOld = 'YOUR_OLD_SIMRS_API_KEY';const apiKeyNew = 'YOUR_NEW_SIMRS_API_KEY';async function migratePatientData() {  try {    // 1. Get patient data from the Old SIMRS    const response = await axios.get(oldSimrsApiUrl, {      headers: { 'X-API-Key': apiKeyOld }    });    const patientsOld = response.data;    for (const patientOld of patientsOld) {      // 2. Transform data to FHIR R4 Patient format      const patientFhir = {        resourceType: 'Patient',        id: patientOld.id_pasien_lama.toString(), // Use the unique ID from the old SIMRS        identifier: [{          use: 'usual',          type: {            coding: [{              system: 'http://terminology.hl7.org/CodeSystem/v2-0203',              code: 'MR' // Medical Record Number            }]          },          system: 'http://simrs-lama.com/id/mr',          value: patientOld.no_rekam_medis        }],        name: [{          use: 'official',          family: patientOld.nama_belakang,          given: [patientOld.nama_depan]        }],        gender: patientOld.jenis_kelamin === 'L' ? 'male' : 'female',        birthDate: patientOld.tanggal_lahir,        address: [{          use: 'home',          line: [patientOld.alamat],          city: patientOld.kota,          postalCode: patientOld.kode_pos,          country: 'ID'        }],        telecom: [{          system: 'phone',          value: patientOld.telepon,          use: 'home'        }]      };      // 3. Validate FHIR resource      const validationResult = fhir.validate(patientFhir);      if (validationResult.valid) {        // 4. Send data to the New SIMRS (FHIR Endpoint)        await axios.put(`${newSimrsApiUrl}/${patientFhir.id}`, patientFhir, {          headers: {            'Content-Type': 'application/fhir+json',            'Authorization': `Bearer ${apiKeyNew}`          }        });        console.log(`Patient ${patientOld.no_rekam_medis} successfully migrated.`);      } else {        console.error(`FHIR validation failed for patient ${patientOld.no_rekam_medis}:`, validationResult.errors);      }    }    console.log('Patient data migration completed.');  } catch (error) {    console.error('An error occurred during migration:', error.message);  }}migratePatientData();

Code Explanation 1: The script above retrieves patient data from the old SIMRS API, then transforms it into the FHIR R4 Patient Resource format. Note the use of fhir.js for FHIR schema validation, which is very important to ensure the data sent complies with the standard. Each patient is then sent to the new SIMRS FHIR endpoint using the PUT method, which is ideal for upsert operations (insert or update if the resource already exists). The patient ID from the old SIMRS is used as the FHIR ID to maintain consistency. This is the basis of the initial batch migration process or CDC if this script is adapted to process data changes incrementally.

Example 2: Implementation of Retry Mechanism for API Calls

const axios = require('axios');const retry = require('async-retry'); // Using the async-retry libraryconst newSimrsApiUrl = 'http://api.simrs-baru.com/fhir/Patient';const apiKeyNew = 'YOUR_NEW_SIMRS_API_KEY';async function sendPatientToNewSimrs(patientFhir) {  await retry(async bail => {    try {      await axios.put(`${newSimrsApiUrl}/${patientFhir.id}`, patientFhir, {        headers: {          'Content-Type': 'application/fhir+json',          'Authorization': `Bearer ${apiKeyNew}`        },        timeout: 5000 // 5 second timeout      });      console.log(`FHIR Patient ${patientFhir.id} sent successfully.`);    } catch (error) {      if (error.response && error.response.status >= 400 && error.response.status < 500) {        // Do not retry for client errors (4xx)        console.error(`Client error for FHIR patient ${patientFhir.id}: ${error.response.status} - ${JSON.stringify(error.response.data)}`);        return bail(new Error('Client error, not retrying'));      }      // For server errors (5xx) or network issues, retry      console.warn(`Failed to send FHIR patient ${patientFhir.id}, retrying... (${error.message})`);      throw error; // Throw the error so async-retry retries it    }  }, {    retries: 5, // Try 5 times    minTimeout: 1000, // 1 second delay before the first attempt    maxTimeout: 5000, // Maximum delay of 5 seconds    factor: 2 // Exponential backoff: 1s, 2s, 4s, ...  });}async function processPatients(patientsFhirArray) {  for (const patientFhir of patientsFhirArray) {    await sendPatientToNewSimrs(patientFhir);  }}// Example usage:asyncdemoPatients = [{ resourceType: 'Patient', id: 'P001', name: [{ family: 'Doe', given: ['John'] }] }];processPatients(demoPatients);

Code Explanation 2: During the migration process, network instability or a busy target API is common. This script demonstrates the implementation of a retry mechanism using the async-retry library. If a server error (5xx) or network issue occurs, the request will automatically be retried up to 5 times with exponential backoff (1 second, 2 seconds, 4 seconds, etc.). This significantly increases the resilience of the migration process. Client errors (4xx) such as validation failures will be stopped immediately without retry, because they indicate a problem with the data or request, not a temporary issue.

Error Handling and FHIR Payload Example

Robust error handling is key to successful data migration. Every data transmission failure must be logged in detail, including the failed payload, error message, and timestamp. A dead-letter queue (DLQ) mechanism can be used to store data that failed to be processed so that it can be inspected and reprocessed manually or automatically after the issue is resolved.

Example FHIR R4 Patient Resource Payload:

{  "resourceType": "Patient",  "id": "P00123456",  "meta": {    "lastUpdated": "2024-07-26T10:30:00Z"  },  "text": {    "status": "generated",    "div": "<div>Patient: Budi Santoso, Male, Born 1980-05-15</div>"  },  "identifier": [    {      "use": "usual",      "type": {        "coding": [          {            "system": "http://terminology.hl7.org/CodeSystem/v2-0203",            "code": "MR",            "display": "Medical Record Number"          }        ],        "text": "Medical Record Number"      },      "system": "http://rekammedis.rs-nugraha.com/id",      "value": "RM00012345"    },    {      "use": "official",      "type": {        "coding": [          {            "system": "http://terminology.hl7.org/CodeSystem/v2-0203",            "code": "NI",            "display": "National unique individual identifier"          }        ],        "text": "NIK"      },      "system": "https://data.kemkes.go.id/nik",      "value": "3273010101800001"    }  ],  "active": true,  "name": [    {      "use": "official",      "family": "Santoso",      "given": [        "Budi"      ],      "prefix": [        "Mr."      ]    }  ],  "telecom": [    {      "system": "phone",      "value": "+6281234567890",      "use": "mobile"    },    {      "system": "email",      "value": "budi.santoso@example.com",      "use": "home"    }  ],  "gender": "male",  "birthDate": "1980-05-15",  "address": [    {      "use": "home",      "type": "physical",      "line": [        "Jl. Kenanga No. 45"      ],      "city": "Bandung",      "district": "Cibeunying Kaler",      "state": "Jawa Barat",      "postalCode": "40123",      "country": "ID"    }  ],  "maritalStatus": {    "coding": [      {        "system": "http://terminology.hl7.org/CodeSystem/v3-MaritalStatus",        "code": "M",        "display": "Married"      }    ],    "text": "Married"  },  "extension": [    {      "url": "https://data.kemkes.go.id/fhir/StructureDefinition/Pasien-TempatLahir",      "valueString": "Bandung"    }  ]}

The payload above is a realistic example of a FHIR R4 Patient Resource. Note the use of identifier for the medical record number and NIK, name for the full name, gender, birthDate, and address. There is also an extension for Indonesia-specific data such as place of birth, in accordance with the SatuSehat guidelines. Understanding this structure is very important for the data transformation process.

Example Error Message and Its Handling:

When sending a FHIR payload to the new SIMRS, you may encounter an error like this:

{  "resourceType": "OperationOutcome",  "issue": [    {      "severity": "error",      "code": "code-invalid",      "details": {        "text": "The value 'Laki-laki' for field 'gender' is not valid. Expected one of: male, female, other, unknown."      },      "location": [        "Patient.gender"      ]    }  ]}

This error message indicates that the value 'Laki-laki' for the gender field is not valid according to the FHIR standard, which only accepts 'male', 'female', 'other', or 'unknown'.

How to Handle It:

  1. Identify the Source of the Error: This error clearly indicates a problem with input data that does not conform to the FHIR standard.
  2. Fix the Transformation Logic: Go back to the data transformation script (such as Code Example 1) and ensure that the jenis_kelamin value from the old SIMRS is correctly mapped to the FHIR standard. For example:gender: patientOld.jenis_kelamin === 'L' ? 'male' : 'female'. Make sure no other values get through.
  3. Pre-Send Validation: Implement FHIR validation (using fhir.js or a similar library) before sending the payload to the new SIMRS. This will catch errors like this earlier and prevent failed API calls.
  4. Dead-Letter Queue (DLQ): If a validation or server error occurs, send the failed payload to a DLQ (for example, a separate Kafka topic, RabbitMQ queue, or dedicated database table). The team can review the DLQ, fix the data, and try to resend it.
  5. Alerting: Configure the monitoring system to send notifications (email, Slack, PagerDuty) if there is a large number of errors or unprocessed items in the DLQ.

It is important to log every error with sufficient context (the original payload, the transformed payload, the full error message) to facilitate debugging and resolution.

Best Practices in SIMRS Data Migration Without Downtime

  1. Comprehensive and Detailed Planning: Create a very detailed migration plan, covering every stage: data analysis, schema mapping, CDC strategy, rollback mechanisms, schedule, and team responsibilities. Identify all connected systems (BPJS, SatuSehat, Laboratory, Radiology) and ensure compatibility. Reference PMK No. 82 of 2015 on SIMRS can be an important guide.
  2. Initial Data Audit and Cleansing: Before migration, conduct a thorough audit of data quality in the old SIMRS. Identify and clean duplicate, incomplete, or inconsistent data. Clean data will minimize errors during migration and improve the quality of the new SIMRS. This may take months.
  3. Repeated Testing in a Staging Environment: Repeatedly simulate data migration in a staging environment that is a replica of production. Test all scenarios, including high data volumes, error handling, and the rollback process. Involve key users from each hospital department for functional validation.
  4. Robust Change Data Capture (CDC) Strategy: Implement CDC using technologies such as Debezium or database log replication to ensure real-time data synchronization between the old and new systems. Ensure that CDC covers all relevant tables and columns, and has a conflict-handling mechanism.
  5. Tested Rollback Mechanism: Always prepare and test a clear rollback plan. This includes a full backup of the old SIMRS and defined procedures to quickly reactivate the old system if a critical failure occurs in the new SIMRS during or after migration.
  6. Real-time Monitoring and Alerting: Set up monitoring dashboards (for example, with Grafana and Prometheus) to track migration metrics such as the number of transactions processed, error rates, synchronization latency, and system health. Configure alerts to notify the team if there are anomalies or failures.
  7. Effective Communication with Stakeholders: Maintain transparent and proactive communication with all stakeholders, including management, medical staff, and IT staff. Inform them of the schedule, potential risks, and progress regularly to manage expectations and gain support.
  8. Phased Migration Approach: Consider migrating data per module or per department (for example, registration first, then medical records, then pharmacy). This reduces complexity and risk compared with a big bang approach, allowing the team to learn and adjust at each phase.
  9. Post-Migration Data Validation: After each migration phase, perform strict data validation between the old and new SIMRS. Use SQL queries, comparative reports, or custom data validation tools to ensure data integrity and consistency. This should include record counts, key values, and other important data.
  10. Data Security Throughout the Process: Ensure all migrated data is secure in transit and at rest. Use encryption, strict access controls, and comply with data privacy regulations (for example, Law on Personal Data Protection No. 27 of 2022). Ensure the staging and production environments are protected.

FAQ About SIMRS Data Migration Without Downtime

  1. How long does it take to migrate SIMRS data without downtime?

    Migration time varies greatly depending on the complexity of the old SIMRS, data volume (for example, a large hospital with millions of medical records could take 6-12 months), the number of integrations, and available resources. Migrating historical data can take several weeks to months, while the real-time synchronization and cutover phase can take several days to weeks. The preparation and testing process often takes longer than the migration execution itself.

  2. What is the biggest risk in SIMRS data migration without downtime?

    The biggest risk is data inconsistency or data loss if the synchronization process fails or is incomplete, as well as failure of the new system after cutover. Other risks include degraded performance during the transition due to double load on the database, compatibility issues between systems, and lack of experience of the migration team. Poor planning and inadequate testing can significantly exacerbate these risks.

  3. How to ensure data integrity during migration?

    Data integrity is ensured through several layers: first, schema and data type validation at the transformation stage; second, use of reliable CDC to capture all changes; third, checksum validation or periodic record count comparison between source and target systems; and fourth, functional testing by end users. Random data audits are also important to verify the accuracy of migrated data.

  4. Can all types of SIMRS be migrated without downtime?

    In theory, most SIMRS can be migrated with a near-zero downtime approach, especially if the legacy system provides adequate database or API access for CDC. However, very old SIMRS with monolithic architecture and without replication or CDC capabilities may require greater engineering effort. The openness of the legacy SIMRS to integration and the availability of historical data in an extractable format are key factors.

  5. What is the role of integration with BPJS/SatuSehat in this migration process?

    Integration with BPJS/SatuSehat is a crucial component. The new SIMRS must be able to communicate with the BPJS and SatuSehat APIs (via FHIR R4) in accordance with applicable standards (for example, PMK No. 24 of 2022 concerning Medical Records). During migration, ensure that the migrated patient and service data remain consistent with data already reported to BPJS or SatuSehat. End-to-end testing for this integration is very important before cutover.

  6. How to handle very large archive data from the old SIMRS?

    For very large archive data, consider a cold migration or archive migration strategy. Inactive data (for example, medical records of patients who have not visited for a long time) can be extracted and stored in a data lake or separate archive system, rather than directly into the new SIMRS. This reduces the load on the new SIMRS and speeds up the active data migration process. Access to archive data can be provided through a separate portal or on-demand integration if needed.

SIMRS data migration without downtime is a strategic investment that enables healthcare facilities to adopt new technology without sacrificing service continuity. With careful planning, selection of the right technologies such as Debezium and Mirth Connect, robust CDC implementation, and rigorous testing and monitoring, hospitals can achieve a smooth transition. Remember that every detail, from data mapping to rollback mechanisms, plays an important role in success. If you need professional expertise to plan and execute complex SIMRS data migration, whether it is BPJS/SatuSehat integration, custom system development, or operational consulting, our team at Nugroho Setiawan is ready to help. Don't let downtime concerns hinder your hospital's innovation. Contact us for further discussion and solutions tailored to your specific needs.

Terakhir diperbarui 17 Oct 2026

Komentar

Komentar ditinjau sebelum tampil.

Belum ada komentar. Jadilah yang pertama!