programing

데이터베이스 백업을 위한 리눅스 셸 스크립트

powerit 2023. 10. 30. 21:21
반응형

데이터베이스 백업을 위한 리눅스 셸 스크립트

데이터베이스 백업을 위해 많은 스크립트를 시도했지만 성공하지 못했습니다.매시간 데이터베이스를 백업하고 싶습니다.
"/etc/cron에 파일을 추가했습니다.harly/" 폴더에서 chmod를 755로 변경했지만 실행되지 않았습니다.적어도 나는 내 의사 코드를 적습니다.

이 작업에 대한 스크립트를 작성해 주시고, 이 스크립트 파일을 추가한 후에 제가 무엇을 더 해야 하는지 알려주시면 좋겠습니다./etc/cron.hourly/폴더.

  • 현재 날짜를 가져오고 변수를 만듭니다.date=date(d_m_y_H_M_S)
  • 파일 이름에 대한 변수를 만듭니다.filename="$date".gz
  • 내 데이터베이스를 이렇게 덤프합니다.mysqldump --user=my_user --password=my_pass --default-character-set=utf8 my_database | gzip > "/var/www/vhosts/system/example.com/httpdocs/backups/$("filename")
  • 폴더의 모든 파일 삭제/var/www/vhosts/system/example.com/httpdocs/backups/된 8일 입니다.
  • "/var/www/vhosts/system/example.com/httpdocs/backup_log.txt", 이 텍스트는 다음과 같이 작성됩니다.Backup is created at $("date")
  • 파일 소유자(chown)를 root에서 "my_user"로 변경합니다."my_user" FTP 계정에서 백업 및 로그 파일을 열고 싶기 때문입니다.
  • 나는 매번 cron 뒤에 이메일을 보내고 싶지 않습니다.>/dev/null 2>&1추가됩니다.

몇 시간씩 작업한 후 아래와 같은 해결책을 만들었습니다.다른 사람들에게 도움이 될 수 있도록 붙여넣기를 합니다.

먼저 스크립트 파일을 만들고 이 파일에 실행 가능한 권한을 부여합니다.

# cd /etc/cron.daily/
# touch /etc/cron.daily/dbbackup-daily.sh
# chmod 755 /etc/cron.daily/dbbackup-daily.sh
# vi /etc/cron.daily/dbbackup-daily.sh

그런 다음 Shift+Ins로 다음 행을 파일로 복사합니다.

#!/bin/sh
now="$(date +'%d_%m_%Y_%H_%M_%S')"
filename="db_backup_$now".gz
backupfolder="/var/www/vhosts/example.com/httpdocs/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=mydbuser --password=mypass --default-character-set=utf8 mydatabase | gzip > "$fullpathbackupfile"
echo "mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
chown myuser "$fullpathbackupfile"
chown myuser "$logfile"
echo "file permission changed" >> "$logfile"
find "$backupfolder" -name db_backup_* -mtime +8 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0

:
InnoDB를 사용하는데 백업에 시간이 너무 많이 걸리는 경우 "단일 트랜잭션" 인수를 추가하여 잠금을 방지할 수 있습니다.따라서 내 sq 덤프 라인은 다음과 같습니다.

mysqldump --user=mydbuser --password=mypass --default-character-set=utf8
          --single-transaction mydatabase | gzip > "$fullpathbackupfile"

다음과 유사한 스크립트를 만듭니다.

#!/bin/sh -e

location=~/`date +%Y%m%d_%H%M%S`.db

mysqldump -u root --password=<your password> database_name > $location

gzip $location

그런 다음 편집할 수 있습니다.crontab스크립트를 실행할 사용자:

$> crontab -e

그리고 항목을 추가합니다.

01 * * * * ~/script_path.sh

이것은 매일 매시간 1분마다 실행하게 될 것입니다.

그러면 롤과 다른 기능만 추가하면 되고, 가도 좋습니다.

저도 똑같은 문제가 생겼어요.하지만 저는 대본을 쓸 줄 압니다.이것이 도움이 되기를 바랍니다.

#!/bin/bash
# Database credentials
user="username"
password="password"
host="localhost"
db_name="dbname"
# Other options
backup_path="/DB/DB_Backup"
date=$(date +"%d-%b-%Y")
# Set default file permissions
umask 177
# Dump database into SQL file
mysqldump --user=$user --password=$password --host=$host $db_name >$backup_path/$db_name-$date.sql

# Delete files older than 30 days
find $backup_path/* -mtime +30 -exec rm {} \;


#DB backup log
echo -e "$(date +'%d-%b-%y  %r '):ALERT:Database has been Backuped"    >>/var/log/DB_Backup.log
#!/bin/sh
#Procedures = For DB Backup
#Scheduled at : Every Day 22:00

v_path=/etc/database_jobs/db_backup
logfile_path=/etc/database_jobs
v_file_name=DB_Production
v_cnt=0

MAILTO="abc@as.in"
touch "$logfile_path/kaka_db_log.log"

#DB Backup
mysqldump -uusername -ppassword -h111.111.111.111 ddbname > $v_path/$v_file_name`date +%Y-%m-%d`.sql 
if [ "$?" -eq 0 ]
  then
   v_cnt=`expr $v_cnt + 1`
  mail -s "DB Backup has been done successfully" $MAILTO < $logfile_path/db_log.log
 else
   mail -s "Alert : kaka DB Backup has been failed" $MAILTO < $logfile_path/db_log.log
   exit
fi

여기 누군가에게 도움이 될 경우를 대비해 우분투를 위한 mysql 백업 스크립트가 있습니다.

#Mysql back up script

start_time="$(date -u +%s)"

now(){
date +%d-%B-%Y_%H-%M-%S
}

ip(){
/sbin/ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'
}

filename="`now`".zip
backupfolder=/path/to/any/folder
fullpathbackupfile=$backupfolder/$filename
db_user=xxx
db_password=xxx
db_name=xxx

printf "\n\n"
printf "******************************\n"
printf "Started Automatic Mysql Backup\n"
printf "******************************\n"
printf "TIME: `now`\n"
printf "IP_ADDRESS: `ip` \n"
printf "DB_SERVER_NAME: DB-SERVER-1\n"

printf "%sBACKUP_FILE_PATH $fullpathbackupfile\n"

printf "Starting Mysql Dump \n"

mysqldump -u $db_user -p$db_password $db_name| pv | zip > $fullpathbackupfile

end_time="$(date -u +%s)"

elapsed=$(($end_time-$start_time))

printf "%sMysql Dump Completed In $elapsed seconds\n"

printf "******************************\n"

추신: 우분투에 pv와 zip을 설치하는 것을 기억하세요.

sudo apt install pv
sudo apt install zip

다음은 다음과 같이 사용하여 크론탭을 설정하는 방법입니다.crontab -eubuntu에서 6시간마다 실행됩니다.

0 */6 * * * sh /path/to/shfile/backup-mysql.sh >> /path/to/logs/backup-mysql.log 2>&1

멋진 점은 어디에서나 압축을 풀기 쉬운 zip 파일을 만들 수 있다는 것입니다.

이제 스크립트 파일(예: /backup/mysql-backup)에 다음 내용을 복사합니다.sh) Linux 시스템에 저장합니다.

    #!/bin/bash

    export PATH=/bin:/usr/bin:/usr/local/bin
    TODAY=`date +"%d%b%Y"`

    DB_BACKUP_PATH='/backup/dbbackup'
    MYSQL_HOST='localhost'
    MYSQL_PORT='3306'
    MYSQL_USER='root'
    MYSQL_PASSWORD='mysecret'
    DATABASE_NAME='mydb'
    BACKUP_RETAIN_DAYS=30   

    mkdir -p ${DB_BACKUP_PATH}/${TODAY}
    echo "Backup started for database - ${DATABASE_NAME}"

    mysqldump -h ${MYSQL_HOST} \
   -P ${MYSQL_PORT} \
   -u ${MYSQL_USER} \
   -p${MYSQL_PASSWORD} \
   ${DATABASE_NAME} | gzip > ${DB_BACKUP_PATH}/${TODAY}/${DATABASE_NAME}-${TODAY}.sql.gz

if [ $? -eq 0 ]; then
  echo "Database backup successfully completed"
else
  echo "Error found during backup"
  exit 1
fi


##### Remove backups older than {BACKUP_RETAIN_DAYS} days  #####

DBDELDATE=`date +"%d%b%Y" --date="${BACKUP_RETAIN_DAYS} days ago"`

if [ ! -z ${DB_BACKUP_PATH} ]; then
      cd ${DB_BACKUP_PATH}
      if [ ! -z ${DBDELDATE} ] && [ -d ${DBDELDATE} ]; then
            rm -rf ${DBDELDATE}
      fi
fi

스크립트를 만들거나 다운로드한 후 제대로 실행되도록 실행 권한을 설정해야 합니다.

$ chmod +x /backup/mysql-backup.sh

crontab -e 명령을 사용하여 시스템의 crontab을 편집합니다.다음 설정을 추가하여 아침 3시에 백업을 활성화합니다.

0 3 * * * root /backup/mysql-backup.sh

셸 스크립트 파일에 다음 코드를 추가합니다.dbname, dbuser, dbpass를 각각 데이터베이스 이름, 사용자 이름, 비밀번호로 바꿉니다.

#!/bin/sh

echo "starting db backup"
day="$(date +"%m-%d-%y")"
db_backup="mydb_${day}.sql"
sudo mysqldump  -udbuser -pdbpass --no-tablespaces dbname  >/home/${db_backup}
echo " backup complete" 

위 백업 데이터를 압축하려면 다음 코드로 바꾸기만 하면 됩니다.

db_backup="mydb_${day}.gz"
sudo mysqldump  -udbuser -pdbpass --no-tablespaces dbname | gzip -c >/home/${db_backup}

폴더에서 14일 이상 된 파일을 삭제하려면 다음 코드를 사용합니다.

#!/bin/bash

fpath1=/home/ubuntu/mysql/*
fpath2=/home/ubuntu/postgsql/*


file_path=($fpath1 $fpath2)


for i in ${file_path[@]};
do
    find $i -type d -mtime +13 -exec rm -Rf {} +
done 
#!/bin/bash

# Add your backup dir location, password, mysql location and mysqldump        location
DATE=$(date +%d-%m-%Y)
BACKUP_DIR="/var/www/back"
MYSQL_USER="root"
MYSQL_PASSWORD=""
MYSQL='/usr/bin/mysql'
MYSQLDUMP='/usr/bin/mysqldump'
DB='demo'

#to empty the backup directory and delete all previous backups
rm -r $BACKUP_DIR/*  

mysqldump -u root -p'' demo | gzip -9 > $BACKUP_DIR/demo$date_format.sql.$DATE.gz

#changing permissions of directory 
chmod -R 777 $BACKUP_DIR

Sqlite3에 메타데이터가 있는 동시 mysql 백업 스크립트인 이 오픈 소스 도구 matiri https://github.com/AAFC-MBB/matiri 를 고려해 볼 수 있습니다.특징:

  • 다중 서버:여러 MySQL 서버가 동일한 물리적 서버 또는 별도의 물리적 서버에 동시에 위치한 경우에도 지원됩니다.
  • 병렬:백업할 서버의 각 데이터베이스는 별도로 병렬로 수행됩니다(동시 설정 가능: 기본값: 3).
  • 압축됨:각 데이터베이스 백업 압축
  • Checksummed: 저장된 각 압축 백업 파일의 SHA256 및 모든 파일의 아카이브
  • 보관됨:모든 데이터베이스 백업을 하나의 파일로 통합
  • 녹음:Sqlite3 데이터베이스에 저장된 백업 정보

전체공개 : 마티리 원작자

DBA로서 MySQL 데이터베이스의 백업을 예약해야 데이터베이스를 현재 백업에서 복구할 수 있습니다.

여기서는 mysqldump를 사용하여 mysql 데이터베이스의 백업을 수행하고 있으며 스크립트에 입력할 수 있는 것과 동일합니다.

[orahow@oradbdb DB_Backup]$ cat.backup_script.sh

#!/bin/bash
# Database credentials
user="root"
password="1Loginxx"
db_name="orahowdb"
v_cnt=0
logfile_path=/DB_Backup
touch "$logfile_path/orahowdb_backup.log"
# Other options
backup_path="/DB_Backup"
date=$(date +"%d-%b-%Y-%H-%M-%p")
# Set default file permissions

읽기를 계속합니다...MySQL 백업

나는 MYSQL 데이터베이스의 백업을 만들기 위해 Shell Script를 준비했습니다.데이터베이스를 백업할 수 있도록 사용할 수 있습니다.

    #!/bin/bash
    export PATH=/bin:/usr/bin:/usr/local/bin
    TODAY=`date +"%d%b%Y_%I:%M:%S%p"`

    ################################################################
    ################## Update below values  ########################
    DB_BACKUP_PATH='/backup/dbbackup'
    MYSQL_HOST='localhost'
    MYSQL_PORT='3306'
    MYSQL_USER='auriga'
    MYSQL_PASSWORD='auriga@123'
    DATABASE_NAME=( Project_O2 o2)
    BACKUP_RETAIN_DAYS=30   ## Number of days to keep local backup copy; Enable script code in end of th script

    #################################################################
    { mkdir -p ${DB_BACKUP_PATH}/${TODAY}
        echo "
                                ${TODAY}" >> ${DB_BACKUP_PATH}/Backup-Report.txt
    } || {
        echo "Can not make Directry"
        echo "Possibly Path is wrong"
    }
    { if ! mysql -u ${MYSQL_USER} -p${MYSQL_PASSWORD} -e 'exit'; then
        echo 'Failed! You may have Incorrect PASSWORD/USER ' >> ${DB_BACKUP_PATH}/Backup-Report.txt
        exit 1
    fi

        for DB in "${DATABASE_NAME[@]}"; do
            if ! mysql -u ${MYSQL_USER} -p${MYSQL_PASSWORD} -e "use "${DB}; then
                echo "Failed! Database ${DB} Not Found on ${TODAY}" >> ${DB_BACKUP_PATH}/Backup-Report.txt

            else
                # echo "Backup started for database - ${DB}"            
                # mysqldump -h localhost -P 3306 -u auriga -pauriga@123 Project_O2      # use gzip..

                mysqldump -h ${MYSQL_HOST} -P ${MYSQL_PORT} -u ${MYSQL_USER} -p${MYSQL_PASSWORD} \
                          --databases ${DB} | gzip > ${DB_BACKUP_PATH}/${TODAY}/${DB}-${TODAY}.sql.gz

                if [ $? -eq 0 ]; then
                    touch ${DB_BACKUP_PATH}/Backup-Report.txt
                    echo "successfully backed-up of ${DB} on ${TODAY}" >> ${DB_BACKUP_PATH}/Backup-Report.txt
                    # echo "Database backup successfully completed"

                else
                    touch ${DB_BACKUP_PATH}/Backup-Report.txt
                    echo "Failed to backup of ${DB} on ${TODAY}" >> ${DB_BACKUP_PATH}/Backup-Report.txt
                    # echo "Error found during backup"
                    exit 1
                fi
            fi
        done
    } || {
        echo "Failed during backup"
        echo "Failed to backup on ${TODAY}" >> ${DB_BACKUP_PATH}/Backup-Report.txt
        # ./myshellsc.sh 2> ${DB_BACKUP_PATH}/Backup-Report.txt
    }

    ##### Remove backups older than {BACKUP_RETAIN_DAYS} days  #####

    # DBDELDATE=`date +"%d%b%Y" --date="${BACKUP_RETAIN_DAYS} days ago"`

    # if [ ! -z ${DB_BACKUP_PATH} ]; then
    #       cd ${DB_BACKUP_PATH}
    #       if [ ! -z ${DBDELDATE} ] && [ -d ${DBDELDATE} ]; then
    #             rm -rf ${DBDELDATE}
    #       fi
    # fi

    ### End of script ####

스크립트에서 사용자 이름, 암호, 데이터베이스 이름(또는 데이터베이스가 둘 이상인 경우) 또한 포트 번호(다른 경우)를 지정하면 됩니다.

스크립트를 실행하려면 다음과 같이 명령을 사용합니다.

sudo ./script.sc

파일의 결과(예: 실패 발생 또는 백업 성공)를 보려면 다음과 같이 명령을 사용할 것을 제안합니다.

sudo ./myshellsc.sh 2>> Backup-Report.log

감사해요.

언급URL : https://stackoverflow.com/questions/19664893/linux-shell-script-for-database-backup

반응형