sufehmi icon

find-corrupt-mysql-table.sh

sufehmi | PRO | 11/02/19 11:49:50 AM UTC | 0 ⭐ | 826 👁️ | Never ⏰ | []
Bash |

1.61 KB

|

None

|

0 👍

/

0 👎

#!/bin/bash
 
# find-corrupt-mysql-table.sh
# Check corrupt table @ MySQL
 
# InnoDB tables sometime does not show up as errors with mysqlcheck,
# yet when you try to SELECT, it will give message : 
# ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
 
# This script will check every available table & find all with such problem
 
# one-liner version
###rm result.txt ; databases=( `mysql -e "show databases"` ) ; for d in "${databases[@]}" ; do tables=( `mysql -e "use $d ; show tables"` ) ; for t in "${tables[@]}"  ; do printf "\n DATABASE: $d ; TABLE: $t \n" >> result.txt ;  if [[ "$d" == "information_"* ]] ; then sleep 0 ; else if mysql -e "select * from $d.$t limit 1"  |& tee -a result.txt | grep -q "ERROR" ; then sleep 2 ; fi ; fi ; done ; done ;
 
##### START #####################
 
omitted=information_
 
# clean up 
rm result.txt 
 
databases=( `mysql -e "show databases"` ) 
 
for d in "${databases[@]}" 
do 
 
    tables=( `mysql -e "use $d ; show tables"` ) 
 
    for t in "${tables[@]}"  
    do 
        printf "\n DATABASE: $d ; TABLE: $t \n" >> result.txt 
 
        if [[ "$d" == "$omitted"* ]] ; then 
    
            # skip this database
            sleep 0 
        else 
 
            # get the output into result.txt, and also
            # to stdout, so we can grep / check it for error message
            if mysql -e "select * from $d.$t limit 1"  |& tee -a result.txt | grep -q "ERROR" ; then 
 
                # if we encountered a problematic table
                # we need to stop for a while
                # to give time to MySQL to recover
                # if we continue anyway, we won't be able to connect to MySQL
 
                sleep 2 
            fi 
 
        fi 
    done 
 
done

Comments