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ì?
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ì?
Câu trả lời:
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.
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ê ở đó.
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 echo
sau khi bạn đã kiểm tra rằng nó sẽ làm những gì bạn mong đợi.
$''
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, $IFS
sẽ 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 .
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_SCHEMA
khô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'
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: