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



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



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



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



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



Правка 2:
То использование подстановочного знака не сработало: #1008-не удается удалить базу данных ' whatever_%'; база данных не существует

534   11  

11 ответов:

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

EDIT : я забыл объяснить вышесказанное! Я не знаю, насколько вы знакомы со сценариями shell, но вот что:

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

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

egrep "^Whatever_"

Ищет любые строки, которые начинаются (что ^ symbols означает "существа с") словом "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"!

Принцип ответа от 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 \`@@\`"

Для объяснения команды посмотрите на объяснениескреймера .

Последний бит... \`@@\` у нас есть наше результирующее имя базы данных в кавычках в 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, за которой следует wild card, как показано ниже:

call droplike("XYZ%");

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

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

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

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

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

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

SHOW TABLES LIKE 'migrate%';

В MySQL workbench.

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

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

DROP DATABASE `any-database_name`;

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

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

Используйте

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

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

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

DROP DATABASE Whatever_%

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

Comments

    Ничего не найдено.