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

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

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

运行 AzAcSnap 命令时,可能会遇到几种常见问题。 请按照说明排查问题。

重要

为了确保准确的故障排除和支持,应使用最新的 AzAcSnap 版本重现问题。 在报告任何问题之前更新到最新版本。 如果仍有问题,请转到 Azure 门户,选择“支持 + 故障排除”并搜索有关 AzAcSnap 问题的指南,这样就可以打开Microsoft支持的服务请求。

AzAcSnap 命令无法运行

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

未能创建 CoreCLR

AzAcSnap 以 .NET 编写,CoreCLR 是用于 .NET 应用的执行引擎。 它执行 IL 字节代码加载、编译到计算机代码和垃圾回收等函数。 出现 CoreCLR 错误时,通常是因为存在环境问题阻止了 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

TMPDIR 用户创建 azacsnap

> 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)

重要

通过更改用户配置文件(例如 TMPDIR$HOME/.bashrc),需要永久更改用户的 $HOME/.bash_profile。 进行此更改意味着在系统重新启动时需要手动清理 TMPDIR 。 对于 TMPDIR,此 /tmp 清理通常自动完成。

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

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

日志文件

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

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

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

结果文件和 syslog

对于 -c backup 命令,AzAcSnap 将写入 *.result 文件。 *.result 文件的用途是大致确认成功/失败。 如果 *.result 文件为空,则假定失败。 写入 *.result 文件的任何输出也会通过使用 命令输出到系统日志(例如 /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 下,且必须在用户的 中。

  • 在以下示例中,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 用户应该可以解决特权不足错误。

后续步骤