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

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

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

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

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

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
60
0
57 715
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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

Думаю, вы не прочитали весь вопрос. Он хочет отбросить несколько «баз данных», а не составных «таблиц».

Xn0vv3r 19.01.2009 10:22

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

Использовать

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

заявление как описано здесь.

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

DROP DATABASE Whatever_%

но я думаю, тебе стоит попробовать.

# 1008 - Невозможно сбросить базу данных 'Any_%'; база данных не существует, по-видимому, она работает только в SELECT

DFectuoso 19.01.2009 10:20
Ответ принят как подходящий

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

Hubro 27.02.2013 23:48

@Codemonkey Чтобы кавычки появлялись, вы можете их избежать. Заменить "DROP TABLE @@" на \"DROP TABLE @@\"

Shalom Craimer 28.02.2013 13:35

отличный ответ! вы можете подумать об использовании printf вместо echo, чтобы избежать непоследовательного поведения в отношении котировок и т. д., но это довольно незначительно :)

Anders Martini 26.09.2018 14:37

хорошо, я думаю, что вы не можете удалить несколько баз данных в 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"

Yeti 04.10.2012 03:37

Для тех, кто копирует это в свой терминал, пожалуйста, поставьте перед командой пробел в начале. Это приводит к тому, что команда (с вашим паролем в виде обычного текста!) Не сохраняется в вашей истории команд.

KlaymenDK 31.07.2020 17:02
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" ;.

MarkHu 17.02.2014 10:44

Если кто-то ищет простой ответ, который отражает скраймер и Исследователь, но написан на 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. Немного более ручное и менее элегантное, чем некоторые из предложенных решений, но на самом деле такое же быстрое.

Другие вопросы по теме