16

すべてが共通のプレフィックスを共有する何百もの mysql データベースを削除する必要がありますが、名前の残りの部分はランダムな ID です (例: database_0123456789、database_9876543210 )。これらのデータベースはすべて同じサーバー上にあります。同じサーバー上に削除したくない他のデータベースがあります。

これは私がやりたいことです:

DROP DATABASE `database_*`;

これらを効率的に削除するにはどうすればよいですか?実行できる MySQL クエリはありますか? もしかしてシェルスクリプト?

4

4 に答える 4

36

DROP DATABASEステートメントの構文は、 1 つのデータベース名のみをサポートします。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 スクリプトが作成されます。


(結果をプレーン テキスト ファイル (例: dropdbs.sql) として保存し、お気に入りのテキスト エディターで見直して、間抜けなヘッダーとフッターの行を削除し、スクリプトが正しいことを確認して保存し、mysql コマンド ライン ツールからmysql> source dropdbs.sql. )

明らかに、それよりも洗練されたものになる可能性がありますが、1 回のショットの場合、これがおそらく最も効率的です。)

于 2013-08-16T18:17:26.537 に答える
5

外部スクリプト ファイルは必要ありません。準備ステートメントを使用するストアド プロシージャは、トリックを実行する可能性があります。

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
于 2013-08-16T18:59:37.750 に答える