

關鍵詞: Oracle 數據庫 跨多版本 跨操作系統 升級 醫院信息系統
筆者醫院信息系統(Hospital Information System,HIS)數據庫為基于Windows 2008 系統的Oracle 10.2.0.5版本,數據量為800 G,單機運行。硬件設備老化,系統穩定性差,隨著醫院業務量的不斷增加擴展,硬件和軟件都難以支撐日益增長的業務量和數據流[1],存在嚴重的系統與數據安全隱患。隨著經濟和社會的不斷發展,對醫院信息化建設工作也提出了更高的要求[2]。HIS 數據作為醫院的核心業務數據[3],確保數據信息軟硬件的安全,運用科學的存儲方式來保護數據信息,避免遭受惡意或者意外損壞,防止數據信息的丟失[4],是醫院信息系統安全工作的重中之重,因此對HIS 升級迫在眉睫。
1 升級方案
為解決上述問題,經過充分測試及論證,決定采用數據泵(expdp/impdp)工具,通過建立中間庫的方式,實現HIS 系統Oracle 數據庫從10g for Windows 到19cRAC for Linux 的跨多版本系統升級。本升級方案的制訂,重點解決了Oralce10g 到19c,Windows 到Linux,單機模式到RAC 模式跨多版本跨平臺升級的技術難點;數據遷移是醫院信息系統數據庫版本升級工作的核心環節[5],采用數據泵(expdp/impdp)工具進行數據導入/導出保證升級過程簡單可靠,采取基于高性能硬件設備建立中轉庫的方案設計主要解決源數據庫設備老舊性能低下的問題,最大限度地縮短系統停機時間。此方案對源數據庫不做任何修改,如升級不成功,回退方便快捷。升級流程如圖1 所示。
2 具體方案實施
醫院信息系統是醫院診療業務平穩開展的基本保障,其數據庫升級工作需做好升級前、升級實施中以及升級后的各項工作[6]。
2.1 準備工作
準備工作不影響業務,有充分的準備時間。在測試環境中對每一個步驟與技術要點進行模擬,根據測試報告得出準確的技術方案與升級實施時間計劃。
2.1.1 系統準備
在中轉庫服務器安裝操作系統及數據庫版本與源數據庫一致的Oracle 10.2.0.5 版本數據庫;目標庫服務器安裝CENTOS7.9 版本操作系統和Oracle 19.4 RAC集群。
在目標庫服務器上配置NFS 并掛載到中轉庫服務器。配置目標服務器為NFS 的服務器端;配置中轉庫為NFS 的目標端;把目標服務器的/data/backup 目錄映射到中轉庫的Y 盤目錄。
2.1.2 數據準備
源數據庫利用RMAN 工具進行數據庫全備份:
RMANgt; backup database;
在中轉庫上通過RMAN 工具恢復數據:
RMANgt; restore database;
RMANgt; recover database;
2.2 升級過程
升級時間選擇業務量較小,對業務應用影響最小的時間段。此次升級選擇周五23:00 開始,此時醫院業務量少,降低升級中可能出現的問題對業務的影響。并做好手工業務方案,提前通知各應用單位計劃停機時間為4 h。
2.2.1 停止應用
由于HIS 系統客戶端采用CS 架構,采取停止源數據庫監聽服務和KILL 前端會話的方式停止數據庫應用。
2.2.2 拷貝歸檔文件到中轉庫
從源數據庫拷貝歸檔文件至中轉庫:
Sqlgt;alter database checkpoint;
Sqlgt;alter system switch logfile;
2.2.3 中轉庫上應用歸檔日志
在中轉庫上應用歸檔日志并打開數據庫:
RMANgt;catalog start with‘ Y:\archivelog’;
RMANgt;recover database until cancel;
Sqlgt;alter database open resetlogs;
2.2.4 中轉庫上導出數據
中轉庫上使用expdp 工具導出數據expdp parfile=parfile1,parfile 腳本提前寫好,數據通過NFS 直接導出到目標庫的/data/backup 目錄。
2.2.5 在目標庫上導入源數據
Impdpparfile=parfile1
exclude=table_data
2.2.6 在目標庫上禁止約束和觸發器
select 'alter table '||owner||'. '||table_name||' disableconstraint '||constraint_name||'; ' from dba_constraintswhere owner in ('AMDB_USER', 'ESB_USER', 'X5SYS_SYS', 'DOC_SYS', 'APOI_SYS') and constraint_name notlike 'BIN%' and status='ENABLED';
select 'alter trigger '||owner||'. '||trigger_name||' disable;' from dba_triggerswhere owner in ('AMDB_USER','ESB_USER', 'X5SYS_SYS', 'DOC_SYS', 'APOI_SYS') andstatus='ENABLED';
2.2.7 在目標數據庫導入表數據
Impdpparfile=parfile1
include=table_data
2.2.8 啟用約束和觸發器
select 'alter table '||owner||'. '||table_name||' enableconstraint '||constraint_name||'; ' from dba_constraintswhere owner in ('AMDB_USER', 'ESB_USER', 'X5SYS_SYS', 'DOC_SYS', 'APOI_SYS') and constraint_name notlike 'BIN%' and status='DISABLED' and constraint_namelt;gt;'FK_RESOURCES_REF_EQUIPMENTS'
select 'alter trigger '||owner||'.'||trigger_name||' enable;' from dba_triggerswhere owner in ('AMDB_USER','ESB_USER', 'X5SYS_SYS', 'DOC_SYS', 'APOI_SYS') andstatus='DISABLED';
2.2.9 更改scanip
srvctl stop scan_listener
srvctl stop scan
srvctl modify scan -n 191.53.21.10
srvctl start scan
srvctl start scan_listener
2.2.10 應用測試
通過客戶應用端測試各業務系統運行是否正常,數據提取、回寫是否正確。
2.2.11 修改目標庫IP
以上步驟完成后,驗證數據無問題,修改目標庫IP地址,使其與生產庫IP 地址一致。
3 數據驗證
3.1 模擬最新數據查詢驗證
(1)遷移前在老的數據庫插入當前的時間:
SQLgt;TIME
SQLgt; insert into system. restoretime select to_char
(sysdate, 'yyyymmdd HH24:mi:ss') time from dual;SQLgt; exit
(2)中轉庫以resetlogs 打開后查詢前插入的數據是否能查詢到:
SQLgt;Database altered.
SQLgt; alter database open resetlogs;
SQLgt;select * from system.restoretime;
(3)目標庫數據導入完成后查詢之前插入的數據是否能查詢到:
SQLgt;select * from system.restoretime;
3.2 源端數據庫、目標數據庫權限比對
具體如下:
SET FEEDBACK ON
set long 999999
SET PAGESIZE 10000
set heading off
set echo off
col sql_txt for a100
---grant role
select 'grant ' || s. GRANTED_ROLE || ' to ' || s.grantee || ';' sql_txt
from dba_role_privs@xttslink s
where s. grantee not in (select username from
oracle_default_users)
and s.admin_option = 'NO'
and not exists (select 1
from dba_role_privs ss
where ss.GRANTEE = s.GRANTEE
and ss.GRANTED_ROLE = s.GRANTED_ROLE
and ss.ADMIN_OPTION = s.ADMIN_OPTION)
union
---grant role with admin
select 'grant ' || s. GRANTED_ROLE || ' to ' || s.grantee ||
' with admin option;' sql_txt
from dba_role_privs@xttslink s
where s. grantee not in (select username from
oracle_default_users)
and s.admin_option = 'YES'
and not exists (select 1
3.3 源數據庫、目標數據庫對象比對
獲取缺少對象的ddl 語句:
set long 100000
set pages 0
set linesize 200
col aa format a100
select dbms_metadata. get_ddl(s. object_type, s. object_
name,s.owner)||';' from dba_objects@xttslink s
where s. owner not in (select username from
oracle_default_users)
and s.owner lt;gt;'PUBLIC'
and s.object_typelt;gt;'LOB'
and object_type not like 'JAVA%'
3.4 expdp 導出日志和impdp 導入日志數據條數比對
系統數據庫升級最重要的是保障升級前后數據的一致性[7]。導出日志會詳細地記錄導出每張表數據的條數。導入日志也會顯示導入每張表數據的條數,兩個數據要求要相等。日志數據對比如圖2 所示。
4 升級后需注意的問題
(1)升級后,Oracle 8i 以下版本的客戶端不能正常使用應用程序,需將客戶端卸載后安裝高版本Oracle,醫院安裝的是Oracle10g 以上版本的客戶端。
(2)由于有的系統通過SID 訪問數據庫,因此目標庫需要配置SID 自動轉化為服務名。
(3)在驗證過程中發現WM_CONCAT 函數失效,原因是Oracle 19c不支持WM_CONCAT函數,需重新創建。
5 結語
HIS 數據庫升級必須保障醫院業務數據的連續性。升級前,需對方案進行評估,選擇對業務影響最小,回退機制最佳且安全可靠的方案,并對升級方案進行充分測試,對客戶端可用性進行驗證;升級中,嚴格按照預演的方案進行升級,并對數據進行驗證,確保數據一致性和完整性;升級后,對各個應用程序進行充分測試,保證業務系統應用正常。此方案在實際升級過程中安全順利,業務系統停機時間不到4 h,實現Oracle數據庫從10g for Windows 到19c RAC for Linux 的跨多版本系統升級,系統升級后性能穩定,數據安全,可操作性強,對相同功能需求具有參考借鑒價值。