本文主要讲述了mysql数据库的备份和迁移;oracle的肯定是备份和数据迁移,同时介绍了linux的定时任务。
一、mysql
Docker容器下mysql备份方法
1、数据库备份
# 进入容器
docker exec -it 《containerId容器id》 /bin/bash
# mysqldump命令备份并生成数据库文件db_name.db
mysqldump -u root -p 《db_name数据库名称》 > /home/db_name.db
# 将容器内文件复制到/home/inspuriot/目录下,便于下载迁移
docker ps
docker cp 162c4c8de496:/home/db_name.db /home/inspuriot/
2、数据库迁移
# 数据库导入
mysql -u root -p 《db_name数据库名称》 < /data/sql/db_.db
二、Oracle
1、创建工作目录
工作目录为数据库导入和导出存放的地址。
首先在服务器下创建目录;
mkdir /data/sqlbak/bakdata
然后在数据库中创建目录:
数据库导出操作目录:BAKDIR
create directory bakdir as '/data/sqlbak/bakdata';
grant read,write on directory bakdir to jtg;
grant read,write on directory bakdir to system;
2、数据库定期备份脚本
#! /bin/bash
# 备份和恢复脚本
# 注意:脚本首先会在执行目录生成sql文件,配置定时任务注意首先切换目录
#db用户名
dbuser=jtg
#db密码
dbpasswd="name\password"
#ip地址
dbip=127.0.0.1
#备份的数据库
db_list="JTG"
#备份目录
bakdir=/data/sqlbak/bakdata
#备份操作的日志文件
bakfile=/data/sqlbak/exp_log.log
#备份数据的目录
bakdatadir=/data/sqlbak/bakdata
#备份数据的目录-持久化备份
persist_path=/data/sqlbak/persistdata
#备份保存时间,单位: 天
dateoutday=10
actDumpDir=/u01/app/oracle/admin/ksmt/dpdump
#备份单个数据库
bak_single()
{
cd ${bakdatadir}
#db name
sdb=$1
#日期字符串
datestr=$2
if [ ! ${datestr} ]; then
datestr=$(date "+%Y_%m_%d_%H_%M_%S")
fi
echo "bak_single ${sdb}_${datestr}_bak.dmp.gz BEGIN..." >> ${bakfile}
#!/bin/bash
# 设置Oracle环境变量
# export ORACLE_HOME=/home/oracle
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
export ORACLE_SID=ksmt
export PATH=$ORACLE_HOME/bin:$PATH
#指定directory名字
export DIRECTORE_NAME='BAKDIR'
# 指定备份文件名
backup_file="${sdb}_${datestr}_bak.dmp"
echo "${datestr}===================================数据库备份开始================================" >> ${bakfile}
# 执行数据库备份
expdp ${dbuser}/${dbpasswd}@《数据库ip地址:端口》/ksmt dumpfile=$backup_file DIRECTORY=${DIRECTORE_NAME} schemas=${dbuser}
# 记录数据库备份日志
cat ${bakdatadir}/export.log >> ${bakfile}
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "数据库备份文件生成: "+${bakdatadir}/${backup_file} >> ${bakfile}
echo "数据库备份成功!" >> ${bakfile}
else
echo "数据库备份失败!" >> ${bakfile}
fi
gzip ${bakdatadir}/${backup_file}
#记录日志
echo "bak_single ${sdb}_${datestr}_bak.dmp.gz COMPLETE..." >> ${bakfile}
}
#备份所有数据库
bak_all()
{
#日期字符串
all_datestr=$(date "+%Y_%m_%d_%H_%M_%S")
#
date_dir=$(date "+%Y%m%d")
date_month_dir=$(date "+%Y%m")
#
echo "bak_all begin ${all_datestr} ====================" >> ${bakfile}
bak_single JTG ${all_datestr}
#等待所有数据库备份完成
wait
#压缩
tar czvf dbbak_${all_datestr}.tar *_${all_datestr}_bak.dmp.gz
#删除
rm *_${all_datestr}_bak.dmp.gz
#是否存在当天日期命名的目录
if [ ! -d ${bakdatadir}/${date_dir} ]; then
mkdir -p ${bakdatadir}/${date_dir}
fi
#移动到当天日期命名的目录中
mv dbbak_${all_datestr}.tar ${bakdatadir}/${date_dir}
#是否存在当月日期命名的目录(持久化存储-1月1次)
if [ ! -d ${persist_path}/${date_month_dir} ]; then
mkdir -p ${persist_path}/${date_month_dir}
#复制备份数据文件到持久化目录中
echo "bak_all 保存到持久化目录:${persist_path}/${date_month_dir} ====================" >> ${bakfile}
cp ${bakdatadir}/${date_dir}/dbbak_${all_datestr}.tar ${persist_path}/${date_month_dir}
fi
echo "bak_all finish dbbak_${all_datestr}.tar ====================" >> ${bakfile}
}
#检查过期备份
check_date_out()
{
#当前目录
curpath=`pwd`
#当前日期
curdate=$(date "+%Y%m%d")
#最早的保存日期
lastdate=`date -d "${curdate} - ${dateoutday} day" +%Y%m%d`
#进入备份目录
cd ${bakdatadir}
# echo "备份目录${bakdatadir}"
#目录列表
pathlst=`ls *`
#检查目录是否过期,删除已过期的目录
# for tmpdate in ${pathlst[*]}; do
for tmpdate in `ls`; do
echo "遍历目录${bakdatadir}"
if [ ${tmpdate} -le ${lastdate} ]; then
rm -rf ${tmpdate}
echo "check_date_out, curdate:${curdate} delete ${tmpdate} " >> ${bakfile}
fi
done
#回到当前目录
cd ${curpath}
}
recoverTables(){
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
export ORACLE_SID=《数据库实例名》
export PATH=$ORACLE_HOME/bin:$PATH
#指定directory名字
export DIRECTORE_NAME='BAKDIR'
# 文件路径
dmpFilePath=$1
# 表名
tableName=$2
dmpTarFileName=$(basename ${dmpFilePath})
echo "dmpTarFileName=${dmpTarFileName}"
dmpFileName=${dmpTarFileName%%.*}
echo "dmpFileName=${dmpFileName}"
cp -v ${dmpFilePath} ${bakdir}
cd ${bakdir}
tar -zxvf ${dmpTarFileName}
dmpName=${dmpFileName: 6}
echo "dmpName=${dmpName}"
dmpDbFileName=JTG_${dmpName}_bak.dmp
echo "dmpDbFileName=${dmpDbFileName}"
gunzip ${dmpDbFileName}.gz
echo "=====================数据库恢复开始==(表:$tableName)======================="
impdp ${dbuser}/${dbpasswd}@《ip地址:端口》/ksmt dumpfile=$dmpDbFileName DIRECTORY=${DIRECTORE_NAME} tables=$2 table_exists_action=truncate
}
case "$1" in
s)
bak_single $2 $3
;;
a)
bak_all
;;
chk)
check_date_out
;;
rec)
recoverTables $2 $3
;;
*)
echo "Please use correct command..."
;;
esac
3、服务器定时任务 执行数据库备份脚本
# 文件执行权限
chmod +x oraclebackup.sh
su - oracle
crontab -e
# 每隔一天0点52分备份数据库
0 52 0 1/2 * ? /data/oraclebackup.sh a
# 每隔一天1点52分备份数据库
0 52 1 1/2 * ? /data/oraclebackup.sh chk
service crond restart
4、数据表恢复
# 示例:手动恢复表FACTORY_CHECK_TASK_COPY0113
sh oraclebackup.sh rec /data/sqlbak/bakdata/20240117/dbbak_2024_01_17_09_56_33.tar FACTORY_CHECK_TASK_COPY0113