서버의 모든 데이터베이스를 백업하고 시스템 데이터베이스를 생략하는 스크립트

서버의 모든 데이터베이스를 백업하고 시스템 데이터베이스를 생략하는 스크립트

이 주제에 관한 많은 기사를 읽었지만 내 필요에 맞는 기사를 찾지 못했습니다. 따라서 기본적 으로 저는 MySQL 서버의 각 데이터베이스에 대해 두 개의 백업을 만들고 싶습니다. 하나는 정오(12시), 다른 하나는 자정(12시)에 하지만 시스템 데이터베이스는 무시하고 싶습니다 mysql. information_schema혹시 다른 분 아시는 분 계시면 알려주세요) 많은 주제를 읽은 후 다음 bash 스크립트를 얻었습니다.

#!/bin/sh
now="$(date +'%d_%m_%Y_%H_%M_%S')"
filename="db_backup_$now".gz
backupfolder="/home/backups"
fullpathbackupfile="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt
echo "mysqldump started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump --user=userbackup --password=***** --default-character-set=utf8 database | gzip > "$fullpathbackupfile"
echo "mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
find "$backupfolder" -name db_backup_* -mtime +7 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0

스크립트는 데이터베이스를 백업 database하고 마지막 7개 .tar.gz파일을 유지합니다. 시스템 데이터베이스를 제외한 모든 데이터베이스를 백업하고 각 데이터베이스의 마지막 7개 복사본을 보관할 수 있도록 이 스크립트를 개선하는 데 도움을 줄 수 있는 사람이 있습니까?

답변1

저는 현재 이것을 사용하고 PostgreSQL있으며 제가 하고 있는 작업은 여러분이 달성하려는 목표와 매우 유사해 보입니다. 따라서 제 백업 스크립트는 다음과 같습니다.

#!/bin/bash
#
#------------------------------------------------------------------------------
# Editable parameters:
#
## Filesystem Location to place backups.
BACKUP_DIR="/path/to/backup/folder"
## The user used to connect to postgres instance
USER="postgres"
PWD="pwd_in_plaintext_is_not_a_"
## Just the date string that will be appended to the backup files name
BACKUP_DATE="$(date +'%d_%m_%Y_%H_%M_%S')"
## Numbers of days you want to keep copie of your databases
NUMBER_OF_DAYS=7
## Uncomment following line if you want to overwrite the whole folder each time
#rm -rf ${BACKUP_DIR}/backupFulldb-*
#
#------------------------------------------------------------------------------
# don't change anything below this line

# Vacumm al databases before begin to backup
vacuumdb --all -U ${USER}

DATABASES=`psql -U ${USER} -l -t | cut -d'|' -f1 | sed -e 's/ //g' -e '/^$/d'`
for i in ${DATABASES}; do
  if [ "$i" != "template0" ] && [ "$i" != "template1" ]; then
    echo Dumping $i to ${BACKUP_DIR}
    pg_dump -U ${USER} --column-inserts $i | gzip -c >  ${BACKUP_DIR}/backupFulldb-$i-${BACKUP_DATE}.out.gz
  fi
done
find ${BACKUP_DIR} -type f -prune -mtime +${NUMBER_OF_DAYS} -exec rm -f {} \;

필요한 것은 mysql 인스턴스의 모든 데이터베이스를 나열하고 이를 배열로 바꾸는 쿼리뿐입니다 DATABASES. 읽다이 게시물그리고이것, 예를 들어 할 수 있다고 생각합니다. 다음을 수행하십시오.

while read line
do 
    DATABASES+=("$line")
done < <(mysql -u${USER} -p${PWD} INFORMATION_SCHEMA -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA")

물론 제외하려는 데이터베이스 이름을 수정하세요.

if [ "$i" != "mysql" ] && [ "$i" != "information_schema" ]; then

관련 정보