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

本文档介绍了如何将 Google Cloud 上 SAP HANA 部署中的文件系统迁移到基于 SSD 的各个 Persistent Disk 或 Google Cloud Hyperdisk 卷。

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

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

  • 它支持为文件系统(尤其是 /hana/data/hana/log)独立调整磁盘性能,尤其是在使用 Hyperdisk 时。
  • 这有助于简化维护。

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

查看迁移注意事项

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

准备工作

在将托管在单个磁盘上的 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 文件系统采用的命名惯例,或者您的计算实例是否支持非易失性存储器 Express (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 纵向扩容 HA 系统类似。

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

架构图:显示将 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 纵向扩容 HA 部署的文件系统从单个 Persistent Disk 卷迁移到每个文件系统的一个 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:您要为要创建的 Hyperdisk 设置的 IOPS,以托管 /hana/data。您可以根据性能要求设置 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. 将数据从源 Persistent Disk 卷传输到您创建的磁盘。您可以使用 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. 检查 HA 集群的状态:

    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. 以 root 用户或具有 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 文件系统迁移到各个磁盘后,请清理与您之前使用的永久性磁盘卷相关的资源。这包括磁盘快照和磁盘本身。