vlambda博客
学习文章列表

linux下,批量进行oracle/mysql数据自动备份

oracle数据库自动备份:

  1. 新建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