【问题标题】:Drop all databases in MySQL删除 MySQL 中的所有数据库
【发布时间】:2014-04-13 15:25:46
【问题描述】:

我们的 MySQL 中有很多数据库,我们想shrink/purge ibdata1 file in MySQL

我们如何从 MySQL 中删除除 information_schemamysqld 之外的所有数据库 数据库?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    以下命令将删除 mysql dbms 中除 mysql、information_schema 和 performance_schema dbs 之外的所有数据库。

    mysql -uroot -p<password> -e "show databases" | grep -v Database | grep -v mysql| grep -v information_schema| gawk '{print "drop database `" $1 "`;select sleep(0.1);"}' | mysql -uroot -p<password>
    

    感谢 Mohinish 的博客post

    【讨论】:

    • 脚本中间有2个管道,但是是的,删除一个就可以了
    • 或更短:mysql -uroot -p -e "show databases" | egrep -v "Database|mysql|information_schema" |gawk '{print "drop database " $1 ";select sleep(0.1);"}' | mysql -uroot -p – johnjg12 1 小时前
    • 如果你有像“yyk2_db”这样的数据库名称,单行将失败。在这种情况下,只需将“$1”替换为`“$1”`
    【解决方案2】:

    关注link - 它演示了如何执行此操作!

    使用的脚本是:

    mysql -uroot -p -e "show databases" | grep -v Database |
    grep -v mysql| grep -v information_schema| grep -v test |
    grep -v OLD |gawk '{print "drop database " $1 ";select sleep(0.1);"}' |
    mysql -uroot -ppassword
    

    【讨论】:

      【解决方案3】:

      如果您有跨数据库外键,或使用 MySQL 保留字(例如“order”)的数据库名称,则 Sukhjinder Singh 的答案的这种变体将起作用。

      mysql -u&lt;user&gt; -p&lt;password&gt; -e "show databases" | grep -v Database | grep -v mysql | grep -v information_schema | gawk '{print "SET FOREIGN_KEY_CHECKS = 0;drop database"$1";select sleep(0.1);"}' | mysql -u&lt;user&gt; -p&lt;password&gt;

      【讨论】:

        【解决方案4】:

        您可以直接使用 MySQL 构建一系列 DROP DATABASE 查询:

        -- Prevent truncation
        SET SESSION group_concat_max_len = 1000000;
        
        SELECT GROUP_CONCAT(
          DISTINCT CONCAT('DROP DATABASE ', table_schema, ';')
          SEPARATOR ''
        )
        FROM information_schema.tables
        WHERE table_schema NOT IN ('mysql', 'information_schema');
        

        然后执行得到的字符串。

        此解决方案的优点是不需要连接到为 MySQL 数据库提供服务的主机。

        【讨论】:

          【解决方案5】:

          这两种方法都会删除除mysqlinformation_schemaperformance_schema 之外的所有数据库。

          方法一、MYSQL方法

          Fabian's answer 的启发,但更轻巧并且可以捕获空数据库。这种方法通过 MYSQL 查询生成脚本,然后将其反馈给 MYSQL。这种方法在 bash 方面可能最兼容。

          mysql -uroot -pMY_PASSWORD -s -N -e "SELECT GROUP_CONCAT(CONCAT('DROP DATABASE ', schema_name, ';') SEPARATOR ' ') FROM information_schema.schemata WHERE schema_name NOT IN ('mysql', 'information_schema', 'performance_schema');" | grep -v "NULL" | mysql -uroot -pMY_PASSWORD
          

          更新。 added -v "NULL" 在没有表的情况下避免 MYSQL 错误。


          方法 2. Bash 方法

          灵感来自Sukhjinder's answer,但经过调整以实现更好的兼容性。这种方法以原始格式请求数据库名称,执行 bash 魔术,然后将代码反馈给 MYSQL。此方法使您可以更好地控制代码。

          mysql -uroot -pMY_PASSWORD -e "show databases" -s -N | egrep -v "mysql|information_schema|performance_schema" | while read x ; do echo "DROP DATABASE $x;" ; done| tr '\n' ' ' | mysql -h"mysql" -uroot -pMY_PASSWORD
          

          【讨论】:

          • 我喜欢这个 bc,另一个答案使用我没有安装的 gawk。但是,对于名称中带有破折号的 dbs,这将失败,因此我不得不将其修改为使用 "DROP DATABASE \`$x\`;" 而不是 "DROP DATABASE $x;"
          猜你喜欢
          • 2013-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-11
          • 1970-01-01
          • 1970-01-01
          • 2014-07-20
          相关资源
          最近更新 更多