Выбросить базы данных MySQL, соответствующие некоторым шаблонам?
Я запускаю mySQL на сервере, где мне нужно сбросить множество баз данных (после некоторого тестирования с сервером). Все базы данных, которые мне нужно удалить, имеют один и тот же префикс "Независимо от _".
После префикса имена являются случайными. Итак, у вас есть ваше Whatever_something, Whatever_232, Whatever_blabla,...., Whatever_imthelast.
Я буду делать эту работу довольно много раз, поэтому мне было интересно, что было бы лучшим способом сделать это?
EDIT:
Я могу использовать любой язык или подключаться к mysql... поэтому мы можем сделать это в некотором роде. Прямо сейчас, я спросил парня, который генерирует базы данных, чтобы дать мне .txt с каждым именем в строке... так что im кодируя быстрый php, который возьмет файл и удалит все базы данных в нем, позже я попробую % answer (если он работает, он, безусловно, берет правильный ответ). В любом случае, я бы хотел сделать это проще, потому что я не смогу поддерживать этот код (другие ребята будут и вы знаете...)
изменить 2:
Использование подстановочного знака не помогло: # 1008 - Невозможно удалить базу данных "whatever_%"; базы данных не существует
Ответы
Ответ 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_%
но я думаю, вы должны попробовать.