데이터베이스 백업을 위한 리눅스 셸 스크립트
데이터베이스 백업을 위해 많은 스크립트를 시도했지만 성공하지 못했습니다.매시간 데이터베이스를 백업하고 싶습니다.
"/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 -e
ubuntu에서 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
'programing' 카테고리의 다른 글
CSS에서 @media screen 및 (max-width: 1024px)는 무엇을 의미합니까? (0) | 2023.10.30 |
---|---|
wpdb 업데이트 쿼리가 작동하지 않음 (0) | 2023.10.30 |
MySQL에서 테이블 이름을 저장 프로시저 및/또는 함수 인수로 전달하는 방법은 무엇입니까? (0) | 2023.10.30 |
자바스크립트 문자열에서 순방향 슬래시를 글로벌하게 대체하는 방법은? (0) | 2023.10.30 |
0과 1사이의 신속한 무작위 유동 (0) | 2023.10.30 |