Oracle备份还原实践

前端之家收集整理的这篇文章主要介绍了Oracle备份还原实践前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、项目背景:

1.1 客户需求

将物理机房生产环境的Oracle/MysqL及阿里云的RDS数据库备份出来,存储到一个集中数据库存储服务器,实现异地备份,并且在还原环境内要将MysqL/Oracle以及阿里云RDS备份数据还原到测试环境,并判断还原数据库是否存在异常,检验数据的一致性,如有异常邮件或微信告警,每周生成Excel报表发送给负责人。

1.2 需求要点:

  1. 网络通信:阿里金融云/公有云/物理机房环境网络须在固定网段互通。

  2. 网络安全:各个网段隔离,有需求通信的网段开放通信,需实现端口级别控制。

  3. 数据备份:MysqL/Oracle/RDS实现数据库备份。

  4. 数据传输:采用定时crond+scp+rsync配合传输。

  5. 数据校验:保障数据库还原成功的可靠性。

  6. 监控告警:VPN网络中断,或数据库备份失败等需要发送通知管理员

  7. 报表生成:将数据库还原的信息生成报表统一发送给管理员

1.3 解决方案:

  1. 网络通信:在阿里云端,采用深信服IPSec VPN与物理机房Cisco设备隧道互通。开通传输网段,将此网段作为网络传输中转网段。

  2. 网络安全:各个网段隔离,如有跨地区或机房相互通信的需求,需将此环境下的数据传输到中转网段,再实现数据传输。使用阿里云安全组deny any,开通需要通信的白名单端口。

  3. 数据备份:MysqL及RDS采用MysqLdump逻辑备份,Oracle采用expdp备份。

  4. 数据传输:采用定时crond+scp+rsync配合传输。

  5. 数据校验:导入文件存在日志,查看日志与比对库数目。

  6. 监控告警:采用smarteye自定义监控,监控VPN状况,同事采用自定义脚本+数据库还原异常告警。如果VPN中断或数据库恢复异常发送短信,邮件,微信消息通知管理员

  7. 报表生成每日脚本将数据库还原日志文件进行处理,最终打包统一传输到一个Python环境下,利用自编写Python脚本处理文件数据,生成报表,每周发送给管理员

二、逻辑拓扑:

2.1 Oracle数据库备份还原:

16f68dfdf4b06071807830bcd959ebd5.png

2.1 Oracle数据库备份还原:

ab7830e1de484cfd73ce38811f7d0b8a.png

三、技术细节:

3.1 Oracle数据库备份还原:

创建Oracle数据库备份用户

  1. createuserbackuseridentifiedbypwdbackuser;

默认情况下用户创建好后系统会默认给该用户分配一个表空间(users);

查看用户表空间:

  1. selectusername,default_tablespacefromdba_users;

需要为创建的用户创建自己的表空间:

  1. createtablespacebaktablesdatafile'/data/bakdir/baktab_data.dbf'size200M;

分配了表空间,此用户还无法登录,因此需要为用户授权:

  1. grantcreatesession,createtable,createview,createsequence,unlimitedtablespacetobackuser;

将创建好的表空间分配给用户

  1. alteruserbackuserdefaulttablespacebaktables;

创建Oracle数据库备份目录:

  1. createdirectorydump_diras'/backup/backup_dir';

查看备份目录:

  1. select*fromdba_directories;

授权备份用户对备份目录具有读写权限:

  1. Grantread,writeondirectorydump_dirtobackuser;

使用expdp导出数据库

  1. expdpbackuser/pwdbackuserSCHEMAS=DB1dumpfile=DB1.dmpdirectory=dump_dirlog=DB1.log

查看备份日志:

725660cc8227f9a6497db28b84428e99.png


Oracle自动备份脚本示例:

  1. #!/bin/bash
  2. exportORACLE_BASE=/u01/app/oracle
  3. exportORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
  4. exportORACLE_SID=ORCL
  5. exportPATH=$ORACLE_HOME/bin:$PATH
  6. filename=`date+%Y-%m-%d`'.dmp'
  7. logname=`date+%Y-%m-%d`'.log'
  8. dump_dir="/backup/backup_dir/"
  9. backdir="dump_dir"
  10. forSchameinDB1....DB2
  11. do
  12. /u01/app/oracle/product/11.2.0/db_1/bin/expdpbackuser/pwdbackuserSCHEMAS=${Schame}dumpfile=${Schame}-${filename}directory=${backdir}log=${Schame}-${logname}
  13. find${dump_dir}-mtime+7-name"*.dmp"-execrm-rf{}\;
  14. find${dump_dir}-mtime+7-name"*.log"-execrm-rf{}\;
  15. done

Oracle 备份检查脚本:

  1. #!/bin/bash
  2. DATE=`date+%F`
  3. MON=`date+%Y-%m`
  4. M_date=`date+%Y/%m/%d`
  5. DIR='/backup/backup_dir/'
  6. FDIR='/backup/Oracle_Excel/'
  7.  
  8. if[!-d${FDIR}];then
  9. mkdir-p${FDIR}
  10. fi
  11. O_FILE='/backup/Oracle_Excel/tmp_OracleB.txt'
  12. #Oracle
  13. END_TIME=`find${DIR}-name"*-${DATE}.dmp"-execls-l{}\;|awk'{print$8}'|sort-r|head-1`
  14. FILE=`find${DIR}-name"*-${DATE}.dmp"-execls{}\;|awk'{printf("%s",$1)}'`
  15. #O_SIZE=`find${DIR}-name"*-${DATE}.dmp"-execdu{}\;|awk'{sum+=$1}END{printsum/1024"M"}'`
  16. O_SIZE=`find${DIR}-name"*-${DATE}.dmp"-execdu-sh{}\;|awk'{printf("%s",$1)}'`
  17. #writefile
  18. echo-e"${M_date},ORACLE,分库备份,(逻辑)每天,22:00:00,${END_TIME},成功,${FILE},否,${O_SIZE},否\n\c">>${O_FILE}
  19. Week=`date+%w`
  20. if[${Week}-eq0];then
  21. if[!-d${FDIR}${DATE}];then
  22. mkdir-p${FDIR}${DATE}
  23. fi
  24. mv${O_FILE}${FDIR}${DATE}
  25. /usr/bin/zip-r${FDIR}OracleB_${DATE}.zip${FDIR}${DATE}/*
  26. if[$?-eq0];then
  27. /usr/bin/scp${FDIR}OracleB_${DATE}.ziproot@192.168.11.11:/user/backup/oracle/Oracle_Excel
  28. fi
  29. rm-rf${FDIR}OracleB_${DATE}.zip
  30. fi

查看数据存储服务器:

脚本拆分开,在那个步失败,可以单独进行恢复统一进行调用

SCP传输

  1. #!/bin/bash
  2. fdate=`date+%Y-%m-%d-d'-1day'`
  3. /usr/bin/scp-P2621root@172.16.84.12:/backup/backup_dir/*-${fdate}.dmp/user/backup/oracle/oraclebak

分类归档压缩:

  1. #!/bin/bash
  2. fdate=`date+%Y-%m-%d-d'-1day'`
  3. filename=`date+%Y-%m-%d-d'-1day'`'.dmp'
  4. dump_dir="/user/backup/oracle/oraclebak"
  5. I=`ls/user/backup/oracle/oraclebak/|grep$filename|awk-F'-''{print$1}'|uniq`
  6. cd${dump_dir}
  7. forSchamein${I[*]}
  8. do
  9. tarzcf${Schame}-$filename.tar.gz${Schame}-$filename
  10. done
  11. find${dump_dir}-name"*.dmp"-execrm-rf{}\;
  12. find${dump_dir}-mtime+7-name"*.dmp.tar.gz"-execrm-rf{}\;

rsync进行断点传输:

  1. #!/bin/bash
  2. #Data=`date+%Y-%m-%d""%H:%m`
  3. dir="/user/backup/oracle/"
  4. fdate=`date+%Y-%m-%d-d'-1day'`
  5. filename=`date+%Y-%m-%d-d'-1day'`'.dmp'
  6. /usr/bin/rsync-rP--timeout=3600--rsh=ssh/user/backup/oracle/oraclebak/DB1-${fdate}.dmp.tar.gzroot@172.17.130.130:/DATA/oracle/oracle_bak&&echo"$DataDB1rsyncissuccess!">>${dir}Logdir/oracle-rsync.log
  7. if["$?"=="0"];then
  8. Data=`date+%Y-%m-%d""%H:%m`
  9. /usr/bin/rsync-rP--timeout=3600--rsh=ssh/user/backup/oracle/oraclebak/DB2-${fdate}.dmp.tar.gzroot@172.17.130.130:/DATA/oracle/oracle_bak&&echo"$DataDB2rsyncissuccess!">>${dir}Logdir/oracle-rsync.log
  10. if["$?"=="0"];then
  11. unsetData
  12. Data=`date+%Y-%m-%d""%H:%m`
  13. /usr/bin/rsync-rP--timeout=3600--rsh=ssh/user/backup/oraclebak/DB3-${fdate}.dmp.tar.gzroot@172.17.130.130:/DATA/oracle/oracle_bak&&echo"$DataDB3rsyncissuccess!">>${dir}Logdir/oracle-rsync.log
  14. if["$?"=="0"];then
  15. unsetData
  16. Data=`date+%Y-%m-%d""%H:%m`
  17. echo"$Datarsyncissuccess!">>${dir}Logdir/oracle-rsync.log
  18. fi
  19. fi
  20. fi

总体调用

  1. #!/bin/bash
  2. #Data=`date+%Y-%m-%d""%H:%m`
  3. dir="/user/backup/oracle/"
  4. /bin/bash${dir}1_oracle_scp.sh
  5. if["$?"=="0"];then
  6. Data=`date+%Y-%m-%d""%H:%m`
  7. echo"$Data1_oracle_scp.shisexecsuccess!">>${dir}Logdir/oracle-back.log&&/bin/bash${dir}2_oracle_tar.sh
  8. if["$?"=="0"];then
  9. unsetData
  10. Data=`date+%Y-%m-%d""%H:%m`
  11. echo"$Data2_oracle_tar.shisexecsuccess!">>${dir}Logdir/oracle-back.log&&/bin/bash${dir}3_oracle_rsync.sh
  12. if["$?"=="0"];then
  13. unsetData
  14. Data=`date+%Y-%m-%d""%H:%m`
  15. echo"$Data3_oracle_rsync.shisexecsuccess!">>${dir}Logdir/oracle-back.log
  16. fi
  17. fi
  18. fi

在还原服务器进行Oracle数据库还原:

首先初步核查传输过来的库数目及文件大小是否异常,如果异常可以进行重新拉取:

  1. #!/bin/bash
  2. oracle_path="/DATA/oracle/oracle_bak/"
  3. Data=`date+%Y-%m-%d""%H:%M`
  4. dir="/user/backup/oracle/"
  5. fdate=`date+%Y-%m-%d-d'-1day'`
  6.  
  7. check_data=`date+%Y-%m-%d-d'-3day'`
  8. check_size=`du-sh/DATA/oracle/oracle_bak/${check_data}/|awk'{print$1}'|cut-dM-f1|awk-F.'{print$1}'`
  9.  
  10. filename=`date+%Y-%m-%d-d'-1day'`'.dmp'
  11. NUM=`ls${oracle_path}*.tar.gz|wc-l`
  12. SIZE=`du-sh/DATA/oracle/oracle_bak/${fdate}/|awk'{print$1}'|cut-dM-f1|awk-F.'{print$1}'`
  13. if["$NUM"!="3"]||[$SIZE-lt${check_size}];then
  14. /usr/bin/rsync-ravP--timeout=3600--rsh=sshroot@10.199.75.14:/user/backup/oracle/oraclebak/DB1-${fdate}.dmp.tar.gz${oracle_path}
  15. if["$?"=="0"];then
  16. /usr/bin/rsync-ravP--timeout=3600--rsh=sshroot@10.199.75.14:/user/backup/oracle/oraclebak/DB2-${fdate}.dmp.tar.gz${oracle_path}
  17. if["$?"=="0"];then
  18. /usr/bin/rsync-ravP--timeout=3600--rsh=sshroot@10.199.75.14:/user/backup/oracle/oraclebak/DB3-${fdate}.dmp.tar.gz${oracle_path}
  19. fi
  20. fi
  21. fi

解压传输过来的数据库

  1. #!/bin/bash
  2. #数据库存储文件
  3. oracle_path="/DATA/oracle/oracle_bak/"
  4. #数据库恢复目录
  5. repath="/DATA/oracle/oracle_restore/"
  6. #数据库导入目录
  7. backdir="/home/oracle/app/backup_dir/"
  8. #数据库归档文件命名
  9. dadir=`date+%Y-%m-%d-d-1day`
  10. #数据库导入日志目录
  11. implogdir="/DATA/oracle/implogdir/"
  12. oraclecmd="/home/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus"
  13. if[!-d${implogdir}${dadir}];then
  14. mkdir-p${implogdir}${dadir}
  15. fi
  16. if[!-d${repath}];then
  17. mkdir-p${repath}
  18. fi
  19. if[!-d${oracle_path}${dadir}];then
  20. mkdir${oracle_path}${dadir}
  21. fi
  22. if[!-d${repath}${dadir}];then
  23. mkdir${repath}${dadir}
  24. fi
  25. #把压缩文件存放在日期目录
  26. sudochown-Roracle:dba${oracle_path}*
  27. cd${oracle_path}
  28. mv*-"$dadir".dmp.tar.gz$dadir
  29. #把压缩文件解压到还原目录
  30. cd${oracle_path}${dadir}
  31. oracle=`ls`
  32. forIin${oracle[*]}
  33. do
  34. /bin/tarzxf$I-C${repath}${dadir}
  35. done
  36. cp${repath}${dadir}/*${backdir}

进行Oracle还原库用户初始化:(此处列两个库做说明)

  1. #!/bin/bash
  2. exportORACLE_BASE=/home/oracle/app
  3. exportORACLE_HOME=$ORACLE_BASE/oracle/product/12.1.0/dbhome_1
  4. exportORACLE_SID=ORCL
  5. exportPATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
  6. #数据库恢复目录
  7. repath="/DATA/oracle/oracle_restore/"
  8. #数据库导入目录
  9. backdir="/home/oracle/app/backup_dir/"
  10. #数据库归档文件命名
  11. dadir=`date+%Y-%m-%d-d-1day`
  12. #数据库导入日志目录
  13. implogdir="/DATA/oracle/implogdir/"
  14. oraclecmd="/home/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus"
  15. cd${backdir}
  16. fordbinDB1...DBn
  17. do
  18. if["$db"=="DB1"];then
  19. sqlplus-S/nolog<<EOF
  20. conn/assysdba
  21. dropuser${db}cascade;
  22. createuser${db}identifiedbyDBuser1;
  23. alteruserDB_user1defaulttablespacetab1;
  24. grantcreatesession,createprocedure,unlimitedtablespaceto${db};
  25. Grantread,writeondirectorydump_dirto${db};
  26. exit;
  27. else["$db"=="GPSUSER"];
  28. sqlplus-S/nolog<<EOF
  29. conn/assysdba
  30. dropuser${db}cascade;
  31. createuser${db}identifiedbyDBuser2;
  32. alteruserDBdefaulttablespacetab2;
  33. grantcreatesession,writeondirectorydump_dirto${db};
  34. exit;
  35. EOF
  36. fi
  37. done

Oracle数据库采用impdp进行导入:

  1. #!/bin/bash
  2. exportORACLE_BASE=/home/oracle/app
  3. exportORACLE_HOME=$ORACLE_BASE/oracle/product/12.1.0/dbhome_1
  4. exportORACLE_SID=glpfin
  5. exportPATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
  6. #数据库存储文件
  7. oracle_path="/DATA/oracle/oracle_bak/"
  8. #数据库恢复目录
  9. repath="/DATA/oracle/oracle_restore/"
  10. #数据库导入目录
  11. backdir="/home/oracle/app/backup_dir/"
  12. #数据库归档文件命名
  13. dadir=`date+%Y-%m-%d-d'-1day'`
  14. #数据库导入日志目录
  15. implogdir="/DATA/oracle/implogdir/"
  16. oraclecmd="/home/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus"
  17. I=`ls/DATA/oracle/oracle_restore/$dadir/|grep$dadir|awk-F'-''{print$1}'|uniq`
  18. cd${backdir}
  19. fordbin${I[*]}
  20.  
  21. do
  22. impdpsystem/51idc.comdirectory=dump_dirdumpfile=${db}-${dadir}.dmplogfile=import-${db}-${dadir}.log
  23. rm-rf${backdir}${db}-${dadir}.dmp&&mvimport-${db}-${dadir}.log${implogdir}${dadir}
  24. /bin/mail-rxuel@anchnet.com-s"Oracle-${db}-backup-mail"oraclebak@anchnet.com<${implogdir}${dadir}/import-${db}-${dadir}.log
  25. done
  26.  
  27. find${oracle_path}-mtime+30-name"*.tar.gz"-execrm-rf{}\;
  28. find${implogdir}-ctime+30-typed-execrm-rf{}\;
  29. find${repath}-mtime+7-name"*.dmp"-execrm-rf{}\;
  30. find${repath}-typed-mtime+7-execrm-rf{}\;

分析导入log,处理后写入文件

  1. #!/bin/bash
  2. date=`date+%Y/%m/%d""%H:%M`
  3. Logdir="/DATA/oracle/Logdir/"
  4. dadir=`date+%Y-%m-%d-d'-1day'`
  5. implogdir="/DATA/oracle/implogdir/"
  6. if[-d${implogdir}${dadir}];then
  7. File=`ls${implogdir}${dadir}|grep${dadir}|awk-F'-''{print$2}'|uniq`
  8. forIin${File[*]}
  9. do
  10. echo${date}>>${Logdir}${I}-import.log
  11. tail-1${implogdir}${dadir}/import-${I}-${dadir}.log>>${Logdir}${I}-import.log
  12. done
  13. fi

VPN监控脚本:

  1. #!/bin/bash
  2. IP=10.199.75.14
  3. dir="/DATA/oracle/netdir/"
  4. if[!-d${dir}];then
  5. mkdir-p${dir}
  6. fi
  7. echo1>${dir}ping.lock
  8. whiletrue
  9. do
  10. Time=`date+%F`
  11. TIME="${Time}23:59"
  12. if["${data}"=="${TIME}"];then
  13. mkdir${dir}${Time}&&mv${dir}ping2.log${dir}${Time}-ping2.log
  14. mv${dir}${Time}-ping2.log${dir}${Time}
  15. fi
  16. find${dir}-mtime+7-name"*-ping2.log"-execrm-rf{}\;
  17. find${dir}-mtime+7-typed-execrm-rf{}\;
  18.  
  19. data=`date+%F''%H:%M`
  20. data1=`date+%F''%H:%M:%S`
  21. echo"------------${data1}---------------">>${dir}ping2.log
  22. ping-c10${IP}>>${dir}ping2.log
  23. if[$?-eq1];then
  24. STAT=`cat${dir}ping.lock`
  25. if[${STAT}-eq1];then
  26. /usr/bin/python/DATA/oracle/netdir/GFweixin.pyxuelVPN-monitor"GLPfromPDC(192.168.11.11)ping金融云(10.75.128.8)中断,请检查深信服VPN!\nTIME:${
  27. data1}"echo0>${dir}ping.lock
  28. else
  29. continue
  30. fi
  31. else
  32. STAT=`cat${dir}ping.lock`
  33. if[${STAT}-eq0];then
  34. /usr/bin/python/DATA/oracle/netdir/GFweixin.pyxuelVPN-monitor"VPNmonitorfrom物理机(192.168.11.11)ping金融云(10.199.75.14)恢复!\nTIME:${data1}"
  35. echo1>${dir}ping.lock
  36. else
  37. continue
  38. fi
  39. fi
  40. done

如有异常会发送告警:

微信告警:

6452046cb63f626449286fea3f55faf6.png

短信告警:

45e0b15253353f2d0b9805c9556bfea2.png

日志收集脚本:

  1. #!/bin/bash
  2. DATE=`date+%F`
  3. MON=`date+%Y-%m`
  4. FDIR='/user/backup/MysqL/MysqL_Excel/'
  5. if[!-d${FDIR}];then
  6. mkdir-p${FDIR}
  7. fi
  8. DIR='/user/backup/MysqL/sub-treasury/'
  9. MysqL_FILE='/user/backup/MysqL/MysqL_Excel/tmp_MysqLB.txt'
  10. M_date=`date+%Y/%m/%d`
  11. M_SIZE=`find${DIR}-name"*-${DATE}.sql.tar.gz"-execdu{}\;|awk'{sum+=$1}END{printsum/1024"M"}'`
  12. #writefile
  13. echo-e"${M_date},MysqL,分库备份(逻辑),每天,22:02:00,${DIR}*-${DATE}.sql.tar.gz,是,${M_SIZE},否\n\c">>${MysqL_FILE}
  14. Week=`date+%w`
  15. if[${Week}-eq0];then
  16. if[!-d${FDIR}${DATE}];then
  17. mkdir-p${FDIR}${DATE}
  18. fi
  19. mv${MysqL_FILE}${FDIR}${DATE}
  20. /usr/bin/zip-r${FDIR}MysqLB_${DATE}.zip${FDIR}${DATE}/*
  21. if[$?-eq0];then
  22. /usr/bin/scp${FDIR}MysqLB_${DATE}.ziproot@172.16.6.150:/DATA/oracle/Excel/MysqL_ZIP
  23. fi
  24. rm-rf${FDIR}MysqLB_${DATE}.zip
  25. fi

集中处理文件脚本:

  1. #!/bin/bash
  2. DATE=`date+%F`
  3. LDATE=`date+%F-d'-1day'`
  4. MON=`date+%Y-%m`
  5. DIR='/DATA/oracle/Excel/'
  6. tmp_dir='/DATA/oracle/Excel/Tmp_restore/'
  7. res_dir='/DATA/oracle/Excel/Totle_restore/'
  8. ZIP='/usr/bin/unzip'
  9. zipfunction(){
  10. $ZIP$1-d${tmp_dir}
  11. TXT=`find${tmp_dir}-nametmp_*.txt`
  12. cp$TXT${res_dir}
  13. rm-rf${tmp_dir}*
  14. }
  15. foriin`find${DIR}-name*_${LDATE}.zip-execls{}\;`
  16. do
  17. zipfunction$i
  18. done
  19. cd${DIR}scripts/
  20. if[$?-eq0];then
  21. /bin/python34${DIR}scripts/GLP_excel.py
  22. fi
  23. if[!-d${DIR}scripts/${MON}];then
  24. mkdir-p${DIR}scripts/${MON}
  25. fi
  26. mv${DIR}scripts/Oralce_bak.xlsx${DIR}scripts/${MON}/GLP_${DATE}.xlsx
  27. cd${DIR}scripts/${MON}/
  28. /bin/mailx-rxuel@anchnet.com-s"Oracle-Excel-report"-a${DIR}scripts/${MON}/GLP_${DATE}.xlsxOraclebak@anchnet.com<${DIR}scripts/${MON}/GLP_${DATE}.xlsx
  29. rm-rf${DIR}Totle_restore/*

Python脚本将文件集中处理生成Excel:(python写的不是很好,初步完成生成报表功能。)

  1. #!/bin/envpython34
  2. importxlsxwriter
  3. #定义excel对象workbook
  4. workbook=xlsxwriter.Workbook("Oracle.xlsx")
  5. #MysqLsheet格式定义
  6. worksheet_M=workbook.add_worksheet('MysqL备份详情表')
  7. worksheet_M.set_column('A:K',12)
  8. worksheet_M.set_row(0,17)
  9. worksheet_M.set_column('C:C',20)
  10. worksheet_M.set_column('H:H',58)
  11. #MysqLDWsheet格式定义
  12. worksheet_MDW=workbook.add_worksheet('MysqL-DW备份详情表')
  13. worksheet_MDW.set_column('A:K',12)
  14. worksheet_MDW.set_row(0,17)
  15. worksheet_MDW.set_column('C:C',20)
  16. worksheet_MDW.set_column('H:H',58)
  17. #Oraclesheet格式定义
  18. worksheet_O=workbook.add_worksheet('ORACLE备份详情表')
  19. worksheet_O.set_column('A:K',12)
  20. worksheet_O.set_row(0,17)
  21. worksheet_O.set_column('G:H',40)
  22. worksheet_O.set_column('C:C',16)
  23. #NFSsheet格式定义
  24. worksheet_N=workbook.add_worksheet('NFS备份详情表')
  25. worksheet_N.set_column('A:K',14)
  26. worksheet_N.set_row(0,17)
  27. worksheet_N.set_column('H:H',59)
  28.  
  29. #定义表头格式
  30. merge_format=workbook.add_format({
  31. 'bold':1,'border':1,'align':'center','valign':'vcenter','fg_color':'#FAEBD7'
  32. })
  33. #表各项目名称格式
  34. name_format=workbook.add_format({
  35. 'bold':1,'fg_color':'#E0FFFF'
  36. })
  37. #表内容格式
  38. normal_format=workbook.add_format({
  39. 'align':'center'
  40. })
  41.  
  42. #写入个表项目名称函数
  43. defset_title(file_list,row,col,worksheet):
  44. foriinfile_list:
  45. worksheet.write(row,i,name_format)
  46. col+=1
  47.  
  48. #写入表内容函数
  49. defset_content(file_content,worksheet):
  50. withopen(file_content,'r')asF:
  51. foriinF:
  52. listnum=list(i.split(','))
  53. col=0
  54. forjinlistnum:
  55. worksheet.write(row,j,normal_format)
  56. col+=1
  57. row+=1
  58. #写入MysqLsheet表头
  59. worksheet_M.merge_range('A1:K1','MysqL备份详情表',merge_format)
  60. worksheet_M.merge_range('A12:K12','MysqL还原详情表',merge_format)
  61. #写入MysqLDWsheet表头
  62. worksheet_MDW.merge_range('A1:K1','MysqL-DW备份详情表',merge_format)
  63. worksheet_MDW.merge_range('A12:K12','MysqL-DW还原详情表',merge_format)
  64. #写入Oraclesheet表头
  65. worksheet_O.merge_range('A1:K1','ORACLE备份详情表',merge_format)
  66. worksheet_O.merge_range('A11:K11','ORACLE传输详情表',merge_format)
  67. worksheet_O.merge_range('A21:K21','ORACLE还原详情表',merge_format)
  68. #写入NFSsheet表头
  69. worksheet_N.merge_range('A1:J1','NFS备份详情表',merge_format)
  70. worksheet_N.merge_range('A12:J12','vsftp备份详情表',merge_format)
  71.  
  72. #定义MysqL表各项目名称
  73. MysqL_Baklist=['备份日期','备份对象','备份类型','备份周期','备份开始时间','备份结束时间','备份状态','备份文件','是否压缩','备份文件大小','是否补备']
  74. MysqL_Reslist=['还原日期','还原对象','还原类型','还原周期','还原开始时间','还原状态','库数目','库数目对比、还原详情','补还原']
  75. #定义MysqL-DW表各项目名称
  76. MysqLDW_Baklist=['备份日期','是否补备']
  77. MysqLDW_Reslist=['还原日期','补还原']
  78. #定义Oracle表各项目名称
  79. Oracle_Baklist=['备份日期','是否补备']
  80. Oracle_Tralist=['传输日期','传输对象','类型','传输周期','开始时间','scp传输打包状态','rsync状态','rsync文件','rsync重传']
  81. Oracle_Reslist=['还原日期','还原详情','补还原']
  82. #定义NFS表各项目名称
  83. Rsync_list=['备份日期','日志文件','是否补备']
  84. Vsftp_list=['备份日期','是否补备']
  85.  
  86. #写入MysqL表项目名称
  87. set_title(MysqL_Baklist,row=1,col=0,worksheet=worksheet_M)
  88. set_title(MysqL_Reslist,row=12,worksheet=worksheet_M)
  89. #写入MysqL-DW表项目名称
  90. set_title(MysqLDW_Baklist,worksheet=worksheet_MDW)
  91. set_title(MysqLDW_Reslist,worksheet=worksheet_MDW)
  92. #写入Oracle表项目名称
  93. set_title(Oracle_Baklist,worksheet=worksheet_O)
  94. set_title(Oracle_Tralist,row=11,worksheet=worksheet_O)
  95. set_title(Oracle_Reslist,row=21,worksheet=worksheet_O)
  96. #写入NFS表项目名称
  97. set_title(Rsync_list,worksheet=worksheet_N)
  98. set_title(Vsftp_list,worksheet=worksheet_N)
  99.  
  100. #定义MysqL内容数据文件路径
  101. MysqLB_file='/DATA/oracle/Excel/Totle_restore/tmp_MysqLB.txt'
  102. MysqLR_file='/DATA/oracle/Excel/Totle_restore/tmp_MysqLR.txt'
  103. #定义MysqL-DW内容数据文件路径
  104. MysqLDWB_file='/DATA/oracle/Excel/Totle_restore/tmp_MysqLDWB.txt'
  105. MysqLDWR_file='/DATA/oracle/Excel/Totle_restore/tmp_MysqLDWR.txt'
  106. #定义Oracle内容数据文件路径
  107. OracleB_file='/DATA/oracle/Excel/Totle_restore/tmp_OracleB.txt'
  108. OracleT_file='/DATA/oracle/Excel/Totle_restore/tmp_OracleT.txt'
  109. OracleR_file='/DATA/oracle/Excel/Totle_restore/tmp_OracleR.txt'
  110. #定义NFS内容数据文件路径
  111. Rsync_file='/DATA/oracle/Excel/Totle_restore/tmp_rsync.txt'
  112. Vsftp_file='/DATA/oracle/Excel/Totle_restore/tmp_vsftpd.txt'
  113.  
  114. #写入MysqL数据内容
  115. set_content(MysqLB_file,row=2,worksheet=worksheet_M)
  116. set_content(MysqLR_file,row=13,worksheet=worksheet_M)
  117. #写入MysqL数据内容
  118. set_content(MysqLDWB_file,worksheet=worksheet_MDW)
  119. set_content(MysqLDWR_file,worksheet=worksheet_MDW)
  120. #写入Oracle数据内容
  121. set_content(OracleB_file,worksheet=worksheet_O)
  122. set_content(OracleT_file,worksheet=worksheet_O)
  123. set_content(OracleR_file,row=22,worksheet=worksheet_O)
  124. #写入NFS数据内容
  125. set_content(Rsync_file,worksheet=worksheet_N)
  126. set_content(Vsftp_file,worksheet=worksheet_N)
  127.  
  128. #关闭workbook
  129. workbook.close()

报表查看:

55c07165b6620975a8ef880a7ddc1f29.png

猜你在找的Oracle相关文章