Veritabanını düşürmeden bir MySQL veritabanındaki tüm tablolar nasıl bırakılır?


12

Önceden adlarını bilmeden bir veritabanındaki tüm tabloları bırakmanız gerekiyor. Tipik prosedür, veritabanını bırakıp yeniden oluşturmaktır, ancak bu bir seçenek değildir. Bunu yapmanın en iyi yolu nedir?


1
Muhtemelen bunu önceden sormalıydım, ama hiç beklemediğimden daha iyi: Hangi işletim sistemi?
Jeff Snider

OS gibi Unix / Linux.
Angel Chiang

Yanıtlar:


18

Mysqldump ( Thingy Ma Jig Blog'dan) kullanarak daha basit bir bash tek katmanlı var .

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

Bu hatayı alıyorsanız:

ERROR 1217 (23000) at line 1: Cannot delete or update a parent row: 
    a foreign key constraint fails

Takip etmeyi dene:

(echo 'SET foreign_key_checks = 0;'; 
 (mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | 
     grep ^DROP); 
 echo 'SET foreign_key_checks = 1;') | \
    mysql -u[USERNAME] -p[PASSWORD] -b [DATABASE]

Şimdi kısıtlamaları görmezden geliyor.


5

Veritabanı ile ilgili meta verileri almak için information_schema tablolarını kullanmalı ve orada listelenen tabloları bırakmalısınız.


3

Bunu yapmak için hızlı bir kabuk komut dosyası da deneyebilirsiniz:

#!/bin/bash

IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
    echo mysql <databaseName> -e "drop table $table"
done

echoBeklediğiniz şeyi yapacağını kontrol ettikten sonra kaldırın .


Bu arada, neden IFS'nin değerinden önce '$' yazıyorsunuz? Neden "IFS = '\ n'" gibi görünmüyor?
kolypto

@o_OTync Kullanmak bash'ın $''ters eğik çizgileri tam anlamıyla almak yerine yorumlamasına neden olur. '\n'tam olarak \ n, tıpkı bunun gibi $IFS, \ ve n karakterlerine bölündüğünü anlayacaktı. $'\n'yeni satır karakteri (0x0D) içerir. Daha fazla bilgi için buraya bakın: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Jeff Snider

Bunun BİLGİ_SCHEMA'yı kullanmaktan daha basit olduğunu düşünüyorum.
Angel Chiang

0

Son zamanlarda Xaprb blogunda bunu güzel bir şekilde kapsayan bir giriş vardı .

Kullanmanın neden INFORMATION_SCHEMAher zaman iyi bir şey olmadığını içerir ve Maatkit'teki bu sevimli insanlardan bir araca referans verir .

Aşağıdakileri deneyin mk-find:

mk-find '<database>' --printf 'DROP TABLE %D.%N'

Sonuçlardan memnunsanız:

mk-find '<database>' --exec 'DROP TABLE %D.%N'

-2

Dosya sistemi erişiminiz varsa, sadece rm -rf databasename/*:).

Drop veritabanı deyimi aynı şeyi yapar ... MySQL kılavuzundan alıntı:

DROP DATABASE deyimi, verilen veritabanı dizininden, MySQL'in kendisinin normal çalışma sırasında oluşturabileceği dosyaları ve dizinleri kaldırır:


2
MySQL bu dosyaların aniden kaybolmasını beklemediğinden ve herhangi bir sayıda işlem, işlem, çoğaltma, kilitlerin ortasında olabileceğinden, önemsiz olmayan herhangi bir kurulum için son derece kötü bir fikir ...
bot403

Cevabınızı uygun komutları ve prosedürü içerecek şekilde gözden geçirmeyi düşünür müsünüz?
bot403
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.