MySQL backup script

Ихэнх сайтын хувьд MySQL баазыг түлхүү ашигладаг билээ. Тиймээс энэ удаад MySQL санг нөөцлөн өгөгдсөн хугацаагаар хадгалж имэйл ээр мэдэгддэг скрипт оруулъя.

###############---MYSQL BACKUP SCRIPT---#############
#
#               By: BATMUNKH Moltov
#               facebook.com/Batmunkh.Moltov
#
# 
################---WWW.BATMUNKH.NET---################
#
# Боломжууд:
#    Нөөцлөх хавтсыг зааж өгч болох бөгөөд тухайн 
#    өдрөөр уг хавтсанд шинэ хавтас үүсгэн файлуудыг хадгална
#    Шаардлагагүй баазыг алгасах боломжтой
#    Бүх баазыг тус тусад нь gzip хэлбэрээр шахаж хадгална
#    Хэд хоног хадгалахыг тохируулах боломжтой
#    Имэйлээр мэдэгдэнэ
#    .........шинэлэгдсээр л байна....
#

# сонордуулга хүлээн авах имэйл
ADMIN_EMAIL="[email protected]"

#нөөцлөх шаардлагагүй баазын жагсаалт. 'db1','db2' гэх мэт оруулах
DATABASES_TO_EXCLUDE=""

#үндсэн авах шаардлагагүй баазууд
EXCLUSION_LIST="'information_schema','mysql','performance_schema'"

#хаана хадгалах зам
DIR_BACKUP=/backup/db/`date +\%G-\%m-\%d`

#backup файлыг хэд хоног хадгалах
RETENTION_BACKUP_DAY=20

#Үүнээс хойшхи кодыг ойлгохгүй бол засварлах шаардлагагүй

# tsag tootsoolohod ashiglana
TIME_START=`date +%s`

find ${DIR_BACKUP} -mindepth 1 -mtime +${RETENTION_BACKUP_DAY} -delete
mkdir -p ${DIR_BACKUP}
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
    EXCLUSION_LIST="${EXCLUSION_LIST},'${DB}'"
done
SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"
MYSQLDUMP_DATABASES="--databases"
MYSQLDUMP_OPTIONS="--routines --triggers --add-drop-table --skip-lock-tables -v"
for DB in `mysql -ANe"${SQLSTMT}"`
do
    #MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
    mysqldump ${MYSQLDUMP_OPTIONS} ${DB}  -u root | gzip > ${DIR_BACKUP}/${DB}.sql.gz
done
TIME_FINISH=`date +%s`

echo `hostname` 'mysql backup done. ' `date` `who` | mail -s `hostname`" mysql backup done"`expr ${TIME_FINISH} - ${TIME_START}`" seconds" ${ADMIN_EMAIL}

Уг кодыг жишээ нь /script/backup_db.sh гэж хадгалаад cronjob дээр нэмж хэдий хугацаанд хэрхэн нөөцлөлт авахаа тохируулна.

Автоматжуулах жишээ комманд:

[decoder@linux ] crontab -e
# Дараах мөрийг нэмж өгнө
18 03 * * * sh /scripts/backup_db.sh

Update:

2017.01.21 - Цаг тооцоолол нэмлээ
2017.04.28 - bug fixed.  (mysqldump ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES}  -u root | gzip > ${DIR_BACKUP}/${DB}.sql.gz)
5 Likes

Replication tei db deer Option deeree --master-data=2 geed backup avdag bol zugeer. Backup avax ueiin position.

1 Like

/backup/db/YYYY/MM/ хавтас үүсгэж table тус бүрээр авдаг болголоо. Бүтнээр нь мөн тухайн хавтсанд баазын нэрээр файл үүсгэж хадгална.

ADMIN_EMAIL="[email protected]"

DATABASES_TO_EXCLUDE=""

EXCLUSION_LIST="'information_schema','mysql','performance_schema'"

DIR_BACKUP=/backup/db/`date +\%G/\%m/\%d`
DIR_BACKUP_ROOT=/backup/db/

#backup файлыг хэд хоног хадгалах
RETENTION_BACKUP_DAY=20

#Үүнээс хойшхи кодыг ойлгохгүй бол засварлах шаардлагагүй

# tsag tootsoolohod ashiglana
TIME_START=`date +%s`

#цэвэрлэгээ хийх
find ${DIR_BACKUP_ROOT} -mindepth 1 -mtime +${RETENTION_BACKUP_DAY} -delete

mkdir -p ${DIR_BACKUP}
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
    EXCLUSION_LIST="${EXCLUSION_LIST},'${DB}'"
done
SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"
MYSQLDUMP_DATABASES="--databases"
MYSQLDUMP_OPTIONS="--routines --triggers --add-drop-table --skip-lock-tables -v"
for DB in `mysql -ANe"${SQLSTMT}"`
do
    #MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
    mysqldump ${MYSQLDUMP_OPTIONS} ${DB}  -u root | gzip > ${DIR_BACKUP}/${DB}.sql.gz

        for TABLE in `mysql -e "use ${DB}; show tables;" | awk 'NR!=1 {print}'`
        do
            mysqldump ${MYSQLDUMP_OPTIONS} ${DB}  -u root ${TABLE} | gzip > ${DIR_BACKUP}/${DB}-${TABLE}.sql.gz
        done
done
TIME_FINISH=`date +%s`

#echo `hostname` 'mysql backup done. ' `date` `who` | mail -s `hostname`" mysql backup done"`expr ${TIME_FINISH} - ${TIME_START}`" seconds" ${ADMIN_EMAIL}
1 Like