在什么情况下会触发ASE错误14545

2020-08-14 00:55发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)你好 我们找到了一个可以触发...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我们找到了一个可以触发ASE错误14545的工作流程:

ASE消息14545:无法在设备'dx2vn91tu9cvrffeO1f00r_3_dat'上找到数据库'dxu3vGfrtUPzEus9uf_ODS_R'dbid = 4的逻辑页3273216。 设备上的页面是dbid 10的逻辑页面3273216。'ASE消息14547:设备'/delphix_toolkit/toolkit/4233acbb-a581-d09a-c500-bf4ff24e0deb-vdb-66/datafile/dx2vn91tu9cvrffeO1f00r_3.dat'不对应 清单文件中的设备" dx2vn91tu9cvrffeO1f00r_3_dat"。ASE消息14519:安装数据库:无法验证设备。 设备分配与清单文件中的描述不一致。

基本上,我们会执行以下操作:


要重现此问题:

#在其自己的设备上创建任意大小的数据库:

1> DISK INIT name ='device',physname ='/home/sybase/device',size ='50M'

2>前进

1>使用覆盖创建CREATE DATABASE db ON device ='30M'LOG ON device ='10M'

2>前进

创建数据库:在磁盘"设备"上分配7680个逻辑页(30.0兆字节)(请求了7680个逻辑页)。

创建数据库:在磁盘"设备"上分配2560个逻辑页(10.0兆字节)(请求了1560个逻辑页)。

警告:您已设置此数据库以在磁盘4上包含用于数据和事务日志的空间。 如果该磁盘发生故障,这可能使恢复无法进行。

数据库'db'现在在线。

注意:创建后,假设此数据库是使用dbid = 4创建的

#将此数据库卸载到某些清单文件中:

1>将数据库db迁移到'/home/sybase/manifest'

2>前进

#创建另一个未指定dbid的数据库。 对于该数据库,使用哪种设备都没有关系。

1> DISK INIT name ='device2',physname ='/home/sybase/device2',size ='20M'

2>前进

1>在OVER2上创建db2在device2 ='10M'上登录device2 ='5M'

2>前进

创建数据库:在磁盘" device2"上分配2560个逻辑页面(10.0兆字节)(请求2560个逻辑页面)。 创建数据库:在磁盘" device2"上分配1280个逻辑页(5.0兆字节)(请求1280个逻辑页)。

警告:您已设置此数据库以在磁盘4上包含用于数据和事务日志的空间。 如果该磁盘发生故障,这可能使恢复无法进行。

数据库'db2'现在处于联机状态。

注意:创建后,该数据库(db2)将具有与先前数据库相同的dbid(dbid也= 4)

#挂载旧数据库

1>从'/home/sybase/manifest'安装MOUNT DATABASE数据库

2>前进

开始估计数据库'db'的恢复日志边界。

数据库'db',检查点=(7685,13),first =(7685,13),last =(7685,13)。

完成估计数据库'db'的恢复日志边界。

为数据库" db"启动了Analysis阶段。

已完成数据库'db'的Analysis通行证。

开始对数据库'db'进行REDO传递。 要处理的日志记录总数为1。

已完成数据库" db"的REDO传递。

恢复数据库'db'将撤消不完整的嵌套顶部操作。

启动数据库'db'的恢复检查点。

已完成数据库" db"的恢复检查点。

开始填充数据库'db'的可用空间信息。

已完成填充数据库'db'的可用空间信息。

开始清除数据库'db'的默认数据缓存。

完成清理数据库'db'的默认数据缓存。

MOUNT DATABASE:已安装数据库'db'的完整恢复。

MOUNT DATABASE:数据库'db'需要一个新的数据库ID才能挂载它。 必须在此数据库上运行DBCC CHECKALLOC才能进行更正。

注意:mount仍然有效,数据库仍然可以联机,我们仍然可以查询数据库中的表。

#向第一个数据库添加一个片段(db,现在dbid为5)

1> ALTER DATABASE db ON device ='10M'

2>前进

在磁盘设备上将数据库扩展2560页(10.0兆字节)

#卸载数据库,然后尝试再次安装它

1>将数据库db迁移到'/home/sybase/manifestbroken'

2>前进

1>从'/home/sybase/manifestbroken'安装数据库

2>前进

信息14545,第16级,状态1:

服务器" RH65_ASE16_TGT_S1",第1行:

无法在设备"设备"上找到数据库" db"的逻辑页面10240,dbid = 4。 设备上的页面是dbid 5的逻辑页面10240。

信息14547,级别16,状态1:

服务器" RH65_ASE16_TGT_S1",第1行:

设备'/home/sybase/device'与清单文件中的设备'device'不对应。

第14级,状态1:邮件14519,

服务器" RH65_ASE16_TGT_S1",第1行:

安装数据库:无法验证设备。 设备分配与清单文件中的描述不一致。


我一直在尝试许多其他工作流程,例如:

  1. 创建一个新数据库(假设我们分配了dbid = 15)。
  2. 创建表,插入一些数据。
  3. 卸载数据库。
  4. 创建一个新数据库(以便为其分配先前使用的dbid = 15)。
  5. 安装原始数据库(以便为其分配新的dbid = 16)。 这将触发" MOUNT DATABASE:数据库'db'需要一个新的数据库ID才能挂载它。必须对此数据库运行DBCC CHECKALLOC进行更正。" 消息。
  6. 在线上原始数据库并开始使用它(无需执行DBCC CHECKALLOC)。

似乎没有任何不良影响。

  • 为什么不总是触发错误14545?
  • 还有其他工作流程可触发此消息吗?
  • 不按照建议进行" DBCC CHECKALLOC"有危险吗? 我发布了" dbcc缓冲区(14," mytable")"。
  • 我了解DBCC CHECALLOC将获得一个新选项" fixdbid",该选项只能通过CR#798271来修复dbid。 您是否可以与我们分享有关798271的详细信息? 我找不到关于它的任何知识库文章。
1条回答
落灬小鱼
2020-08-14 01:20 .采纳回答

嗨,尼尔,

数据库ID存储在多个位置-最明显的是sysdatabases和sysusages。 在数据库中,它还存储在磁盘上的" dbinfo"结构(sysanchors表的一部分)中,并存储在数据库中每个分配页的页眉中。

示例:

< p> 1> dbcc dbinfo(db)

2>转到| grep dbid

offset 60 = dbi_dbid:6

1> dbcc页面(db,0)

2> go | grep dbid

bmass_next = 0x0x14b5d51c0 bmass_prev = 0x0x14b5d9090 bdbid = 7

pageno = 0 dealloc_count = 36 allocnode = 0 ptnid = 99 distribution_page dbid = 7

dbinfo结构和分配页面位于数据库中,当您卸载数据库时,它们位于清单中包含的页面上。

将数据库装载到已经使用了装载数据库dbid的服务器上时 ,ASE会为已安装的数据库分配一个新的dbid,这将反映在master数据库中的sysdatabases和sysusages表中以及已安装数据库的dbtable内存结构中。 但是,dbinfo结构中的dbid和已安装数据库中的分配页不会通过mount进行更新。 这样做会在大型数据库上花费很长时间。
DBCC checkalloc将更正所有分配页面中的值。

在第一个示例中,当您更改数据库时,ASE使用以下命令中的dbid: 内存中的dbtable来初始化添加空间中的分配页。 结果,较旧的分配页面仍具有旧的dbid,而新添加的页面具有新的dbid。 Mount希望所有分配页都反映相同的dbid值。

您的第二个示例没有得到此错误,因为没有生成新的分配页(具有不匹配的dbid)。

CR 798271实际上将在MOUNT命令中而不是dbcc checkalloc中添加" with fixdbid"选项,以便可以在安装过程中而不是在以后修复dbid。

-bret

# p#

从分配页的标头中获取dbid的另一种方法是使用内置函数pageinfo。
分配页将dbid存储在"下一行号"标头字段中。

1>选择pageinfo(2,256,"下一个行号")
2>转到
----------
2
(受影响的1行)
1>选择pageinfo(5,512,"下一行")
2>转到
----------
5
(受影响的1行)

这比使用dbcc页更方便,因为结果可以直接在TSQL脚本中使用

干杯,
-bret

一周热门 更多>