PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [mysql]Problem mit shell-dump



foruni.de
14.07.04, 19:09
Hi,

ich hab mir ein shell-script geschrieben, welches mir dann per cron automatisch meine mysql db backupt. nun hab ich ein kleines problem: ich kann die backup-sql nicht per shell-befehl wieder einfügen.

Wenn ich ein Backup per phpmyadmin mache und dieses per shell einfügen will, geht es.

so sieht der kopf meiner sql aus dem backup-script aus (und auch vor jedem "create table" steht ein "--")


-- MySQL dump 8.22
--
-- Host: localhost Database: xxx
---------------------------------------------------------
-- Server version 3.23.55-log

--
-- Current Database: xxx
--


man beachte die "--"

ich backupe die datenbank mit dem befehl: mysqldump -u root -p$pass --databases $dbname > $path/$filename (die variablen natürlich gefüllt).

kann mir jemand helfen bzw eine Option geben, wie er nicht in der Art ein Backup macht, dass ständig diese "--" in der sql stehen?

danke :D

michael.sprick
14.07.04, 19:42
hi,

also dass im Kopf immer die "--" davorstehen ist ja klar...
Aber vor den Creates und Inserts sollte eigentlich nix stehen:



mysqldump -u root -p Datenbankname Tabellenname


sollte einen ganz normalen Dump erzeugen...
versuch vorsichtshalber mal die Option --no-defaults, falls irgendwer in der my.cnf festgelegt hat, dass JEDE Zeile mit -- beginnen soll...

foruni.de
20.07.04, 22:48
hi,

danke für deine hilfe, nur zeigt sich keine änderung :confused:

temir
22.07.04, 13:57
zum sichern:
mysqldump --opt "$DB_NAME" >"$DB_NAME".sql

zum wiederherstellen:
mysql -D "$DB_NAME" <"$DB_NAME".sql

Pingu
22.07.04, 14:16
man beachte die "--"
Wo ist das Problem? Das sind ganz normale Kommentare. Die werden beim Einlesen übergangen.

Ich übertrage meine Daten von einer DB zur anderen DB auch mit:
mysqldump -C --add-drop-table -u username -ppassword database | mysql -C -u username -ppassword database

Man kann das sicherlich auch über eine Datei machen
mysqldump -C --add-drop-table -u username -ppassword database > gzip -9 > database.gz
Um es dann später wieder einzufügen
gunzip -c database.gz | mysql -C -u username -ppassword database

Pingu

foruni.de
23.07.04, 11:46
Wo ist das Problem? Das sind ganz normale Kommentare. Die werden beim Einlesen übergangen.


das Problem besteht darin, dass ich per Shell den Dump nicht mehr in die DB eintragen kann. Jedesmal (auch wenn die DB leer ist) erhalte ich den Fehler:

ERROR 1050 at line 19: Table 'bar_counter' already exists
(wobei sich der Fehler auf den ersten Table im Dump bezieht).

Fakt ist nunmal, dass ich den Dump, den ich per phpMyAdmin gemacht habe ohne Probleme in die DB einfügen kann (Kommentare mit '#', anstatt mit '--').

//edit

habe nun mal die '--' durch '#' ersetzt und es scheint nicht daran zu liegen, sondern daran:


CREATE DATABASE /*!32312 IF NOT EXISTS*/ DBname;
USE DBname;

Pingu
23.07.04, 12:21
Die Fehlermeldung hat aber nichts mit den Kommentaren zu tun.

Die Fehlermeldung hat damit zu tun, daß die Tabelle schon existiert und in Deinem Dump ein CREATE TABLE bar_counter ... steht. Da die Tabelle schon existiert, kann mySQL sie nicht neu erstellen.

Deshalb gebe ich beim erstellen des Dump immer die Option --add-drop-table mit an. Dabei stellt mysqldump vor jedem CREATE TABLE bar_counter ... ein DROP TABLE bar_counter IF EXISTS und stellt damit sicher, daß dieser Fehler nicht mehr auftreten kann.

Übrigens eine leere Datenbank heißt: Es existieren keine Tabellen.

Pingu

PS: Fakt ist auch folgendes, wie es in der Dokumentation steht:

Some other SQL databases use `--' to start comments. MySQL Server uses `#' as the start comment character. You can also use the C comment style /* this is a comment */ with MySQL Server. See section 10.5 Comment Syntax.

Another safe feature is that the mysql command-line client removes all lines that start with `--'.
Ein anderer Fakt ist, dass gerade das letzte Statement zu der Annahme führt, dass die Zeilennummer in der Fehlermeldung eine andere Zeile meint als in deiner Datei, da ja mysql die Zeilen schon vorneweg weggeworfen, bevor sie überhaupt zur Datenbank gesendet werden.
Das ist Fakt.

EDIT: auf Deutsch:

MySQL Manual | 7.1.5 Kommentar-Syntax (http://dev.mysql.com/doc/mysql/de/Comments.html)

Der MySQL-Server die Kommentar-Stile # bis Zeilenende, -- bis Zeilenende und /* mittendrin oder mehrzeilig */:

mysql> select 1+1; # Dieser Kommentar geht bis zum Zeilenende
mysql> select 1+1; -- Dieser Kommentar geht bis zum Zeilenende
mysql> select 1 /* Das ist ein Kommentar mittendrin */ + 1;
mysql> select 1+
/*
Das ist ein
mehrzeiliger
Kommentar
*/
1;

Beachten Sie, dass Sie beim Kommentarstil -- mindestens ein Leerzeichen hinter -- setzen müssen!

Obwohl der Server die Kommentar-Syntax wie beschrieben versteht, gibt es einige Einschränkungen in der Art, wie der mysql-Client /* ... */-Kommentare parst:

Einfache und doppelte Anführungszeichen werden genommen, um den Anfang einer Zeichenkette zu bestimmen, selbst innerhalb eines Kommentars. Wenn die Zeichenkette nicht durch ein zweites Anführungszeichen innerhalb des Kommentars abgeschlossen wird, bemerkt der Parser nicht, dass der Kommentar zuende ist. Wenn Sie mysql interaktiv ausführen, sehen Sie, dass mysql verwirrt ist, weil sich die Eingabeaufforderung von mysql> zu to '> oder "> ändert.
Ein Semikolon wird genommen, um das Ende des aktuellen SQL-Statements kenntlich zu machen. Alles Folgende wird als Anfang des nächsten Statements aufgefasst.

Diese Einschränkungen gelten sowohl, wenn Sie mysql interaktiv ausführen und wenn Sie Befehle in eine Datei schreiben und mysql mit mysql < some-file anweisen, seine Eingaben aus dieser Datei zu lesen.

MySQL unterstützt nicht den ANSI-SQL-Kommentarstil `--' ohne nachfolgendes Leerzeichen. See section 2.7.4.8 `--' als Beginn eines Kommentars.

foruni.de
23.07.04, 14:23
hi,

danke schonmal. du scheinst sehr nett zu sein, pingu.... :rolleyes:

//

Kollege, lies mal genau durch, was ich geschrieben hab.
dein
DROP TABLE bar_counter IF EXISTS und stellt damit sicher, daß dieser Fehler nicht mehr auftreten kann.

Übrigens eine leere Datenbank heißt: Es existieren keine Tabellen.

ich hab genau das geschrieben. es existieren KEINE Tabellen mehr in meiner Datenbank http://www.foruni.de/board/images/smilies/41.gif (danke für die Berichtigung :)) und dennoch erhielt ich diesen Fehler.

Pingu
23.07.04, 17:03
danke schonmal. du scheinst sehr nett zu sein, pingu.... :rolleyes:
Ich habe nur entsprechend geantwortet passend zu dem Statement

Fakt ist nunmal, dass ich den Dump, den ich per phpMyAdmin gemacht habe ohne Probleme in die DB einfügen kann (Kommentare mit '#', anstatt mit '--').
Denn es liegt ja eindeutig nicht an den Kommentaren.

Kollege, lies mal genau durch, was ich geschrieben hab.
dein
ich hab genau das geschrieben. es existieren KEINE Tabellen mehr in meiner Datenbank http://www.foruni.de/board/images/smilies/41.gif (danke für die Berichtigung :)) und dennoch erhielt ich diesen Fehler.
Dazu kann ich nur sagen, Dein EDIT hatte ich nicht lesen können vor meiner Antwort. Denn für viele ist leer auch, wenn die Tabellen leer sind.

Zurück zu dem Problem: Es ist genau das gleiche wie mit den Tabellen. Den das steht CREATE DATABASE DBname; (Wieder die Kommentare, die nicht beachtet werden /*!32312 IF NOT EXISTS*/). D. h. was macht MySQL? Es hat eine Datenbank mit dem Namen (auch wenn sie leer ist) und sollen aber plötzlich eine neue mit dem gleichen Namen erstellen. *bumm* Das geht natürlich nicht. Jetzt stelle ich mir die Frage, wie bekomme ich ein richtiges Statement in den Dump? Dafür gibt es zwei Möglichkeiten:
das IF NOT EXISTS muß aus dem Kommentar raus
das ganze Statement ist überflüssig

Also schaue ich ersteinmal in der Hilfe nach, ob es da eine entsprechende Option gibt:


ts@ts-mobile:~
16:59:09 - 503> mysqldump --help
mysqldump Ver 8.22 Distrib 3.23.53, for apple-darwin6.1 (powerpc)
By Igor Romanenko, Monty, Jani & Sinisa
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Dumping definition and data mysql database or table
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]

-A, --all-databases Dump all the databases. This will be same as
--databases with all databases selected.
-a, --all Include all MySQL specific create options.
-#, --debug=... Output debug log. Often this is 'd:t:o,filename`.
--character-sets-dir=...
Directory where character sets are
-?, --help Display this help message and exit.
-B, --databases To dump several databases. Note the difference in
usage; In this case no tables are given. All name
arguments are regarded as databasenames.
'USE db_name;' will be included in the output
-c, --complete-insert Use complete insert statements.
-C, --compress Use compression in server/client protocol.
--default-character-set=...
Set the default character set
-e, --extended-insert Allows utilization of the new, much faster
INSERT syntax.
--add-drop-table Add a 'drop table' before each create.
--add-locks Add locks around insert statements.
--allow-keywords Allow creation of column names that are keywords.
--delayed-insert Insert rows with INSERT DELAYED.
--master-data This will cause the master position and filename to
be appended to your output. This will automagically
enable --first-slave.
-F, --flush-logs Flush logs file in server before starting dump.
-f, --force Continue even if we get an sql-error.
-h, --host=... Connect to host.
-l, --lock-tables Lock all tables for read.
--no-autocommit Wrap tables with autocommit/commit statements.
-K, --disable-keys '/*!40000 ALTER TABLE tb_name DISABLE KEYS */;
and '/*!40000 ALTER TABLE tb_name ENABLE KEYS */;
will be put in the output.
-n, --no-create-db 'CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name;'
will not be put in the output. The above line will
be added otherwise, if --databases or
--all-databases option was given.
-t, --no-create-info Don't write table creation info.
-d, --no-data No row information.
-O, --set-variable var=option
give a variable a value. --help lists variables
--opt Same as --add-drop-table --add-locks --all --quick
--extended-insert --lock-tables --disable-keys
-p, --password[=...] Password to use when connecting to server.
If password is not given it's solicited on the tty.

-P, --port=... Port number to use for connection.
-q, --quick Don't buffer query, dump directly to stdout.
-Q, --quote-names Quote table and column names with `
-r, --result-file=... Direct output to a given file. This option should be
used in MSDOS, because it prevents new line '\n'
from being converted to '\n\r' (newline + carriage
return).
-S, --socket=... Socket file to use for connection.
--tables Overrides option --databases (-B).
-T, --tab=... Creates tab separated textfile for each table to
given path. (creates .sql and .txt files).
NOTE: This only works if mysqldump is run on
the same machine as the mysqld daemon.
-u, --user=# User for login if not current user.
-v, --verbose Print info about the various stages.
-V, --version Output version information and exit.
-w, --where= dump only selected records; QUOTES mandatory!
-X, --xml dump a database as well formed XML
-x, --first-slave Locks all tables across all databases.
EXAMPLES: "--where=user='jimf'" "-wuserid>1" "-wuserid<1"
Use -T (--tab=...) with --fields-...
--fields-terminated-by=...
Fields in the textfile are terminated by ...
--fields-enclosed-by=...
Fields in the importfile are enclosed by ...
--fields-optionally-enclosed-by=...
Fields in the i.file are opt. enclosed by ...
--fields-escaped-by=...
Fields in the i.file are escaped by ...
--lines-terminated-by=...
Lines in the i.file are terminated by ...

Default options are read from the following files in the given order:
/etc/my.cnf /usr/local/mysql/var/my.cnf ~/.my.cnf
The following groups are read: mysqldump client
The following options may be given as the first argument:
--print-defaults Print the program argument list and exit
--no-defaults Don't read default options from any options file
--defaults-file=# Only read default options from the given file #
--defaults-extra-file=# Read this file after the global files are read

Possible variables for option --set-variable (-O) are:
max_allowed_packet current value: 25165824
net_buffer_length current value: 1047551

ts@ts-mobile:~
16:59:21 - 504>

Siehe da, da gibt es sogar eine Option für :rolleyes: :

-n, --no-create-db 'CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name;'
will not be put in the output. The above line will
be added otherwise, if --databases or
--all-databases option was given.


Das sollte dann des Problems Lösung sein ... und es waren doch nicht die Kommentare, sondern weil phpMyAdmin den Aufruf anders durchführt.

Pingu

EDIT: Eine andere Option wäre es natürlich die Option --databases ganz weg zu lassen, wie ich es oben in meinen ursprünglichen Beispielen auch gemacht habe. Leider scheints Du das ja nicht gelesen zu haben :eek:

eclipse
23.07.04, 17:57
So wie es die Vorredner schon sagten, die Kommentare haben nicht mit deinem Fehler zu tun.
Ich kenn den Fehler auch. Was bei mir geholfen hatte, war einfach mal das ganze so zu machen.
mysql tabelle < deinbackup --password=$passwort -u $user

foruni.de
24.07.04, 12:54
hi,

hatte zwar danach geschaut, aber anscheinend nicht richtig. dankeschön.
hatte nur ein mysql --help gemacht :D