2013-05-09 7 views
36

Jestem w trakcie przenoszenia moich plików na inny komputer, a jedną rzeczą, którą chciałbym zrobić, jest przesłanie danych do mojej bazy danych MySQL. Chcę zrzucić bazy danych do plików .sql, ale także utworzyć bazę danych db_name, w tym w pliku, w ten sposób po prostu muszę zaimportować plik do mysql bez konieczności ręcznego tworzenia baz danych. Czy jest jakiś sposób na zrobienie tego?mysqldump z utworzeniem linii baz danych

Odpowiedz

48

Domyślnie mysqldump zawsze tworzy instrukcję CREATE DATABASE IF NOT EXISTS db_name; na początku pliku zrzutu.

[EDIT] Kilka rzeczy o pliku mysqldump i to opcje:

--all-databases, -A

Dump wszystkich tabel we wszystkich baz danych. Jest to to samo, co użycie opcji --databases i nazwanie wszystkich baz danych w wierszu poleceń.

--add-drop-database

Dodaj DROP DATABASE oświadczenia przed każdym rachunku CREATE DATABASE. Ta opcja jest zwykle używana w połączeniu z opcją --all-databases lub --databases, ponieważ nie są zapisywane żadne instrukcje, chyba że podano jedną z tych opcji.

--databases, -B

Dump kilka baz danych. Zwykle mysqldump traktuje argument first name w linii komend jako nazwę bazy danych i następujące nazwy jako nazwy tabel. Dzięki tej opcji traktuje wszystkie argumenty nazw jako nazwy baz danych. Instrukcje CREATE DATABASE i USE są zawarte w danych wyjściowych przed każdą nową bazą danych.

--no-create-db, -n

Ta opcja tłumi CREATE DATABASE wypowiedzi, które są w inny sposób uwzględnione w danych wyjściowych, jeśli opcja --databases lub --all-databases podano.

Jakiś czas temu podobnym pytaniem było pytanie o brak takiego stwierdzenia na początku pliku (w przypadku pliku XML). Link do tego pytania: is here.

więc odpowiedzieć na pytanie:

  • jeśli masz jedną bazę danych do zrzutu, trzeba mieć odpowiednią opcję w swoim oświadczeniu mysqldump --add-drop-database.
  • jeśli masz kilka baz danych do zrzutu, należy użyć opcji --databases lub --all-databases i składnię CREATE DATABASE zostanie dodany automatycznie

Więcej informacji na MySQL Reference Manual

+1

Tak się ze mną działo. Nie korzystałem z --databases lub --all-databases. Właśnie umieściłem nazwę bazy danych, która nie utworzyłaby bazy danych, jeśli istnieje i utworzyła linię baz danych. – Vince

+0

Tak, to w przypadku jednej bazy danych dodaj opcję '--add-drop-database' i wszystko powinno być w porządku. Pamiętaj jednak, że zaimportowanie pliku zrzutu spowoduje usunięcie tej bazy danych i wszystkiego, co znajduje się w środku, jeśli taki jest na komputerze. – GregD

+3

W jakiej wersji to było? mysqldump Ver 10.11 Distrib 5.0.51a, dla debian-linux-gnu (i486) test mysqldump --add-drop-database | grep DROP wyprowadza tylko linie DROP TABLE dla testowej bazy danych. Muszę dodać - bazy danych zanim dostanę komentarz DROP DATABASE IF EXISTS 'test' – jla

7

Najprostszym rozwiązaniem jest użycie opcji -B lub --databases. Następnie w pliku wyjściowym pojawia się polecenie CREATE database. Na przykład:

mysqldump -uuser -ppassword -d -B --events --routines --triggers database_example > database_example.sql 

Oto nagłówku dumpfile za:

-- MySQL dump 10.13 Distrib 5.5.36-34.2, for Linux (x86_64) 
-- 
-- Host: localhost Database: database_example 
-- ------------------------------------------------------ 
-- Server version  5.5.36-34.2-log 

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 
/*!40103 SET @[email protected]@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 

-- 
-- Current Database: `database_example` 
-- 

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `database_example` /*!40100 DEFAULT CHARACTER SET utf8 */; 
0

Oto jak to zrobić zrzut bazy danych (tylko z schematu):

mysqldump -u root -p"passwd" --no-data --add-drop-database --databases my_db_name | sed 's#/[*]!40000 DROP DATABASE IF EXISTS my_db_name;#' >my_db_name.sql 

Jeśli też chcesz dane, usuń opcję --no-data.