oracle数据库自动备份:
新建oracle_databak.sh文件,并赋予可执行权限、oracle用户权限
2.新建user.txt(用于存放oracle数据库用户名密码)文件,并赋予读写权限
3.编写oracle_databak.sh脚本
功能说明:
1.删除bakdir目录中的原文件,
脚本内容如下:
#!/bin/sh
export ORACLE_BASE=/data/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export ORACLE_SID=nccd
export PATH=$ORACLE_HOME/bin:$HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export LANG=C
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"
wj=/data/backup
bakdir=/data/backup/dmpback
USER_FILE=Oracle_user.txt
cd $wj
#rm -rf $bakdir/*
#echo "删除原备份文件$bakdir"
delday=15
lso=$(cat $USER_FILE | wc -l)
echo $lso
for((line=0;"$lso" > "$line";line++));
do
userdata=$(cat $USER_FILE |head -n $line|tail -n 1|awk -F/ '{print $1}')
passdata=$(cat $USER_FILE |head -n $line|tail -n 1|awk -F/ '{print $2}')
date>>ora_bak_$(date +%Y%m%d).log
echo "这是第"$line"行" >>ora_bak_$(date +%Y%m%d).log
echo $userdata "密码" $passdata >>ora_bak_$(date +%Y%m%d).log
if [ "$userdata" = "" ];then
echo "$userdata为空">>ora_bak_$(date +%Y%m%d).log
else
echo "exp $userdata/$passdata@nccd grants=y file=$bakdir/$userdata"_"$(date +%Y%m%d).dmp log=$bakdir/$userdata"_"$(date +%Y%m%d).log" >>ora_bak_$(date +%Y%m%d).log
exp $userdata/$passdata@nccd grants=y file=$bakdir/$userdata"_"$(date +%Y%m%d).dmp log=$bakdir/$userdata"_"$(date +%Y%m%d).log
tar -zcPf $bakdir/$userdata"_"$(date +%Y%m%d).tar.gz $bakdir/$userdata"_"$(date +%Y%m%d).dmp $bakdir/$userdata"_"$(date +%Y%m%d).log
if [ $? -eq 0 ] ; then
echo "$userdata压缩成功">>ora_bak_$(date +%Y%m%d).log
sleep 1
rm -rf $bakdir/*.log
rm -rf $bakdir/*.dmp
#find /data/backup/dmpback -mtime +$delday -name "*.dmp" -exec rm -rf {} \;
#find /data/backup/dmpback -mtime +$delday -name "*.log" -exec rm -rf {} \;
find /data/backup -mtime +$delday -name "*.log" -exec rm -rf {} \;
echo "删除dmp、log文件成功!">>ora_bak_$(date +%Y%m%d).log
scp $bakdir/$userdata"_"$(date +%Y%m%d).tar.gz [email protected]:/data/36/oracle
if [ $? -eq 0 ] ; then
# rm -rf $bakdir/$userdata"_"$(date +%Y%m%d).tar.gz
echo "$(date +%Y%m%d).tar.gz传送成功">>ora_bak_$(date +%Y%m%d).log
echo -e "\n">>ora_bak_$(date +%Y%m%d).log
else
echo "传送失败">>ora_bak_$(date +%Y%m%d).log
fi
sleep 1
else
echo "压缩失败">>ora_bak_$(date +%Y%m%d).log
fi
fi
done
echo "结束">>ora_bak_$(date +%Y%m%d).log
echo -e "*********************************************************************************************************\n*********************************************************************************************************">>ora_bak_$(date +%Y%m%d).log
exit
4.scp命令使用前需要进行如下配置
下面是实现scp无密码登录
1)在 A 上运行 ssh-keygen -t rsa 在/root/.ssh 下生成id_rsa 和 id_rsa.pub 两个文件
在/root/.ssh下复制备份一份id_rsa.pub 命名为 id_rsa.pub.A
2)在 B 上也同样运行 ssh-keygen -t rsa
3)在 B 的 /root/.ssh 下创建authorized_keys文件 把A 中 id_rsa.pub.A 文件 传到 B /root/.ssh 下
通过 cat 命令 把id_rsa.pub.A 写到 authorized_keys 文件中
scp ./id_rsa.pub.A B的IP:/root/.ssh
cat id_rsa.pub.A >> authorized_keys
测试:最终从B服务器拷贝文件到A上,就无需输入密码了
在生成密钥的过程中,一直Enter即可,否则还是需要输入设置的密码
5.设置定时执行
1)查看是否安装和运行cron
ps -ef | grep cron
rpm -qa | grep crontab
2)服务命令
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看服务状态
3)添加定时任务
crontab -e
4)查看已添加的定时任务
crontab -l
5)crontab格式
* * * * * command
minute hour day month week command
分 时 天 月 星期 命令
15 8 * * * /home/backup.sh 每天8点15执行一次脚本
答疑:
1、第一次执行scp的时候会出现warning,这时候要输入“yes”。所以脚本编写完一定要手动执行一遍,防止定时执行失败
2、在win下编写shell时,换行符为:\n\r,而在linux下为:\n ,因此在win下编写的脚本在linux下运行会报错,尽量避免这个问题。
3.https://tool.lu/crontab可计算crontab执行时间
mysql数据库自动
1.备份脚本:
#!/bin/sh
#mysql数据库批量备份
# Database info
DB_USER="root"
DB_PASS="nccd36"
DB_HOST="192.168.200.36"
BAK_SERVER="192.168.200.41"
BAK_SERVER_file=/data/36/mysql
# Others vars
#the mysql bin path
BIN_DIR=/usr/bin
#the backup file directory
BCK_DIR=/data/backup/mysqlbackup
DATE=`date +%F`
DEL_DAY=15
USER_FILE=Mysql_user.txt
ROWS_NUM=$(cat $USER_FILE | wc -l)
echo $ROWS_NUM >> mysql_baklog_$(date +%Y%m%d).log
for((line=0;"$ROWS_NUM" > "$line";line++));
do
DB_NAME=$(cat $USER_FILE |head -n $line|tail -n 1|awk -F/ '{print $1}')
echo "这是第"$line"行" >> mysql_baklog_$(date +%Y%m%d).log
echo $DB_NAME>>mysql_baklog_$(date +%Y%m%d).log
if [ "$DB_NAME" = "" ];then
echo "$DB_NAME为空">>mysql_baklog_$(date +%Y%m%d).log
else
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME --skip-lock-tables|gzip > $BCK_DIR/$DB_NAME"_"$DATE.sql.zip
echo "$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME --skip-lock-tables|gzip > $BCK_DIR/$DB_NAME"_"$DATE.sql.zip" >>mysql_baklog_$(date +%Y%m%d).log
if [ $? -eq 0 ] ; then
echo "$userdata压缩成功">>mysql_baklog_$(date +%Y%m%d).log
sleep 1
find /data/backup/mysqlbackup -mtime +$DEL_DAY -name "*.zip" -exec rm -rf {} \;
echo "删除$DEL_DAY天前的$BCK_DIR/$DB_NAME"_"$DATE.sql.zip文件成功!">>mysql_baklog_$(date +%Y%m%d).log
scp $BCK_DIR/$DB_NAME"_"$DATE.sql.zip root@$BAK_SERVER:$BAK_SERVER_file
if [ $? -eq 0 ] ; then
echo "$BCK_DIR/$DB_NAME_$DATE.sql.zip传送至备份服务器:$BAK_SERVER 文件夹:$BAK_SERVER_file成功!">>mysql_baklog_$(date +%Y%m%d).log
echo -e "\n">>mysql_baklog_$(date +%Y%m%d).log
else
echo "传送失败">>mysql_baklog_$(date +%Y%m%d).log
fi
sleep 1
else
echo "$BCK_DIR/$DB_NAME_$DATE.sql.zip压缩失败">>mysql_baklog_$(date +%Y%m%d).log
fi
fi
done
echo "结束">>mysql_baklog_$(date +%Y%m%d).log
echo -e "*********************************************************************************************************\n*********************************************************************************************************">>mysql_baklog_$(date +%Y%m%d).log
exit
# *********************还原数据库**************************
# 把 *.sql.zip 使用gunzip 或 本地的解压软件 解压为 *.sql 文件
# 用mysql-front导入前一天的 *.sql 文件即可恢复数据
#1、恢复到指定数据库
#mysql -hhostname -uusername -ppassword databasename < backupfile.sql
#2、还原压缩的MySQL数据备份文件
#gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
#3、直接将备份导入到新的数据库
#mysqldump -uusername -ppassword databasename | mysql -host=192.168.1.101 -C databasename
#4、使用source导入sql文件
#mysql > use cmdb
#mysql > source /data/cmdb_backup.sql