phpbar.de logo

Mailinglisten-Archive

Re: import-export
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: import-export



Walter Steinbach schrieb heute:

> gibt es eine moeglichkeit, eine datenbank von einem rechner (linux)
> auf einen anderen (auch linux, aber an sich ja egal) zu
> transferieren. ich weiss, dass man die datenbank erst dumpen koennte
> und dann auf dem anderen rechner wieder einlesen, aber geht es nicht
> einfacher?

Ups, ist das nicht eh schon sehr einfach?

  mysqldump --opt -hquellrechner dbname | mysql -hzielrechner neudbname

Und falls Du nicht beide Rechner zugleich on-line erreichen kannst,
dann halt mit einer Zwischendatei:

  a) Am Quellrechner: mysqldump --opt dbname >tmpdatei.sql
  b) Die Datei "tmpdatei.sql" zum Zielrechner bringen
     (wie auch immer: FTP, HTTP-Upload, rcp, Mailanhang -
      hauptsache unverändert ...)
  c) Am Zielrechner: mysql neudbname <tmpdatei.sql

Diese Methode funktioniert immer, auch wenn Deine MySQL-Server unter
verschiedenen Betriebssystemen laufen würden (ich weiß, bei Dir ist es
eh jeweils Linux).  Sie funktioniert sogar oft mit anderen DBMS zusammen,
da in "tmpdatei.sql" normale SQL-Anweisungen stehen, die evtl. nur ein
wenig angepaßt werden müssen - aber zumindest ist es kein Binärformat.

Die von MySQL intern zur Speicherung der Tabellen benutzten
ISAM-Dateien (*.ISD, *.ISM, *.frm im Datenbankverzeichnis) können
leider auf verschiedenen Betriebssystemen unterschiedlich sein, können
dann also _nicht_ einfach kopiert werden.  (Ab V3.23.x gibt's
alternativ auch das neue MYISAM-Format, das binärkompatibel und damit
immer austauschbar ist).

Wenn Du Datenbanken zwischen MySQL-Servern austauschen willst, die
unter genau dem gleichen Betriebssystem laufen, kannst Du auch direkt
die DB-Dateien aus MySQLs Datenbankverzeichnis kopieren (*.ISD, *.ISM,
*.frm).
Da MySQL teilweise Datenänderungen auch im Speicher hält (caching) und
nicht sofort in die Tabellendateien schreibt, muß man vor dem Kopieren
ein wenig auf die Datenkonsistenz achten:

- Am einfachsten ist es, wenn man den DB-Server mysqld herunterfährt
  und dann erst kopiert.  Auf der Zielseite genauso: runterfahren,
  neue Tabellen einkopieren, neu starten.

- Wenn die DB-Server aber weiterlaufen sollen, dann so.

  Am Quellrechner:
    LOCK TABLES dietabelle READ;
      /* damit nicht andere Threads Datenänderungen machen können,
         während wir kopieren */
    FLUSH TABLES;
      /* damit MySQL den aktuellen Zustand der Tabelle auch sicher
         in die Tabellen-Dateien geschrieben hat */
    /*
    Jetzt die Tabellen-Dateien kopieren.
    */
    UNLOCK TABLES;

  Am Zielrechner:
    LOCK TABLES dietabelle WRITE;
      /* damit andere Threads nicht lesen können, während wir
         neue Daten einkopieren */
    FLUSH TABLES;
      /* damit MySQL nichts mehr im Speicher hält und später
         verwirrt wäre */
    /*
    Jetzt die neuen Tabellen-Dateien einkopieren.
    */
    FLUSH TABLES;
      /* damit MySQL die neuen Tabellen erkennt */
    UNLOCK TABLES;

Genauso geht man übrigens auch vor, wenn man Tabellen-Dateien während
des laufenden Betriebs mit 'isamchk' prüfen (dann wie beim Quell-
rechner) oder reparieren (dann wie beim Zielrechner) will.

Letzte Alternative zum Tabellenaustausch, die mir einfällt, ist mit
Hilfe von Exportdateien, die je Zeile einen Datenensatz enthalten,
dessen Datenfelder z.B. durch Tabs oder Kommata voneinander getrennt
sind (sog. Comma Seperated Values, CSV).
Erzeugt wird sowas in MySQL mit: SELECT ... INTO OUTFILE ...
Eingelesen mit: LOAD DATA INFILE ...
Siehe Handbuch.
Diese Methode ist schneller als ein Dump, allerdings muß man sich
auf der Zielseite selbst um das erzeugen der richtigen Tabellenstruktur
kümmern.

Ciao,
  Martin

PS: Ich persönlich finde es nicht gut, daß Du als "Der Compilierer"
    anonym postest, daß Du die nervige Nur-Kleinschreibung verwendest,
    daß Du eine protzige Riesen-Signature verwendest.  Aber mache sich
    jeder nach eigener Lust und Laune unbeliebt.  Wäre jeder Listen-
    artikel nicht auch zugleich für alle anderen Listenmitglieder
    bestimmt, bekämst Du so von _mir_ keine Antworten.  _Meine_ Meinung.
-- 
Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://home.pages.de/~ramsch/ >
PGP KeyID=0xE8EF4F75 FiPr=52 44 5E F3 B0 B1 38 26  E4 EC 80 58 7B 31 3A D7

---
*** Abmelden von dieser Mailingliste funktioniert per E-Mail
*** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive