Я запускаю mySQL на сервере, где мне нужно сбросить тонны баз данных (после некоторого тестирования с сервером). Все базы данных, которые мне нужно удалить, имеют один и тот же префикс «Whatever_».
После префикса имена случайны. Итак, у вас есть Whatever_something, Whatever_232, Whatever_blabla, ...., What_imthelast.
Я буду делать эту работу довольно часто, поэтому мне было интересно, как лучше всего это сделать?
Обновлено: Я могу использовать любой язык или плагин для mysql ... так что мы МОЖЕМ сделать это некоторыми способами. Прямо сейчас я попросил парня, который генерирует базы данных, дать мне .txt с каждым именем в строке ... так что я кодирую быстрый php, который возьмет файл и удалит все базы данных в нем, позже я попробую % ответ (если он работает, он наверняка берет правильный ответ, это более простой способ). В любом случае, я хотел бы сделать это более простым способом, потому что я не смогу поддерживать этот код (другие ребята будут, и вы знаете ...)
редактировать 2: Использование подстановочного знака не сработало: # 1008 - Невозможно удалить базу данных «Any_%»; база данных не существует






Вы можете попробовать библиотека подпрограмм общего назначения mysql 5 (загружается с здесь). Используя его, вы можете удалить несколько таблиц, соответствующих регулярному выражению. Я предлагаю внимательно проверять регулярное выражение, чтобы не пропустить нужные вам таблицы.
Извините, мы не можем удалить несколько баз данных за раз с помощью команд sql
Использовать
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
заявление как описано здесь.
Я не знаю, можно ли использовать wildcars для чего-то вроде
DROP DATABASE Whatever_%
но я думаю, тебе стоит попробовать.
# 1008 - Невозможно сбросить базу данных 'Any_%'; база данных не существует, по-видимому, она работает только в SELECT
Основная идея состоит в том, чтобы запустить "показать таблицы" в вашей базе данных и использовать полученные результаты для выбора столы, которые вам нужны. Я не думаю, что 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
распечатывает список всех ваших таблиц с заголовком «Таблицы_в_имя_вашей_базы_данных». Выходные данные передаются по конвейеру (символ | означает «по конвейеру», как в переданном) с помощью следующей команды:
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»!
У меня он не выводит кавычки (") после -e. Он выводит такие строки: mysql -u root -D joomla_test -e DROP TABLE bak_xlr1q_weblinks, используя ваш точный сценарий bash. Я использую Bash 4.1.5 (1) -release.
@Codemonkey Чтобы кавычки появлялись, вы можете их избежать. Заменить "DROP TABLE @@" на \"DROP TABLE @@\"
отличный ответ! вы можете подумать об использовании printf вместо echo, чтобы избежать непоследовательного поведения в отношении котировок и т. д., но это довольно незначительно :)
хорошо, я думаю, что вы не можете удалить несколько баз данных в MySql.
Но у меня есть очень интересное решение. вы можете запрограммировать на C / C++ / C# / JAVA, чтобы многократно печатать «DROP DATABASE WHATEVER_<name>;» в блокноте или любом текстовом редакторе. После этого вы можете скопировать вставку в клиентскую командную строку MySql, и все готово. не забывайте ";" после каждой команды DROP.
Я считаю, что это возможно. попробуй написать это.
Принцип ответа скраймер правильный, но поскольку вопрос касался удаления базы данных, а не таблицы в базе данных, правильная команда должна быть:
mysql -u your_username -p'your password' -e 'show databases'
| grep Whatever_*
| xargs -I "@@" mysql -u your_username -p'your password' -e "DROP database \`@@\`"
Для объяснения команды см. Объяснение скраймер.
Последний бит ... \ `@@ \` у нас есть имя нашей результирующей базы данных, заключенное в кавычки (`) на случай, если имя нашей базы данных содержит специальные символы, такие как` -`
Ваше здоровье
Для меня было лучше использовать регулярное выражение в части grep: | grep -e ".*_backup" выбирает все базы данных, заканчивающиеся на "_backup"
Для тех, кто копирует это в свой терминал, пожалуйста, поставьте перед командой пробел в начале. Это приводит к тому, что команда (с вашим паролем в виде обычного текста!) Не сохраняется в вашей истории команд.
DROP DATABASE `any-database_name`;
Я просто использую этот символ ` (обратная кавычка) до и после имени моей базы данных.
Мы можем сделать это с помощью хранимых процедур. Вот один из них:
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 с подстановочным знаком, как показано ниже:
call droplike("XYZ%");
Некоторые диалекты SQL позволяют использовать списки с разделителями-запятыми, например: DROP TABLE "table1_bits" , "table2_links" , "table3_stuff" ;.
Если кто-то ищет простой ответ, который отражает скраймер и Исследователь, но написан на 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-сервер был подвергнут обыску.
что насчет этого (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 )
Здесь есть несколько хороших опрятных решений. Но то, что я сделал, было просто:
SHOW TABLES LIKE 'migrate%';
в рабочей среде MySQL.
Затем я скопировал результаты в приличный текстовый редактор, который может найти / заменить с помощью управляющих последовательностей, и заменил \n на ;\nDROP TABLE, и привел в порядок начало и конец. Затем скопировал обратно в рабочую среду MySQL. Немного более ручное и менее элегантное, чем некоторые из предложенных решений, но на самом деле такое же быстрое.
Думаю, вы не прочитали весь вопрос. Он хочет отбросить несколько «баз данных», а не составных «таблиц».