Подтвердить что ты не робот

Выбросить базы данных MySQL, соответствующие некоторым шаблонам?

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

После префикса имена являются случайными. Итак, у вас есть ваше Whatever_something, Whatever_232, Whatever_blabla,...., Whatever_imthelast.

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

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

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

4b9b3361

Ответ 1

Основная идея - запустить "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_". Если вы хотите, чтобы он фактически выполнял эти команды, удалите слово "эхо".

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

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

Ответ 2

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

Приветствия

Ответ 3

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

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%");

Ответ 4

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

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

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

Ответ 5

как насчет этого (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 ) 

Ответ 6

В случае, если кто-то ищет простой ответ, который отражает 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-сервер был обыскан.

Ответ 7

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

Ответ 8

DROP DATABASE `any-database_name`;

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

Ответ 9

Вы можете попробовать тупическую библиотеку mysql 5 общего назначения (можно загрузить из здесь). Используя его, вы можете удалить несколько таблиц, которые соответствуют регулярному выражению. Я предлагаю тщательно проверить регулярное выражение, чтобы предотвратить падение таблиц, в которых вы нуждаетесь.

Ответ 10

Используйте

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

как описанный здесь.

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

DROP DATABASE Whatever_%

но я думаю, вы должны попробовать.