你当前正在访问 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
结合运行的命令(例如 backup
、test
或 details
)以及默认配置文件名(例如 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 文件放置在与其他日志文件相同的位置,并且是简单的单行输出文件。
成功完成示例:
输出到 *.result 文件:
Database # 1 (PR1) : completed ok
输出到
/var/log/messages
:Dec 17 09:01:13 azacsnap-rhel azacsnap: Database # 1 (PR1) : completed ok
发生失败且 AzAcSnap 捕获失败的示例输出:
输出到 *.result 文件:
Database # 1 (PR1) : failed
输出到
/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) 中的网络控制来测试配置是否正确。
在 Azure 门户中打开一个 Cloud Shell 会话。
创建一个测试目录,例如
mkdir azacsnap
。切换到 azacsnap 目录,并下载最新版本的 AzAcSnap。
wget https://aka.ms/azacsnapinstaller
使安装程序可执行,例如
chmod +x azacsnapinstaller
。提取二进制文件以进行测试。
./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
使用 Cloud Shell 上传/下载图标上传服务主体文件 azureauth.json 和 AzAcSnap 配置文件(例如 azacsnap.json)以进行测试。
运行
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']
解决此错误:
检查 azacsnap.json 配置文件中设置的服务主体文件 azureauth.json 是否存在。
检查日志文件(例如 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.
检查日志文件,查看服务主体是否已过期。 以下日志文件示例显示客户端机密密钥已过期。
[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
解决此错误:
检查每个 HANA 实例的配置文件(例如 azacsnap.json),以确保 SAP HANA 数据库值正确。
运行以下命令以验证
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 用户应该可以解决特权不足错误。