请有经验的DBA进来回答一下,sqlserver大批量数据迁移问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请有经验的DBA进来回答一下,sqlserver大批量数据迁移问题相关的知识,希望对你有一定的参考价值。

我要把数据从sqlserver迁移到oracle,需要通过程序转换,但是现在sqlserver中有5亿多的数据,服务器的性能也只是一般(无法更换),其中有1.5亿的数据是可以删除的,但是现在删除和查询都遇到瓶颈了。删除和查询都比较慢,基本10分钟才能删一个id号,查询也要10分钟左右,但是我有15000个ID,该表的索引是联合索引,id,insertDate,name

1 不需要的数据当然删除最好 减轻压力。
1) 删除前先删除索引。因为删除的同时也需要对索引进行维护。我们先删除索引再删除数据效率会有一点提高
2) 删除完数据后,再重新创建索引。为数据转换做准备。

2 数据转换过程
1)不知道你是如何实现的。我推荐的方法是将数据导出来成一个或者一系列的文件。
2)再将导出的文件导入到oracle中。可能需要进行数据类型等的转换。
我的想法就是将你的所有动作分解,一个个完成。这样出问题也能及时解决,而且互不影响。如果从sqlserver导出数据的同时还需要往sqlserver中插入数据,那么我推荐插入的数据放入一个新表中,最后将这个新表的数据也导出来再导入。

3 导入到oracle数据库中。
1)做好详细规划。删除不必要的数据大概还有接近4亿行。oracle中的表是否要做分区等?
2)数据导入后再在表上建索引。追问

做这个的目的是将原来的5亿数据转换成15000个分表,讲所有的数据根据ID分别存在不同的表中。,代码的作用实行数据转换的意思是比如读出来的state是1 我需要通过算法转换成其他的值,类似这样的。你说的数据导出来成一个或者一系列的文件我理解其中的意思,但是具体要怎么做呢?请指教!

追答

我的想法和你差不多。以id的不同进行分类存储(不过我的想法是做成分区表,就是一个大表里面多个分区。你的想法是做成15000个独立的表。你的想法也行得通,就看你结合实际情况如何取舍吧)。不过这样子你们的数据库设计就要从头改到尾了。以前的sql语句全部都要改。
我刚说的一系列文件本意就是指以id分类的15000个文件。
我们算一下:4亿/15000=2.7万。也就是说每个表大概3W数据量。根据我的经验,一个导出文件大小大概在5M-10M(每行数据有多少列也影响大小)左右。
具体做法:
1 利用某个工具将数据导出成txt文件(里面的内容类似 inset into table values();形式) sqlserver我不大熟悉。不过我查了下,据说DTS可以实现。这方面你得自己看着办了。
这个步骤也有讲究。有两个方案:
1) 直接从这个大表中一个id一个id的导出数据。
2)先采取 create table t_idname as select * from souce_table where id=1;的形式建立15000个id表。然后直接一个表一个表的导出数据。优点是:导出的时候速度快,目标清晰,出错了容易处理。缺点:前期准备工作很多。得考虑磁盘空间等。
2 导出文件的处理。因为sqlserver和oracle的一些数据类型不同,一些关键字也不同。需要对导出文件进行处理。(如果导出工具支持的话,可以直接在导出工具中设置进行处理,兼并到第一步中去)
3 导入。没什么好说的,采用oracle的sqlload工具即可。

追问

首先 你说的很好,但是我有个疑问,目前我最大的瓶颈就是查询速度慢的问题,即使使用工具到处txt文件,也是需要依赖于sql查询的功能,在这一步我就已经卡住了。。。进行不下去了

追答

如果是这样的话,那么你任何操作都不用做了。。。
想办法去解决这事。。。
虽然查询速度慢,但不是不能查询。这个地方无非就是多耗些时间而已。

参考技术A 给你换个思路:在SQLserver中,建立一个存储过程,根据你的算法,把数据分散到15000个数据表中,建表和insert全都在存储过程中完成
这样就没有大数据显示占用内存的问题了,等几个小时,应该就能完成转换
然后你再对小表进行操作,迁移到oracle中,因为表中数据少,所以速度就非常快了,你看这样行吗?
参考技术B 表有没有做分区?
如果有分区的话,可以一个分区一个分区的做。
如果没分区的话,可以用并行。
还有,删除时,可以把删除的查询条件中没用到的索引disable掉。追问

没有分区,请问怎么并行啊,我是通过java用ibatis和spring做的,主要的目的是查询,平均一个iD有5W左右的数据,但是现在的瓶颈就是查询慢,所以我才想到删除这条路的。先删除没必要的数据再查询。

追答

指定并行:
可通过内置参数指定,也可以通过hints来指定。
1、内部参数的指定
SQL code
sp_configure 'max degree of parallelism'
sp_configure 'cost threshold for parallelism'
默认是0,也就是系统自动调整;

2、hints的语法是
option (maxdop n)
n就是指定的并行数。。
不过这个跟CPU关系很大。

参考技术C 平均每个id号大概多少数据?
确认一下你的语句执行计划走没走索引。
既然已经要清理数据,那甬余的索引,主键都可以drop掉。会提高dml效率。
数据迁移常用的办法就是多进程并发。
根据你性能,起10-20或者更多的进程,同时执行。

对了。想起来个问题,你为什么要删除数据呢?直接在程序转换的过程中通过where条件过滤掉这些数据不是更好么?追问

本来的方案是直接查询,结果由于数据过多,采用先删除没必要的数据的方案,但是用java现在起了5个线程,一起操作数据库,数据库会卡在那很长时间。请问有什么好办法么?如果不删除直接查询也可以,但是效率也比较低

追答

其实5亿,删除1.5亿,效率上不会有本质区别,另外删除之后你还需要重新压缩表,否则高水位还在,效率不会有增加。最好的办法就是多进程并发,肯定会比连续执行5次效果要好。

追问

也可以不删除的,但是可以告诉我怎么进行多进程并发么,这里用的是进程,而我用的是线程,请问哪个好呢?

追答

没影响,主要是要并发,而且前提是不同进程查询的数据块尽量没有重复。减少等待。

追问

可以麻烦给我一个详细的方案么?提醒一下:查询遇到瓶颈,查询不动,所有联合索引都用上了

追答

用shell执行,nohup起进程,按照id号来执行。比如每次5个或者10个。
执行完一个再起新的。

参考技术D insertDate,

程序员接私活经验总结

 

程序员接私活经验总结

 

到网上看看,接私活是多么不容易,技术问题本身是个因素,还有很多有技术的人接私活时被骗,或者是合作到最后以失败告终,所以想请有经验的大侠们出来指点一下,接私活是怎么接的?一般流程怎样?要注意什么?签合同的风险?等等问题,希望高手能将宝贵的经验与大家共享阿?

===================================================================================================================

最好是朋友或熟人推荐,这样双方都比较放心,项目也好拿一些,一般也不会欠款。 
如果是陌生人就不好说了,即使签合同也没用。 

还有就是接项目时,一定要了解对方是否有技术背景。 
如果有技术背景,一般的项目费用会比较合适,不会太高也不会太低,关键是需求定义会比较清楚,后期维护修改量不大。 
如果对方没有技术背景,就不好办了,即使能蒙对方要个比较高的价格,后期也会被无休止的需求变更累死的。 

还有谈项目时一定要看对方的人品,夸夸其谈的人要敬而远之。 

===================================================================================================================

程序员接活、新手接,需知:

1.接活前,先跟美工把报酬讲好,如果程序员和美编报酬一样的话,那就不要接.因为后期的活程序占绝大多数,而美编的任务比起程序,差的多. 

2.接活前,一定要先让,客户把需求写成书面形式,然后根据文本里要求的功能,估价,如果是整个站的话,那最好多要点,因为后期的修改相当烦人.要的少的话,修改起来没劲. 

如果客户不会写书面要求 的话,那就不要接了,因为这将是个无头活. 

3,做活之前,先跟客户说好了,文本里有的功能实现,后添加的功能不要做.(从书面文本发过来那天算起) 

4,跟客户说明,做完活,从结账那天起,就不要管了,除非客户愿意出维护费或者你自愿. 

(从客户审核通过,结账那时起,即使是后期客户发现bug,即使是最基本的bug也不要管,除非客户愿意出钱,维护,不要听他们什么,很好改了,就一下就完了,别忘了,改那么一点是要知识的,就一点你怎么不改,这是知识含量.,请不要糟贱自己辛苦学来的程序知识.) 

5,一般后期程序维护是需要资金的,如果客户不愿意出,或者认为程序是你写的就理应你来免费,维护,这叫扯蛋!你并没有答应他们程序写完后,就一辈子永远时刻准备为他们免费维护.一般每月维护费在500RMB左右,这点可以跟客户协商. 

6,程序和页面一定要分开,这样各做各的,分工明确,而且不易发生什么误会,最主要的是能提高做活效率.后期,美工改起来也不会影响到程序. 

7,做活的时间一般不要跟客户定死了,程序这东西,改来改去就会改出问题,需要化时间去修补的,如果你把时间定的很死,一旦发生变化,到时候完不成任务,到时候你一定死的很难看. 

8,做活前,先搞清楚客户说的报酬,是税前的还是税后的,有些所谓'正式'的单位到结账的时候会说'要扣掉部分'个人所得税'. 

9,最好有自己的服务器,把做的活放到自己的服务器上,如果客户满意了,付清全部的钱再把代码给他们,这样避免了客户不发钱,活已经给人家了,自己弄的很被动的局面.切记!切记! 

以上只是我个人的几点接活经验,仅供参考

===================================================================================================================

可以通过朋友介绍。 
也可以通过一些私活中介平台。 

不过,无论什么方式,都要注意事先谈好需求,定好价格,谈好支付方式。有必要的,要收取部分订金。 

对于一些不熟悉,没什么信任感的最好用中介支付。我一般是在淘宝上交易,先付款到支付宝,完成后放款。

===================================================================================================================

接网站私活,如何防骗?经验谈  
  
        我接活很长时间了,被骗过几次,但是最近几乎没被骗过,把经验告诉你大家 
        一般接私活,都存在不信任对方,接活的朋友怕做了不给钱,客户怕给你钱了,怕你做不好,  所以我接私活,先做后给钱,比较好接,但是怎么防骗呢? 

        把一个网站分成几段,可以协商,比如把网站分为 三期,1、美工 2、后台 3美工和后台的结合每做完一期,客户满意给钱,但是如何防骗呢, 
如果网站有后台那就好办,可以先做后台 ,后做美工,后台基本都有,所以几乎不用做什么,就是根据客户的网站设置改善一下后台,给客户看,客户满意后台给你钱,这样有个好处,后台本来你就有,就是客户不满意你也不损失什么,如果客户看后台满意给钱了,那他基本不是骗子,(记住一定要在网上让客户看后台,不要直接给他,他给你钱了,如果要后台你可以给他) 
        如果你要做的网站只有美工,那你要特别注意,一定要求做好网站图片 他们满意了就要付全款(至少要付一半的钱),如果他们不同意,你也不要做了,可能是骗子,不要相信如果不给钱就不是人的话,我就遇见过这样的人,到最后还是不给钱,所以我也不能把他当人看待了 
        你在做之前给客户说好,做好的网站图片 你要缩小 30% 给他看,(缩小30%图片再放大到原来的状太态将失真)如果他不同意 有一下几种可能  

1、他是骗子 

2、他给你的活是转包的 


当您遇到二传单(也就是与您联系也是一家接单的公司或者个人),各位朋友在交涉时一定要当心,因为不是直接客户,二传单你所知晓的需求和分析往往并不是直接客户所想要的东西。遇到这种单 我一般是放弃 

3、这个网站他说话不算数,他可能有老板要让老板看。  

不管是什么情况只要他不同意把图片缩小给他看,那网站就不要做了,再想办法找其他项目 

还有在最后交付的时候一定要客户把钱给你了 再给网站 

===================================================================================================================

1、有一个网站,这样便于用户找到你,否则哪来的那么多活(我自己的网站,天狼工作室:http://www.j2soft.cn/); 

2、将客户需求调研清楚; 

3、需求调研清楚之后,根据工作量、难度计划费用; 

4、收取定金,一般为全部费用的20%~30%(定金一定要收,否则宁愿不接这个活); 

5、有的客户签合同,有的客户不签。签合同的占少数; 

6、软件完工之后,加上试用期,再给客户; 

7、付完全款之后,再给正式版; 

8、要源码的,多加20%费用。 

自己接活已经挣了20多W了,以上全是自己的经验。我的网站 天狼工作室,大家可以看看,借鉴一下。

===================================================================================================================

我一共接过4单私活,第一单是跟他人合作开发,后面的全是自己一个人开发。 

个人总结经验如下: 

1. 如果你从来没接过私活,那么第一单可以不讲究对象,不讲究项目金额,开张就是胜利,必定会给你不一样的体会; 

2. 开张后再接单,就应该选择对象,选择项目,这是本着对自己负责任的态度,因为有很多项目几乎是无利可图的; 

3. 首选人品好有实力的对象,次选资金量高的项目,再次选有前景的方向; 

4. 接单就必须完成,这是做人的原则问题,无论遇到什么技术难题,反正现在网络资源也非常丰富,技术无难题; 

5. 能用熟悉技术开发,不选择其他新技术,因为新技术意味着很多未知的问题,这些问题必定拖延开发进度; 

6. 私活项目开发人多,不一定能加快进度,最好是自己一个人做,最多2-3人开发; 

7. 在接单之前,一定要有充足的思想准备,因为这是体力活,身体好是前提。 

我去年写的《个人外包项目全记》,与大家共享 
http://topic.csdn.net/u/20081022/15/2997ee3a-dada-4bf1-86aa-36266d0e5ed5.html

===================================================================================================================

这个帖子,从创建时(2007-12-20 12:52:17)到现在2009/03/01,也已经有一年多了,看到有这么多朋友回复和跟贴,实在是很开心。 
我也来说说,我这一年里,对接私活的一些情况。 

在这一年里,直道现在,我总共遇到了三个私活。 
第一个,给自己母校(中学),开发一个综合性网站。 
    这个私活,总的来说是失败了。因为是我主动去和学校老师谈这件事情的,希望能给学校做点贡献,本想着一个偌大的学校,如果这次开发成功,也许以后就有很多机会了。说不定,人家也给为了答谢,能给点报酬呢。可自己的想法真是太过天真了。最后连基本的需求都做不下去,老师们根本就是在应付我,只是说让我自己看着做,最后放到网上他们能看到就好了。能起到宣传作用就好了。嘴上很感谢我,很赞成。实际没人支持和配合,我很无奈,也没有继续做下去,最后事情不了了之。失败原因,我觉得还是不了解用户状况,让自己很被动。 

第二个,是经朋友介绍,给另一个朋友做一个卖产品的宣传性网站。 
    这个还算可以,不管怎么样,最终开张了,并且拿了1000元的报酬(唉,报酬少的可怜啊。。)。 
    不过也有很多无奈,客户是个软件行外人,总是提出这样那样的变更要求。 
    虽然我开始和他谈得时候,就说过除了bug以外,如果有变更,就需要另外算钱。 
    如果是bug,就免费维护。可毕竟都是朋友,有很多小的变更,也没好意思问人家要。 
    要钱也要不了很多,觉得还不如做个人情呢,可是,人家不懂你做的是人情, 
    觉得你做的不是他想要的,你就必须改。可是很无奈,明明之前都让他确认过了。就是他需要的(其实他根本不知道自己想要的是什么)。 
    这种无理变更,而且人家就搞不清楚,什么是bug什么是变更。最后我很无奈, 
    告诉他网站维护,需要专门找个人来维护,我工作很忙,没有时间给他再继续维护了, 
    这样才把我解脱了。 

第三个,我给我一个朋友的老公作的。 
    她老公是一个专业美工,所以合作起来还比较好。开发的很顺利,很舒服, 
    现在第一期前台页面已经开发完了,等待确认。 

以上,是自己的一些经历。总结起来,觉得私活还真是不好接, 
而且确实像楼上各位说的那样,得靠朋友靠人脉。 
而且谈价格,搞需求,后期需求变更和bug维护,需要交涉的事情还真不少呢。 
真的感觉学问很多的。我现在第三个活,到现在还不知道怎么和人家谈钱的问题比较合适呢。 
还在努力学习中阿。。。 

 

参考:http://blog.csdn.net/qq_16313365/article/details/50814581













































































以上是关于请有经验的DBA进来回答一下,sqlserver大批量数据迁移问题的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer DBA 三十问

准备好了吗?MySQL DBA 面试高频三十问

softether为啥连不上?请有经验的朋友帮助。

用于 Oracle 开发人员/dba 的 SQL 服务器

在navicat连接数据库成功,但在php代码里连接不上,显示以下错误请有经验的前辈看看是怎么回事

请有各位大虾帮我分析下面关于LINUX文件系统编程的代码,然后回答几个问题?