program story

일부 와일드 카드와 일치하는 MySQL 데이터베이스를 삭제 하시겠습니까?

inputbox 2021. 1. 11. 08:06
반응형

일부 와일드 카드와 일치하는 MySQL 데이터베이스를 삭제 하시겠습니까?


서버에서 몇 가지 테스트 후 수많은 데이터베이스를 삭제해야하는 서버에서 mySQL을 실행하고 있습니다. 삭제해야하는 모든 데이터베이스에는 "Whatever_"라는 동일한 접두사가 있습니다.

접두사 뒤의 이름은 무작위입니다. 그래서 당신은 Whatever_something, Whatever_232, Whatever_blabla, ...., Whatever_imthelast.

나는이 일을 꽤 자주 할 것이기 때문에 이것을하는 가장 좋은 방법이 무엇 일지 궁금했다.

편집 : 나는 모든 종류의 언어를 사용하거나 mysql에 연결할 수 있습니다 ... 그래서 우리는 이것을 어떤 방식으로 할 수 있습니다. 지금, 나는 데이터베이스를 생성하는 사람에게 한 줄에 각 이름이있는 .txt를 제공하도록 요청했습니다 ... 그래서 파일을 가져 와서 모든 데이터베이스를 삭제하는 빠른 PHP를 코딩하고 있습니다. 나중에 시도하겠습니다. % 대답 (작동하는 경우 더 쉬운 방법을 위해 올바른 대답을 취합니다). 어쨌든 나는이 코드를 지원할 수없는 더 쉬운 방법으로하고 싶습니다 (다른 사람들은 알고 있습니다 ...)

편집 2 : 와일드 카드 사용이 작동하지 않았습니다. # 1008- 'whatever_ %'데이터베이스를 삭제할 수 없습니다. 데이터베이스가 존재하지 않습니다


기본 아이디어는 데이터베이스에서 "show tables"를 실행하고 그 결과를 사용하여 원하는 테이블을 선택하는 것입니다. MySQL이 "show tables"의 결과 세트로 무엇이든 할 수 있다고 생각하지 않지만 아마 틀렸을 것입니다.

다음은 셸을 사용하는 빠르고 더러운 솔루션입니다.

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 @@"

그러면 "Whatever_"로 시작하는 테이블을 삭제하는 모든 쉘 명령이 출력됩니다. 실제로 이러한 명령을 실행하려면 "echo"라는 단어를 제거하십시오.

편집 : 위의 설명을 잊었습니다! 셸 스크립팅에 얼마나 익숙한 지 모르겠지만 여기에 있습니다.

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

"Tables_in_your_database_name"헤더와 함께 모든 테이블 목록을 인쇄합니다. 그 출력은 다음 명령을 통해 파이프됩니다 (| 기호는 전달 된 것과 같이 "파이프 됨"을 의미 함).

egrep "^Whatever_"

"Whatever_"라는 단어로 시작하는 줄 (^ 기호는 "함께"를 의미 함)을 검색하고 해당 줄만 인쇄합니다. 마지막으로 다음 명령을 통해 "Whatever_ *"테이블 목록을 파이프합니다.

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

테이블 이름 목록에서 각 줄을 가져 와서 명령에 "@@"대신 삽입합니다.

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

따라서 "Whatever_1", "Whatever_2", "Whatever_3"이라는 이름의 테이블이있는 경우 생성되는 명령은 다음과 같습니다.

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"

다음을 출력합니다.

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"

나는 그것이 충분한 세부 사항이었고 너무 많은 정보로 누군가를 때리는 것이 아니기를 바랍니다. 행운을 빕니다. "DROP TABLE"명령을 사용할 때주의하십시오!


스크 라이머 의 대답 원칙 은 정확하지만 질문은 데이터베이스의 테이블이 아닌 데이터베이스 삭제에 관한 것이기 때문에 올바른 명령은 다음과 같아야합니다.

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

명령에 대한 설명은 scraimer 의 설명을 참조하십시오.

마지막 비트 ... \`@@ \`데이터베이스 이름에`-`와 같은 특수 문자가있는 경우 bacticks (`)로 결과 데이터베이스 이름을 인용합니다.

건배


저장 프로 시저로이를 수행 할 수 있습니다. 다음은 다음과 같습니다.

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 ;

database_name을 데이터베이스 이름으로 바꿉니다 (쓰기 권한 필요). XYZ 패턴이있는 테이블을 삭제하려면 아래에 주어진대로 XYZ 입력과 와일드 카드를 사용하여 프로 시저를 호출하십시오.

call droplike("XYZ%");

글쎄, 나는 당신이 MySql에서 여러 데이터베이스를 삭제할 수 없다고 생각합니다.

But I have a very geeky solution. you can program in C/C++/C#/JAVA to print many times "DROP DATABASE WHATEVER_<name>;" into a note pad or any text editor. After that you can copy paste in the client command prompt of MySql and there you go. don't forget the ";" after every DROP command.

I believe this is possible. try out to write this.


what about this (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 ) 

Some nice tidy solutions here. But what I did was just:

SHOW TABLES LIKE 'migrate%';

in MySQL workbench.

Then I copied the results into a decent text editor than can find/replace using escape sequences, and replaced \n with ;\nDROP TABLE, and tidied up the start and finish. Then copied back into MySQL workbench. A bit more manual and less elegant than some of the proposed solutions, but actually just as quick.


In case someone is looking for a simple answer that mirrors scraimer and Explorer's but is written in Java using JDBC (I know I was), here's a quick and dirty one that got the job done for me:

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();
    }
}

Warning: Do not surface this to customers or even other developers if you don't want your SQL server ransacked.


Sorry we cannot drop multiple database at a time using sql commands


DROP DATABASE `any-database_name`;

I just use this character ` (backtick) before and after the name of my database.


You can try the mysql 5 general purpose routine library (downloadable from here). Using it, you can drop multiple tables which match a regular expression. I suggest checking the regular expression carefully in order to prevent dropping tables you do need.


Use the

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

statement as described here.

I don't know if you can use wildcars to do something like

DROP DATABASE Whatever_%

but I think you should try it.

ReferenceURL : https://stackoverflow.com/questions/456751/drop-mysql-databases-matching-some-wildcard

반응형