利用ado.net 实现百万级的数据复制备份

u010269523 2015-01-10 03:17:25
现在的需求是利用c# ado.net 将数据从A库的表中提取出来备份到B库的表中
一个月执行一次
一次大概有百万行的数据
字段很简单 一般只有2到3个字段

我现在实现的方法是一次性读取到dataset中
然后在一条条插入到数据库中

问题有2个:
1.一次性读出来 内存占用很大,而且内存中可能会丢失(我测了一次 用了500M)
2.插入太慢 测试的时候20分钟才插入了5000条
我自己的想法:
针对第一个问题:我考虑根据某个字段做分页,然后分批次的读取到内存中,循环处理,可是这样可能会出现漏查的情况 (中间有新数据插入)
针对第二个问题目前还没有好的解决思路

求大神们帮忙看看
谢谢
...全文
323 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
刘兄弟 2015-01-13
  • 打赏
  • 举报
回复
LZ新手或者对数据库不了解吧。 根据你的描述我建议你: 1.用ADO查询数据出来。 2.把查询到的数据生成TXT文档 3.在需要导入的数据库使用牛逼的blUK 具体 参考我随意COPY过来的语句 --文本文件导出 EXEC Master..xp_cmdshell 'bcp "select * from sqbl.dbo.SubCenter" QueryOut "c: est.txt" /c /S"127.0.0.1" /U"sa" /P""' --EXEC Master..xp_cmdshell 'bcp "查询" QueryOut "路径+文件名" /c /S"服务器名" /U"用户名" /P"密码"' --文本文件导入 EXEC Master..xp_cmdshell 'bcp "sqbl.dbo.SubCenter" In "c: est.txt" /c /S"127.0.0.1" /U"sa" /P""' --EXEC Master..xp_cmdshell 'bcp "库名.dbo.表名" in "路径+文件名" /c /S"服务器名" /U"用户名" /P"密码"' --导出到文本文件,自定制分隔符 EXEC Master..xp_cmdshell 'bcp "select * from sqbl.dbo.SubCenter" QueryOut "c: est.txt" /c /t";" /r" " /S"127.0.0.1" /U"sa" /P""' --EXEC Master..xp_cmdshell 'bcp "查询" QueryOut "路径+文件名" /c /t"列分隔符" /r"行分隔符" /S"服务器名" /U"用户名" /P"密码"' --导入到文本文件,自定制分隔符 EXEC Master..xp_cmdshell 'bcp "sqbl.dbo.SubCenter" In "c: est.txt" /c /t";" /r" " /S"127.0.0.1" /U"sa" /P""' --EXEC Master..xp_cmdshell 'bcp "库名.dbo.表名" in "路径+文件名" /c /t"列分隔符" /r"行分隔符" /S"服务器名" /U"用户名" /P"密码"' select * from sqbl.dbo.SubCenter delete from sqbl.dbo.SubCenter --bcp具体参数请参见: EXEC Master..xp_cmdshell 'bcp /?'
myhope88 2015-01-13
  • 打赏
  • 举报
回复
让dba去弄就行了
勇敢的老散户 2015-01-13
  • 打赏
  • 举报
回复
20分钟5000条,500M,这都是些什么数据。你为什么不定时备份数据库,然后每个月以还原呢
lwq222121 2015-01-12
  • 打赏
  • 举报
回复
sql bulkcopy
  • 打赏
  • 举报
回复
SQL Server一秒钟肯定可以插入2000条记录。 lz所谓的的“20分钟插入5000条”,他也不能准确描述“干了什么事儿”、也不能自己动手进行跟踪和分析,只等着别人给结果,这就难以有什么改进。
  • 打赏
  • 举报
回复
真觉得危险就Sqlbulkcopy吧
by_封爱 2015-01-12
  • 打赏
  • 举报
回复
insert select 执行下带条件不就好了吗??? 为啥还要查询出来 然后在循环插入??
qzyf1992 2015-01-12
  • 打赏
  • 举报
回复
20分钟才5000条你确定你认真测试过?
SPFarmer 2015-01-12
  • 打赏
  • 举报
回复
这个数据库管理员要做的事情。因为你这个起不到备份的效果。 每个月运行一次,如果中间数据丢失了,怎么办呢。应该让数据库管理员每天做增量备份。
lincolnandlinda 2015-01-12
  • 打赏
  • 举报
回复
为何不直接使用Sql server replication。
ajaxfeifei 2015-01-12
  • 打赏
  • 举报
回复
如果一定要用程序来做(排除用数据库直接备份) 第一个问题,如果字段中有自增长列或者创建日期列,当然最好就用这个字段来做分页查询了,如果没有就加一个自增字段不会影响业务的。 第二个问题,你的插入操作最好是50(或者更多)条数据的插入拼成一个插入语句一次执行。
三楼の郎 2015-01-12
  • 打赏
  • 举报
回复
SQL Server自带发布订阅功能,配置一下不需要写程序来实现。
devmiao 2015-01-10
  • 打赏
  • 举报
回复
google sql bulkcopy
  • 打赏
  • 举报
回复
所谓的“而且内存中可能会丢失”这是质的问题,你读取数据不过写了不足5行代码,而且一个月运行一次,你就应该花点精力找找自己的这几行代码有什么问题。不要找别的事情来回避自己的开发的质量问题。
  • 打赏
  • 举报
回复
一个月才做一次,做一次难道用20个小时还转换不完吗?你随便写好了。
software_artisan 2015-01-10
  • 打赏
  • 举报
回复
这个还要做程序?数据库自己没这个功能?

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧