Удалите базы данных MySQL, совпадающие с каким-нибудь подстановочным знаком? - PullRequest
52 голосов
/ 19 января 2009

Я запускаю MySQL на сервере, где мне нужно сбросить тонны баз данных (после некоторого тестирования на сервере). Все базы данных, которые мне нужно отбросить, имеют одинаковый префикс "Whither _".

После префикса имена являются случайными. Таким образом, у вас есть что угодно, что угодно, что угодно, все, что угодно, ...., что угодно.

Я буду выполнять эту работу довольно часто, поэтому мне было интересно, как лучше всего это сделать?

EDIT: Я могу использовать любой язык или плагин для mysql ... поэтому мы МОЖЕМ сделать это несколькими способами. Прямо сейчас я попросил парня, который генерирует базы данных, дать мне .txt с каждым именем в строке ... так что я кодирую быстрый php, который возьмет файл и удалит все базы в нем, позже я попробую % answer (если он работает, он принимает правильный ответ, наверняка, его проще). В любом случае, я хотел бы сделать это более простым способом, потому что я не смогу поддерживать этот код (другие ребята будут, и вы знаете ...)

изменить 2: Использование подстановочного знака не сработало: # 1008 - Невозможно удалить базу данных «what_%»; база данных не существует

Ответы [ 11 ]

80 голосов
/ 19 января 2009

Основная идея состоит в том, чтобы запустить «показ таблиц» в вашей базе данных и использовать полученные результаты для выбора таблицы, которые вы хотите. Я не думаю, что 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 @@"

Это выведет все команды оболочки для удаления таблиц, начинающихся с «Wh независимо_». Если вы хотите, чтобы он действительно выполнял эти команды, удалите слово «эхо».

РЕДАКТИРОВАТЬ : Я забыл объяснить выше! Я не знаю, насколько вы знакомы со сценариями оболочки, но здесь говорится:

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

распечатывает список всех ваших таблиц с заголовком "Tables_in_your_database_name". Вывод этого передается по конвейеру (символ | означает «передано по каналу», как и при передаче) через следующую команду:

egrep "^Whatever_"

ищет любые строки, которые начинаются (эти символы ^ означают «существа с»), слово «Whither_» и печатает только те. Наконец, мы передаем этот список таблиц «Whither_ *» через команду:

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

Таким образом, если бы у вас было несколько таблиц с именами «Whither_1», «Whwhat_2», «Whever_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»!

26 голосов
/ 02 февраля 2012

Принцип ответа scraimer правильный, но поскольку вопрос касался удаления базы данных, а не таблицы в базе данных, правильная команда должна быть:

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 (`) на случай, если в имени нашей базы данных есть специальные символы, такие как` -`

Приветствия

12 голосов
/ 16 марта 2012

Мы можем сделать это с помощью хранимых процедур. Вот один ниже:

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 ;

Замените имя_базы_данных именем базы данных (требуется разрешение на запись). Чтобы удалить таблицы с шаблоном XYZ, вызовите процедуру с вводом как XYZ, за которым следует подстановочный знак, как показано ниже:

call droplike("XYZ%");
1 голос
/ 06 сентября 2018

Несколько хороших аккуратных решений здесь. Но то, что я сделал, было просто:

SHOW TABLES LIKE 'migrate%';

в рабочей среде MySQL.

Затем я скопировал результаты в приличный текстовый редактор, который можно найти / заменить, используя escape-последовательности, и заменил \n на ;\nDROP TABLE, и привел в порядок начало и конец. Затем скопировал обратно в MySQL верстак. Чуть более ручная и менее изящная, чем некоторые из предложенных решений, но на самом деле такая же быстрая.

1 голос
/ 24 ноября 2013

что насчет этого (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 ) 
1 голос
/ 17 июня 2011

ну, я думаю, что вы не можете удалить несколько баз данных в MySql.

Но у меня очень вызывающее решение. Вы можете запрограммировать на C / C ++ / C # / JAVA многократную печать «DROP DATABASE WHATEVER_<name>;» в блокнот или любой текстовый редактор. После этого вы можете скопировать вставить в командной строке клиента MySql и там вы идете. не забывайте ";" после каждой команды DROP.

Я верю, что это возможно. попробуйте написать это.

0 голосов
/ 28 февраля 2013

Если кто-то ищет простой ответ, который отражает scraimer и Explorer , но написан на Java с использованием JDBC (я знаю, что я был), вот быстрый и грязный тот, который сделал работу за меня:

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

Предупреждение. Не обращайте на это внимания клиентов или даже других разработчиков, если вы не хотите, чтобы ваш SQL-сервер был разграблен.

0 голосов
/ 22 февраля 2012
DROP DATABASE `any-database_name`;

Я просто использую этот символ ` (backtick) до и после имени моей базы данных.

0 голосов
/ 19 января 2009

Используйте

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

оператор как описан здесь .

Я не знаю, можно ли использовать подстановочные знаки, чтобы сделать что-то вроде

DROP DATABASE Whatever_%

но я думаю, тебе стоит попробовать.

0 голосов
/ 19 января 2009

Извините, мы не можем удалить несколько баз данных одновременно с помощью команд sql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...