在 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 :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。