[SQL] *.sql Datei ausführen

krizzelfix

Commander
Registriert
Sep. 2005
Beiträge
2.626
Hallo Community,

bräuchte mal wieder eure Hilfe.
Ich habe einige Datein mit einer Menge sql Befehlen.
Wie kann ich die Statements alle auf einmal Ausführen?
Habe es mit
PHP:
mysql_query("LOAD DATA INFILE 'SQL/shop.sql");
probiert. Aber dann bekomm ich immer den Fehler
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''SQL/shop.sql' at line 1
Was mache ich falsch?

Grüße

tewes
 
wenn du ne shell zur verfügung hast, dann mach das so

mysql -u ich -ppass < dump.sql

Ansonsten steht in der Doku vom mysql folgendes :

Code:
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test
  FIELDS TERMINATED BY ','  LINES STARTING BY 'xxx';

Demnach musst du das Ziel noch mit angeben Trennzeichen und Startzeichen sind soweit ich weiss optional.Ausserdem hast du nen Syntaxfehler hinter shop.sql gehört noch eine einfachen Hochkomma/Anführungszeichen.
 
Zuletzt bearbeitet:
wenn das ne einmalige aktion ist, machs doch per phpMyAdmin oder mysqldumper.
 
Es fehlt auch ein ' in der Query...

Probiers mal so:
PHP:
mysql_query("LOAD DATA INFILE 'SQL/shop.sql'")

Ungetestet und ohne Gewähr... ;)

Gruß
 
Vielen dank für eure antworten.

@luky37: Nein es ist keine einmalige Sache da es sich um einen Installer für ein CMS handelt.

@Epyx: Ich weiss nicht ob ich das über die Shell machen kann. Es sollte auf Linux und Windows Servern laufen.

Muss ich denn INTO TABLE etc schreiben? Ich will ja mit den Dateien die Tabellen erstellen und eventuell schon Daten einpflegen.

@vacation: Ich werde es nachher bei Gelegenheit mal ausprobieren.

Grüße

tewes
 
naja die Tabelle solltest du vorher mit CREATE erstellen und dann das LOAD DATA INFILE...

Also musst du 2 Querys schreiben und nacheinander ausführen.
 
Zuletzt bearbeitet: (Link zum CREATE-Beispiel eingefügt)
tewes, ich denke ma das fehlende ' war der Fehler, is mir auch direkt aufgefallen :)
 
Habs jetzt mal mit dem Hochkomata probiert und es geht auch nicht.
Alle Tabellen von Hand in den Code schreiben ist auch sehr umständlich und dann könnte ich auch nicht LOAD DATA benutzen, da in der Datei daten für unterschiedliche Tabellen stehen.

Wie funktioniert denn die PhpMyAdmin funktion Importieren?
Das ist ja genau das was ich brauche.

Grüße

tewes
 
Womit hast du denn dem Dump (mysql-file) erzeugt ? Wenn du die Möglichkeit hast, das File neu zu erstellen, dann machs mit Struktur.

PHPMyAdmin wirds auch nciht anders machen. Da wählst du ja vornerein eine Datenbank aus und wenn in dem Dump keine Struktur ist, wird er spätestens dann meckern weil er weder Table erstellen kann noch findet.
 
Die Datei wurde aus einem fertigen System exportiert mit Administratoren, Layouts und sonstigen Einstellungen. Also ein SQL. Und die Datei auseinander zu nehmen wäre ja auch ziemlich viel arbeit, da es bis zu 72 Tabellen mit Datensätzen sind.

Aber PHPMyAdmin wird dazu doch ein RegEx oder so etwas benutzen.

Grüße

tewes
 
RegEx ? PHPMYAdmin basiert auch nur auf PHP und nutzt die PHP-Funktionen für MySQL-Datenbanken.

Du musst doch nur die Tabellenstruktur mit exportieren lassen, dann sind alle Informationen über den Aufbau der XY Tabellen mit dabei und dann kannst du auch deine SQL-File importieren oder mit LOAD DATA via Skript verarbeiten.

phpmyadminexport.jpg
 
Zuletzt bearbeitet:
Hallo Epyx,

ich habe die Struktur mit exportiert.
Ich habe nur noch den Dump in unterschiedliche Dateien aufgeteilt um nur die Tabellen zu importieren die ich auch für die aktivierten Module benötige.

Oder meinst du das so, das ich eine Datei für die Struktur und ein für die Daten habe und diese dan nacheinander Importiere?

Grüße

tewes
 
Normalerweise solltest du, wenn es etwas per phpmyadmin exportierst, ALLES in EINER Datei haben.

Wenn du aber per phpmyadmin importierst, limitiert der server die maxilae dateigröße die du senden kannst (meist so 2-4MB).


Du kannst aber die sql datei öffnen, ALLES KOPIEREN (STRG + C) und zB bei phpmyadmin im sqlfenster einfügen .... so hab ich das gemacht, weil der import per upload auch net ging ... (Datei nicht lesbar O_o)
 
Ich wollte es aber gar nicht per PhpMyAdmin machen, da alles möglichst automatisch gehen soll.
Werd mir das heute abend nochmal angucken wie Joomla, etc. das machen. Irgendwie muss es ja gehen.

Grüße

tewes
 
Eigentlich, macht man das so wie dMopp es schilderte, alles in eine Datei. Beim exportieren mit PHPMyAdmin, kann man sogar auswählen welche Tabellen man exportiert haben möchte.

Btw. Ich habe über ein Jahr Joomla eingesetzt (was nicht heisst, dass ich mich nicht irren kann) und habe nie ein importfunktion für mysql-Dumps entdeckt. Vielleciht hab ich sie nur übersehn, man lernt bekanntlich nie aus.
 
Ja ich weiss, aber in diesem Fall ist es einfacher wenn die augeteilt sind. Werde die aber heute abend nochmal neu exportieren. Letzte mal hatte ich das von Hand gemacht.

Ich mein beim Installieren von Joomla. Irgendwie müssen die das ja auch machen, dass die Tabellen mit Daten importiert werden.
 
Ja, die führen mkt php eine *.sql datei aus .... ;)

(schau dir mal zB vom wbb lite oder phpbb den inmstallordner an .. dann siehste wie das funktioniert)
 
Oke thx.
Werde mir das heute abend anschauen.

Habe mir grad auf der Arbeit schonmal Typo3 angeguckt, aber die haben dazu Ihre eigene Funktion geschrieben.

Werde zur not auch ein RegEx schreiben müssen was die SQL Statements rausfiltert und dann einzeln ausführen.

Grüße

tewes
 
Da dein SQL-Dump Struturen und Werte enthält, wird es auch MySQL-Statements enthalten und die kannst du mit LOAD DATA nicht einlesen.


So, probierdas mal aus. Dabei wird die Datei zeilenweise gelesen und das darinliegene MYSQL-Statement verarbeitet.

Allerdings sollten in dem Dump keine Kommentare sein.

Beispiel einen MySQL-Statements von Wordpress :

Code:
UPDATE wp_cid_downloads SET id = 1, file_name = 'D-Kanal.pdf', login = 'ePyx', referer = 'http://www.epyx-online.de/index.php/studium/protocoll/?preview=true', remote_addr = '84.189.128.13', date = '2007-05-03 08:35:42' WHERE  `id` = 1;


PHP:
<?php
// Daten für die Datenbankverbindung
$dbhost = "host";
$dbuser = "user";
$dbname = "name";

// Dateiname
$filename = "fname";

// Öffnen der Verbindung

$db_connection=mysql_connect($dbhost,$dbuser,$dbpasswd); 
@mysql_select_db($dbname) or die( "Unable to select database");


$lines = file ($filename);

// Durchgehen des Arrays und Senden des Qrys an die MySQL-Datenbank
foreach ($lines as $line_num => $line) {
    $result=mysql_query($line);        
    if (!$result) { 
      echo "Anfrage ($sql) konnte nicht ausgeführt werden : " . mysql_error(); 
      exit; 
    }
}

// Aufräumen
mysql_free_result ($result); 
mysql_close ($db_connection);
?>


Bitte.
 
Zuletzt bearbeitet:
Vielen Dank Epyx,

aber in der Datei stehen viele SQL Statements mit Zeilenumbrüchen und Kommentare sind auch etliche drin.

Ich habe deshalb auch schon überlegt ob man anhand des Semikolons nicht ein Statement idenifizieren kann, aber in den Daten stehen auch Templates und somit PHP-Code und CSS Stylesheets.

Deshalb hatte ich auch die Idee mit dem RegEx.

Grüße

tewes
 
Zurück
Oben