簡體   English   中英

Bash 中的 MySQL 備份腳本

[英]MySQL Backup Script in Bash

參考http://www.rsnapshot.org/howto/1.2/rsnapshot-HOWTO.en.html 4.3.9。 備份腳本

如果創建新數據庫,我需要動態備份所有 mysql 數據庫。 有沒有一種理想的方法可以用最少的代碼在 bash 中做到這一點?

我需要登錄到 mysql 並獲取所有數據庫嗎?

似乎您想要一個 bash 腳本在 MySQL 中創建的動態數據庫上運行備份。 您可以在根目錄下的my.cnf 或bash 腳本中的#[Define Variables] 下添加mysql root 用戶帳戶信息。

您將需要使用 chmod bash 腳本

$sudo chmod +x backupmysql.sh

這將允許您使用以下命令運行腳本。

$sudo ./backupmysql.sh

您可以隨意命名腳本。 在本例中,我將其命名為 backupmysql.sh。

這是 bash 腳本:

#!/bin/bash

# [ Define Variables ]
HOST=`hostname -s`
syslogtag=MySQL-Backup
DEST=/var/dba/backup/
DBS="$(mysql -u root -Bse 'show databases' | egrep -v '^Database$|hold$' | grep -v 'performance_schema\|information_schema')"
DATE=$(date +'%F')

#[ Individually dump all databases with date stamps ]
for db in ${DBS[@]};
do  

GZ_FILENAME=$HOST-$db-$DATE.sql.gz
mysqldump -u root --quote-names --opt --single-transaction --quick $db > $DEST$HOST-$db-$DATE.sql
ERR=$?

if [ $ERR != 0 ]; then
NOTIFY_MESSAGE="Error: $ERR, while backing up database: $db"
logger -i -t ${syslogtag} "MySQL Database Backup FAILED; Database: $db"
else
NOTIFY_MESSAGE="Successfully backed up database: $db "
logger -i -t ${syslogtag} "MySQL Database Backup Successful; Database: $db"
fi
echo $NOTIFY_MESSAGE
done

如果你有大文件要備份,你可以將mysqldump的bash腳本中的語句替換為gzip壓縮文件。

mysqldump -u root --quote-names --opt --single-transaction --quick $db | gzip -cf > $DEST$HOST-$db-$DATE.sql.gz

您可以使用 gunzip 解壓縮文件。

mysqldump命令有一個--all-databases選項,可以一次性備份每個數據庫。

唯一的缺點是你必須一起恢復它們,你沒有挑選和選擇的奢侈。

請記住,數據庫通常在您的 MySQL 數據目錄中有一個關聯目錄,因此您始終可以遍歷這些目錄以找出存在哪些數據庫。

對於 mysql 本地系統進程,我使用:

#!/bin/bash

DEFAULTSFILE=/etc/my.cnf.d/.backups.cnf
BACKUPDIR=/root/db_backups
SAVEIFS=$IFS

# get list of dbs with field name (Database)

DBLIST=$(mysql -e "show databases" | cut -d ' '  -f 2 | grep -v Database)
IFS=$'\n'
DBLIST=($DBLIST)

# create backups directory if it doesn't exist

[ -d $BACKUPDIR ] || mkdir -p $BACKUPDIR

# make a single dump file for all databases in case entire server needs to be restored:

echo "Dumping all databases..."
mysqldump --defaults-file=$DEFAULTSFILE --all-databases > $BACKUP_DIR/$(date +%Y%m%d).all.sql
echo "Done dumping all databases."

# backup each database into it's own file to facilitate discrete restoration:

for (( i=0; i<${#DBLIST[@]}; i++ ))
do
  echo "starting dump of  ${DBLIST[$i]}..."
  mysqldump --defaults-file=$DEFAULTSFILE ${DBLIST[$i]} --skip-lock-tables > $BACKUPDIR/$(date +%Y%m%d).${DBLIST[$i]}.sql
  echo "done dumping ${DBLIST[$i]}."
done
IFS=$SAVEIFS

# gzip the sql files in-place to save space

gzip -f $BACKUPDIR/*.sql

# delete sql files older than 7 days

find $BACKUPDIR -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

對於 docker,事情略有不同:

#!/bin/bash
DEFAULTSFILE=/etc/my.cnf.d/.backups.cnf
BACKUPDIR=/root/db_backups
SAVEIFS=$IFS

# get list of dbs with field name (Database) and information_schema excluded. information_schema hangs during dumps

DBLIST=$(docker exec mysql mysql --defaults-file=/etc/my.cnf.d/.backups.cnf -e "show databases" | cut -d ' '  -f 2 | grep -v Database)
IFS=$'\n'
DBLIST=($DBLIST)

# create backups directory if it doesn't exist

[ -d $BACKUPDIR ] || mkdir -p $BACKUPDIR

# backup each database into it's own file to facilitate discrete restoration:

for (( i=0; i<${#DBLIST[@]}; i++ ))
do
  echo "starting dump of  ${DBLIST[$i]}..."
  docker exec mysql mysqldump --defaults-file=$DEFAULTSFILE ${DBLIST[$i]} --skip-lock-tables > $BACKUPDIR/$(date +%Y%m%d).${DBLIST[$i]}.sql
  echo "done dumping ${DBLIST[$i]}."
done
IFS=$SAVEIFS

# gzip the sql files in-place to save space

gzip -f $BACKUPDIR/*.sql

# delete sql files older than 7 days

find $BACKUPDIR -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

我一直無法讓 --all-databases 為 docker 工作。 反正我不喜歡多合一備份...

我將這些直接扔到 root 的 crontab 中,它們工作正常......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM