Как я могу отбросить все базы данных 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%