Delphi MySQL Dump

(转)Delphi MySQL Dump
最近需要 MySQL 库结构同步,参考了一下代码,分享。

procedure TMySQLDump.GetTableStructure(Table :String);
var
  SQL : String;
  Res : TMysqlResult;
  A   : Boolean;
begin
   Res := TMySQLClient(TNativeConnect(FDatabase.Handle).Handle).query(Format('SHOW CREATE TABLE %s',[Table]),True, A);
   SQL := Res.FieldValue(1);
   Res.Free;
   WriteLn(F,'--');
   WriteLn(F,Format('--  Table structure for table "%s"',[Table]));
   WriteLn(F,'--');
   if FDropObject then WriteLn(F,Format('DROP TABLE IF EXISTS %s%s'+#13#10,[Table,FDelimiter]));
   WriteLn(F,SQL+FDelimiter+#13#10);
end;

procedure TMySQLDump.GetTableData(Table : String);
var
   Ins_tmp : String;
   I,Rows : Integer;
   S1 : String;
   Percent : Integer;
   A : Boolean;
   Res : TMysqlResult;
begin
  if FDisableKeys then
     WriteLn(F,Format('/*!40000 ALTER TABLE %s DISABLE KEYS%s */',[Table, FDelimiter]));
  Res := TMySQLClient(TNativeConnect(FDatabase.Handle).Handle).query(Format('select * from %s',[Table]),True, A);
  Rows := res.RowsCount;
  WriteLn(F,'--');
  WriteLn(F,Format('--  Table data for table "%s". Record count - %s ',[Table,IntToStr(Rows)]));
  WriteLn(F,'--');
  if FAddLocks then
     WriteLn(F,Format('LOCK TABLES %s WRITE%s',[Table,FDelimiter]));
  WriteLn(F,'');

  ins_tmp := Format('INSERT INTO %s VALUES',[Table]);
  // Added for ExtendInsert support
  if ExtInsert and not (Res.RowsCount =0) then
     Write(F,Ins_tmp);
  // End modification
  while not Res.Eof do
  begin
     S1:='';
     Res.FetchLengths;
     for I := 0 to Res.FieldsCount-2 do
     begin
        if Res.FieldValue(I) = nil then
           S1 := S1 +'NULL'+',' else
           begin
              if isBLOB(Res.FieldDef(I)) or (Res.FieldDef(I).FieldType in [FIELD_TYPE_VAR_STRING, FIELD_TYPE_STRING])  then
                 S1 := S1 + ''''+StrValue(Res.FieldValue(I),Res.FieldLenght(I))+''','else
                 begin
                    if Res.FieldDef(I).FieldType in [FIELD_TYPE_TIMESTAMP, FIELD_TYPE_DATE, FIELD_TYPE_TIME, FIELD_TYPE_DATETIME] then
                       S1 := S1 + ''''+Res.FieldValue(I)+''',' else
                       S1 := S1 + Res.FieldValue(I)+',';
                 end;
           end;
     end;
     if Res.FieldValue(Res.FieldsCount-1) = nil then
        S1 := S1 +'NULL' else
        begin
           if isBLOB(Res.FieldDef(Res.FieldsCount-1)) or (Res.FieldDef(Res.FieldsCount-1).FieldType in [FIELD_TYPE_VAR_STRING, FIELD_TYPE_STRING])  then
               S1 := S1 + ''''+StrValue(Res.FieldValue(Res.FieldsCount-1),Res.FieldLenght(Res.FieldsCount-1))+'''' else
               begin
                  if Res.FieldDef(Res.FieldsCount-1).FieldType in [FIELD_TYPE_TIMESTAMP, FIELD_TYPE_DATE, FIELD_TYPE_TIME, FIELD_TYPE_DATETIME] then
                     S1 := S1 + ''''+Res.FieldValue(Res.FieldsCount-1)+'''' else
                     S1 := S1 + Res.FieldValue(Res.FieldsCount-1);
               end;
        end;
     // Added for ExtendInsert support
     if Not ExtInsert then
     begin
        S1 := Format('%s (%s)%s',[ins_tmp,S1,FDelimiter]);
        WriteLn(F,S1);
     end else
     begin
        if Res.RecNo = 0 then
           S1 := Format('(%s)',[S1]) else
           S1 := Format(',(%s)',[S1]);
        Write(F, S1);
     end;
     // End modification
     if Assigned(FonDataProcess) then
     begin
        Percent := Trunc(Res.RecNo*100/(Rows-1));
        FOnDataProcess(Self, Percent);
        Application.ProcessMessages;
     end;
     Res.Next;
  end;
  // Added for ExtendInsert support
  if ExtInsert and not (Res.RowsCount =0) then
  begin
     S1 := FDelimiter;
     WriteLn(F,S1);
  end;
  Res.Free;
  WriteLn(F,'');
  // End modification
  if FDisableKeys then
     WriteLn(F,Format('/*!40000 ALTER TABLE %s ENABLE KEYS%s */',[Table,FDelimiter]));
  WriteLn(F,'');
  if FAddLocks then
     WriteLn(F,Format('UNLOCK TABLES%s',[FDelimiter]));
  WriteLn(F,'');
end;

作者使用了TMyDac。
MySQL数据管理和结构管理好像是分开的(没有太深入研究——不受待见的Delphi,官方无Pascal开发包)。
FDAC 是否包含DDL相关支持呢?
MySQL 数据库结构管理小工具,MySQL 表、视图、触发器、函数、过程结构同步管理MySQL DDL
https://download.csdn.net/download/woniu149113662/87202074

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、 需求分析目前在不少部门存储着大量的数据,包括数据库数据和文件数据,并处于不断更新、不断扩充的状态。数据量大,数据源分布广,同一设备上数据分布散等特点使得对这些数据维护和管理有一些困难。为防止数据因某些不可控制的事故而丢失,对上述数据必须进行备份,以备在主数据丢失时,进行还原。目前的备份手段多为人工定期(不定期)地进行,这样就存在着以下一些问题:1.人工备份多在正常工作期间进行,这样数据备份时很可能会影响数据在正常业务中的使用,会造成业务应用系统性能不稳定,严重的还会造成数据丢失。2.由于数据分布散,人工备份时难于及时掌握数据更新动态,为防止数据备份有丢失,往往只能“一锅炖”,每次都做完整性拷贝,这样每次备份量将叠加,备份延时将增加,造成网络资源浪费,网络流量增加,从而可能会对网络的日常通信造成影响。3.工作烦琐,操作不方便。 二、 系统介绍1. 系统简介软件可自动完成SQL Server数据库和文档的数据定时自动备份,由用户选择对哪些数据库或文档进行数据备份,提供对备份、还原数据作业的管理、分析、日志跟踪等功能。2.软件功能: (1)自动生成备份指令,减少备份的难度,一般用户也可操作,也可由技术人员设好后发给用户。 (2)定时备份按用户的设定的作业时间自动执行。 (3)支持用户任意时刻的手动备份。 (4)支持数据的完整备份、差异备份、增量备份(该项功能目前只用于文件项目)。 (5)完善的数据库还原功能,随时可能数据进行还原操作。 (6)操作日志跟踪功能。用户的操作都保留在日志中,以供备备察。 (7)系统维护提供对备份数据、日志、操作日志的清理功能。3.解决问题针对人工数据备份存在的问题,结合单位生活生产情况,该软件能够基本上解决目前人工数据备份的弊端。(1)通过设置定时备份时刻,从而可以避开数据日常的业务工作期,选择夜间没有数据访问或很少数据访问的时间进行。(2)通过设置备份方式(如:差异备份、增量备份),可以避免每次备份不必要重复备份量。(3)通过对日志的跟踪,可以很快很及时地了解数据备份情况(包括每次的耗时、备份量等)。(4)人力资源消耗降低到几乎为零。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值