你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

排查 Azure 应用程序一致性快照 (AzAcSnap) 工具的问题

本文介绍如何排查在对 Azure NetApp 文件和 Azure 大型实例使用 Azure 应用程序一致性快照 (AzAcSnap) 工具时出现的问题。

运行 AzAcSnap 命令时,可能会遇到几种常见问题。 请按照说明排查问题。 如果仍有问题,请在 Azure 门户中向 Microsoft 支持部门提出服务请求,并将请求分配到 SAP HANA 大型实例队列。

AzAcSnap 命令无法运行

在某些情况下,AzAcSnap 会因用户环境而无法启动。

未能创建 CoreCLR

AzAcSnap 是使用 .NET 编写的,CoreCLR 是 .NET 应用的执行引擎,可执行 IL 字节代码加载、编译为计算机代码和垃圾回收等功能。 在本例中,有一个环境问题阻止 CoreCLR 引擎启动。

常见原因是 AzAcSnap 操作系统用户(通常是“azacsnap”)的权限或环境设置有限。

错误 Failed to create CoreCLR, HRESULT: 0x80004005 可能是由于 azacsnap 用户缺少对系统的 TMPDIR 的写入访问权限导致的。

注意

# 开头的所有命令行都是以 root 身份运行的命令,而以 > 开头的所有命令行都以 azacsnap 用户身份运行。

检查 /tmp 所有权和权限(请注意,在本例中,只有 root 用户可以读取和写入 /tmp):

# ls -ld /tmp
drwx------ 9 root root 8192 Mar 31 10:50 /tmp

典型的 /tmp 具有以下权限,这允许 azacsnap 用户运行 azacsnap 命令:

# ls -ld /tmp
drwxrwxrwt 9 root root 8192 Mar 31 10:51 /tmp

如果无法更改 /tmp 目录权限,请创建特定于用户的 TMPDIR

azacsnap 用户创建 TMPDIR

> mkdir /home/azacsnap/_tmp
> export TMPDIR=/home/azacsnap/_tmp
> azacsnap -c about
 
 
                            WKO0XXXXXXXXXXXNW
                           Wk,.,oxxxxxxxxxxx0W
                           0;.'.;dxxxxxxxxxxxKW
                          Xl'''.'cdxxxxxxxxxdkX
                         Wx,''''.,lxxxxdxdddddON
                         0:''''''.;oxdddddddddxKW
                        Xl''''''''':dddddddddddkX
                       Wx,''''''''':ddddddddddddON
                       O:''''''''',xKxddddddoddod0W
                      Xl''''''''''oNW0dooooooooooxX
                     Wx,,,,,,'','c0WWNkoooooooooookN
                    WO:',,,,,,,,;cxxxxooooooooooooo0W
                    Xl,,,,,,,;;;;;;;;;;:llooooooooldX
                   Nx,,,,,,,,,,:c;;;;;;;;coooollllllkN
                  WO:,,,,,,,,,;kXkl:;;;;,;lolllllllloOW
                  Xl,,,,,,,,,,dN WNOl:;;;;:lllllllllldK
                  0c,;;;;,,,;lK     NOo:;;:clllllllllo0W
                  WK000000000N        NK000KKKKKKKKKKXW
 
 
                Azure Application Consistent Snapshot Tool
                       AzAcSnap 7a (Build: 1AA8343)

重要

通过更改用户配置文件(例如 $HOME/.bashrc$HOME/.bash_profile),需要永久更改用户的 TMPDIR。 还需要在系统重新启动时清理 TMPDIR/tmp 通常是自动清理。

检查日志文件、结果文件和 syslog

用于调查 AzAcSnap 问题的最佳信息来源包括日志文件、结果文件和系统日志。

日志文件

AzAcSnap 日志文件存储在 AzAcSnap 配置文件中 logPath 参数配置的目录中。 默认配置文件名为 azacsnap.json,logPath 的默认值为 ./logs,这意味着,日志文件将写入到相对于 azacsnap 命令运行位置的 ./logs 目录。 如果将 logPath 设为绝对位置(例如 /home/azacsnap/logs),则 azacsnap 始终将日志输出到 /home/azacsnap/logs,无不管 azacsnap 命令在何处运行。

日志文件名基于应用程序名称 azacsnap、与 -c 结合运行的命令(例如 backuptestdetails)以及默认配置文件名(例如 azacsnap.json)。 使用 -c backup 命令时,默认日志文件名将是 azacsnap-backup-azacsnap.log,该文件写入到 logPath 配置的目录。

此命名约定允许多个配置文件(每个数据库各有一个),以帮助查找关联的日志文件。 如果配置文件名为 SID.json,则使用 azacsnap -c backup --configfile SID.json 选项时的日志文件名为 azacsnap-backup-SID.log。

结果文件和 syslog

对于 -c backup 命令,AzAcSnap 将写入 *.result 文件。 *.result 文件的用途是大致确认成功/失败。 如果 *.result 文件为空,则假定失败。 写入 *.result 文件的任何输出也会通过使用 logger 命令输出到系统日志(例如 /var/log/messages)。 *.result 文件名与日志文件具有相同的基名称,以便将结果文件与配置文件和备份日志文件匹配。 *.result 文件放置在与其他日志文件相同的位置,并且是简单的单行输出文件。

  1. 成功完成示例:

    1. 输出到 *.result 文件:

      Database # 1 (PR1) : completed ok
      
    2. 输出到 /var/log/messages

      Dec 17 09:01:13 azacsnap-rhel azacsnap: Database # 1 (PR1) : completed ok
      
  2. 发生失败且 AzAcSnap 捕获失败的示例输出:

    1. 输出到 *.result 文件:

      Database # 1 (PR1) : failed
      
    2. 输出到 /var/log/messages

      Dec 19 09:00:30 azacsnap-rhel azacsnap: Database # 1 (PR1) : failed
      

排查“test storage”命令失败的原因

命令 azacsnap -c test --test storage 可能未成功完成。

检查网络防火墙

与 Azure NetApp 文件的通信可能会失败或超时。若要进行故障排除,请确保防火墙规则不会阻止从运行 AzAcSnap 的系统到以下地址和 TCP/IP 端口的出站流量:

  • https://management.azure.com:443
  • https://login.microsoftonline.com:443

使用 Cloud Shell 验证配置文件

可以通过 Azure 门户使用 Cloud Shell 来测试服务主体的配置是否正确。 使用 Cloud Shell 并绕过虚拟网络或虚拟机 (VM) 中的网络控制来测试配置是否正确。

  1. 在 Azure 门户中打开一个 Cloud Shell 会话。

  2. 创建一个测试目录,例如 mkdir azacsnap

  3. 切换到 azacsnap 目录,并下载最新版本的 AzAcSnap。

    wget https://aka.ms/azacsnapinstaller
    
  4. 使安装程序可执行,例如 chmod +x azacsnapinstaller

  5. 提取二进制文件以进行测试。

    ./azacsnapinstaller -X -d .
    

    结果类似于以下输出:

    +-----------------------------------------------------------+
    | Azure Application Consistent Snapshot Tool Installer |
    +-----------------------------------------------------------+
    |-> Installer version '5.0.2_Build_20210827.19086'
    |-> Extracting commands into ..
    |-> Cleaning up .NET extract dir
    
  6. 使用 Cloud Shell 上传/下载图标上传服务主体文件 azureauth.json 和 AzAcSnap 配置文件(例如 azacsnap.json)以进行测试。

  7. 运行 storage 测试。

    ./azacsnap -c test --test storage
    

    注意

    测试命令可能需要大约 90 秒才能完成。

Azure 大型实例上的测试失败

以下错误示例是在 Azure 大型实例上运行 azacsnap 后的结果:

azacsnap -c test --test storage
The authenticity of host '172.18.18.11 (172.18.18.11)' can't be established.
ECDSA key fingerprint is SHA256:QxamHRn3ZKbJAKnEimQpVVCknDSO9uB4c9Qd8komDec.
Are you sure you want to continue connecting (yes/no)?

若要排查此错误,请不要响应 yes。 确保你的存储 IP 地址正确。 可与 Microsoft 运营团队确认存储 IP 地址。

当 Azure 大型实例存储用户无权访问底层存储时,通常会出现该错误。 若要确定存储用户是否有权访问存储,请运行 ssh 命令以验证与存储平台的通信。

ssh <StorageBackupname>@<Storage IP address> "volume show -fields volume"

以下示例显示了预期的输出:

ssh clt1h80backup@10.8.0.16 "volume show -fields volume"
vserver volume
--------------------------------- ------------------------------
osa33-hana-c01v250-client25-nprod hana_data_h80_mnt00001_t020_vol
osa33-hana-c01v250-client25-nprod hana_data_h80_mnt00002_t020_vol

对 Azure NetApp 文件测试失败

以下错误示例是对 Azure NetApp 文件运行 azacsnap 后的结果:

azacsnap --configfile azacsnap.json.NOT-WORKING -c test --test storage
BEGIN : Test process started for 'storage'
BEGIN : Storage test snapshots on 'data' volumes
BEGIN : 1 task(s) to Test Snapshots for Storage Volume Type 'data'
ERROR: Could not create StorageANF object [authFile = 'azureauth.json']

解决此错误:

  1. 检查 azacsnap.json 配置文件中设置的服务主体文件 azureauth.json 是否存在。

  2. 检查日志文件(例如 logs/azacsnap-test-azacsnap.log),查看服务主体文件的内容是否正确。 以下日志文件输出显示客户端机密密钥无效。

    [19/Nov/2020:18:39:49 +13:00] DEBUG: [PID:0020080:StorageANF:659] [1] Innerexception: Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException AADSTS7000215: Invalid client secret is provided.
    
  3. 检查日志文件,查看服务主体是否已过期。 以下日志文件示例显示客户端机密密钥已过期。

    [19/Nov/2020:18:41:10 +13:00] DEBUG: [PID:0020257:StorageANF:659] [1] Innerexception: Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException AADSTS7000222: The provided client secret keys are expired. Visit the Azure Portal to create new keys for your app, or consider using certificate credentials for added security: https://learn.microsoft.com/azure/active-directory/develop/active-directory-certificate-credentials
    

提示

有关生成新的服务主体的详细信息,请参阅安装 Azure 应用程序一致性快照工具指南中启用与存储的通信部分。

排查“test hana”命令失败的原因

命令 azacsnap -c test --test hana 可能未成功完成。

找不到命令

当设置与 SAP HANA 的通信时, hdbuserstore 程序用于创建安全通信设置。 AzAcSnap 还要求使用 hdbsql 程序来与 SAP HANA 进行各种通信。 这些程序通常位于 /usr/sap/<SID>/SYS/exe/hdb/ 或 /usr/sap/hdbclient 下,且必须在用户的 $PATH 中。

  • 在以下示例中,hdbsql 命令不在用户的 $PATH 中。

    hdbsql -n 172.18.18.50 - i 00 -U AZACSNAP "select version from sys.m_database"
    
    If 'hdbsql' is not a typo you can use command-not-found to lookup the package that contains it, like this:
    cnf hdbsql
    
  • 以下示例临时将 hdbsql 命令添加到用户的 $PATH 中,使 azacsnap 能够正常运行。

    export PATH=$PATH:/hana/shared/H80/exe/linuxx86_64/hdb/
    

确保安装程序将这些文件的位置添加到 AzAcSnap 用户的 $PATH 中。

注意

若要永久添加到用户的 $PATH 中,请更新用户的 $HOME/.profile 文件。

密钥值无效

此命令输出显示未使用 hdbuserstore Set 命令正确设置连接密钥。

hdbsql -n 172.18.18.50 -i 00 -U AZACSNAP "select version from sys.m_database"
* -10104: Invalid value for KEY (AZACSNAP)

有关 hdbuserstore 的设置的详细信息,请参阅 AzAcSnap 入门

失败的测试

在使用 azacsnap -c test --test hana 运行测试来验证与 SAP HANA 的通信时,可能会收到以下错误:

> azacsnap -c test --test hana
BEGIN : Test process started for 'hana'
BEGIN : SAP HANA tests
CRITICAL: Command 'test' failed with error:
Cannot get SAP HANA version, exiting with error: 127

解决此错误:

  1. 检查每个 HANA 实例的配置文件(例如 azacsnap.json),以确保 SAP HANA 数据库值正确。

  2. 运行以下命令以验证 hdbsql 命令是否在路径中,以及它是否可以连接到 SAP HANA 服务器。

    hdbsql -n 172.18.18.50 - i 00 -d SYSTEMDB -U AZACSNAP "\s"
    

    以下示例显示正常运行命令时的输出:

    host          : 172.18.18.50
    sid           : H80
    dbname        : SYSTEMDB
    user          : AZACSNAP
    kernel version: 2.00.040.00.1553674765
    SQLDBC version:        libSQLDBCHDB 2.04.126.1551801496
    autocommit    : ON
    locale        : en_US.UTF-8
    input encoding: UTF8
    sql port      : saphana1:30013
    

特权不足错误

如果运行 azacsnap 时出现类似于 * 258: insufficient privilege 的错误,请检查是否根据安装指南为用户设置了适当的 AZACSNAP 数据库用户特权。 使用以下命令验证用户的特权:

hdbsql -U AZACSNAP "select GRANTEE,GRANTEE_TYPE,PRIVILEGE,IS_VALID,IS_GRANTABLE from sys.granted_privileges " | grep -i -e GRANTEE -e azacsnap

该命令应返回以下输出:

GRANTEE,GRANTEE_TYPE,PRIVILEGE,IS_VALID,IS_GRANTABLE
"AZACSNAP","USER","BACKUP ADMIN","TRUE","FALSE"
"AZACSNAP","USER","CATALOG READ","TRUE","FALSE"
"AZACSNAP","USER","CREATE ANY","TRUE","TRUE"

该错误可能会提供更多信息来帮助确定所需的 SAP HANA 特权,例如 Detailed info for this error can be found with guid '99X9999X99X9999X99X99XX999XXX999' SQLSTATE: HY000。 在这种情况下,请按照 SAP 帮助门户 - GET_INSUFFICIENT_PRIVILEGE_ERROR_DETAILS 中的说明操作,其中建议使用以下 SQL 查询来确定所需特权的详细信息:

CALL SYS.GET_INSUFFICIENT_PRIVILEGE_ERROR_DETAILS ('99X9999X99X9999X99X99XX999XXX999', ?)
GUID,CREATE_TIME,CONNECTION_ID,SESSION_USER_NAME,CHECKED_USER_NAME,PRIVILEGE,IS_MISSING_ANALYTIC_PRIVILEGE,IS_MISSING_GRANT_OPTION,DATABASE_NAME,SCHEMA_NAME,OBJECT_NAME,OBJECT_TYPE
"99X9999X99X9999X99X99XX999XXX999","2021-01-01 01:00:00.180000000",120212,"AZACSNAP","AZACSNAP","DATABASE ADMIN or DATABASE BACKUP ADMIN","FALSE","FALSE","","","",""

在以上示例中,将 DATABASE BACKUP ADMIN 特权添加到 SYSTEMDB 的 AZACSNAP 用户应该可以解决特权不足错误。

后续步骤