Optymalizacja baz MySQL
listopad 7th, 2007Serwer z baza MySQL działał sobie pięknie od długiego czasu. Bazy rosły i rosły były wykorzystywane dość intensywnie. Postanowiłem wymusić procesy optymalizacji na tabelach.
Skrypt jest uruchamiany na tym samym serwerze (uprzedzam ewentualne pytania o listowanie katalogu roboczego MySQL)
#!/bin/bash
MYSQL_DIR="/home/services/mysql/mysqldb/db/"
MYSQL_WORK="/home/services/mysql/optimize"
MYSQL_NICE="19"
MYSQL_ARCHIVE="/home/services/mysql/backup"
MYSQL_BIN="/usr/bin/mysql"
MYSQL_DUMP="/usr/bin/mysqldump"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="3306"
MYSQL_USER="mysql"
MYSQL_PASS="OjojojJakiesHaslo"
#
# do not touch tables ib* and mysql
MYSQL_DATABASES=`ls $MYSQL_DIR | grep -e "^ib*" -v | grep -v "mysql"`
TODAY=`date +%Y-%m-%d`
TMP_FILE=`mktemp`
TMP_TABLES=`mktemp`
ARCHIVE_DIR=$MYSQL_ARCHIVE/$TODAY
#
if [ ! -d $ARCHIVE_DIR ]; then
mkdir -p $ARCHIVE_DIR
fi
#
for DATABASE in $MYSQL_DATABASES; do
ARCHIVE_NAME=$DATABASE".sql.gz"
if [ -f $ARCHIVE_DIR/$ARCHIVE_NAME ]; then
ARCHIVE_NAME=$DATABASE"_last.sql.gz"
fi
nice -n $MYSQL_NICE $MYSQL_DUMP -u $MYSQL_USER -p$MYSQL_PASS --opt $DATABASE | gzip -c - > $ARCHIVE_DIR/$ARCHIVE_NAME
BACKUP_SIZE=`du -sh $ARCHIVE_DIR/$ARCHIVE_NAME | awk ' { print $1 } '`
BACKUP_MD5=`md5sum $ARCHIVE_DIR/$ARCHIVE_NAME | awk ' { print $1 } '`
echo " [$TODAY] backup database $DATABASE" >> $MYSQL_ARCHIVE/$TODAY.log
echo " $BACKUP_MD5 $ARCHIVE_NAME ($BACKUP_SIZE)" >> $MYSQL_ARCHIVE/$TODAY.log
echo " [$TODAY] analize database $DATABASE" >> $MYSQL_ARCHIVE/$TODAY.log
nice -n $MYSQL_NICE $MYSQL_BIN -u $MYSQL_USER -p$MYSQL_PASS $DATABASE -e "show tables" > $TMP_FILE
#
cat $TMP_FILE | sed -e '1d' > $TMP_TABLES
TABLES_COUNT=`wc -l $TMP_TABLES | awk ' { print $1 } '`
rm -f $TMP_FILE
TABLES=`cat $TMP_TABLES`
echo "" > $TMP_TABLES
echo " [$TODAY] optimize database $DATABASE ($TABLES_COUNT tables)" >> $MYSQL_ARCHIVE/$TODAY.log
for TABLE in $TABLES; do
echo "repair table $TABLE;" >> $TMP_TABLES
echo "optimize table $TABLE;" >> $TMP_TABLES
done
nice -n $MYSQL_NICE $MYSQL_BIN -u $MYSQL_USER -p$MYSQL_PASS $DATABASE < $TMP_TABLES>/dev/null
rm -f $TMP_TABLES
done
#
TODAY_SIZE=`du -sh $ARCHIVE_DIR | awk ' { print $1 } '`
echo "" >> $MYSQL_ARCHIVE/$TODAY.log
echo " [$TODAY] Backup size for today $TODAY_SIZE">> $MYSQL_ARCHIVE/$TODAY.log
echo "" >> $MYSQL_ARCHIVE/$TODAY.log
Można dodać jeszcze informację w postaci email dla administratora z kawałkiem loga
Tutaj wersja do pobrania optimize.txt.
listopad 9th, 2007 at 11:26 am
%s/analize/analyze/g
listopad 9th, 2007 at 12:45 pm
true … dziekować
grudzień 1st, 2007 at 9:21 pm
liste baz zdalnie mozna uzyskac np. przez:
BAZY=`mysql -u $USER –password=$PASS -e ’show databases;’ -s -N`
a do naprawy po nieoczekiwanym padzie korzystanm z komendy
mysqlcheck –repair –all-databases –auto-repair –fast -p | tee /tmp/reair.log
a do optymalizacji starcza komenda
mysqlcheck –optimize –all-databases –all-in-1 -p |tee /tmp/optimize.log
o ilesz mniej pisania i skryptow
grudzień 1st, 2007 at 10:12 pm
zdalnie owszem ale bedzie takze baza mysql
co do mysqlcheck to owszem
da sie dziala …
sa trzy sposoby zrobienia czegokolwiek
1. dobry
2. zly
3. moj