首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将表从一台服务器复制到另一台服务器,包括键和索引

问将表从一台服务器复制到另一台服务器,包括键和索引
EN

Database Administration用户
提问于 2019-07-15 16:24:22
回答 4查看 3.9K关注 0票数 2

我做一个小项目已经有两个星期了。

我们希望合并几个远程服务器数据库中的几个表,以便独立于一个DIY迷你数据仓库的实时databases....kind上运行查询和报告。

我们有三个Server 2008远程服务器,我正在将数据编译到一个本地服务器上,运行三个单独的2017实例。

Server数据库都已设置完毕,我已经成功地测试了如何使用几种不同的方法复制所需的表,包括:

  • SSMS导入/导出向导
  • 以及使用新数据库中的链接服务器编写脚本:插入到dbo.table中,SELECT *来自remoteserver.remotedatabase.dbo.remotetable

这两种方法都成功地复制了表和数据,但没有复制键、索引和其他约束。

我只是最近才在数据库中工作,所以我自己也不知所措,Google给出了上述复制建议,但在服务器间传输表时,我找不到任何包含键、索引和其他约束的内容。

EN

回答 4

Database Administration用户

发布于 2019-07-15 16:51:58

由于您希望有选择地写出某些表,所以可以使用双酚以编程方式编写表、触发器的脚本等使用Export-DbaScript。

或者,您也可以尝试Export-DbaDacPackage和-table参数。

由于您使用的是链接服务器,我在哪个更有效:从链接服务器中选择还是插入到链接服务器中?上的回答也会有所帮助。

票数 3
EN

Database Administration用户

发布于 2019-07-15 16:59:21

我有一个类似的需求,在我的一个网站:我需要创建一个报告数据库的生产每晚在维护期间。我没有使用链接服务器,但是如果您在远程服务器上有特权来添加索引和主键,那么这种方法应该同样工作。在数据加载步骤之后,如果不存在索引,则运行create和主键命令。

代码语言:javascript
复制
-- do the data loading
INSERT INTO dbo.table
  SELECT *
  FROM remoteserver.remotedatabase.dbo.remotetable;

-- create the indexes if they do not exist

if NOT exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'pk_remotetable' )

ALTER TABLE [remoteserver].[remotedatabase].[dbo].[remotetable] ADD  CONSTRAINT [pk_remotetable] PRIMARY KEY CLUSTERED ( [remotetable_ID] ASC );

go

if NOT exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'nc_index1' )

    CREATE NONCLUSTERED INDEX [nc_index1] ON [remoteserver].[remotedatabase].[dbo].[remotetable] (
    [col1] ASC) INCLUDE ( [col2], [col3])

go

您可能需要尝试数据加载时间,以及删除索引、执行数据加载、然后重新创建它们或在数据加载之前创建索引是否更快。我相信在没有索引的情况下,您会发现数据加载速度更快,但是创建索引还需要时间。

例如,您可以尝试以下方法

代码语言:javascript
复制
if exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'pk_remotetable' )

ALTER TABLE [remoteserver].[remotedatabase].[dbo].[remotetable] DROP CONSTRAINT [pk_remotetable]

go

if exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'nc_index1' )

DROP INDEX IX_index1 ON [remoteserver].[remotedatabase].[dbo].[remotetable]

go

然后执行数据加载,然后创建如上所示的pk和nc索引。

注意:我的回答有点理论性,因为在我的例子中,我的数据加载是通过还原prod的备份(不是通过链接服务器)完成的,但是在我的SQL Agent工作中,我做了大量删除生产OLTP数据库所需的索引,但是在报告和创建与报告相关的索引时,这些索引都是错误的,并帮助报告运行得更快。换句话说,我确实会在源数据库中自动重新创建相同的索引,但是我确实在目标中创建了专门为报告需要而设计的新索引,而不是OLTP需求。

票数 0
EN

Database Administration用户

发布于 2019-07-15 19:34:51

就我个人而言,我使用SSIS为我需要传输的项生成创建脚本(通过右键单击您的数据库、选择任务、生成脚本)(特别是如果我不得不删除和重新创建,而不是正常创建,因为这将处理由外键关联的表序列、禁用/删除未被操作的表等)、在目标DB上执行创建脚本,然后使用SSIS数据转移操作来传输数据,这通常比从一个系统大量传输数据到另一个系统的其他方法更快。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/242910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档