我正在将其中一个具有多个文件组的数据库迁移到Azure Sql Server中。根据DMA(数据迁移助手),Azure似乎还不支持多个文件组。
现在我想将文件组合并回单个文件。
通过在互联网上搜索,我发现以下命令缩小文件组以清空文件组。我认为只需将内容合并到主文件组中,然后就可以删除文件组。
DBCC SHRINKFILE ('ndfFile', EMPTYFILE);
GO
ALTER DATABASE myDb REMOVE file ndfFile
GO
当我运行此命令时,我收到以下错误消息:
Msg 2556,Level 16,State 1,Line 2
文件组中没有足够的空间来完成空文件操作。
我已检查主文件组文件并启用了自动增长
我已经进行了完整备份并删除了数据库并再次恢复了数据库,但再次没有成功。
我还尝试使用单个文件创建新数据库,并尝试使用导入/导出将数据复制到新数据库中。但是,导入/导出向导仅创建表,但不创建参照完整性约束,也不创建主键等。
当我使用Generate Scripts功能创建对象来创建所有对象时,即使是" Insert Identity"我也无法复制数据。选项已被选中。
问题1:有什么方法可以将MyDb.bak备份文件恢复为单个文件(和日志文件)吗?
问题2:有没有办法将文件组合并为单个文件?
答案 0 :(得分:2)
您需要使用WITH(DROP_EXISTING = ON)将现有数据从其他文件组移动到主文件组,如this文章中所述。
之后,您可以使用ALTER DATABASE语句删除文件组。
ALTER DATABASE [DB1] REMOVE FILEGROUP [fg_Secondary]
最后,您将能够将数据库迁移到Azure SQL数据库。
答案 1 :(得分:1)
最后我深入了解了这个问题。该问题是由放置在第二个文件组中的全文搜索索引引起的。用提供的答案来识别那些并不容易。
下面运行此脚本可识别所选数据库和索引文件组中的所有全文索引。
USE yourdatabasename;
SELECT
t.name AS TableName,
c.name AS FTCatalogName ,
i.name AS UniqueIdxName,
cl.name AS ColumnName,
f.name as FileGroupName
FROM
sys.tables t
INNER JOIN
sys.fulltext_indexes fi
ON
t.[object_id] = fi.[object_id]
INNER JOIN
sys.fulltext_index_columns ic
ON
ic.[object_id] = t.[object_id]
INNER JOIN
sys.columns cl
ON
ic.column_id = cl.column_id
AND ic.[object_id] = cl.[object_id]
INNER JOIN
sys.fulltext_catalogs c
ON
fi.fulltext_catalog_id = c.fulltext_catalog_id
INNER JOIN
sys.indexes i
ON
fi.unique_index_id = i.index_id
INNER JOIN sys.filegroups f ON fi.data_space_id = f.data_space_id
AND fi.[object_id] = i.[object_id];
一旦确定了辅助文件组中的所有索引,就需要删除所有这些索引并再次创建它们。如果未指定文件组名称,则它们将被放置在默认(PRIMARY)文件组中。
在PRIMARY文件组中重新创建索引后,您可以运行以下脚本清空并从数据库中删除辅助文件组:
DBCC SHRINKFILE ('ndfFile', EMPTYFILE);
GO
ALTER DATABASE myDb REMOVE file ndfFile
GO
您还可以按照以下步骤清空和删除SSMS属性中的文件:
右键单击数据库>任务>收缩>文件
在FileGroup下拉列表中选择第二个文件组。
然后使用单选按钮说"通过迁移来清空文件..."并点击确定。这将删除空间。
现在可以通过以下方式删除文件组:
右键单击数据库>属性
在左窗格中选择“文件组”。并选择第二个文件组并删除。
一切都应该好好迁移到Azure Sql Server。