Как я могу отбросить все базы данных MySQL с определенным префиксом?

Мне нужно сбросить сотни баз данных mysql, которые имеют общий префикс, но имеют случайный идентификатор в качестве остальной части своего имени (например, database_0123456789, database_9876543210). Все эти базы данных находятся на одном сервере. На том же сервере есть другие базы данных, которые я не хочу отбрасывать.

Это то, что я хотел бы сделать:

DROP DATABASE `database_*`;

Как я могу отказаться от них эффективно? Есть ли запрос MySQL, который я могу запустить? Может быть, оболочка script?

Ответ 1

Синтаксис оператора DROP DATABASE поддерживает только одно имя базы данных. Вам нужно будет выполнить отдельный оператор DROP DATABASE для каждой базы данных.

Вы можете запустить запрос, чтобы вернуть список имен баз данных или, может быть, более полезно, чтобы генерировать фактические операторы, которые нужно запустить. Если вы хотите отбросить все базы данных, начинающиеся с литеральной строки database_ (включая символ подчеркивания), выполните следующие действия:

SELECT CONCAT('DROP DATABASE ',schema_name,' ;') AS stmt
  FROM information_schema.schemata
 WHERE schema_name LIKE 'database\_%' ESCAPE '\\'
 ORDER BY schema_name

Скопируйте результаты этого запроса, и у вас есть SQL script.


(Сохраните результаты в виде текстового файла (например, dropdbs.sql), просмотрите в своем любимом текстовом редакторе, чтобы удалить любые заголовки заголовков и нижних колонтитулов, убедитесь, что script выглядит правильно, сохраните его, а затем из mysql инструмент командной строки, mysql> source dropdbs.sql.)

Очевидно, что вы могли бы стать более сложным, чем это, но для одноразового выстрела это, вероятно, наиболее эффективно.)

Ответ 2

Не требуется внешний файл script. Хранимая процедура с использованием инструкций подготовки может сделать трюк:

CREATE PROCEDURE kill_em_all()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE dbname VARCHAR(255);
    DECLARE cur CURSOR FOR SELECT schema_name
      FROM information_schema.schemata
     WHERE schema_name LIKE 'database\_%' ESCAPE '\\'
     ORDER BY schema_name;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO dbname;

        IF done THEN
          LEAVE read_loop;
        END IF;

        SET @query = CONCAT('DROP DATABASE ',dbname);
        PREPARE stmt FROM @query;
        EXECUTE stmt;
    END LOOP;
END;

Как только у вас будет эта процедура, вам просто нужно:

CALL kill_em_all();

Когда сделано:

DROP PROCEDURE kill_em_all

Ответ 3

Изменение ответа spencer7593

Вот команда поиска желаемых результатов и сохранения в файле, где префикс - префикс базы данных

 SELECT CONCAT('DROP DATABASE ',schema_name,' ;') AS stmt
 FROM information_schema.schemata
 WHERE schema_name LIKE 'prefix\_%' ESCAPE '\\'
 ORDER BY schema_name into outfile '/var/www/pardeep/file.txt';

если вы получили разрешение, а затем измените разрешение на папку 777 или измените группу папок на mysql, используя этот

chown -R mysql /var/www/pardeep/

затем запустите этот запрос

source /var/www/pardeep/file.txt;

Ответ 4

В этом вопросе отсутствует ответ, не создавая файл в первую очередь.

Наш сервер сборки автоматически создает базу данных для каждой ветки темы при выполнении модульных тестов. После того, как запросы information_schema становятся очень медленными, что приводит к сбою наших тестов.

Я создал пакетный файл, который запускается каждый день. Я не хотел иметь дело с временными файлами. Итак, вот мое решение.

@ECHO OFF
REM drops all databases excluding defaults
SET user=user
SET pass=pass

mysql ^
-u %user% ^
-p%pass% ^
-NBe "SELECT CONCAT('drop database `', schema_name, '`;') from information_schema.schemata where schema_name NOT IN ('mysql', 'test', 'performance_schema', 'information_schema')" | mysql -u %user% -p%pass%