MySQL OPTIMIZE all tables?

前端 未结 14 1939
迷失自我
迷失自我 2020-12-04 04:57

MySQL has an OPTIMIZE TABLE command which can be used to reclaim unused space in a MySQL install. Is there a way (built-in command or common stored procedure) to run this o

相关标签:
14条回答
  • 2020-12-04 05:13

    This bash script will accept the root password as option and optimize it one by one, with status output:

    #!/bin/bash
    
    if [ -z "$1" ] ; then
      echo
      echo "ERROR: root password Parameter missing."
      exit
    fi
    MYSQL_USER=root
    MYSQL_PASS=$1
    MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
    TBLLIST=""
    COMMA=""
    SQL="SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE"
    SQL="${SQL} table_schema NOT IN ('information_schema','mysql','performance_schema')"
    for DBTB in `mysql ${MYSQL_CONN} -ANe"${SQL}"`
    do
        echo OPTIMIZE TABLE "${DBTB};"
        SQL="OPTIMIZE TABLE ${DBTB};"
        mysql ${MYSQL_CONN} -ANe"${SQL}"
    done
    
    0 讨论(0)
  • 2020-12-04 05:15

    From command line:

    mysqlcheck -o <db_name> -u<username> -p
    

    then type password

    0 讨论(0)
  • 2020-12-04 05:16

    Following example php script can help you to optimize all tables in your database

    <?php
    
    dbConnect();
    
    $alltables = mysql_query("SHOW TABLES");
    
    while ($table = mysql_fetch_assoc($alltables))
    {
       foreach ($table as $db => $tablename)
       {
           mysql_query("OPTIMIZE TABLE '".$tablename."'")
           or die(mysql_error());
    
       }
    }
    
    ?>
    
    0 讨论(0)
  • 2020-12-04 05:17

    Do all the necessary procedures for fixing all tables in all the databases with a simple shell script:

    #!/bin/bash
    mysqlcheck --all-databases
    mysqlcheck --all-databases -o
    mysqlcheck --all-databases --auto-repair
    mysqlcheck --all-databases --analyze
    
    0 讨论(0)
  • 2020-12-04 05:20

    If you want to analyze, repair and optimize all tables in all databases in your MySQL server, you can do this in one go from the command line. You will need root to do that though.

    mysqlcheck -u root -p --auto-repair --optimize --all-databases
    

    Once you run that, you will be prompted to enter your MySQL root password. After that, it will start and you will see results as it's happening.

    Example output:

    yourdbname1.yourdbtable1       OK
    yourdbname2.yourdbtable2       Table is already up to date
    yourdbname3.yourdbtable3
    note     : Table does not support optimize, doing recreate + analyze instead
    status   : OK
    
    etc..
    etc...
    
    Repairing tables
    yourdbname10.yourdbtable10
    warning  : Number of rows changed from 121378 to 81562
    status   : OK
    

    If you don't know the root password and are using WHM, you can change it from within WHM by going to: Home > SQL Services > MySQL Root Password

    0 讨论(0)
  • 2020-12-04 05:20

    A starter bash script to list and run a tool against the DBs...

    #!/bin/bash
    
    declare -a dbs
    unset opt
    
    for each in $(echo "show databases;" | mysql -u root) ;do
    
            dbs+=($each)
    
    done
    
    
    
    echo " The system found [ ${#dbs[@]} ] databases." ;sleep 2
    echo
    echo "press 1 to run a check"
    echo "press 2 to run an optimization"
    echo "press 3 to run a repair"
    echo "press 4 to run check,repair, and optimization"
    echo "press q to quit"
    read input
    
    case $input in
            1) opt="-c"
            ;;
            2) opt="-o"
            ;;
            3) opt="-r"
            ;;
            4) opt="--auto-repair -c -o"
            ;;
            *) echo "Quitting Application .."; exit 7
            ;;
    esac
    
    [[ -z $opt ]] && exit 7;
    
    echo " running option:  mysqlcheck $opt in 5 seconds  on all Dbs... "; sleep 5
    
    for ((i=0; i<${#dbs[@]}; i++)) ;do
            echo "${dbs[$i]} : "
            mysqlcheck $opt ${dbs[$i]}  -u root
        done
    
    0 讨论(0)
提交回复
热议问题