如何迁移大数据?(200)

  • 主题发起人 主题发起人 wxj9527
  • 开始时间 开始时间
W

wxj9527

Unregistered / Unconfirmed
GUEST, unregistred user!
1.说明:主要是把track(报告bug的工具数据库sql server 2000)中的bugs迁移到bugzilla(报告bug的工具数据库mysql )中.2.工具delphi53.使用myodbc+ado已经连接到mysql.4.两个库的结构不一致.5.环境:sql server2000库中数据量很大,问题就在于:如何把这么大的数据用最有效的方法迁移到mysql中.
 
结构都不一样还说什么说啊N张表迁移到N张表?还是一张到一张?会不会track里一张表对应bugzilla里多张表?关键要说出结构不一致到什么程度
 
一对一转换.用户可以自己定义选择某些字段到某些字段.所以结构暂不考虑.主要是某些对应的字段数据类型不同或sql 与mysql数据类型不兼容..主要问题还是有没有高效率的方法迁移大量数据(结构先不考虑)?
 
几百万条记录.循环下去会死人的.with ADOQuery_Source dobegin First; while not eof do begin ADOQuery_Destination.Append; ADOQuery_Destination.FieldByName('test').AsString := FieldByName('test').asString; ADOQuery_Destination.Post; end;end;如果这样效率太低.大家有没有更好的方法?
 
mysql支持OPENROWSET吗?这个应该快点不过好象也不能满足你的要求
 
好像不行哦 !!
 
如果迁移大量数据, 比如:sql-->sql.你会用什么方法?
 
mysql没怎么用过超大量的数据用循环肯定死人的我通常都用OPENROWSET感觉上快点,到底快多少没验证过
 
最快的速度:写程序取出SQL2000的数据,按每行一条insert into语句的格式存成多个文本文件,每个文件2M或者4M、8M(根据MYSQL的max_allowed_packet确定),然后在MYSQL中用LOAD DATA 导入。如果不想用文件中转,MYSQL用libmysql.dll直连,使用insert into *** ()values(),(),()……插入数据,一次大约1000条,速度也不错。
 
我要用delphi5来操作啊!!要良好的操作界面!
 
界面是由你来写的。
 
skadon`大哥```能说详细点吗?soft_wxj@126.com
 
可以利用存储过程来实现的。在你的SQLSERVER里编写存储过程,直接连接MYSQL,根据传入的参数实现数据转换和导出
 
用insert ````select 语句,从sql取数据到mysql怎么写啊?主要是在语句中怎么连接到mysql. 注:1.我采用MYODBC连接MYSQL. 2.我用delphi5 ADO连接mysql的字符串,Provider=MSDASQL.1;Persist Security Info=True;Extended Properties="DRIVER={MySQL ODBC 3.51 Driver};DATABASE=bugs;SERVER=localhost;UID=root;PASSWORD=;PORT=;OPTION=;STMT=;"请问:怎么在sql语句中实现连接?openwest, opensource? 怎么写? 我试了几次都不行?
 
先把数据倒如txt,在倒如mysql,时间复杂度2*N, 你的方法复杂度 N*N
 
怎么把数据导入txt,在导入mysql,?
 
SQL自带的功能,”导出数据“,
 
我要用户不去操作后台数据库```全部用delphi5界面..
 
第二种方法:mysql.pas到这里下载:http://www.shijiku.com/data/libmysql.pashttp://www.shijiku.com/data/libmysql5.dll或者自己去baidu,google。连接代码例子:procedure TForm1.BitBtn1Click(Sender: TObject);var dbh : PMYSQL; MResult : PMYSQL_RES; Row : PMYSQL_ROW; rowc : my_ulonglong; lint : longint;begin //libmysql_load(PChar('libmysql.dll')); libmysql_load(nil); dbh:=mysql_init(nil); if dbh=nil then begin Memo1.Lines.Add('初始化错误'); exit; end; Memo1.Lines.Add('libmysql_status='+#9+IntToStr(libmysql_status)); Memo1.Lines.Add('libmysql_handle='+#9+IntToStr(libmysql_handle)); //if nil=mysql_real_connect(dbh, PChar('localhost'), PChar('root'), Pchar(''), PChar(''), 3306, nil, 0) then begin if nil=mysql_connect(dbh, PChar('localhost:3306'), PChar('root'), Pchar('')) then begin Memo1.Lines.Add('无法连接数据库服务器:'+#13#10+mysql_error(dbh)); exit; end; Memo1.Lines.Add('mysql_get_client_info='+#9+mysql_get_client_info); Memo1.Lines.Add('mysql_get_host_info='+#9+mysql_get_host_info(dbh)); Memo1.Lines.Add('mysql_get_server_info='+#9+mysql_get_server_info(dbh)); mysql_query(dbh, PChar('SHOW VARIABLES')); MResult:=mysql_use_result(dbh); rowc:=mysql_num_rows(MResult); Memo1.Lines.Add('Rowc='+#9+IntToStr(rowc)); Row:=mysql_fetch_row(MResult); while Row<>nil do begin Memo1.Lines.Add(Row[0] + #9#9+Row[1]); Row:=mysql_fetch_row(MResult); end; //mysql_query(dbh, PChar('LOAD DATA LOCAL INFILE "E://mapfile.txt" ' // +'INTO TABLE a_logs1 FIELDS TERMINATED BY ";" ENCLOSED BY ''"'' ESCAPED BY "//" LINES TERMINATED BY "/r/n"')); Memo1.Lines.Add('mysql_error='+#9+mysql_error(dbh)); lint:=mysql_ping(dbh); Memo1.Lines.Add('mysql_ping='+#9+IntToStr(lint)); Memo1.Lines.Add('mysql_ping='+#9+IntToStr(lint));end;从SQL2000取出数据构造成insert into语句,只需要执行 mysql_query(dbh, PChar(构造的insert语句));var sql : string; k : integer;begin sql:=''; k:=1;with ADOQuery_Source dobegin First; while not eof do begin sql:=sql+',("'+FieldByName('test').asString;+'")'; inc(k); if k>1000 then begin sql[1]:=#32; mysql_query(dbh, PChar('insert into tablename (FieldName)values'+sql)); k:=1; sql:=''; end; end;end;
 
SQLSERVER可以用DTS方式,非常快
 
后退
顶部