Jak mogę wykonać kopię zapasową struktury tabeli, ale NIE jej danych w MySQL

20

Korzystam z MySQL Administrator do tworzenia kopii zapasowych bazy danych. Mogę idealnie wykonać kopię zapasową całej bazy danych ze wszystkimi jej tabelami. Istnieje kilka tabel, których rozmiar jest bardzo duży, więc zastanawiam się, czy mógłbym wykonać kopię zapasową struktury tabel (tylko ich elementów), ale nie ich danych.

Andrew Schulman
źródło

Odpowiedzi:

40

Użyj --no-dataprzełącznika z mysqldump, aby powiedzieć mu, aby nie zrzucał danych, tylko strukturę tabeli.

Spowoduje to wyświetlenie instrukcji CREATE TABLE dla tabel.

Coś takiego

mysqldump --no-data -h localhost -u root -ppassword mydatabase > mydatabase_backup.sql

Aby kierować na określone tabele, wprowadź je po nazwie bazy danych.

mysqldump --no-data -h localhost -u root -ppassword mydatabase table1 table2 > mydatabase_backup.sql

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_no-data

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

LukeR
źródło
+1 wygląda w prawo.
David Pashley,
Wielkie dzięki LukeR. Poradziłbym sobie z tym. W chwili pisania tego nie wiedziałem nic o mysqldump, ale mogłem rozwiązać problem z przełącznikiem --no-data. Następnie znalazłem również w MySQL Administrator „UTWÓRZ SKRÓT” tej tabeli, aby móc rozwiązać ten problem również z tą alternatywą.
3

jak powiedział LukeR, opcja --no-data mysqldump zrobi to, co chcesz.

aby dodać do tego, oto skrypt tworzenia kopii zapasowych, który napisałem, który zrzuca wszystkie bazy danych mysql do zwykłych plików tekstowych i tworzy osobne pliki zrzutu dla schematu tabeli i danych każdej bazy danych (dość często przywracanie lub tworzenie tabel na innym serwerze mysql BEZ dane, a jest to o wiele łatwiejsze, jeśli masz już mały plik za pomocą tylko poleceń CREATE TABLE / CREATE INDEX itp.)

#! / bin / bash

# backup-mysql.sh
#
# Craig Sanders <[email protected]>
# ten skrypt jest w domenie publicznej. rób z nim co chcesz.

MYUSER = „USERNAME”
MYPWD = "PASSWD"

ARGS = "- pojedyncza transakcja - flush-logs --complete-insert"

BAZY DANYCH = $ (mysql -D mysql --skip-nazwa-kolumny -B -e 'pokazuje bazy danych;' | egrep -v 'schemat_informacyjny');


BACKUPDIR = / var / backups / mysql

ROK = $ (data + „% Y”)
MIESIĄC = $ (data + „% m”)
DZIEŃ = $ (data + „% d”)

DATA = „$ ROK- $ MIESIĄC / $ ROK- $ MIESIĄC- $ DZIEŃ”

mkdir -p $ BACKUPDIR / $ DATE
cd $ BACKUPDIR / $ DATE

dla i w $ DATABASES; robić
  echo -n "tworzenie kopii zapasowej $ i: schemat ..."
  mysqldump $ ARGS --no-data -u $ MYUSER -p $ MYPWD $ i> $ i.schema.sql

  echo -n „dane ...”
  mysqldump $ ARGS --skip-opt --no-create-db --no-create-info -u $ MYUSER -p $ MYPWD $ i> $ i.data.sql

  echo -n „kompresowanie ...”
  gzip -9fq $ i.schema.sql $ i.data.sql
  echo „gotowe”.
gotowy

# usuń pliki kopii zapasowej starsze niż 30 dni
OLD = $ (znajdź $ BACKUPDIR -typ d -mtime +30)
jeśli [-n „$ OLD”]; następnie
        echo usuwa stare pliki kopii zapasowej: $ OLD
        echo $ OLD | xargs rm -rfv
fi
cas
źródło
Wielkie dzięki Craig za odpowiedź! Po prostu wybrałem odpowiedź LukeR, tak jak była pierwsza. Dzięki za skrypt, to dobra referencja.
Czy mogę zasugerować dodanie --routinesdo skryptu schematu?
Jonathan
0

Możesz to również zrobić ręcznie za pomocą mysqlinterfejsu wiersza poleceń, wykonując DESCRIBE <tablename>i kopiuj / wklejając wyniki.

królikarnia
źródło
DESCRIBE nie da ci czegoś, co możesz skopiować i wkleić. POKAŻ UTWÓRZ TABELĘ będzie.
David Pashley,
nie jest to zrzut co TWORZENIE oświadczenie musiałoby być, ale nie przedstawiają typy kolumn i relacji
Warren