2009-01-19 27 views
48

Im chạy mySQL trong một máy chủ mà tôi cần phải giảm tấn cơ sở dữ liệu (sau một số thử nghiệm với máy chủ). Tất cả các cơ sở dữ liệu mà tôi cần phải có cùng một tiền tố "Whatever_".Thả cơ sở dữ liệu MySQL khớp với một số ký tự đại diện?

Sau tiền tố, tên là ngẫu nhiên. Vì vậy, bạn có Whatever_something của bạn, Whatever_232, Whatever_blabla, ...., Whatever_imthelast.

Tôi sẽ thực hiện công việc này một số lần vì vậy tôi đã tự hỏi điều gì sẽ là cách tốt nhất để làm điều này?

CHỈNH SỬA: Tôi có thể sử dụng bất kỳ loại ngôn ngữ nào hoặc cắm vào mysql ... vì vậy chúng tôi CÓ THỂ làm điều này theo một số cách. Ngay bây giờ, tôi hỏi anh chàng đang tạo ra cơ sở dữ liệu để cho tôi một .txt với mỗi tên trong một dòng ... để im mã hóa một php nhanh chóng mà sẽ mất một tập tin và xóa tất cả các cơ sở dữ liệu trong nó, sau đó tôi sẽ cố gắng câu trả lời% (nếu nó hoạt động, phải có câu trả lời đúng để chắc chắn nó là cách dễ dàng hơn). Dù sao tôi muốn làm điều này coz cách dễ dàng hơn i wont có khả năng hỗ trợ mã này (kẻ khác sẽ và bạn biết ...)

chỉnh sửa 2: Việc sử dụng một tác phẩm wildcard didnt: # 1008 - Không thể thả cơ sở dữ liệu 'whatever_%'; cơ sở dữ liệu không tồn tại

Trả lời

78

Ý tưởng cơ bản là chạy "hiển thị bảng" trong cơ sở dữ liệu của bạn và sử dụng kết quả từ đó để chọn các bảng bạn muốn. Tôi không nghĩ rằng MySQL cho phép bạn làm bất cứ điều gì với resultset từ "bảng hiển thị", nhưng tôi có thể sai.

Dưới đây là một giải pháp nhanh chóng-và-bẩn bằng cách sử dụng vỏ:

mysql -u your_user -D your_database_name -e "show tables" -s | 
    egrep "^Whatever_" | 
    xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

Điều đó sẽ in ra tất cả các vỏ lệnh để thả các bảng bắt đầu với "Whatever_". Nếu bạn muốn nó thực sự thực hiện các lệnh đó, hãy xóa từ "echo".

EDIT: Tôi quên giải thích ở trên! Tôi không biết làm thế nào bạn đang quen thuộc với kịch bản vỏ, nhưng ở đây đi:

mysql -u your_user -D your_database_name -e "show tables" -s 

in ra một danh sách của tất cả các bảng của bạn, với tiêu đề "Tables_in_your_database_name".Sản lượng từ được cấp nước tập trung (ký hiệu | nghĩa là "đường ống", như trong truyền-on) thông qua các lệnh tiếp theo:

egrep "^Whatever_" 

tìm kiếm cho bất kỳ dòng bắt đầu (mà^ký tự có nghĩa là "con với") các từ "Whatever_" và chỉ in những từ đó. Cuối cùng, chúng tôi ống danh sách "Whatever_ *" bảng thông qua lệnh rằng:

xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

mà mất mỗi dòng trong danh sách các tên bảng và chèn nó thay vì "@@" trong lệnh

echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

Vì vậy, nếu bạn đã có một loạt các bảng có tên là "Whatever_1", "Whatever_2", "Whatever_3", các lệnh được tạo ra sẽ là:

echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1" 
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2" 
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3" 

trong đó sẽ ra như sau:

mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1" 
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2" 
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3" 

Tôi hy vọng điều đó đủ chi tiết và tôi không chỉ đánh bại bất kỳ ai trên đầu với quá nhiều thông tin. Chúc may mắn, và hãy cẩn thận khi sử dụng lệnh "DROP TABLE"!

+0

Với tôi nó không xuất ra dấu ngoặc kép ('" ') sau' -e'. Nó xuất các dòng như sau: 'mysql -u root -D joomla_test -e DROP TABLE bak_xlr1q_weblinks' bằng cách sử dụng kịch bản bash chính xác của bạn Tôi đang sử dụng Bash 4.1.5 (1) -release – Hubro

+0

@Codemonkey Để làm cho các dấu ngoặc kép xuất hiện, bạn có thể thoát khỏi chúng. Thay thế '" DROP TABLE @@ "' bằng '\ "DROP TABLE @@ \" ' – scraimer

-4

Bạn có thể thử mysql 5 general purpose routine library (có thể tải xuống từ here). Sử dụng nó, bạn có thể thả nhiều bảng phù hợp với một biểu thức chính quy. Tôi khuyên bạn nên kiểm tra biểu thức chính quy một cách cẩn thận để ngăn chặn việc giảm các bảng bạn cần.

+0

Tôi nghĩ bạn đã không đọc toàn bộ câu hỏi. Anh ta muốn thả nhiều "cơ sở dữ liệu" không nhiều "bảng". – Xn0vv3r

-1

Xin lỗi, chúng tôi không thể thả nhiều cơ sở dữ liệu tại một thời điểm sử dụng sql lệnh

+1

chúng tôi có thể thả nhiều bảng cùng một lúc bằng cách sử dụng lệnh sql – Adnan

+0

DROP bảng table1, table2 ... – Adnan

-7

Sử dụng báo cáo kết quả

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name 

như described here.

Tôi không biết nếu bạn có thể sử dụng wildcars để làm một cái gì đó giống như

DROP DATABASE Whatever_% 

nhưng tôi nghĩ bạn nên thử nó.

+0

# 1008 - Không thể thả cơ sở dữ liệu 'whatever_%'; cơ sở dữ liệu không tồn tại một cách rõ ràng nó chỉ hoạt động trong SELECT – DFectuoso

1

Tôi nghĩ rằng bạn không thể xóa nhiều cơ sở dữ liệu trong MySql.

Nhưng tôi có một giải pháp rất geeky. bạn có thể lập trình trong C/C++/C#/JAVA để in nhiều lần "DROP DATABASE WHATEVER_<name>;" vào một bảng ghi chú hoặc bất kỳ trình soạn thảo văn bản nào. Sau đó bạn có thể sao chép dán trong dấu nhắc lệnh của khách hàng của MySql và có bạn đi. đừng quên ";" sau mỗi lệnh DROP.

Tôi tin rằng điều này là có thể. thử viết cái này đi.

25

Nguyên tắc của câu trả lời bằng cách scraimer là đúng, nhưng kể từ khi câu hỏi là về thả một cơ sở dữ liệu không phải là một bảng trong một cơ sở dữ liệu, lệnh đúng phải là:

mysql -u your_username -p'your password' -e 'show databases' 
| grep Whatever_* 
| xargs -I "@@" mysql -u your_username -p'your password' -e "DROP database \`@@\`" 

Đối với giải thích của lệnh , hãy xem giải thích scraimer.

Bit cuối cùng ... \ `@@ \` chúng tôi đã dẫn tên cơ sở dữ liệu của chúng tôi được trích dẫn trong bacticks (`) trong trường hợp tên cơ sở dữ liệu của chúng tôi có ký tự đặc biệt như` -`

Cheers

+0

Đối với tôi, tốt hơn là sử dụng Regular expression trong phần grep:' | grep -e ". * _ Backup" 'chọn tất cả các cơ sở dữ liệu kết thúc bằng" _backup " – Yeti

-1
DROP DATABASE `any-database_name`; 

Tôi chỉ sử dụng ký tự này ` (backtick) trước và sau tên cơ sở dữ liệu của tôi.

11

Chúng tôi có thể thực hiện việc này với các thủ tục được lưu trữ. Dưới đây là một bên dưới:

drop procedure if exists droplike; 
delimiter // 
create procedure droplike(pattern varchar(20)) 
begin 
    set group_concat_max_len = 65535; 
    select @drop:= concat('drop table ', group_concat(table_name) , ';') from information_schema.tables where table_schema = "database_name" and table_name like pattern; 
    prepare statement from @drop; 
    execute statement; 
end // 
delimiter ; 

Thay tên cơ sở dữ liệu bằng tên cơ sở dữ liệu (yêu cầu quyền ghi). Để thả bảng với mẫu XYZ gọi các thủ tục với đầu vào như XYZ sau bằng thẻ hoang dã như đưa ra dưới đây:

call droplike("XYZ%"); 
+0

Một số phương ngữ SQL cho phép dấu phẩy- danh sách phân tách như sau: 'DROP TABLE" table1_bits ", " table2_links ", " table3_stuff ";' – MarkHu

0

Trong trường hợp ai đó đang tìm kiếm một câu trả lời đơn giản mà phản ánh scraimerExplorer 's nhưng được viết bằng Java sử dụng JDBC (tôi biết tôi là), đây là một cách nhanh chóng và dơ bẩn đó đã hoàn thành công việc cho tôi:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 

public class DatabaseDeleter { 
    // Pass your database wildcard as the only argument to program ("%MY_CRAZY_PATTERN%") 
    public void main(String[] args) throws SQLException, ClassNotFoundException{ 

     Class.forName("com.mysql.jdbc.Driver"); 
     Connection connection = DriverManager.getConnection("jdbc:mysql://databaseURL"); 
     PreparedStatement pst = connection.prepareStatement("show databases like ?"); 
     pst.setString(1, args[0]); 
     ResultSet rs = pst.executeQuery(); 

     ArrayList<String> databases = new ArrayList<String>(); 
     while (rs.next()) databases.add(rs.getString(1)); 

     for (String s : databases){ 
      Statement st = connection.createStatement(); 
      st.execute("drop database " + s); 
     } 
     connection.close(); 
    } 
} 

Cảnh báo: không bề mặt này cho khách hàng hoặc thậm chí các nhà phát triển khác nếu bạn không muốn bạn Máy chủ SQL đã bị lục soát.

1

còn về điều này (Jython)?

rs = stmt.executeQuery("SHOW DATABASES LIKE 'Whatever_%'") 
databases_for_dropping = [] 
while rs.next(): 
    databases_for_dropping.append(rs.getString(1)) 
for database_for_dropping in databases_for_dropping: 
    stmt.execute("DROP DATABASE %s" % database_for_dropping) 
Các vấn đề liên quan