Drop multiple databases with names matching a pattern

后端 未结 10 2108
南旧
南旧 2021-02-02 10:39

I want to drop all the databases starting with a word.

abc
xyz
cms_db1
cms_db2
cms_xyz
pqr

In the example given above, I will like to drop all

相关标签:
10条回答
  • 2021-02-02 10:58

    Improved @neurino solution to avoid storing of MySQL credentials in the script and passing them through a command line (it might be visible in the list of processes then)

    #!/bin/bash
    
    DB_STARTS_WITH="cms"
    MYSQL="mysql"
    
    read -p "Enter MySQL user name: " MYSQL_USER
    read -s -p "Enter password: " MYSQL_PASSWORD
    
    CREDENTIALS_FILE="$(mktemp)"
    chmod 600 $CREDENTIALS_FILE
    cat > $CREDENTIALS_FILE <<- EOM
    [client]
    user=$MYSQL_USER
    password=$MYSQL_PASSWORD
    EOM
    
    trap "{ rm -f $CREDENTIALS_FILE; }" EXIT
    
    DATABASES="$(echo "show databases;" | $MYSQL --defaults-file=$CREDENTIALS_FILE)"
    
    for DATABASE in $DATABASES; do
        if [[ $DATABASE =~ ^${DB_STARTS_WITH} ]]; then
            echo Removing $DATABASE...
            echo "drop database $DATABASE" | $MYSQL --defaults-file=$CREDENTIALS_FILE
        fi
    done
    
    0 讨论(0)
  • 2021-02-02 11:05

    Linux way:

    #!/bin/bash
    
    DB_STARTS_WITH="cms"
    MUSER="root"
    MPWD="yourpass"
    MYSQL="mysql"
    
    DBS="$($MYSQL -u$MUSER -p$MPWD -Bse 'show databases')"
    for db in $DBS; do
    
    if [[ "$db" =~ "^${DB_STARTS_WITH}" ]]; then
        echo "Deleting $db"
        $MYSQL -u$MUSER -p$MPWD -Bse "drop database $db"
    fi
    
    done
    

    Of course use the drop part at your own risk ;)

    0 讨论(0)
  • 2021-02-02 11:09

    Improvising on the excellent answer by @cloakedninjas, for easier retrieval of all the queries to execute in a single string.

    Firstly, you can set the maximum value for group_concat_max_len to the maximum possible value, for this particular session:

    SET SESSION group_concat_max_len = @@max_allowed_packet;
    

    Now, you can prepare a query string (to execute later) using SQL. Using information_schema, we can get name of all the databases matching the pattern. Now, use Concat() to prepare a single DROP DATABASE .. query, and then utilize Group_Concat() to merge them all into a single string, for easier retrieval.

    SELECT GROUP_CONCAT(CONCAT('DROP DATABASE `', SCHEMA_NAME, '`;') 
                        SEPARATOR ' ') AS query_to_execute
    FROM information_schema.SCHEMATA
    WHERE SCHEMA_NAME LIKE 'cms_%'
    

    Now copy the string in query_to_execute and run it separately.

    0 讨论(0)
  • 2021-02-02 11:11

    I would use something like:

    echo "SHOW DATABASES LIKE 'cms_%'" \
      | mysql \
      | tail -n +2 \
      | xargs -n1 mysqladmin -f drop
    

    If you don't have your default username and password configured inside ~/my.cnf, you may need to supply the username and password via the -u and -p switches to the mysql/mysqladmin commands above.

    (Edit - added -n arg to tail.)

    0 讨论(0)
提交回复
热议问题