超全备份脚本!涵盖Oracle、MySQL、PG等主流数据库

指尖上的架构 2024-10-30 03:51:56

分享概要

1.Oracle RMAN备份

1.1 创建目录

1.2 编辑脚本

1.3 脚本授权

1.4 执行脚本

1.5 定时任务

1.6 备份删除

2.Oracle逻辑备份

2.1 生成目录

2.2 备份脚本

2.3 定时任务

3.MySQL逻辑全|增备份

3.1 开启binlog日志

3.2 全备脚本

3.3 增备脚本

3.4 定时任务

3.5 恢复步骤

4.MySQL PXB全/增备份

4.1 备份脚本

4.2 备份删除

4.3 定时任务

5.PostgreSQL逻辑备份

5.1 备份脚本

5.2 定时任务

5.3 备份恢复

6.PostgreSQL物理备份

6.1 备份脚本

6.2 备份恢复

7.openGauss备份

7.1 备份脚本

7.2 定时任务

7.3 备份清理

在日常运行过程中,为防止出现数据库故障、病毒或者用户操作不当而导致数据丢失,必须要有良好的预备方案,特分享主流数据库的Shell脚本给大家。

1.Oracle RMAN备份

1.1 创建目录

[oracle@OEL7 ~]$ mkdir -p /u01/dbbak/script[oracle@OEL7 ~]$ cd /u01/dbbak[oracle@OEL7 ~]$ chown -R oracle:oinstall script[oracle@OEL7 ~]$ mkdir -p /u01/dbbak/db[oracle@OEL7 ~]$ mkdir -p /u01/dbbak/arch[oracle@OEL7 ~]$ cd /u01/dbbak[oracle@OEL7 ~]$ chown -R oracle:oinstall db[oracle@OEL7 ~]$ chown -R oracle:oinstall arch

1.2 编辑脚本

[oracle@OEL7 ~]$ vi /u01/dbbak/script/rman_full.shexport ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1export ORACLE_SID=proddt=`date '+%Y%m%d_%H%M%S'`/u01/app/oracle/product/19.3.0/dbhome_1/bin/rman target / cmdfile=/u01/dbbak/script/backup.sh log=/u01/dbbak/log/log_$dt.log append[oracle@OEL7 ~]$ vi /u01/dbbak/script/backup.shrun{allocate channel c1 type disk; allocate channel c2 type disk; allocate channel c3 type disk;allocate channel c4 type disk;backup as compressed backupset database format '/u01/dbbak/db/DB%U.bkp' plus archivelog format '/u01/dbbak/arch/ARCH%U.bkp' delete all input;release channel c1; release channel c2; release channel c3;release channel c4;report obsolete;crosscheck copy;crosscheck archivelog all;delete noprompt obsolete;crosscheck backup;delete noprompt expired backup;}quit;EOF

1.3 脚本授权

[oracle@OEL7 ~]$ chmod 775 /u01/dbbak/script/backup.sh[oracle@OEL7 ~]$ chmod 775 /u01/dbbak/script/rman_full.sh

1.4 执行脚本

/u01/dbbak/script/rman_full.sh

1.5 定时任务

crontab -e 为编辑窗口[oracle@OEL7 ~]$ crontab -l0 2 * * * /u01/dbbak/script/rman_full.sh

1.6 备份删除

[oracle@OEL7 ~]$ rman target /RMAN> show all;--备份策略调整,备份保留7天CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

2.Oracle逻辑备份

2.1 生成目录

[oracle@OEL7 ~]$ mkdir -p /home/oracle/backup/dump[oracle@OEL7 ~]$ mkdir -p /home/oracle/backup/tars#使用expdp时需要先指定转储文件和日志文件所在的目录,可以通过如下命令实现SQL> CREATE OR REPLACE DIRECTORY scott_backup as '/home/oracle/backup/dump';SQL> grant read,write on directory scott_backup to public;

2.2 备份脚本

[oracle@OEL7 ~]$ vi /home/oracle/backup/exp_backup.sh#!/bin/bash#Oracle 环境变量NLS_LANG=AMERICAN_AMERICA.AL32UTF8ORACLE_SID=prodORACLE_BASE=/opt/oracleORACLE_HOME=/opt/oracle/11gPATH=$PATH:$ORACLE_HOME/bin:$HOME/binexport ORACLE_SID ORACLE_BASE ORACLE_HOME NLS_LANG PATH#获取时间戳#dump生成时间export BAKUPTIME=`date +%Y%m%d%H%M%S`#压缩文件存放目录export DATA_DIR=/home/oracle/backup/dumpexport TAR_DIR=/home/oracle/backup/tarscd $DATA_DIR echo "Starting bakup..."echo "Bakup file path $DATA_DIR/scott_expdp_$BAKUPTIME.dmp"#parallel=4 为并行度,对于备份大数据库有助于减少备份时间,但会增加CPU负载。expdp scott/tiger directory=scott_backup dumpfile=scott_expdp_$BAKUPTIME.dump logfile=scott_expdp_$BAKUPTIME.log parallel=4echo "Starting tar..."echo "Tar file path $TAR_DIR/SCOTT_$BAKUPTIME.tar.gz"tar -zcvf $TAR_DIR/scott_expdp_$BAKUPTIME.tar.gz scott_expdp*echo "Bakup job is done!"#历史dump文件保留7天find $DATA_DIR -type f -mtime +7 -exec rm -rf {} \;

2.3 定时任务

crontab -e 为编辑窗口[oracle@OEL7 ~]$ crontab -l0 3 * * * /home/oracle/backup/exp_backup.sh

3.MySQL逻辑全|增备份

3.1 开启binlog日志

binlog日志默认不开启,修改参数后重启MySQL数据库mysql> show variables like '%log_bin%';# vim /etc/my.cnflog_bin=ONlog_bin_basename=/home/mysql/mysql-binlog_bin_index=/home/mysql/mysql-bin.index## 参数说明log_bin:开启binlog日志文件,默认值为OFF。log_bin_basename:binlog日志的基本文件名。MySQL会在该文件名后追加标识来表示每一个binlog文件。log_bin_index:binlog文件的索引文件,管理所有的binlog文件。

3.2 全备脚本

# mkdir -p /home/mysql/daily# mkdir -p /home/mysql/backup# vi /home/mysql/Mysql-FullyBak.sh#mysqldump to Fully backup mysql data per week!source /etc/profileBakDir=/home/mysql/backupLogFile=/home/mysql/backup/bak.logDate=`date +%Y%m%d`Begin=`date +"%Y年%m月%d日 %H:%M:%S"`cd $BakDirDumpFile=$Date.sqlGZDumpFile=$Date.sql.tgz/usr/bin/mysqldump -uroot -proot --quick --events --databases wmp --flush-logs --delete-master-logs --single-transaction >$DumpFile/bin/tar -zvcf $GZDumpFile $DumpFile/bin/rm $DumpFileoldDate=`date -d '7 days ago' +%Y%m%d`oldBakFile=${oldDate}".sql.tgz"/bin/rm $oldBakFileLast=`date +"%Y年%m月%d日 %H:%M:%S"`echo 开始:$Begin 结束:$Last $GZDumpFile succ >> $LogFilecd $BakDir/daily/bin/rm -f *

3.3 增备脚本

# vi /home/mysql/Mysql-DailyBak.sh#use cp to bakup mysql data everyday!source /etc/profileBakDir=/home/mysql/backup/dailyBinDir=/home/mysql/mysql-binLogFile=/home/mysql/backup/bak.logBinFile=/home/mysql/mysql-bin/mysql-bin.index/usr/bin/mysqladmin -uroot -proot flush-logsCounter=`wc -l $BinFile |awk '{print $1}'` #产生新的mysql-bin.00000*文件NextNum=0#比对$Counter和¥NextNum这两个值来确定文件是不是最新的for file in `cat $BinFile`do base=`basename $file` #basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./ NextNum=`expr $NextNum + 1` if [[ $NextNum -eq $Counter ]] then echo $base skip! >> $LogFile else dest=$BakDir/$base if(test -e $dest) #test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去 then echo $base exist! >> $LogFile else cp $BinDir/$base $BakDir echo $base copying >> $LogFile fifidone

3.4 定时任务

在命令行输入:#crontab -e添加相应的任务,wq存盘退出#每个星期日凌晨3:00执行完全备份脚本0 3 * * 0 /bin/bash -x /home/mysql/Mysql-FullyBak.sh >/dev/null 2>&1#周一到周六凌晨3:00做增量备份0 3 * * 1-6 /bin/bash -x /home/mysql/Mysql-DailyBak.sh >/dev/null 2>&1

3.5 恢复步骤

4.MySQL PXB全/增备份

Xtrabackup是一个开源的MySQL数据库备份工具,由Percona公司开发和维护

4.1 备份脚本

vi /home/mysql/scripts/backup.sh#!/bin/bashecho ""START_TIME=`date`echo "############## backup start at $START_TIME ##############"echo ""###you need install xtrabackup!#### Set envsource /home/mysql/.bash_profilewhich xtrabackup# Database InfoDB_USER="root"DB_PASS="jeames@123"CONF="/data/mysqldb/conf/mysql.conf"SOCKET="/data/mysqldb/socket/mysql.sock"BAK_BASE="/db_bak/mysql_bak/mysql"DATE=`date +%F`YESTERDAY=`date +%F -d "-1 days"`WEEK_DAY=`date +%w`BAK_DIR=$BAK_BASE/$DATE-$WEEK_DAY# Create Directory and backupif [ "$WEEK_DAY" == "6" ]; then xtrabackup --defaults-file=$CONF --socket=$SOCKET --backup --user=$DB_USER --password=$DB_PASS --target-dir=$BAK_DIR --compresselif [ "$WEEK_DAY" == "0" ]; then INCRE_BASE=$BAK_BASE/$YESTERDAY-6 xtrabackup --defaults-file=$CONF --socket=$SOCKET --backup --user=$DB_USER --password=$DB_PASS --target-dir=$BAK_DIR --incremental-basedir=$INCRE_BASE --compresselse INCRE_BASE=$BAK_BASE/$YESTERDAY-$[WEEK_DAY-1] xtrabackup --defaults-file=$CONF --socket=$SOCKET --backup --user=$DB_USER --password=$DB_PASS --target-dir=$BAK_DIR --incremental-basedir=$INCRE_BASE --compressfiecho ""END_TIME=`date`echo "############## backup end at $END_TIME ##############"echo ""

4.2 备份删除

vi /home/mysql/scripts/cleanup.sh#!/bin/bashecho ""START_TIME=`date`echo "############## clean up start at $START_TIME ##############"echo ""find /db_bak/mysql_bak/mysql -maxdepth 1 -type d -mtime +30find /db_bak/mysql_bak/mysql -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;echo ""END_TIME=`date`echo "############## clean up end at $END_TIME ##############"echo ""

4.3 定时任务

运行脚本每天凌晨 4:10 分清理 30 天之前的备份,每天 4:30 分使用 xtrabackup 进行备份,注意只有周六是全备,其他时间均是增备。#crontab -e10 4 * * * /home/mysql/scripts/cleanup.sh >> /home/mysql/scripts/cleanup.log 2>&130 4 * * * /home/mysql/scripts/backup.sh >> /home/mysql/scripts/backup.log 2>&1

5.PostgreSQL逻辑备份

以下是一个用于定时备份 PostgreSQL 数据库的示例脚本。这个脚本将使用 pg_dump 工具来创建数据库备份,然后将备份文件保存到指定的目录中,并可选择保留最近一段时间内的备份文件

5.1 备份脚本

vi /data/script_name.sh #!/bin/bash# PostgreSQL数据库相关信息db_host="localhost"db_port="5432"db_name="database_name"db_user="database_user"db_password="database_password"# 备份存储目录backup_dir="/data/backup/folder"# 保留备份的天数retention_days=7# 创建备份目录mkdir -p $backup_dir# 备份文件名backup_file="$backup_dir/backup_$(date +'%Y%m%d%H%M%S').sql"# 执行备份PGPASSWORD=$db_password pg_dump -h $db_host -p $db_port -U $db_user -F c -b -v -f "$backup_file" $db_nameif [ $? -eq 0 ]; then echo "数据库备份成功: $backup_file" # 删除旧的备份文件 find $backup_dir -name "backup_*.sql" -type f -mtime +$retention_days -exec rm -f {} \;else echo "数据库备份失败."fi

5.2 定时任务

在命令行输入:#crontab -e#每天定时凌晨2点定时任务0 2 * * * /data/script_name.sh

5.3 备份恢复

--恢复drop database jmedb;create database jmedb;;psql --file=jmedb.sql --先查看可否有创建数据库的语句 psql --dbname=db2 --file=jmedb.sql --先查看可否有创建数据库的语句

6.PostgreSQL物理备份

pg_rman是一个开源的PostgreSQL备份软件,pg_rman跑的不是流复制协议,而是文件拷贝,所以pg_rman必须和数据库Server安装在一起.

6.1 备份脚本

#!/bin/bashsource /home/postgres/.bash_profileDATE=`date +%Y%m%d`;PG_HOME=/home/postgresBACK_LOG=/home/postgres/log/pg_rman_${DATE}.log#START BACKUPecho "START BACKUP" > $BACK_LOG#执行备份命令pg_rman backup --backup-mode=full -B /rmanbk >> $BACK_LOG#备份集校验pg_rman validate >> $BACK_LOG#检查备份是否成功error_num=`pg_rman show | awk 'BEGIN{n=0}{if(NR > 3 && $8 != "OK")n++}END{print n}'`if [ $error_num > 0 ];then message="Postgres 数据库服务器${hostname}在${DATE}备份失败" echo $messagefi#清理无效备份集pg_rman purge >> $BACK_LOGecho "BACKUP END" >> $BACK_LOG

6.2 备份恢复

--原地恢复,使用新的$PGDATA恢复pg_ctl stop rm -rf /postgresql/pgdata/ pg_rman restore -B /rmanbk-- 检查配置文件是否有问题,若无问题则可以启动PGpg_ctl start--检验数据是否正确启动PG后,会删除recovery.signal文件

7.openGauss备份

7.1 备份脚本

vi /home/omm/backup.sh# database dump shell# you should change the GAUSSHOME GAUSSPORT GAUSSDATA DUMP_USER DUMP_PASSWORD#!/bin/bashsource /etc/profilesource /home/omm/.bash_profileexport GAUSSHOME=/opt/gaussdb/appexport GAUSSPORT=26000export GAUSSDATA=/gaussdb/data/dn1export PATH=$PGHOME/bin:$PATHDUMP_USER=yslaDUMP_PASSWORD='jeames007@HW'CUR_DATE=`date "+%Y-%m-%d-%H%M"`dbnamelist=`cat db.txt`#Loading DBLISTgsql -p ${GAUSSPORT} postgres -c "select datname from pg_database where datname not in ('template1','template0','postgres')" -t | grep -v '^$' >db.txt#save directorySAVE_BASE_DIR="/gaussdb/dump_dir"DAT_FILE_DIR="${SAVE_BASE_DIR}/${CUR_DATE}"if [ -d ${DAT_FILE_DIR} ] then : else mkdir -p ${DAT_FILE_DIR}fi# The real backup step!echo "`date "+%Y-%m-%d-%H%M"` begin backup db "for dbname in ${dbnamelist}dogs_dump -E UTF8 ${dbname} -U ${DUMP_USER} -W ${DUMP_PASSWORD} -p ${GAUSSPORT} -F p -f ${DAT_FILE_DIR}/${dbname}_${CUR_DATE}.sqlgs_dumpall -l ${dbname} -U ${DUMP_USER} -W ${DUMP_PASSWORD} -p ${GAUSSPORT} -g -f ${DAT_FILE_DIR}/global_data_${dbname}_${CUR_DATE}.sqldonetar -cjvf ${DAT_FILE_DIR}.tar.gz /${DAT_FILE_DIR} --remove-filesecho "`date "+%Y-%m-%d-%H%M"` end backup db "

7.2 定时任务

在命令行输入:#crontab -e30 02 * * * sh /home/omm/backup.sh

7.3 备份清理

每天都进行备份,如果备份天数过多不清理,可能使目录打满,因此需要添加备份清理策略在命令行输入:#crontab -e30 03 * * * find /gaussdb/dump_dir -not -path '*/\.*' -mtime +30 -type f -name *.tar.gz -exec rm -rf {} \;

作者丨詹姆斯邦德007

来源丨公众号:IT邦德(ID:jeamesDB)

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

活动推荐

为了和大家一起探索AI相关技术在大数据、数据资产管理、数据库、运维等领域的最佳落地方式,挖掘由此激发的软件发展和技术进步,第九届DAMS中国数据智能管理峰会将于2024年11月29日在上海举办,携手一众产学研界技术领跑单位,带来新思路、重实践、可落地的全日干货盛宴。

活动详情:

0 阅读:0