引言
在 linux 做自動化其實非常方便,不會像windows一樣受制于系統的配置以及桌面環境。Linux 完全沒有這些負擔,一個 Bash 就搞定了。
今天我們分享一段基本的 Bash 代碼,實現 MySQL 數據庫備份,并通過網絡連接拷貝到遠程服務器目錄。

代碼時間
首先聲明所使用的解釋器:
#!/bin/bash
聲明時間戳變量:
TIMESTAMP=$(date +"%F")
然后是 MYSQL 操作所使用到的變量:
MYSQL="/usr/bin/mysql"
MYSQL_USER="{mysql_user_with_DBAdmin_permits}"
MYSQL_PASSword="{mysql_user_password}"
MYSQLDUMP="/usr/bin/mysqldump"
我們指定了 mysql 應用位置,以及 mysqldump 工具的絕對路徑。還有連接數據庫所使用的用戶名和密碼。
接著是 Samba 服務器的遠程掛載目錄相關的變量:
SMB_BACKUP_DIR="/mnt/backup"
SMB_BACKUP_SOURCE="//{path_to_network_share}"
SMB_BACKUP_USER="{network_user_with_permits_to_share}"
SMB_BACKUP_PASSWORD="{network_user_password}"
指定了備份的目錄,以及原始目錄,還有訪問遠程目錄所使用的用戶名和密碼。
為了方便操作,再使用一個完整的備份文件路徑變量:
BACKUP_DIR="$SMB_BACKUP_DIR/$TIMESTAMP"
下面是邏輯過程。
如果用于映射 Samba 遠程目錄的備份目錄不存在,就創建:
[[ ! -d "$SMB_BACKUP_DIR" ]] && mkdir -p $SMB_BACKUP_DIR
然后,我們把遠程通過網絡訪問的 Samba 服務器地址,掛載到本地目錄,同時傳遞訪問的用戶授權信息。
mount -t cifs "$SMB_BACKUP_SOURCE" "$SMB_BACKUP_DIR" -o username="$SMB_BACKUP_USER",password="$SMB_BACKUP_PASSWORD"
注意文件類型一定是 cifs (Common Internet File System) 類型,需要 linux kernel 內核支持該文件系統。
如果需要備份的目錄不存在,就創建:
[[ ! -d "$BACKUP_DIR" ]] && mkdir -p $BACKUP_DIR
下面是數據庫的備份。
我們把 MySQL 的數據庫遍歷出來:
databases=`$MYSQL --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`
結果就是本地所有數據庫名稱,然后我們使用循環,逐一導出數據,并壓縮到 $BACKUP_DIR ,文件名稱是數據庫名 + gz 后綴。
for db in $databases; do
$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/$db.gz"
done
好了,不知道會有多久這個任務執行完畢,就可以不用掛載遠程 Samba 目錄了,因為這很耗費網絡資源。
umount $SMB_BACKUP_DIR
寫在最后
本文我們通過一個簡單的需求,在 Linux 下實現了 MySQL 自動備份到指定目錄。同時掛載 Samba 遠程目錄,將數據庫備份到異地。
邏輯很清晰,實現很簡單,也沒有復雜的過程,很適合自動化工作。
HAppy coding :_)
我是 @程序員小助手 ,持續分享編程知識,歡迎關注。