2013-11-27 4 views
1

Я работаю над этим скриптом в течение нескольких дней (я недавно начал писать в bash)
Скрипт проверяет, когда столбец приближается к пределу auto_incment. Я мог бы просто получить значение auto_increment из информационной схемы. Но, поскольку у нас есть сотни таблиц и около 4 Тбайт данных, которые можно было бы потратить некоторое время. Поэтому я решил получить значение auto_increment из «SHOW CREATE TABLE», который, мы надеемся, будет быстрее (все равно придется запускать это при постановке). Я уверен, что есть несколько способов решить эту проблему, и, как я уже сказал, я не эксперт по сценарию bash, но мне бы хотелось ваше мнение и если бы я мог сделать что-то лучше. Надеюсь, это также поможет другим.
Спасибо! -GioMySQL Check Auto Increment Script - без 'SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES'

#!/bin/bash 
# 
# This is bash script checks when auto_increment column is reaching its limit 
# To run Script $ ./auto_increment_check.sh [username] [password] [host] 

MYSQL_USER="$1" 
MYSQL_PASSWD="$2" 
MYSQL_HOST="$3" 

MYSQL=$(which mysql) 
if [ $? != 0 ] 
then 
    echo -e "\nMYSQL CLIENT NOT PRESENT!\n" 
    exit 1 
fi 

MYSQLCONNECT="$MYSQL -u$MYSQL_USER -p$MYSQL_PASSWD -h $MYSQL_HOST" 

QUERY=" 
SELECT table_schema, 
     table_name, 
     data_type, 
     (CASE data_type 
      WHEN 'tinyint' THEN 255 
      WHEN 'smallint' THEN 65535 
      WHEN 'mediumint' THEN 16777215 
      WHEN 'int' THEN 4294967295 
      WHEN 'bigint' THEN 18446744073709551615 
     end >> IF(Locate('unsigned', column_type) > 0, 0, 1)) AS MAX_VALUE 
FROM information_schema.columns 
     INNER JOIN information_schema.tables USING (table_schema, table_name) 
WHERE table_schema NOT IN ('MYSQL', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA' 
          ) 
     AND extra = 'auto_increment'" 


$MYSQLCONNECT --batch -N -e "$QUERY" | while read DATABASE TABLE DATA_TYPE MAX_VALUE; 
do 
    NEXT_AUTO_INCREMENT=`mysql -uroot -pgio --batch -N -e "SHOW CREATE TABLE $DATABASE.$TABLE" | awk  -F'AUTO_INCREMENT=' 'NF==1{print "0";next}{sub(/ .*/,"",$2);print $2}'` 
    AUTO_INCREMENT_RATIO=$(awk 'BEGIN {printf "%2.2f\n", '$NEXT_AUTO_INCREMENT'/'$MAX_VALUE'}') 
    [[ $(awk 'BEGIN{print ('$AUTO_INCREMENT_RATIO'>=0.9)}') -eq 1 ]] && echo "Auto Increment limit almost reached! $DATABASE.$TABLE - NEXT_AUTO_INCREMENT= $NEXT_AUTO_INCREMENT, MAX= $MAX_VALUE, RATIO= $AUTO_INCREMENT_RATIO" 
done 
+0

Моя интуиция заключается в том, что получение автоматического приращения из information_schema будет быстрее, чем выполнение множества операторов show show table. – Barmar

+0

Я отправлю результаты после проверки скрипта – andresg3

ответ

0

Если INFORMATION_SCHEMA медленно для вас, я рекомендую установить innodb_stats_on_metadata=0.

Что касается контроля автонастройки, вы должны сделать это с помощью common_schema.

После common_schema установки вы можете запустить запрос, как это:

select * 
from common_schema.auto_increment_columns 
order by auto_increment_ratio desc 
limit 10; 

Для получения дополнительной информации, пожалуйста, прочитайте blog post я писал на эту тему в прошлом году.