AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datenbank duplizieren

Ein Thema von erich.wanker · begonnen am 24. Jun 2020 · letzter Beitrag vom 25. Jun 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.576 Beiträge
 
Delphi 12 Athens
 
#1

AW: Datenbank duplizieren

  Alt 24. Jun 2020, 15:33
Nja, der "normale" Weg, den Viele gehen:
Zwei Connections, zwei DataSets, in dem Einen das SELECT, mit WHILE to EOF drüberlaufen und dann drüben manuell die INSERTs/UPDATEs... ausführen.


Praktisch ist es, wenn man via SQL eine Verbindung zur anderen Datenbank aufbauen kann.

PS: Postgres kann man ohne Installation lokal starten, darin lassen sich Verbindungen zu MySQL aufbauen.
Das geht sogar als FOREIGN TABLE, also eine Tabelle im PostgreSQL, die intern nach MySQL weiterleitet.
Und dann kann man im Postgres einfach INSERT INTO a SELECT * FROM b ausführen.
https://www.postgresql.org/docs/curr...eigntable.html
https://www.postgresql.org/docs/curr...tawrapper.html
oder (das ALTE)
https://www.postgresql.org/docs/10/dblink.html




oder
FireDAC > LocalSQL

Da kann man im SQL auf lokale Komponenten zugreifen. Ich glaub auch auf andere DataSets, welche z.B. jeweils mit den MySQL-Datenbanken verbunden sind.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (24. Jun 2020 um 15:50 Uhr)
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Datenbank duplizieren

  Alt 24. Jun 2020, 16:06
Nja, der "normale" Weg, den Viele gehen:
Zwei Connections, zwei DataSets, in dem Einen das SELECT, mit WHILE to EOF drüberlaufen und dann drüben manuell die INSERTs/UPDATEs... ausführen.


Praktisch ist es, wenn man via SQL eine Verbindung zur anderen Datenbank aufbauen kann.
Ja..was MySQL (soweit ich das weiß) aber von Haus aus nicht kann

PS: Postgres kann man ohne Installation lokal starten, darin lassen sich Verbindungen zu MySQL aufbauen.
Das geht sogar als FOREIGN TABLE, also eine Tabelle im PostgreSQL, die intern nach MySQL weiterleitet.
Und dann kann man im Postgres einfach INSERT INTO a SELECT * FROM b ausführen.
https://www.postgresql.org/docs/curr...eigntable.html
https://www.postgresql.org/docs/curr...tawrapper.html
oder (das ALTE)
https://www.postgresql.org/docs/10/dblink.html
Joa...kannst dir auch die Oracle Version Installieren und das darüber machen.



oder
FireDAC > LocalSQL

Da kann man im SQL auf lokale Komponenten zugreifen. Ich glaub auch auf andere DataSets, welche z.B. jeweils mit den MySQL-Datenbanken verbunden sind.
Das würde aber nix daran ändern, das du 2 Connections brauchst.
Ob eine andere DB diese Verbindungen hat oder die App selbst dürfte dabei relativ egal sein

Mit LocalSQL (wenn das so funktioniert, bin da kein Spezialist) hätte man natürlich den Vorteil, das man innerhalb von SQL das ganze handhaben kann.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.017 Beiträge
 
#3

AW: Datenbank duplizieren

  Alt 24. Jun 2020, 17:30
Über einen Dump - Restore wie hier dargestellt.

Dump:
Delphi-Quellcode:
procedure TMain.BackupClick(Sender: TObject);
const
   READ_BYTES = 2048;

var
  command: TProcess;
  s: string;
  output: TStringList;
  BytesRead, n: LongInt;
  m: TMemoryStream;

begin
  if not (ZConnection1.User = 'root') then begin
    ShowMessage('Only root could access.');
    Exit
  end;
  SaveDialog1.Free;
  SaveDialog1 := TSaveDialog.Create(Self);
  SaveDialog1.InitialDir:= GetUserDir + 'My Documents\';
  SaveDialog1.Filter:='Backup Files|*.bfl';
  if SaveDialog1.Execute then begin
    s := SaveDialog1.FileName;
    if not (copy(s,Length(s)-3,Length(s)-1) = '.bfl') then
      s := s + '.bfl';
    command := TProcess.Create(Nil);
    output := TStringList.Create;
    M := TMemoryStream.Create;
    BytesRead := 0;
    command.CommandLine := 'c:\mysqldump -u root -p'+ZConnection1.Password+' -h '+ZConnection1.HostName+' database';
    command.Options := command.Options + [poUsePipes];
    command.Execute;
    while command.Running do begin
      // ensure the space
      M.SetSize(BytesRead + READ_BYTES);
      // we try to read
      n := command.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
      if n > 0 then
        Inc(BytesRead, n)
      else
        // whitout data, wait 100 ms
        Sleep(100);
    end;
    // we read the last part
    repeat
      // ensure the space
      M.SetSize(BytesRead + READ_BYTES);
      // we try to read
      n := command.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
      if n > 0 then
       Inc(BytesRead, n);
    until n <= 0;
    M.SetSize(BytesRead);
    output.LoadFromStream(M);
    output.SaveToFile(s);
    output.Free;
    command.Free;
    M.Free;
    ShowMessage('Backup ready.')
  end else
    ShowMessage('Backup canceled.');
end;
Restore:
Delphi-Quellcode:
procedure TFMain.restoreClick(Sender: TObject);
var
  s: string;
  tfFile: TextFile;
begin
  if not (ZConnection1.User = 'root') then begin
    ShowMessage('Only root could access.');
    Exit
  end;
  OpenDialog1.Free;
  OpenDialog1 := tOpenDialog.Create(Self);
  OpenDialog1.InitialDir:=GetUserDir+'My Documents\';
  OpenDialog1.Filter:='Backup Files|*.bfl';
  if OpenDialog1.Execute then begin
    AssignFile(tfFile, OpenDialog1.FileName);
    if not FileExists(OpenDialog1.FileName) then
      exit;
    reset(tfFile);
    ZQuery1.SQL.Clear;
    readln(tfFile,s);
    While not eof(tfFile) do begin
      Readln(tfFile,s);
      if length(s) > 0 then begin
        s := StringReplace(s, #10, '', [rfReplaceAll]);
        s := StringReplace(s, #13, '', [rfReplaceAll]);
        s := StringReplace(s, #9, ' ', [rfReplaceAll]);
        if not ((s[1]+s[2]) = '--') then begin
          ZQuery1.SQL.Add(s);
          if s[length(s)] = ';then begin
            ZQuery1.ExecSQL;
            ZQuery1.SQL.Clear
          end
        end
      end
    end;
    CloseFile(tfFile);
    ShowMessage('Restauration done.');
  end else
    ShowMessage('Restauration canceled.');
end;
Hab's nicht getestet. Aber mit ein paar kleinen Anpassungen könnte man den Umweg über eine Datei eliminieren.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Datenbank duplizieren

  Alt 24. Jun 2020, 20:54
Bin mir nicht sicher, aber ich mein mysql kann untereinander auf mehrere DB zugreifen, sie müssen nur "erreichbar" sein.
Erreichbar bedeutet in dem Fall, auf dem gleichen Server. (So ungefähr)
Unter den Voraussetzungen würde dann die Idee von Erich Wanker funktioneren.

DB Tools, Backup+Restore wären aber ein nicht unüblicher Weg, eine Kopie anzulegen.

P.S.: Das müsste es sein
https://stackoverflow.com/questions/...rent-databases
Gruß, Jo

Geändert von jobo (24. Jun 2020 um 21:01 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Datenbank duplizieren

  Alt 24. Jun 2020, 22:16
HeidiSQL kann über Server-Instanzen hinweg exportieren, und es ist in Delphi geschrieben. Leider aber nicht Open Source. Wenn es nur um eine Einmalige Sache geht, kann ich das durchaus empfehlen. Man muss nur im Start-Screen den Zielserver als gespeicherte Verbindung hinterlegen, und kann dann wenn man sich mit der Quell-DB verbunden hat im SQL-Export ein Ziel (auch) aus den gespeicherten Verbindungen angeben. Habe ich schon öfter gemacht, und klappt prima.

Ich vermute, dass intern tabellenweise SQL dumps erzeugt werden, die dann auf dem Zielserver einfach ausgeführt werden. Queries über mehrere Instanzen hinweg gibt es in der MySQL-Welt soweit ich weiß nicht.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Datenbank duplizieren

  Alt 25. Jun 2020, 05:12
...Leider aber nicht Open Source.
Wie kommst du denn auf das schmale Brett?
Chris
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Datenbank duplizieren

  Alt 25. Jun 2020, 21:02
...Leider aber nicht Open Source.
Wie kommst du denn auf das schmale Brett?
Ich hab offenbar nicht "tief" genug gelesen, scusi! Hatte auf SF nur in die Files geaschaut, und da war nix. Der Button, der auf die aktuell gültige Heimat der Quellen, Github, verweist, ist mir nicht aufgefallen. Und zumindest im Einleitungstext auf Wikipedia steht nur "freier Client" - dass es OS wurde kommt zwar kurz danach, las sich im müden Kopf aber nicht ganz eindeutig so, dass es wirklich das aktuelle HeidiSQL ist, welches da in OS überging. Beim nochmaligen Lesen wurde es mir dann aber auch klar. Danke für's vom Brett schubsen!


Edit: Jup, da wird ein SQL Dump erzeugt. Allerdings nicht der, den manche DMBS selbst erzeugen können, sondern recht aufwendig ein eigenes Vorgehen. Zu finden in der Methode TfrmTableTools.DoExport(DBObj: TDBObject); in tabletools.pas. Der dort erzeugte Stream wird bei Export in eine andere DB in eine Query mit einer 2. Connection zum Ziel-DBMS übergeben und ausgeführt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (25. Jun 2020 um 21:16 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz