写一个脚本/root/mysqlbak.sh,备份mysql数据库 ?
参考回答
下面是一个基本的 mysqlbak.sh
脚本,用于备份 MySQL 数据库。这个脚本会定期备份数据库,并将备份存储到指定的目录中,文件名带有时间戳以避免覆盖。
脚本内容(/root/mysqlbak.sh
):
#!/bin/bash
# 设置 MySQL 用户和密码
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"
MYSQL_HOST="localhost"
# 备份文件存储目录
BACKUP_DIR="/root/mysql_backups"
DATE=(date +%Y%m%d%H%M%S) # 用当前时间戳命名备份文件
# 要备份的数据库列表
DATABASES=("database1" "database2" "database3") # 可以添加更多的数据库名
# 创建备份目录(如果不存在)
mkdir -p "BACKUP_DIR"
# 备份每个数据库
for DB in "{DATABASES[@]}"
do
BACKUP_FILE="BACKUP_DIR/DB-DATE.sql"
echo "正在备份数据库 DB 到BACKUP_FILE"
# 使用 mysqldump 命令备份数据库
mysqldump -u "MYSQL_USER" -p"MYSQL_PASSWORD" -h "MYSQL_HOST" "DB" > "BACKUP_FILE"
# 检查备份是否成功
if [? -eq 0 ]; then
echo "数据库 DB 备份成功"
else
echo "数据库DB 备份失败"
fi
done
# 删除超过 7 天的备份文件(可选,保持备份文件清理)
find "$BACKUP_DIR" -type f -name "*.sql" -mtime +7 -exec rm -f {} \;
echo "备份过程完成"
详细讲解与拓展
- 变量配置:
MYSQL_USER
:MySQL 用户名,这里设置为root
。MYSQL_PASSWORD
:MySQL 用户密码,替换为你的实际密码。MYSQL_HOST
:MySQL 服务器的主机地址,默认为localhost
。BACKUP_DIR
:备份文件存储的目录,这里设置为/root/mysql_backups
。DATE
:备份文件的时间戳,用当前日期和时间生成文件名。
- 备份数据库:
- 使用
mysqldump
命令来备份每个数据库。命令格式为:mysqldump -u "MYSQL_USER" -p"MYSQL_PASSWORD" -h "MYSQL_HOST" "DB" > "$BACKUP_FILE"
- 其中,
-u
是指定 MySQL 用户名,-p
是指定密码,-h
是指定 MySQL 服务器主机名,最后是数据库名。 - 备份文件将保存为
database_name-YYYYMMDDHHMMSS.sql
的形式,确保文件名唯一。
- 使用
- 删除过期备份:
- 使用
find
命令删除超过 7 天的备份文件:find "$BACKUP_DIR" -type f -name "*.sql" -mtime +7 -exec rm -f {} \;
-mtime +7
表示查找修改时间超过 7 天的文件,-exec rm -f
删除这些文件。
- 使用
- 执行状态检查:
- 每次备份后,检查
mysqldump
的返回值$?
。如果返回值为0
,表示备份成功;否则表示备份失败。
- 每次备份后,检查
如何使用该脚本
- 保存脚本:
将脚本保存为/root/mysqlbak.sh
。 -
赋予执行权限:
sudo chmod +x /root/mysqlbak.sh
- 手动运行备份:
直接执行脚本进行手动备份:/root/mysqlbak.sh
- 定期备份(可选):
可以通过crontab
定期运行脚本进行自动备份。例如,每天凌晨 2 点执行该脚本:crontab -e
添加以下行:
0 2 * * * /root/mysqlbak.sh
总结
- 该脚本通过
mysqldump
工具进行 MySQL 数据库的备份。 - 备份的文件以时间戳命名,避免覆盖。
- 支持定期清理超过 7 天的备份文件,保持备份目录的整洁。
- 可以通过
cron
定时执行,自动化数据库备份任务。