如何在2个数据库的表间复制大数据量的表

时间:2022-02-14 12:22:15
请问各位:从server1的DB1的表table1定时同步到server2的DB2的同结构表table2,并且数据量是百万级别的,用SQL语句怎么实现比较好一点?

13 个解决方案

#1


出版与订阅

#2


我觉得最好用DTS调度来做。

#3


出版与订阅

#4


使用联结服务器:
EXEC sp_addlinkedserver '别名','','MSDASQL',NULL,NULL,'DRIVER={SQL Server};SERVER=远程名;UID=用户;PWD=密码;'
exec sp_addlinkedsrvlogin  @rmtsrvname='别名',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='密码'
GO
然后你就可以如下:


insert 库名.dbo.表名 select * from 别名.库名.dbo.表名 where 主键列 not in (select 主键列 from 库名.dbo.表名)



选中Microsoft SQL Servers-->工具栏,工具-->选项-->高级-->连接超时-->改为0

go

#5


可以建立JOB,定期执行。

#6


大力的做法是对的,我也试过,但是存在2个问题:
1。增加连接服务器的时候,有些服务器存在问题,增加不了
2。程序运行的不是很稳定,大数据量复制的时候经常出问题
不知道有没有别的更好的办法实现?

#7


dts job 执行

#8


请详细说明一下用dts job 怎么做好吗?

#9


用大力的方法定义好链接服务器后,再定义作业定时执行:

创建作业
企业管理器--管理--SQL SERVER代理--右键作业--新建作业
常规项中输入作业名称
步骤项中,点新建--输入步骤名称--类型选择TSQL--命令处输入:
---------------------------------------
insert 库名.dbo.表名 select * from 别名.库名.dbo.表名 where 主键列 not in (select 主键列 from 库名.dbo.表名)
---------------------------------------
确定
调度项,设置你的作业的执行时间计划.

并将SQL AGENT服务设置为自动启动.

#10


增加连接服务器的时候,有些服务器存在问题,增加不了

网络有问题吗?
1、先保证ping通

2、在dos下写入telnet ip 1433不会报错

3、用ip连如企业管理器:
企业管理器-->右键SQlserver组-->新建sqlserver注册-->下一步-->写入远程实例名(IP,机器名)-->下一步-->选Sqlserver登陆-->下一步-->写入登陆名与密码(sa,pass)-->下一步-->下一步-->完成

4、如果还不行:
sqlserver服务器-->开始菜单-->SQLserver-->服务器网络实用工具-->启用 WinSock代理-->代理地址:(sqlserver服务器IP)-->代理端口-->1433-->OK了

5、如果还不行:
sqlserver客户端-->开始菜单-->SQLserver-->客户端网络实用工具-->别名-->添加-->写入别名如"大力"-->"网络库"选tcp/ip-->服务器名称写入远程ip或实例名-->OK了

----------------------------------------------
程序运行的不是很稳定,大数据量复制的时候经常出问题
不知道有没有别的更好的办法实现?
dts,就是导入导出工具,在企业管理器-->数据转换服务-->包-->... 很简单的。
job,就是作业 你的数据库服务器-》企业管理器-》管理-》SQL Server 代理-》作业-》新建作业,按照要求填就可以了,在“步骤”的“命令”中填写你要执行的存储过程或语句,在“调度”里面填写什么时间执行

#11


谢谢大力和邹建,再问:如果我要同步的是两个数据库呢,不用复制分发,应为我试过,用事务类型的复制分发在大数据量的时候很容易引起问题,那么如果用代码实现有什么更好的办法吗?

#12


你可以结合dts和job如:

dtsrun 实用工具
dtsrun 实用工具执行用数据转换服务 (DTS) 创建的包。DTS 包可存储在 Microsoft® SQL Server™ 2000 msdb 数据库、COM 结构化存储文件或 SQL Server Meta Data Services 中。

语法
dtsrun 
[/?]|
[
    [
        /[~]S server_name[\instance_name]
        { {/[~]U user_name [/[~]P password]} | /E }
    ]
    {    
        {/[~]N package_name }
        | {/[~]G package_guid_string}
        | {/[~]V package_version_guid_string}
    }
    [/[~]M package_password]
    [/[~]F filename]
    [/[~]R repository_database_name]
    [/A global_variable_name:typeid=value]
    [/L log_file_name]
    [/W NT_event_log_completion_status]
    [/Z] [/!X] [/!D] [/!Y] [/!C]
]

参数/?

显示命令提示选项。

~

指定接下来的参数采取十六进制文本表示加密的参数值。可以和 /S、/U、/P、/N、/G、/V、/M、/F 和 /R 选项一起使用。使用加密的值增加了用于执行 DTS 包的命令的安全性,因为服务器名称、密码等等都不可见。使用 /!Y 确定加密的命令。

/S server_name[\instance_name]

指定要连接到的 SQL Server 实例。指定用于连接到该服务器上的 SQL Server 默认实例的 server_name。指定用于连接到该服务器上的 SQL Server 2000 命名实例的 server_name\instance_name。

/U user_name

是用于连接到 SQL Server 实例的登录 ID。

/P password

是同登录 ID 一起使用的用户指定的密码。

/E

指定信任连接(不需密码)。

/N package_name

当创建 DTS 包时为包所指派的名称。

/G package_guid_string

当创建 DTS 包时指派给它的包 ID。该包 ID 是 GUID。

/V package_version_guid_string

当第一次保存或执行 DTS 包时指派给它的版本 ID。每次修改 DTS 包时都指派给它新的版本 ID。该版本 ID 是 GUID。

/M package_password

当创建 DTS 包时指派给它的可选密码。

/F filename

包含 DTS 包的结构化存储文件的名称。如果也指定了 server_name,则执行从 SQL Server 中检索到的 DTS 包并且将该包添加到结构化存储引擎。

/R repository_database_name

包含 DTS 包的知识库数据库名称。如果没有指定名称,则使用默认的数据库名称。 

/A global_variable_name:typeid=value

指定一个包全局变量,其中 typeid = 全局变量数据类型的类型标识符。可以引用整个参数字符串。该参数可重复使用以指定多个全局变量。有关全局变量的各种可用类型标识符的信息,请参见注释部分。

若要使用该命令开关设置全局变量,必须有包的所有者权限或者该包必须已在未启用 DTS 密码保护的状态保存。如果没有所有者权限,可以指定全局变量,但是所用的值将是设置在包中的值,而不是那些用 /A 命令开关指定的值。

/L log_file_name:

指定包日志文件的名称。

/W Windows_Event_Log

指定是否在 Windows 应用程序日志中写入包执行的完成状态。指定 True 或 False。

/Z

指示使用 SQL Server 2000 加密对 dtsrun 命令行进行加密。

/!X

阻塞选定 DTS 包的执行。当想要无须执行包便能创建加密的命令行时,使用该命令参数。如果未指定此选项,则将立即执行 DTS 包。

/!D

从 SQL Server 实例中删除 DTS 包。将不执行此包。从结构化存储文件中删除特定的 DTS 包是不能实现的。需要使用 /F 和 /S 选项重写整个文件。

/!Y

显示用于执行 DTS 包的加密命令,但不执行该命令。

/!C

将用于执行 DTS 包的命令复制到 Microsoft Windows® 剪贴板上。此选项也可与 /!X 和 /!Y 一起使用。

#13


谢谢大力,我明白了,我用DTS工具,将它导成VB的代码,然后我就可以完全用程序执行了。

#1


出版与订阅

#2


我觉得最好用DTS调度来做。

#3


出版与订阅

#4


使用联结服务器:
EXEC sp_addlinkedserver '别名','','MSDASQL',NULL,NULL,'DRIVER={SQL Server};SERVER=远程名;UID=用户;PWD=密码;'
exec sp_addlinkedsrvlogin  @rmtsrvname='别名',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='密码'
GO
然后你就可以如下:


insert 库名.dbo.表名 select * from 别名.库名.dbo.表名 where 主键列 not in (select 主键列 from 库名.dbo.表名)



选中Microsoft SQL Servers-->工具栏,工具-->选项-->高级-->连接超时-->改为0

go

#5


可以建立JOB,定期执行。

#6


大力的做法是对的,我也试过,但是存在2个问题:
1。增加连接服务器的时候,有些服务器存在问题,增加不了
2。程序运行的不是很稳定,大数据量复制的时候经常出问题
不知道有没有别的更好的办法实现?

#7


dts job 执行

#8


请详细说明一下用dts job 怎么做好吗?

#9


用大力的方法定义好链接服务器后,再定义作业定时执行:

创建作业
企业管理器--管理--SQL SERVER代理--右键作业--新建作业
常规项中输入作业名称
步骤项中,点新建--输入步骤名称--类型选择TSQL--命令处输入:
---------------------------------------
insert 库名.dbo.表名 select * from 别名.库名.dbo.表名 where 主键列 not in (select 主键列 from 库名.dbo.表名)
---------------------------------------
确定
调度项,设置你的作业的执行时间计划.

并将SQL AGENT服务设置为自动启动.

#10


增加连接服务器的时候,有些服务器存在问题,增加不了

网络有问题吗?
1、先保证ping通

2、在dos下写入telnet ip 1433不会报错

3、用ip连如企业管理器:
企业管理器-->右键SQlserver组-->新建sqlserver注册-->下一步-->写入远程实例名(IP,机器名)-->下一步-->选Sqlserver登陆-->下一步-->写入登陆名与密码(sa,pass)-->下一步-->下一步-->完成

4、如果还不行:
sqlserver服务器-->开始菜单-->SQLserver-->服务器网络实用工具-->启用 WinSock代理-->代理地址:(sqlserver服务器IP)-->代理端口-->1433-->OK了

5、如果还不行:
sqlserver客户端-->开始菜单-->SQLserver-->客户端网络实用工具-->别名-->添加-->写入别名如"大力"-->"网络库"选tcp/ip-->服务器名称写入远程ip或实例名-->OK了

----------------------------------------------
程序运行的不是很稳定,大数据量复制的时候经常出问题
不知道有没有别的更好的办法实现?
dts,就是导入导出工具,在企业管理器-->数据转换服务-->包-->... 很简单的。
job,就是作业 你的数据库服务器-》企业管理器-》管理-》SQL Server 代理-》作业-》新建作业,按照要求填就可以了,在“步骤”的“命令”中填写你要执行的存储过程或语句,在“调度”里面填写什么时间执行

#11


谢谢大力和邹建,再问:如果我要同步的是两个数据库呢,不用复制分发,应为我试过,用事务类型的复制分发在大数据量的时候很容易引起问题,那么如果用代码实现有什么更好的办法吗?

#12


你可以结合dts和job如:

dtsrun 实用工具
dtsrun 实用工具执行用数据转换服务 (DTS) 创建的包。DTS 包可存储在 Microsoft® SQL Server™ 2000 msdb 数据库、COM 结构化存储文件或 SQL Server Meta Data Services 中。

语法
dtsrun 
[/?]|
[
    [
        /[~]S server_name[\instance_name]
        { {/[~]U user_name [/[~]P password]} | /E }
    ]
    {    
        {/[~]N package_name }
        | {/[~]G package_guid_string}
        | {/[~]V package_version_guid_string}
    }
    [/[~]M package_password]
    [/[~]F filename]
    [/[~]R repository_database_name]
    [/A global_variable_name:typeid=value]
    [/L log_file_name]
    [/W NT_event_log_completion_status]
    [/Z] [/!X] [/!D] [/!Y] [/!C]
]

参数/?

显示命令提示选项。

~

指定接下来的参数采取十六进制文本表示加密的参数值。可以和 /S、/U、/P、/N、/G、/V、/M、/F 和 /R 选项一起使用。使用加密的值增加了用于执行 DTS 包的命令的安全性,因为服务器名称、密码等等都不可见。使用 /!Y 确定加密的命令。

/S server_name[\instance_name]

指定要连接到的 SQL Server 实例。指定用于连接到该服务器上的 SQL Server 默认实例的 server_name。指定用于连接到该服务器上的 SQL Server 2000 命名实例的 server_name\instance_name。

/U user_name

是用于连接到 SQL Server 实例的登录 ID。

/P password

是同登录 ID 一起使用的用户指定的密码。

/E

指定信任连接(不需密码)。

/N package_name

当创建 DTS 包时为包所指派的名称。

/G package_guid_string

当创建 DTS 包时指派给它的包 ID。该包 ID 是 GUID。

/V package_version_guid_string

当第一次保存或执行 DTS 包时指派给它的版本 ID。每次修改 DTS 包时都指派给它新的版本 ID。该版本 ID 是 GUID。

/M package_password

当创建 DTS 包时指派给它的可选密码。

/F filename

包含 DTS 包的结构化存储文件的名称。如果也指定了 server_name,则执行从 SQL Server 中检索到的 DTS 包并且将该包添加到结构化存储引擎。

/R repository_database_name

包含 DTS 包的知识库数据库名称。如果没有指定名称,则使用默认的数据库名称。 

/A global_variable_name:typeid=value

指定一个包全局变量,其中 typeid = 全局变量数据类型的类型标识符。可以引用整个参数字符串。该参数可重复使用以指定多个全局变量。有关全局变量的各种可用类型标识符的信息,请参见注释部分。

若要使用该命令开关设置全局变量,必须有包的所有者权限或者该包必须已在未启用 DTS 密码保护的状态保存。如果没有所有者权限,可以指定全局变量,但是所用的值将是设置在包中的值,而不是那些用 /A 命令开关指定的值。

/L log_file_name:

指定包日志文件的名称。

/W Windows_Event_Log

指定是否在 Windows 应用程序日志中写入包执行的完成状态。指定 True 或 False。

/Z

指示使用 SQL Server 2000 加密对 dtsrun 命令行进行加密。

/!X

阻塞选定 DTS 包的执行。当想要无须执行包便能创建加密的命令行时,使用该命令参数。如果未指定此选项,则将立即执行 DTS 包。

/!D

从 SQL Server 实例中删除 DTS 包。将不执行此包。从结构化存储文件中删除特定的 DTS 包是不能实现的。需要使用 /F 和 /S 选项重写整个文件。

/!Y

显示用于执行 DTS 包的加密命令,但不执行该命令。

/!C

将用于执行 DTS 包的命令复制到 Microsoft Windows® 剪贴板上。此选项也可与 /!X 和 /!Y 一起使用。

#13


谢谢大力,我明白了,我用DTS工具,将它导成VB的代码,然后我就可以完全用程序执行了。