最近有一个需求是需要在后台实现定时备份mysql,但是因为java和mysql都是部署在docker里面,容器之间似乎没有办法通信,试了一天一夜,终于让我找到了方法解决。
docker run -d -p 8094:8095 -v /data/images/:/data/images/ -v /data/upload/:/data/upload/ -v /data/cert:/data/cert -v /data/backup:/data/backup -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -e SPRING_PROFILES_ACTIVE=uat --name shanhai-proj shanhai-proj
java挂载的容器需要加上
-v /var/run/docker.sock:/var/run/docker.sock
-v $(which docker):/usr/bin/docker
这样就可以跨容器使用docker语句了。
备份的脚本代码:
#!/bin/bash
# 数据库配置
DB_USER="root"
DB_PASSWORD="root"
DB_NAME="dbName"
DB_HOST="3306"
BACKUP_DIR="/data/backup"
#BACKUP_DAYS=1 # 设置自动备份的天数
#mkdir -p "$BACKUP_DIR"
# 当前日期
DATE=$(date +%Y%m%d%H%M)
# 备份文件名
BACKUP_FILE="$BACKUP_DIR/$DB_NAME-$DATE.sql"
docker exec mysql mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_FILE
echo $BACKUP_FILE
# 删除旧备份
#find $BACKUP_DIR -type f -name "*.sql" -mtime +$BACKUP_DAYS -exec rm -f {} ;
还原数据库的脚本代码:
#!/bin/bash
# 数据库配置
DB_USER="root"
DB_PASSWORD="root"
DB_NAME="dbName"
DB_HOST="3306"
BACKUP_DIR="/data/backup"
# 备份文件名
#BACKUP_FILE="$BACKUP_DIR/$DB_NAME-$DATE.sql"
BACKUP_FILE_NAME="$1"
BACKUP_FILE="$BACKUP_DIR/$BACKUP_FILE_NAME"
docker exec -i mysql mysql -u$DB_USER -p$DB_PASSWORD $DB_NAME <$BACKUP_FILE
if [ $? -eq 0 ]; then
echo "Restore succeeded: $BACKUP_FILE"
else
echo "Restore failed.: $BACKUP_FILE"
fi
# 删除旧备份
#find $BACKUP_DIR -type f -name "*.sql" -mtime +$BACKUP_DAYS -exec rm -f {} ;