我们有一个数据库已经增长到大约50GB,我们想要从该数据库中提取一组特定的表(大约20个)并将它们移动到一个新的数据库中。所有这些都将在同一个SQL Server上。我们想要提取的表大约有12GB的空间(6GB数据,6GB索引)。
我们如何将表从一个数据库移动到第二个数据库,但是确保在新数据库中创建的表是原始数据的索引(索引,键等)?理想情况下,我想从SQL Server Management Studio中复制/粘贴,但我知道这不存在,那么我的选择是什么?
答案 0 :(得分:27)
1。)右键单击数据库(而不是表格),然后选择任务 - >生成脚本
2.。)在第一页上单击“下一步”
3.。)如果要复制整个数据库,只需单击“下一步”。如果要复制特定表,请单击“选择特定数据库对象”,选择所需的表,然后单击“下一步”。
4.。)选择“保存到剪贴板”或“保存到文件”。 重要:单击“保存到文件”旁边的“高级”按钮,找到“脚本数据类型”,然后将“仅模式”更改为“模式和数据”(如果要创建表格) )或“仅数据”(如果您将数据复制到现有表)。这也是您设置其他选项的地方,例如确切要复制的键等等。
5.点击其余部分,你就完成了!
答案 1 :(得分:7)
如果您因为增长而将表移动到一个全新的数据库,那么考虑在现有数据库中使用filegroups可能会更好。与试图处理两个独立的数据库相比,将来会有更少的麻烦。
修改强>
正如我在下面的评论中提到的,如果你确实需要一个新的数据库,根据所涉及的表的总数,可能更容易以新名称恢复数据库的备份并删除你不知道的表我想要。
答案 2 :(得分:2)
我也使用SQL Server Management Studio找到了这个潜在的解决方案。您可以使用SQL Server Management Studio中的“生成脚本向导”和“导入/导出向导”生成要移动的特定表的脚本,然后导出数据。然后在新数据库上运行脚本以创建所有对象,然后导入数据。我们可能会按照@Joe Stefanelli的回答中的描述使用备份/恢复方法,但我确实找到了这种方法,并希望将其发布给其他人查看。
为对象生成sql脚本:
从表中导出数据:
然后创建新数据库,运行脚本以创建所有对象,然后导入数据。
答案 3 :(得分:1)
如果您喜欢/拥有SSIS,可以使用“复制SQL对象任务”组件进行探索。
答案 4 :(得分:1)
在我的情况下,有些表很大,因此编写数据脚本是不切实际的。
此外,我们只需迁移一小部分非常大的数据库,因此我不想进行备份/恢复。
所以我选择INSERT INTO / SELECT FROM并使用information_schema等来生成代码。
对于要迁移到新数据库的每个表,请在新数据库上创建该表。
要么编写表格,要么使用SQL Compare,来自information_schema的动态sql - 有很多方法可以做到这一点。 dallin的答案显示了使用SSMS的一种方式(但一定要选择模式)。
这只是生成代码时使用的辅助函数。
USE [staging_edw]
GO
CREATE FUNCTION dbo.udf_get_column_list
(
@table_name varchar(8000)
)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @var VARCHAR(8000)
SELECT
@var = COALESCE(@var + ',', '', '') + c.COLUMN_NAME
FROM INFORMATION_SCHEMA.columns c
WHERE c.TABLE_SCHEMA + '.' + c.TABLE_NAME = @table_name
AND c.COLUMN_NAME NOT LIKE '%hash%'
RETURN @var
END
生成的代码会将进度记录到此表中,以便您进行监控。但是你必须先创建这个日志表。
USE staging_edw
GO
IF OBJECT_ID('dbo.tmp_sedw_migration_log') IS NULL
CREATE TABLE dbo.tmp_sedw_migration_log
(
step_number INT IDENTITY,
step VARCHAR(100),
start_time DATETIME
)
在这里,您将生成将为您迁移数据的T-SQL。它只为每个表生成INSERT INTO / SELECT FROM语句,并记录其进度。
此脚本实际上不会修改任何内容。它只输出一些代码,您可以在执行之前检查它们。
USE staging_edw
GO
-- newline characters for formatting of generated code
DECLARE @n VARCHAR(100) = CHAR(13)+CHAR(10)
DECLARE @t VARCHAR(100) = CHAR(9)
DECLARE @2n VARCHAR(100) = @n + @n
DECLARE @2nt VARCHAR(100) = @n + @n + @t
DECLARE @nt VARCHAR(100) = @n + @t
DECLARE @n2t VARCHAR(100) = @n + @t + @t
DECLARE @2n2t VARCHAR(100) = @n + @n + @t + @t
DECLARE @3n VARCHAR(100) = @n + @n + @n
-- identify tables with identity columns
IF OBJECT_ID('tempdb..#identities') IS NOT NULL
DROP TABLE #identities;
SELECT
table_schema = s.name,
table_name = o.name
INTO #identities
FROM sys.objects o
JOIN sys.columns c on o.object_id = c.object_id
JOIN sys.schemas s ON s.schema_id = o.schema_id
WHERE 1=1
AND c.is_identity = 1
-- generate the code
SELECT
@3n + '-- ' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME,
@n + 'BEGIN TRY',
@2nt + IIF(i.table_schema IS NOT NULL, 'SET IDENTITY_INSERT staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' ON ', ''),
@2nt + 'TRUNCATE TABLE staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME,
@2nt + 'INSERT INTO staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' WITH (TABLOCKX) ( ' + f.f + ' ) ',
@2nt + 'SELECT ' + f.f + + @nt + 'FROM staging.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME,
@2nt + IIF(i.table_schema IS NOT NULL, 'SET IDENTITY_INSERT staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' OFF ', ''),
@2nt + 'INSERT INTO dbo.tmp_sedw_migration_log ( step, start_time ) VALUES ( ''' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' inserted successfully'', GETDATE() );' ,
@2n + 'END TRY',
@2n + 'BEGIN CATCH',
@2nt + 'INSERT INTO dbo.tmp_sedw_migration_log ( step, start_time ) VALUES ( ''' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' FAILED'', GETDATE() );' ,
@2n + 'END CATCH'
FROM INFORMATION_SCHEMA.tables t
OUTER APPLY (SELECT f = staging_edw.dbo.udf_get_column_list(t.TABLE_SCHEMA + '.' + t.TABLE_NAME)) f
LEFT JOIN #identities i ON i.table_name = t.TABLE_NAME
AND i.table_schema = t.TABLE_SCHEMA
WHERE t.TABLE_TYPE = 'base table'
现在您只需复制步骤4的输出,粘贴到新的查询窗口,然后运行。
答案 5 :(得分:0)
SELECT *
INTO new_table_name [IN new database]
FROM old_tablename
答案 6 :(得分:0)
尝试使用DBSourceTools
http://dbsourcetools.codeplex.com。
此工具集使用SMO将表和数据编写到磁盘,还允许您选择要包含的表/视图/存储过程。
使用“部署目标”时,它还会自动处理依赖关系
我已经反复使用它来解决这类问题,而且它非常简单快速。