Làm thế nào để bỏ tất cả các bảng trong cơ sở dữ liệu MySQL mà không bỏ cơ sở dữ liệu?


12

Tôi cần bỏ tất cả các bảng trong cơ sở dữ liệu mà không cần biết tên của chúng trước đó. Thủ tục điển hình là thả và sau đó tạo lại cơ sở dữ liệu nhưng đây không phải là một tùy chọn. Cách tốt nhất để làm điều đó là gì?


1
Có lẽ nên hỏi điều này trước, nhưng muộn còn hơn không bao giờ tôi cho rằng: HĐH nào?
Jeff Snider

Unix / Linux giống như HĐH.
Thiên thần Chiang

Câu trả lời:


18

Có một bash one-liner đơn giản hơn bằng cách sử dụng mysqldump (từ Thingy Ma Jig Blog ).

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

Nếu bạn gặp lỗi này:

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

Hãy thử như sau:

(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]

Bây giờ nó bỏ qua các ràng buộc.


5

Bạn nên sử dụng các bảng information_schema để tìm nạp siêu dữ liệu về cơ sở dữ liệu và sau đó thả các bảng được liệt kê ở đó.


3

Bạn cũng có thể thử một kịch bản shell nhanh để làm điều đó:

#!/bin/bash

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

Xóa echosau khi bạn đã kiểm tra rằng nó sẽ làm những gì bạn mong đợi.


Nhân tiện, tại sao bạn viết '$' trước giá trị của IFS? Tại sao nó không giống như "IFS = '\ n'"?
kolypto

@o_OTync Sử dụng $''nguyên nhân bash để diễn giải các chuỗi bị gạch chéo thay vì lấy chúng theo nghĩa đen. '\n'sẽ chứa chính xác \ n, giống như vậy, $IFSsẽ hiểu là phân tách trên \ và n ký tự. $'\n'sẽ chứa một ký tự dòng mới, 0x0D. Hãy xem tại đây để biết thêm thông tin: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quote .
Jeff Snider

Tôi nghĩ rằng điều này đơn giản hơn so với việc sử dụng THÔNG TIN_SCHema.
Thiên thần Chiang

0

Gần đây có một mục trên blog Xaprb bao gồm điều này độc đáo.

Nó bao gồm tại sao việc sử dụng INFORMATION_SCHEMAkhông phải lúc nào cũng là một điều tốt và tham khảo một công cụ từ những người đáng yêu đó tại Maatkit .

Hãy thử làm như sau với mk-find:

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

Nếu bạn hài lòng với kết quả thì:

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

-2

Nếu bạn có quyền truy cập hệ thống tập tin, thì chỉ cần rm -rf databasename/*:).

Câu lệnh cơ sở dữ liệu Drop thực hiện tương tự ... Trích từ hướng dẫn sử dụng MySQL:

Câu lệnh DROP DATABASE xóa khỏi thư mục cơ sở dữ liệu đã cho những tệp và thư mục mà chính MySQL có thể tạo trong quá trình hoạt động bình thường:


2
Ý tưởng cực kỳ tồi tệ cho bất kỳ thiết lập không tầm thường nào vì MySQL không hy vọng các tệp này đột nhiên biến mất và có thể ở giữa bất kỳ số lượng hoạt động, giao dịch, sao chép, khóa ...
bot403

Bạn sẽ xem xét sửa đổi câu trả lời của bạn để bao gồm các lệnh và thủ tục thích hợp sau đó?
bot403
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.