将 SAP HANA 文件系统迁移到单个磁盘

本文档介绍了如何将 Google Cloud 上的 SAP HANA 部署中的文件系统迁移到单个基于 SSD 的永久性磁盘卷或 Google Cloud Hyperdisk 卷。

Google Cloud 上的 SAP HANA 部署使用统一磁盘布局或拆分磁盘布局。在统一磁盘布局中,单个磁盘用于托管所有 SAP HANA 文件系统。在拆分磁盘布局中,每个 SAP HANA 文件系统都托管在单独的磁盘上。如需了解这些磁盘布局,请参阅支持的磁盘布局

Google Cloud 建议您使用拆分磁盘布局,原因如下:

  • 该布局可针对文件系统(尤其是 /hana/data/hana/log)进行独立的磁盘性能调优,尤其是在使用 Hyperdisk 时。
  • 该布局有助于简化维护工作。

为了说明迁移过程,本指南假设有一个示例系统,并将 SAP HANA 文件系统从单个永久性磁盘卷迁移到每个文件系统的一个 Hyperdisk 卷。您还可以使用此过程将 SAP HANA 文件系统迁移到单个永久性磁盘卷。

查看迁移注意事项

  • 数据迁移时长:对于 SAP HANA HA 系统,您可以通过取消注册辅助节点、删除其租户数据库,然后回收日志来缩短数据迁移时长。本指南中介绍的过程使用了这种方法。
  • 停机时间:对于 SAP HANA 高可用性系统,您需要先迁移辅助数据库,将其设为新的主数据库,然后再迁移先前的主数据库。这有助于将停机时间降至最低。
  • 还原到现有磁盘:如果迁移过程中出现任何问题,您可以还原到现有磁盘,因为它们不受此过程的影响,并且在您自行将其删除之前都可用。如需了解详情,请参阅回退到现有磁盘

准备工作

在将单个磁盘上托管的 SAP HANA 文件系统迁移到每个文件系统的一个磁盘之前,请确保满足以下条件:

  • SAP HANA 在支持 HyperdiskSAP 认证 Compute Engine 实例上运行。
  • 具备有效的 SAP HANA 数据库备份。如果需要,您可以使用此备份恢复数据库。
  • 如果目标 Compute Engine 实例属于高可用性 (HA) 集群,请确保集群处于维护模式。
  • 如果 SAP HANA 数据库使用横向扩容部署,请针对每个 SAP HANA 实例重复本指南中的过程。
  • SAP HANA 数据库已启动并运行。 对于高可用性系统,请确保数据库的主实例和辅助实例之间的复制处于活跃状态。
  • 如需缩短数据复制时间,请从要迁移的 SAP HANA 卷中移除所有不必要的备份或媒体。
  • 运行以下命令,验证您要迁移的 SAP HANA 文件系统是否托管在单个磁盘上:

    lsblk
    

    输出类似于以下示例。您的输出可能与此示例不同,具体取决于您对 SAP HANA 文件系统的命名惯例,或者取决于您的计算实例是否支持非易失性快速内存 (NVMe) 磁盘接口。

    NAME                   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
    sda                      8:0    0   30G  0 disk
    ├─sda1                   8:1    0    2M  0 part
    ├─sda2                   8:2    0   20M  0 part /boot/efi
    └─sda3                   8:3    0   30G  0 part /
    sdb                      8:16   0  2.3T  0 disk
    ├─vg_hana-shared       254:0    0  850G  0 lvm  /hana/shared
    ├─vg_hana-sap          254:1    0   32G  0 lvm  /usr/sap
    ├─vg_hana-log          254:2    0  425G  0 lvm  /hana/log
    └─vg_hana-data         254:3    0    1T  0 lvm  /hana/data
    sdc                      8:32   0  1.7T  0 disk
    └─vg_hanabackup-backup 254:4    0  1.7T  0 lvm  /hanabackup
    

SAP 系统示例

为了说明迁移过程,本指南会执行以下操作:

  • 假设有一个 SAP HANA 纵向扩容高可用性 (HA) 部署示例,其中单个永久性磁盘卷托管 /hana/data/hana/log/hana/shared/usr/sap 文件系统。
  • 将文件系统迁移到单个 Hyperdisk 卷,其配置类似于通过 Terraform:SAP HANA 纵向扩容高可用性集群配置指南部署的 SAP HANA 纵向扩容高可用性系统。

下图展示了示例系统在迁移文件系统之前和之后的架构:

展示将 SAP HANA 文件系统迁移到 Google Cloud上的单个磁盘的架构图

示例 SAP 系统的配置详情如下所示:

  • 机器类型:n2-highmem-128
  • 操作系统:SLES for SAP 15 SP5
  • SAP HANA:HANA 2 SPS07,修订版本 78
  • 系统使用的磁盘类型:SSD 永久性磁盘 (pd-ssd)
  • /hana/data/hana/log/hana/shared/usr/sap 卷会装载到同一磁盘上,并在 SAP HANA 的持久性设置中进行配置。以下示例展示了 SID 为 ABC 的 SAP HANA 系统的 /hana/data/hana/log 卷的持久性设置:

    [persistence]
    basepath_datavolumes = /hana/data/ABC
    basepath_logvolumes = /hana/log/ABC

将文件系统迁移到单个 Hyperdisk 卷

如需将 SAP HANA 纵向扩容高可用性部署的文件系统从单个永久性磁盘卷迁移到每个文件系统的一个 Hyperdisk 卷,请执行以下步骤:

  1. 为次要实例做好迁移准备
  2. 迁移次要实例
  3. 提升次要实例
  4. 迁移先前的主实例

为次要实例做好迁移准备

  1. 将高可用性集群设置为维护模式:

    crm maintenance on
    
  2. 验证 HANA 系统复制 (HSR) 是否处于活跃状态:

    /usr/sap/ABC/HDB00/exe/python_support> python systemReplicationStatus.py
    

    输出类似于以下示例:

    /usr/sap/ABC/HDB00/exe/python_support> python systemReplicationStatus.py
    |Database |Host        |Port  |Service Name |Volume ID |Site ID |Site Name |Secondary |Secondary |Secondary |Secondary   |Secondary     |Replication |Replication |Replication    |Secondary    |
    |         |            |      |             |          |        |          |Host      |Port      |Site ID   |Site Name |Active Status |Mode        |Status      |Status Details |Fully Synced |
    |-------- |----------- |----- |------------ |--------- |------- |--------- |--------- |--------- |--------- |----------- |------------- |----------- |----------- |-------------- |------------ |
    |SYSTEMDB |example-vm1 |30001 |nameserver   |        1 |      1 |example-vm1 |example-vm2 |    30001 |        2 |example-vm2 |YES           |SYNCMEM     |ACTIVE      |               |        True |
    |ABC      |example-vm1 |30007 |xsengine     |        2 |      1 |example-vm1 |example-vm2 |    30007 |        2 |example-vm2 |YES           |SYNCMEM     |ACTIVE      |               |        True |
    |ABC      |example-vm1 |30003 |indexserver  |        3 |      1 |example-vm1 |example-vm2 |    30003 |        2 |example-vm2 |YES           |SYNCMEM     |ACTIVE      |               |        True |
    status system replication site "2": ACTIVE
    overall system replication status: ACTIVE
    Local System Replication State
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    mode: PRIMARY
    site id: 1
    site name: example-vm1

  3. 取消注册 SAP HANA 数据库的次要实例:

    hdbnsutil -sr_unregister
    

    输出显示数据库的次要实例已成功取消注册:

    abcadm@example-vm2:/usr/sap/ABC/HDB00> hdbnsutil -sr_unregister
    unregistering site ...
    done.
    Performing Final Memory Release with 10 threads.
    Finished Final Memory Release successfully.
    
  4. 在 SAP HANA 系统的次要实例中,删除所有租户数据库并回收日志:

    1. 停止租户数据库:

      hdbsql -n localhost:3INSTANCE_NUMBER13 -u SYSTEM -p "SYSTEM_DB_PASSWORD" -j "ALTER SYSTEM STOP DATABASE TENANT_DB_SID"
      

      替换以下内容:

      • INSTANCE_NUMBER:租户数据库的实例编号
      • SYSTEM_DB_PASSWORD:系统数据库的密码
      • TENANT_DB_SID:租户数据库的 SID,其中字母为大写
    2. 删除您停止的租户数据库:

      hdbsql -n localhost:3INSTANCE_NUMBER13 -u SYSTEM -p "SYSTEM_DB_PASSWORD" -j "DROP DATABASE TENANT_DB_SID"
      
    3. 回收日志:

      hdbsql -n localhost:3INSTANCE_NUMBER13 -u SYSTEM -p "SYSTEM_DB_PASSWORD" -j "ALTER SYSTEM RECLAIM LOG"
      
    4. 对 SAP HANA 系统的次要实例中的所有租户数据库重复上述步骤。

    以下示例展示了成功响应:

    0 rows affected (overall time 9032.460 msec; server time 9032.273 msec)
    
  5. 停止 SAP HANA 系统的次要实例:

    sapcontrol -nr INSTANCE_NUMBER -function Stop
    

迁移次要实例

  1. 为每个 SAP HANA 文件系统创建一个磁盘。对于此过程假定的示例系统,请创建 4 个磁盘,分别为 /hana/data/hana/log/hana/shared/usr/sap 各创建一个。

    如需为每个文件系统设置磁盘大小,您可以使用系统的 lsblk 命令输出中显示的大小信息。

    如需了解有助于满足 SAP HANA 性能要求的建议的磁盘大小、IOPS 和吞吐量下限,请参阅基于 SSD 的永久性磁盘卷和 Hyperdisk 卷的大小下限

    gcloud compute disks create USR_SAP_DISK_NAME \
        --project=PROJECT_ID \
        --type=USR_SAP_DISK_TYPE \
        --size=USR_SAP_DISK_SIZE \
        --zone=ZONE \
        --provisioned-iops=USR_SAP_DISK_IOPS
    gcloud compute disks create SHARED_DISK_NAME \
        --project=PROJECT_ID \
        --type=SHARED_DISK_TYPE \
        --size=SHARED_DISK_SIZE \
        --zone=ZONE \
        --provisioned-iops=SHARED_DISK_IOPS
    gcloud compute disks create DATA_DISK_NAME \
        --project=PROJECT_ID \
        --type=DATA_DISK_TYPE \
        --size=DATA_DISK_SIZE \
        --zone=ZONE \
        --provisioned-iops=DATA_DISK_IOPS
    gcloud compute disks create LOG_DISK_NAME \
        --project=PROJECT_ID \
        --type=LOG_DISK_TYPE \
        --size=LOG_DISK_SIZE \
        --zone=ZONE \
        --provisioned-iops=LOG_DISK_IOPS
    

    替换以下内容:

    • USR_SAP_DISK_NAME:您要为托管 /usr/sap 卷的磁盘设置的名称
    • PROJECT_ID:您的 Google Cloud 项目的 ID
    • USR_SAP_DISK_TYPE:您要部署用于托管 /usr/sap 卷的 Hyperdisk 类型,例如 hyperdisk-extreme

    • USR_SAP_DISK_SIZE:您要为托管 /usr/sap 卷的磁盘设置的大小

    • ZONE:要在其中部署新磁盘的 Compute Engine 可用区

    • USR_SAP_DISK_IOPS:您要为创建用于托管 /hana/data 的 Hyperdisk 设置的 IOPS。您可以根据性能要求设置 IOPS。

    • SHARED_DISK_NAME:您要为托管 /hana/shared 卷的磁盘设置的名称

    • SHARED_DISK_TYPE:您要部署用于托管 /hana/shared 卷的 Hyperdisk 类型,例如 hyperdisk-extreme

    • SHARED_DISK_SIZE:您要为托管 /hana/shared 卷的磁盘设置的大小

    • SHARED_DISK_IOPS:您要为托管 /hana/shared 卷的磁盘设置的 IOPS

    • DATA_DISK_NAME:您要为托管 /hana/data 卷的磁盘设置的名称

    • DATA_DISK_TYPE:您要部署用于托管 /hana/data 卷的 Hyperdisk 类型,例如 hyperdisk-extreme

    • DATA_DISK_SIZE:您要为托管 /hana/data 卷的磁盘设置的大小

    • DATA_DISK_IOPS:您要为托管 /hana/data 卷的磁盘设置的 IOPS

    • LOG_DISK_NAME:您要为托管 /hana/log 卷的磁盘设置的名称

    • LOG_DISK_TYPE:您要部署用于托管 /hana/log 卷的 Hyperdisk 类型,例如 hyperdisk-extreme

    • LOG_DISK_SIZE:您要为托管 /hana/log 卷的磁盘设置的大小

    • LOG_DISK_IOPS:您要为托管 /hana/log 卷的磁盘设置的 IOPS

  2. 将您创建的磁盘挂接到托管 SAP HANA 数据库的次要实例的 Compute Engine 实例:

    gcloud compute instances attach-disk SECONDARY_INSTANCE_NAME \
        --disk=USR_SAP_DISK_NAME \
        --zone=ZONE
    gcloud compute instances attach-disk SECONDARY_INSTANCE_NAME \
        --disk=SHARED_DISK_NAME \
        --zone=ZONE
    gcloud compute instances attach-disk SECONDARY_INSTANCE_NAME \
        --disk=DATA_DISK_NAME \
        --zone=ZONE
    gcloud compute instances attach-disk SECONDARY_INSTANCE_NAME \
        --disk=LOG_DISK_NAME \
        --zone=ZONE
    

    SECONDARY_INSTANCE_NAME 替换为托管 SAP HANA 数据库的次要实例的 Compute Engine 的名称。

  3. 如需使用逻辑卷管理 (LVM),请完成以下步骤:

    1. 为您创建和挂接的新磁盘创建物理卷:

      pvcreate USR_SAP_PV_NAME
      pvcreate SHARED_PV_NAME
      pvcreate DATA_PV_NAME
      pvcreate LOG_PV_NAME
      

      替换以下内容:

      • USR_SAP_PV_NAME:您为托管 /usr/sap 卷而创建的磁盘的实际设备路径
      • SHARED_PV_NAME:您为托管 /hana/shared 卷而创建的磁盘的实际设备路径
      • DATA_PV_NAME:您为托管 /hana/data 卷而创建的磁盘的实际设备路径
      • LOG_PV_NAME:您为托管 /hana/log 卷而创建的磁盘的实际设备路径
    2. 创建卷组:

      vgcreate vg_hana_usrsap USR_SAP_PV_NAME
      vgcreate vg_hana_shared SHARED_PV_NAME
      vgcreate vg_hana_data DATA_PV_NAME
      vgcreate vg_hana_log LOG_PV_NAME
      
    3. 创建逻辑卷:

      lvcreate -l 100%FREE -n usrsap vg_hana_usrsap
      lvcreate -l 100%FREE -n shared vg_hana_shared
      lvcreate -l 100%FREE -n data vg_hana_data
      lvcreate -l 100%FREE -n log vg_hana_log
      
  4. 创建文件系统:

    mkfs -t xfs /dev/vg_hana_usrsap/usrsap
    mkfs -t xfs /dev/vg_hana_shared/shared
    mkfs -t xfs /dev/vg_hana_data/data
    mkfs -t xfs /dev/vg_hana_log/log
    
  5. 为 SAP HANA 文件系统创建临时目录:

    mkdir -p /tmp/usr/sap
    mkdir -p /tmp/hana/shared
    mkdir -p /tmp/hana/data
    mkdir -p /tmp/hana/log
    
  6. 使用临时目录装载新创建的卷:

    mount -o logbsize=256k /dev/vg_hana_usrsap/usrsap /tmp/usr/sap
    mount -o logbsize=256k /dev/vg_hana_shared/shared /tmp/hana/shared
    mount -o logbsize=256k /dev/vg_hana_data/data /tmp/hana/data
    mount -o logbsize=256k /dev/vg_hana_log/log /tmp/hana/log
    
  7. 将数据从来源永久性磁盘卷传输到您创建的磁盘。您可以使用 rsync、LVM 快照或任何其他方法来实现此目的。以下示例使用 rsync 实用程序进行数据传输:

    rsync -avz --progress /usr/sap/ /tmp/usr/sap/
    rsync -avz --progress /hana/shared/ /tmp/hana/shared/
    rsync -avz --progress /hana/data/ /tmp/hana/data/
    rsync -avz --progress /hana/log/ /tmp/hana/log/
    
  8. 卸载 SAP HANA 文件系统的旧逻辑卷:

    umount /usr/sap
    umount /hana/shared
    umount /hana/data
    umount /hana/log
    
  9. 卸载您为 SAP HANA 文件系统创建的临时卷:

    umount /tmp/usr/sap
    umount /tmp/hana/shared
    umount /tmp/hana/data
    umount /tmp/hana/log
    
  10. 从托管 SAP HANA 数据库的次要实例的 Compute Engine 实例中,分离托管 SAP HANA 文件系统的永久性磁盘卷:

    gcloud compute instances detach-disk SECONDARY_INSTANCE_NAME
        --disk=SOURCE_DISK_NAME \
        --zone=ZONE
    

    SOURCE_DISK_NAME 替换为要从计算实例分离的托管 SAP HANA 文件系统的永久性磁盘卷的名称。

  11. 以根用户或具有 sudo 访问权限的用户身份更新 /etc/fstab 条目。以下示例展示了如何更新条目:

    /dev/vg_hana_shared/shared /hana/shared xfs defaults,nofail,logbsize=256k 0 2
    /dev/vg_hana_usrsap/sap /usr/sap xfs defaults,nofail,logbsize=256k 0 2
    /dev/vg_hana_data/data /hana/data xfs defaults,nofail,logbsize=256k 0 2
    /dev/vg_hana_log/log /hana/log xfs defaults,nofail,logbsize=256k 0 2
    
  12. 装载新创建的逻辑卷:

    mount -a
    
  13. 验证有关文件系统所用空间的信息:

    df -h
    

    输出类似于以下内容:

    # df -h
    Filesystem                         Size  Used Avail Use% Mounted on
    devtmpfs                           4.0M  8.0K  4.0M   1% /dev
    tmpfs                              638G   35M  638G   1% /dev/shm
    tmpfs                              171G  458M  170G   1% /run
    tmpfs                              4.0M     0  4.0M   0% /sys/fs/cgroup
    /dev/sdb3                           30G  6.4G   24G  22% /
    /dev/sdb2                           20M  3.0M   17M  15% /boot/efi
    /dev/mapper/vg_hanabackup-backup   1.7T   13G  1.7T   1% /hanabackup
    tmpfs                               86G     0   86G   0% /run/user/0
    /dev/mapper/vg_hana_usrsap-usrsap   32G  277M   32G   1% /usr/sap
    /dev/mapper/vg_hana_shared-shared  850G   54G  797G   7% /hana/shared
    /dev/mapper/vg_hana_data-data      1.1T  5.4G  1.1T   1% /hana/data
    /dev/mapper/vg_hana_log-log        475G  710M  475G   1% /hana/log
    

提升次要实例

  1. SID_LCadm 用户身份向 SAP HANA 系统复制注册 SAP HANA 数据库的次要实例:

    hdbnsutil -sr_register --remoteHost=PRIMARY_INSTANCE_NAME \
        --remoteInstance=PRIMARY_INSTANCE_NUMBER \
        --replicationMode=syncmem --operationMode=logreplay \
        --name=SECONDARY_INSTANCE_NAME
    

    替换以下内容:

    • PRIMARY_INSTANCE_NAME:托管 SAP HANA 系统的主实例的 Compute Engine 实例的名称
    • PRIMARY_INSTANCE_NUMBER:SAP HANA 系统的主实例的实例编号
    • SECONDARY_INSTANCE_NAME:托管 SAP HANA 系统的次要实例的 Compute Engine 实例的名称
  2. 启动 SAP HANA 数据库的次要实例:

    HDB start
    

    或者,您也可以使用 sapcontrol 命令启动次要实例:

    sapcontrol -nr INSTANCE_NUMBER -function StartSystem
    
  3. 在 SAP HANA 数据库的主实例上,以 SID_LCadm 用户身份确认 SAP HANA 系统复制处于活跃状态:

    python $DIR_INSTANCE/exe/python_support/systemReplicationStatus.py
    
  4. 确认系统复制处于活跃状态后,将 SAP HANA 数据库的次要实例设为新的主实例:

    crm resource move msl_SAPHana_SID_HDBINSTANCE_NUMBER SECONDARY_INSTANCE_NAME
    

    输出类似于以下示例:

    INFO: Move constraint created for msl_SAPHana_ABC_HDB00 to example-vm2
    INFO: Use `crm resource clear msl_SAPHana_ABC_HDB00` to remove this constraint
    
  5. 检查高可用性集群的状态:

    crm status
    

    输出类似于以下示例:

    example-vm1:~ # crm status
    Status of pacemakerd: 'Pacemaker is running' (last updated 2025-02-04 10:08:16Z)
    Cluster Summary:
      * Stack: corosync
      * Current DC: example-vm1 (version 2.1.5+20221208.a3f44794f-150500.6.20.1-2.1.5+20221208.a3f44794f) - partition with quorum
      * Last updated: Tue Feb  4 10:08:16 2025
      * Last change:  Tue Feb  4 10:07:47 2025 by root via crm_attribute on example-vm2
      * 2 nodes configured
      * 8 resource instances configured
    Node List:
      * Online: [ example-vm1 example-vm2 ]
    Full List of Resources:
      * STONITH-example-vm1  (stonith:fence_gce):     Started example-vm2
      * STONITH-example-vm2  (stonith:fence_gce):     Started example-vm1
      * Resource Group: g-primary:
        * rsc_vip_int-primary    (ocf::heartbeat:IPaddr2):    Started example-vm2
        * rsc_vip_hc-primary (ocf::heartbeat:anything):   Started example-vm2
      * Clone Set: cln_SAPHanaTopology_ABC_HDB00 [rsc_SAPHanaTopology_ABC_HDB00]:
        * Started: [ example-vm1 example-vm2 ]
      * Clone Set: msl_SAPHana_ABC_HDB00 [rsc_SAPHana_ABC_HDB00] (promotable):
        * Masters: [ example-vm2 ]
        * Slaves: [ example-vm1 ]
    
  6. 以根用户或具有 sudo 访问权限的用户身份,移除确保资源未设置为首选特定 Compute Engine 实例的限制条件:

    crm resource clear msl_SAPHana_SID_HDBINSTANCE_NUMBER
    

    输出类似于以下内容:

    INFO: Removed migration constraints for msl_SAPHana_ABC_HDB00
    

迁移先前的主实例

  1. 如需迁移 SAP HANA 系统先前的主实例,请重复前面部分中提供的过程。

  2. 让高可用性集群退出维护模式:

    crm maintenance off
    

回退到现有磁盘

如果磁盘迁移失败,您可以回退到使用现有的永久性磁盘卷,因为它们包含迁移过程开始前已存在的数据。

如需将 SAP HANA 数据库恢复到原始状态,请执行以下步骤:

  1. 停止托管 SAP HANA 系统的 Compute Engine 实例。
  2. 分离您创建的 Hyperdisk 卷。
  3. 将现有的永久性磁盘卷重新挂接到计算实例。
  4. 启动计算实例。

清理

成功将 SAP HANA 文件系统迁移到单个磁盘后,请清理与您使用的永久性磁盘卷相关的资源。这包括磁盘快照和磁盘本身。