일부 와일드 카드와 일치하는 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
'program story' 카테고리의 다른 글
Delphi 용 프로파일 러 및 메모리 분석 도구 (0) | 2021.01.11 |
---|---|
Powershell에서 사용자 이름 / 암호로 네트워크 폴더에 연결 (0) | 2021.01.11 |
바이트 버퍼는 부호가있는 또는 부호없는 문자 버퍼 여야합니까? (0) | 2021.01.11 |
JQuery 정렬 가능한 '변경'이벤트 요소 위치 (0) | 2021.01.11 |
JSTL에서 지정된 횟수만큼 반복하는 방법은 무엇입니까? (0) | 2021.01.11 |