使用sql server2012英文版数据库.某表按天建立分区,估计有100个分区.
问题:现在我将表的数据清空,需要删除数据和分区
数据库有一个存储过程过程XXXX,作用是传入时间,删除当天的数据和分区.
然后我写了一个循环.
use dbname declare @date datetime = '20190416' declare @date2 datetime --= '20190717' set @date2 = @date + 100 while @date <= @date2 --getdate()-80 begin exec [XXXX] @date set @date = @date + 1 end
然后删除到第九个分区,报错如下:
Msg 606, Level 21, State 1, Procedure XXXX, Line 17 Metadata inconsistency. Filegroup id 9 specified for table 'dbo.XXX' does not exist. Run DBCC CHECKDB or CHECKCATALOG.
很多尝试:
- 重建索引
- 收缩数据库
- 修改表后在修改回来
- 各种dbcc db ,dbcc table,dbcc Filegroup
等等方法都得不到解决.
最后呢,算是投机取巧吧.完成了清空工作,方法如下:
- 备份数据库
2.运行脚本
use dbname declare @date datetime = '20190416' declare @date2 datetime --= '20190717' set @date2 = @date + N while @date <= @date2 --getdate()-80 begin exec [XXXX] @date set @date = @date + 1 end
注意N的值,修改成一个相对较小的值.
3.如果2中脚本运行没有出错,再备份一次,到第4步;如果出错,还原最新一个备份,回到2,将N值在改小,再运行一下.
4.Dbcc一下数据库,如下脚本
ALTER DATABASE [XXX] SET SINGLE_USER dbcc checkdb(XXXX,REPAIR_ALLOW_DATA_LOSS) go alter database [XXXX] set multi_user --多用户 --dbcc checkdb(xxxx,REPAIR_REBUILD) go
如果dbcc有如下错误:
Unable to process index IX_L_XX of tableXXX because filegroup (FileGroup ID 9) is invalid. 说明有错了.需要欢迎一个最新的.
如果没有错,回到第2步,直到分区被删除完.
PS:
1.备份是关键,避免重复操作
2.在时间段上,N的值有时候可以变大或变小,需要心灵感应,O(∩_∩)O.
以下内容用于baidu搜索引擎方便搜索.
CHECKFILEGROUP found 0 allocation errors and 1 consistency errors in table 'xxxx' (object ID 1137439126). Unable to process index IX_ttime of table xxx because filegroup (FileGroup ID 9) is invalid. CHECKFILEGROUP found 0 allocation errors and 1 consistency errors in table 'xxx' (object ID 1137439126).. CHECKFILEGROUP found 0 allocation errors and 1 consistency errors in database ‘dbxxx’. is the minimum repair level for the errors found by DBCC CHECKFILEGROUP (dbxxx).
https://support.microsoft.com/en-us/help/3100361/fix-dbcc-checkdb-doesn-t-report-metadata-inconsistency-of-invalid-file
重要补充:
1.我上面遇到的出错的表,都是数据交换的表
2.出错的时候,直接定位到某一张表上的.
3.所以在数据量不大的时候,我把表直接删除后,重建(看数据重要程度备份与否),这个问题也能解决.