点击此处---> 群内免费提供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行:
安装数据库:无法验证设备。 设备分配与清单文件中的描述不一致。
我一直在尝试许多其他工作流程,例如:
- 创建一个新数据库(假设我们分配了dbid = 15)。
- 创建表,插入一些数据。
- 卸载数据库。
- 创建一个新数据库(以便为其分配先前使用的dbid = 15)。
- 安装原始数据库(以便为其分配新的dbid = 16)。 这将触发" MOUNT DATABASE:数据库'db'需要一个新的数据库ID才能挂载它。必须对此数据库运行DBCC CHECKALLOC进行更正。" 消息。
- 在线上原始数据库并开始使用它(无需执行DBCC CHECKALLOC)。
似乎没有任何不良影响。
- 为什么不总是触发错误14545?
- 还有其他工作流程可触发此消息吗?
- 不按照建议进行" DBCC CHECKALLOC"有危险吗? 我发布了" dbcc缓冲区(14," mytable")"。
- 我了解DBCC CHECALLOC将获得一个新选项" fixdbid",该选项只能通过CR#798271来修复dbid。 您是否可以与我们分享有关798271的详细信息? 我找不到关于它的任何知识库文章。
嗨,尼尔,
数据库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
一周热门 更多>