常用数据库备份与恢复

注意: 将Windows环境写的shell脚本,放入Linux环境运行,可能会出现以下问题: ./boot.sh:行3: $'\r': 未找到命令
解决: 在linux中用vi打开脚本文件,在命令模式下输入:set ff=unix set ff=unix,设置格式为unix格式
注意: 该操作在 Docker 环境下

MySQL数据库

备份

1. 新建备份脚本保存目录

arduino 复制代码
mkdir -p /home/southgisbackup/script

2. 新建备份脚本

bash 复制代码
vim /home/southgisbackup/script/mysql_bak.sh
# 写入以下内容(根据实际环境修改变量值)
bash 复制代码
#!/bin/bash
#容器名称
DOCKER_NAME=mysql  

#备份数据保存目录           
DATA_DIR=/home/southgisbackup/mysql_bak

#数据库用户名/密码
DB_USER=root
DB_PASS=Southgis@3306

#DAYS=2代表删除2天前的备份,即只保留近3天的备份
DAYS=2

echo "***************** 开始备份 *******************"

#创建备份数据保存目录和日志保存目录
mkdir -p $DATA_DIR/logs

#执行备份命令,并压缩备份数据(--all-databases表示是备份全部)
docker exec -i $DOCKER_NAME mysqldump -u$DB_USER -p$DB_PASS --all-databases | gzip > "$DATA_DIR/mysql_$(date +%Y%m%d%H%M).sql.gz"

#删除指定天数前的备份数据
find $DATA_DIR/ -mtime +$DAYS -name "mysql_*.sql.gz" -exec rm -f {} \;

#删除指定天数前的备份日志
find $DATA_DIR/logs -mtime +$DAYS -name "mysql_*_bak.log" -exec rm -f {} \;

echo "***************** 备份完成 *******************"

3.修改备份脚本执行权限

bash 复制代码
chmod +x /home/southgisbackup/script/mysql_bak.sh

4.创建定时执行任务

bash 复制代码
crontab -l #查看定时执行任务
crontab -e #编辑定时执行任务
# 每天凌晨3点执行mysql数据库备份,输出日志/home/southgisbackup/mysql_bak/logs/mysql_bak.log
0 3 * * * /bin/sh /home/southgisbackup/script/mysql_bak.sh >> /home/southgisbackup/mysql_bak/logs/mysql_$(date '+\%Y\%m\%d\%H\%M')_bak.log 2>&1

恢复

1. 解压备份数据

复制代码
gunzip mysql_202106240850.sql.gz 

2. 将备份数据拷贝到容器中

bash 复制代码
docker cp mysql_202106240850.sql mysql:/tmp/

3. 进入容器中

bash 复制代码
docker exec -it mysql /bin/bash

4. 恢复数据

shell 复制代码
mysql> source /tmp/mysql_202106240850.sql

MongoDB数据库

备份

1.新建备份脚本保存目录

arduino 复制代码
mkdir -p /home/southgisbackup/script

2. 新建备份脚本

bash 复制代码
vim /home/southgisbackup/script/mongodb_bak.sh
# 写入以下内容(根据实际环境修改变量值)
bash 复制代码
#!/bin/bash
#容器名称
DOCKER_NAME=mongodb 

#备份数据保存目录
DATA_DIR=/home/southgisbackup/mongodb_bak

#数据库用户名/密码
DB_NAME=imap_smart
DB_USER=imap_smart
DB_PASS=Southgis27017

#容器数据保存目录
DOCKER_DIR=/data/db

#本地数据保存目录
LOCAL_DIR=/home/southgisdata/mongodb/data

#DAYS=2代表删除2天前的备份,即只保留近3天的备份
DAYS=2 

echo "***************** 开始备份 *******************"

#创建备份数据目录和备份日志保存目录
mkdir -p $DATA_DIR/logs

#执行备份命令,备份数据
docker exec -i $DOCKER_NAME mongodump -u $DB_USER -p $DB_PASS -d $DB_NAME -o $DOCKER_DIR

#将备份的数据转移到数据备份目录下
mv $LOCAL_DIR/$DB_NAME $DATA_DIR

#压缩备份数据
cd $DATA_DIR
tar -zcf imap_smart_$(date +%Y%m%d%H%M).tar.gz $DB_NAME

#删除未压缩的备份数据
rm -rf $DB_NAME

#删除指定天数前的备份
find $DATA_DIR -mtime +$DAYS -name "imap_smart_*.tar.gz" -exec rm -f {} \;

#删除指定天数前的备份日志
find $DATA_DIR/logs -mtime +$DAYS -name "imap_smart_*_bak.log" -exec rm -f {} \;

echo "***************** 备份完成 *******************"

3.修改备份脚本执行权限

bash 复制代码
chmod +x /home/southgisbackup/script/mongodb_bak.sh

4.创建定时执行任务

bash 复制代码
crontab -l #查看定时执行任务
crontab -e #编辑定时执行任务
# 每天凌晨3点30分执行mongodb数据库备份,输出日志到/home/southgisbackup/mongodb_bak/logs下
30 3 * * * /bin/sh /home/southgisbackup/script/mongodb_bak.sh >> /home/southgisbackup/mongodb_bak/logs/imap_smart_$(date '+\%Y\%m\%d\%H\%M')_bak.log 2>&1

恢复

1. 解压备份数据

复制代码
tar -xvf mongodb_202106241505.tar.gz 

2. 将备份数据拷贝到容器本地挂载目录下

bash 复制代码
docker cp imap_smart /home/southgisdata/mongodb/data

3. 执行恢复命令,/data/db/imap-smart是容器中备份数据的目录

bash 复制代码
docker exec -it mongodb mongorestore -u imap_smart -p Southgis27017 -d imap_smart /data/db/imap_smart

PostGIS数据库

备份

1. 新建备份脚本保存目录

arduino 复制代码
mkdir -p /home/southgisbackup/script

2. 新建备份脚本

bash 复制代码
vim /home/southgisbackup/script/postgis_bak.sh
# 写入以下内容(根据实际环境修改变量值)

#!/bin/bash
#容器名称
DOCKER_NAME=postgis 

#备份数据保存目录
DATA_DIR=/home/southgisbackup/postgis_bak

#数据库用户名
USER=postgres

#DAYS=2代表删除2天前的备份,即只保留近3天的备份
DAYS=2 

echo "***************** 开始备份 *******************"

#创建备份数据保存目录
mkdir -p $DATA_DIR/logs

#执行备份命令,并压缩备份数据
docker exec -i $DOCKER_NAME pg_dumpall -U $USER | gzip > "$DATA_DIR/postgis_$(date +%Y%m%d%H%M).sql.gz"

#删除指定天数前的备份
find $DATA_DIR -mtime +$DAYS -name "postgis_*.sql.gz" -exec rm -f {} \;

#删除指定天数前的备份日志
find $DATA_DIR/logs -mtime +$DAYS -name "postgis_*_bak.log" -exec rm -f {} \;

echo "***************** 备份完成 *******************"

3.修改备份脚本执行权限

bash 复制代码
chmod +x /home/southgisbackup/script/postgis_bak.sh

4.创建定时执行任务

bash 复制代码
crontab -l #查看定时执行任务
crontab -e #编辑定时执行任务
# 每天凌晨4点执行postgis数据库备份,输出日志到/home/southgisbackup/postgis_bak/logs下
0 4 * * * /bin/sh /home/southgisbackup/script/postgis_bak.sh >> /home/southgisbackup/postgis_bak/logs/postgis_$(date '+\%Y\%m\%d\%H\%M')_bak.log 2>&1

注意:

直接执行备份命令可能会出现以下报错: createdb: could not connect to database postgres: FATAL: Peer authentication failed for user "postgres"

解决方法:

bash 复制代码
编辑 /etc/postgresql/11/main/pg_hba.conf
将
# Database administrative login by Unix domain socket
local   all             postgres                                peer
改为
# Database administrative login by Unix domain socket
local   all             postgres                                trust

docker中该文件的修改位置:

bash 复制代码
#查找该文件
find /var/lib/docker -name pg_hba.conf         
#修改该文件                    
vi /var/lib/docker/overlay2/d410bacbc00accbe1bef/merged/etc/postgis/11/main/pg_hba.conf

恢复

1. 解压备份数据

bash 复制代码
cd /home/southgissoftware/data/20210918
gunzip -c imap_dms_202109092332.sql.gz > /home/southgisdata/postgis/data/backup/imap_dms.sql

3.恢复备份数据

bash 复制代码
docker exec postgis psql -U postgres -f /var/lib/postgresql/data/backup/imap_dms.sql imap_dms

Redis数据库

备份

1.新建备份脚本保存目录

arduino 复制代码
mkdir -p /home/southgisbackup/script

2. 新建备份脚本

bash 复制代码
vim /home/southgisbackup/script/redis_bak.sh
# 写入以下内容(根据实际环境修改变量值)
bash 复制代码
#!/bin/bash
#容器名称
DOCKER_NAME=redis  

#备份数据保存目录
DATA_DIR=/home/southgisbackup/redis_bak

#数据库密码
DB_PASS=Southgis@6379

#DAYS=2代表删除2天前的备份,即只保留近3天的备份
DAYS=2 

echo "***************** 开始备份 *******************"

#创建备份数据目录和备份日志目录
mkdir -p $DATA_DIR/logs

#执行备份命令
docker exec -i redis redis-cli -a $DB_PASS save

#将redis备份从容器中复制到宿主机上
docker cp redis:/data/dump.rdb $DATA_DIR/dump.rdb

#压缩备份数据
cd $DATA_DIR
tar -zcf redis_$(date +%Y%m%d%H%M).tar.gz dump.rdb

#删除未压缩的备份数据
rm -f $DATA_DIR/dump.rdb

#删除指定天数前的备份数据
find $DATA_DIR/ -mtime +$DAYS -name "redis_*.tar.gz" -exec rm -f {} \;

#删除指定天数前的备份日志
find $DATA_DIR/logs -mtime +$DAYS -name "redis_*.tar.gz" -exec rm -f {} \;

echo "***************** 备份完成 *******************"

3.修改备份脚本执行权限

bash 复制代码
chmod +x /home/southgisbackup/script/redis_bak.sh

4.创建定时执行任务

bash 复制代码
crontab -l #查看定时执行任务
crontab -e #编辑定时执行任务
# 每天凌晨3点15分执行redis数据库备份,输出日志到/home/southgisbackup/redis_bak/logs下
15 3 * * * /bin/sh /home/southgisbackup/script/redis_bak.sh >> /home/southgisbackup/redis_bak/logs/redis_$(date '+\%Y\%m\%d\%H\%M')_bak.log 2>&1

恢复

1.解压备份数据

复制代码
tar -xvf redis_202106241617.tar.gz

2. 将备份的dump.rdb文件复制到需要恢复的机器上,放到 CONFIG GET dir 显示的目录下

bash 复制代码
redis 127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis/bin"

3. 重启redis

复制代码
docekr restart redis
perl 复制代码
#linux启动方式
#查看进程
ps -ef | grep redis
#杀掉进程
#重启
/usr/local/redis/bin/redis-server  &
相关推荐
zyseo85 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量
大数据·数据库·人工智能
xiaogai_gai7 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
数据工匠老o7 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案
数据库·架构
这个DBA有点耶8 小时前
银行业市占率最高的国产数据库是谁?先搞清楚“市占率”的四种口径
数据库·程序员·架构
用户6279947182629 小时前
南大通用GBase 8a之基于审计日志的冷温热数据分析
数据库
数据库小学妹9 小时前
数据库运维五级成熟度:监控、备份、高可用怎么串起来
运维·数据库·监控
一个天蝎座的程序猿9 小时前
为了给报表提速,我把金仓KES的列存储折腾了个遍:聊聊KES的技术能力
数据库
飞越未来云城的霓虹飞猪9 小时前
AI 数据库地图:从 PostgreSQL 到向量数据库,一次看懂 AI 时代的数据底座
数据库
不像程序员的程序媛9 小时前
导出mysql数据结构
数据库·mysql
GlobalTradercrb9 小时前
独立站SEO先写博客还是先优化产品页?看站点阶段
数据库·人工智能·google·pdf·go·seo