Отбросить базы данных MySQL, соответствующие какому-то шаблону?
Я запускаю mySQL на сервере, где мне нужно сбросить тонны баз данных (после некоторого тестирования с сервером). Все базы данных, которые мне нужно удалить, имеют один и тот же префикс "Whatever_".
После префикса имена являются случайными. Итак, у вас есть Whatever_something, Whatever_232, Whatever_blabla, .... , Whatever_imthelast.
Я буду делать эту работу довольно много раз, поэтому я задавался вопросом, что было бы лучшим способом сделать это?
Редактировать:
Я могу использовать любой язык или подключитесь к mysql... так что мы можем сделать это в некотором роде. Прямо сейчас я попросил парня, который генерирует базы данных, дать мне ответ .txt с каждым именем в строке... поэтому я кодирую быстрый php, который возьмет файл и удалит все базы данных в нем, позже я попробую % ответ(если он работает, он берет правильный ответ наверняка его более простой способ). В любом случае, я хотел бы сделать это более простым способом, потому что я не смогу поддерживать этот код(другие ребята будут, и вы знаете... )
Правка 2:
То использование подстановочного знака не сработало: #1008-не удается удалить базу данных ' whatever_%'; база данных не существует
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", который выведет следующее:
Я надеюсь, что это было достаточно подробно, и что я не просто бью кого-то по голове слишком большим количеством информации. Удача и будьте осторожны при использовании команды "DROP TABLE"!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"
Принцип ответа от 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. Немного более ручное и менее элегантное, чем некоторые из предложенных решений, но на самом деле столь же быстрое.
DROP DATABASE `any-database_name`;Я просто использую этот символ
`(backtick) до и после имени моей базы данных.
Вы можете попробовать mysql 5 универсальная библиотека подпрограмм (загружается из здесь ). С его помощью можно удалить несколько таблиц, которые соответствуют регулярному выражению. Я предлагаю тщательно проверять регулярное выражение, чтобы предотвратить выпадение нужных таблиц.
Используйте
DROP {DATABASE | SCHEMA} [IF EXISTS] db_nameУтверждение какописано здесь .
Я не знаю, можно ли использовать дикие автомобили, чтобы сделать что-то вроде
DROP DATABASE Whatever_%Но я думаю, вы должны попробовать его.
Comments