一、项目背景:
1.1 客户需求:
将物理机房生产环境的Oracle/MysqL及阿里云的RDS数据库备份出来,存储到一个集中数据库存储服务器,实现异地备份,并且在还原环境内要将MysqL/Oracle以及阿里云RDS备份数据还原到测试环境,并判断还原数据库是否存在异常,检验数据的一致性,如有异常邮件或微信告警,每周生成Excel报表发送给负责人。
1.2 需求要点:
网络通信:阿里金融云/公有云/物理机房环境网络须在固定网段互通。
网络安全:各个网段隔离,有需求通信的网段开放通信,需实现端口级别控制。
数据传输:采用定时crond+scp+rsync配合传输。
数据校验:保障数据库还原成功的可靠性。
1.3 解决方案:
网络通信:在阿里云端,采用深信服IPSec VPN与物理机房Cisco设备隧道互通。开通传输网段,将此网段作为网络传输中转网段。
网络安全:各个网段隔离,如有跨地区或机房相互通信的需求,需将此环境下的数据传输到中转网段,再实现数据传输。使用阿里云安全组deny any,开通需要通信的白名单端口。
数据传输:采用定时crond+scp+rsync配合传输。
数据校验:导入文件存在日志,查看日志与比对库数目。
监控告警:采用smarteye自定义监控,监控VPN状况,同事采用自定义脚本+数据库还原异常告警。如果VPN中断或数据库恢复异常发送短信,邮件,微信消息通知管理员。
报表生成:每日脚本将数据库还原日志文件进行处理,最终打包统一传输到一个Python环境下,利用自编写Python脚本处理文件数据,生成报表,每周发送给管理员。
二、逻辑拓扑:
2.1 Oracle数据库备份还原:
2.1 Oracle数据库备份还原:
三、技术细节:
3.1 Oracle数据库备份还原:
createuserbackuseridentifiedbypwdbackuser;
默认情况下用户创建好后系统会默认给该用户分配一个表空间(users);
查看用户表空间:
selectusername,default_tablespacefromdba_users;
需要为创建的用户创建自己的表空间:
createtablespacebaktablesdatafile'/data/bakdir/baktab_data.dbf'size200M;
grantcreatesession,createtable,createview,createsequence,unlimitedtablespacetobackuser;
将创建好的表空间分配给用户:
alteruserbackuserdefaulttablespacebaktables;
创建Oracle数据库备份目录:
createdirectorydump_diras'/backup/backup_dir';
查看备份目录:
select*fromdba_directories;
授权备份用户对备份目录具有读写权限:
Grantread,writeondirectorydump_dirtobackuser;
使用expdp导出数据库:
expdpbackuser/pwdbackuserSCHEMAS=DB1dumpfile=DB1.dmpdirectory=dump_dirlog=DB1.log
查看备份日志:
Oracle自动备份脚本示例:
#!/bin/bash exportORACLE_BASE=/u01/app/oracle exportORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1 exportORACLE_SID=ORCL exportPATH=$ORACLE_HOME/bin:$PATH filename=`date+%Y-%m-%d`'.dmp' logname=`date+%Y-%m-%d`'.log' dump_dir="/backup/backup_dir/" backdir="dump_dir" forSchameinDB1....DB2 do /u01/app/oracle/product/11.2.0/db_1/bin/expdpbackuser/pwdbackuserSCHEMAS=${Schame}dumpfile=${Schame}-${filename}directory=${backdir}log=${Schame}-${logname} find${dump_dir}-mtime+7-name"*.dmp"-execrm-rf{}\; find${dump_dir}-mtime+7-name"*.log"-execrm-rf{}\; done
Oracle 备份检查脚本:
#!/bin/bash DATE=`date+%F` MON=`date+%Y-%m` M_date=`date+%Y/%m/%d` DIR='/backup/backup_dir/' FDIR='/backup/Oracle_Excel/' if[!-d${FDIR}];then mkdir-p${FDIR} fi O_FILE='/backup/Oracle_Excel/tmp_OracleB.txt' #Oracle END_TIME=`find${DIR}-name"*-${DATE}.dmp"-execls-l{}\;|awk'{print$8}'|sort-r|head-1` FILE=`find${DIR}-name"*-${DATE}.dmp"-execls{}\;|awk'{printf("%s",$1)}'` #O_SIZE=`find${DIR}-name"*-${DATE}.dmp"-execdu{}\;|awk'{sum+=$1}END{printsum/1024"M"}'` O_SIZE=`find${DIR}-name"*-${DATE}.dmp"-execdu-sh{}\;|awk'{printf("%s",$1)}'` #writefile echo-e"${M_date},ORACLE,分库备份,(逻辑)每天,22:00:00,${END_TIME},成功,${FILE},否,${O_SIZE},否\n\c">>${O_FILE} Week=`date+%w` if[${Week}-eq0];then if[!-d${FDIR}${DATE}];then mkdir-p${FDIR}${DATE} fi mv${O_FILE}${FDIR}${DATE} /usr/bin/zip-r${FDIR}OracleB_${DATE}.zip${FDIR}${DATE}/* if[$?-eq0];then /usr/bin/scp${FDIR}OracleB_${DATE}.ziproot@192.168.11.11:/user/backup/oracle/Oracle_Excel fi rm-rf${FDIR}OracleB_${DATE}.zip fi
查看数据存储服务器:
脚本拆分开,在那个步失败,可以单独进行恢复统一进行调用:
SCP传输
#!/bin/bash fdate=`date+%Y-%m-%d-d'-1day'` /usr/bin/scp-P2621root@172.16.84.12:/backup/backup_dir/*-${fdate}.dmp/user/backup/oracle/oraclebak
分类归档压缩:
#!/bin/bash fdate=`date+%Y-%m-%d-d'-1day'` filename=`date+%Y-%m-%d-d'-1day'`'.dmp' dump_dir="/user/backup/oracle/oraclebak" I=`ls/user/backup/oracle/oraclebak/|grep$filename|awk-F'-''{print$1}'|uniq` cd${dump_dir} forSchamein${I[*]} do tarzcf${Schame}-$filename.tar.gz${Schame}-$filename done find${dump_dir}-name"*.dmp"-execrm-rf{}\; find${dump_dir}-mtime+7-name"*.dmp.tar.gz"-execrm-rf{}\;
rsync进行断点传输:
#!/bin/bash #Data=`date+%Y-%m-%d""%H:%m` dir="/user/backup/oracle/" fdate=`date+%Y-%m-%d-d'-1day'` filename=`date+%Y-%m-%d-d'-1day'`'.dmp' /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 if["$?"=="0"];then Data=`date+%Y-%m-%d""%H:%m` /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 if["$?"=="0"];then unsetData Data=`date+%Y-%m-%d""%H:%m` /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 if["$?"=="0"];then unsetData Data=`date+%Y-%m-%d""%H:%m` echo"$Datarsyncissuccess!">>${dir}Logdir/oracle-rsync.log fi fi fi
总体调用:
#!/bin/bash #Data=`date+%Y-%m-%d""%H:%m` dir="/user/backup/oracle/" /bin/bash${dir}1_oracle_scp.sh if["$?"=="0"];then Data=`date+%Y-%m-%d""%H:%m` echo"$Data1_oracle_scp.shisexecsuccess!">>${dir}Logdir/oracle-back.log&&/bin/bash${dir}2_oracle_tar.sh if["$?"=="0"];then unsetData Data=`date+%Y-%m-%d""%H:%m` echo"$Data2_oracle_tar.shisexecsuccess!">>${dir}Logdir/oracle-back.log&&/bin/bash${dir}3_oracle_rsync.sh if["$?"=="0"];then unsetData Data=`date+%Y-%m-%d""%H:%m` echo"$Data3_oracle_rsync.shisexecsuccess!">>${dir}Logdir/oracle-back.log fi fi fi
在还原服务器进行Oracle数据库还原:
首先初步核查传输过来的库数目及文件大小是否异常,如果异常可以进行重新拉取:
#!/bin/bash oracle_path="/DATA/oracle/oracle_bak/" Data=`date+%Y-%m-%d""%H:%M` dir="/user/backup/oracle/" fdate=`date+%Y-%m-%d-d'-1day'` check_data=`date+%Y-%m-%d-d'-3day'` check_size=`du-sh/DATA/oracle/oracle_bak/${check_data}/|awk'{print$1}'|cut-dM-f1|awk-F.'{print$1}'` filename=`date+%Y-%m-%d-d'-1day'`'.dmp' NUM=`ls${oracle_path}*.tar.gz|wc-l` SIZE=`du-sh/DATA/oracle/oracle_bak/${fdate}/|awk'{print$1}'|cut-dM-f1|awk-F.'{print$1}'` if["$NUM"!="3"]||[$SIZE-lt${check_size}];then /usr/bin/rsync-ravP--timeout=3600--rsh=sshroot@10.199.75.14:/user/backup/oracle/oraclebak/DB1-${fdate}.dmp.tar.gz${oracle_path} if["$?"=="0"];then /usr/bin/rsync-ravP--timeout=3600--rsh=sshroot@10.199.75.14:/user/backup/oracle/oraclebak/DB2-${fdate}.dmp.tar.gz${oracle_path} if["$?"=="0"];then /usr/bin/rsync-ravP--timeout=3600--rsh=sshroot@10.199.75.14:/user/backup/oracle/oraclebak/DB3-${fdate}.dmp.tar.gz${oracle_path} fi fi fi
解压传输过来的数据库:
#!/bin/bash #数据库存储文件 oracle_path="/DATA/oracle/oracle_bak/" #数据库恢复目录 repath="/DATA/oracle/oracle_restore/" #数据库导入目录 backdir="/home/oracle/app/backup_dir/" #数据库归档文件命名 dadir=`date+%Y-%m-%d-d-1day` #数据库导入日志目录 implogdir="/DATA/oracle/implogdir/" oraclecmd="/home/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus" if[!-d${implogdir}${dadir}];then mkdir-p${implogdir}${dadir} fi if[!-d${repath}];then mkdir-p${repath} fi if[!-d${oracle_path}${dadir}];then mkdir${oracle_path}${dadir} fi if[!-d${repath}${dadir}];then mkdir${repath}${dadir} fi #把压缩文件存放在日期目录 sudochown-Roracle:dba${oracle_path}* cd${oracle_path} mv*-"$dadir".dmp.tar.gz$dadir #把压缩文件解压到还原目录 cd${oracle_path}${dadir} oracle=`ls` forIin${oracle[*]} do /bin/tarzxf$I-C${repath}${dadir} done cp${repath}${dadir}/*${backdir}
进行Oracle还原库用户初始化:(此处列两个库做说明)
#!/bin/bash exportORACLE_BASE=/home/oracle/app exportORACLE_HOME=$ORACLE_BASE/oracle/product/12.1.0/dbhome_1 exportORACLE_SID=ORCL exportPATH=$PATH:$HOME/bin:$ORACLE_HOME/bin #数据库恢复目录 repath="/DATA/oracle/oracle_restore/" #数据库导入目录 backdir="/home/oracle/app/backup_dir/" #数据库归档文件命名 dadir=`date+%Y-%m-%d-d-1day` #数据库导入日志目录 implogdir="/DATA/oracle/implogdir/" oraclecmd="/home/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus" cd${backdir} fordbinDB1...DBn do if["$db"=="DB1"];then sqlplus-S/nolog<<EOF conn/assysdba dropuser${db}cascade; createuser${db}identifiedbyDBuser1; alteruserDB_user1defaulttablespacetab1; grantcreatesession,createprocedure,unlimitedtablespaceto${db}; Grantread,writeondirectorydump_dirto${db}; exit; else["$db"=="GPSUSER"]; sqlplus-S/nolog<<EOF conn/assysdba dropuser${db}cascade; createuser${db}identifiedbyDBuser2; alteruserDBdefaulttablespacetab2; grantcreatesession,writeondirectorydump_dirto${db}; exit; EOF fi done
Oracle数据库采用impdp进行导入:
#!/bin/bash exportORACLE_BASE=/home/oracle/app exportORACLE_HOME=$ORACLE_BASE/oracle/product/12.1.0/dbhome_1 exportORACLE_SID=glpfin exportPATH=$PATH:$HOME/bin:$ORACLE_HOME/bin #数据库存储文件 oracle_path="/DATA/oracle/oracle_bak/" #数据库恢复目录 repath="/DATA/oracle/oracle_restore/" #数据库导入目录 backdir="/home/oracle/app/backup_dir/" #数据库归档文件命名 dadir=`date+%Y-%m-%d-d'-1day'` #数据库导入日志目录 implogdir="/DATA/oracle/implogdir/" oraclecmd="/home/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus" I=`ls/DATA/oracle/oracle_restore/$dadir/|grep$dadir|awk-F'-''{print$1}'|uniq` cd${backdir} fordbin${I[*]} do impdpsystem/51idc.comdirectory=dump_dirdumpfile=${db}-${dadir}.dmplogfile=import-${db}-${dadir}.log rm-rf${backdir}${db}-${dadir}.dmp&&mvimport-${db}-${dadir}.log${implogdir}${dadir} /bin/mail-rxuel@anchnet.com-s"Oracle-${db}-backup-mail"oraclebak@anchnet.com<${implogdir}${dadir}/import-${db}-${dadir}.log done find${oracle_path}-mtime+30-name"*.tar.gz"-execrm-rf{}\; find${implogdir}-ctime+30-typed-execrm-rf{}\; find${repath}-mtime+7-name"*.dmp"-execrm-rf{}\; find${repath}-typed-mtime+7-execrm-rf{}\;
分析导入log,处理后写入文件
#!/bin/bash date=`date+%Y/%m/%d""%H:%M` Logdir="/DATA/oracle/Logdir/" dadir=`date+%Y-%m-%d-d'-1day'` implogdir="/DATA/oracle/implogdir/" if[-d${implogdir}${dadir}];then File=`ls${implogdir}${dadir}|grep${dadir}|awk-F'-''{print$2}'|uniq` forIin${File[*]} do echo${date}>>${Logdir}${I}-import.log tail-1${implogdir}${dadir}/import-${I}-${dadir}.log>>${Logdir}${I}-import.log done fi
VPN监控脚本:
#!/bin/bash IP=10.199.75.14 dir="/DATA/oracle/netdir/" if[!-d${dir}];then mkdir-p${dir} fi echo1>${dir}ping.lock whiletrue do Time=`date+%F` TIME="${Time}23:59" if["${data}"=="${TIME}"];then mkdir${dir}${Time}&&mv${dir}ping2.log${dir}${Time}-ping2.log mv${dir}${Time}-ping2.log${dir}${Time} fi find${dir}-mtime+7-name"*-ping2.log"-execrm-rf{}\; find${dir}-mtime+7-typed-execrm-rf{}\; data=`date+%F''%H:%M` data1=`date+%F''%H:%M:%S` echo"------------${data1}---------------">>${dir}ping2.log ping-c10${IP}>>${dir}ping2.log if[$?-eq1];then STAT=`cat${dir}ping.lock` if[${STAT}-eq1];then /usr/bin/python/DATA/oracle/netdir/GFweixin.pyxuelVPN-monitor"GLPfromPDC(192.168.11.11)ping金融云(10.75.128.8)中断,请检查深信服VPN!\nTIME:${ data1}"echo0>${dir}ping.lock else continue fi else STAT=`cat${dir}ping.lock` if[${STAT}-eq0];then /usr/bin/python/DATA/oracle/netdir/GFweixin.pyxuelVPN-monitor"VPNmonitorfrom物理机(192.168.11.11)ping金融云(10.199.75.14)恢复!\nTIME:${data1}" echo1>${dir}ping.lock else continue fi fi done
如有异常会发送告警:
微信告警:
短信告警:
日志收集脚本:
#!/bin/bash DATE=`date+%F` MON=`date+%Y-%m` FDIR='/user/backup/MysqL/MysqL_Excel/' if[!-d${FDIR}];then mkdir-p${FDIR} fi DIR='/user/backup/MysqL/sub-treasury/' MysqL_FILE='/user/backup/MysqL/MysqL_Excel/tmp_MysqLB.txt' M_date=`date+%Y/%m/%d` M_SIZE=`find${DIR}-name"*-${DATE}.sql.tar.gz"-execdu{}\;|awk'{sum+=$1}END{printsum/1024"M"}'` #writefile echo-e"${M_date},MysqL,分库备份(逻辑),每天,22:02:00,${DIR}*-${DATE}.sql.tar.gz,是,${M_SIZE},否\n\c">>${MysqL_FILE} Week=`date+%w` if[${Week}-eq0];then if[!-d${FDIR}${DATE}];then mkdir-p${FDIR}${DATE} fi mv${MysqL_FILE}${FDIR}${DATE} /usr/bin/zip-r${FDIR}MysqLB_${DATE}.zip${FDIR}${DATE}/* if[$?-eq0];then /usr/bin/scp${FDIR}MysqLB_${DATE}.ziproot@172.16.6.150:/DATA/oracle/Excel/MysqL_ZIP fi rm-rf${FDIR}MysqLB_${DATE}.zip fi
集中处理文件脚本:
#!/bin/bash DATE=`date+%F` LDATE=`date+%F-d'-1day'` MON=`date+%Y-%m` DIR='/DATA/oracle/Excel/' tmp_dir='/DATA/oracle/Excel/Tmp_restore/' res_dir='/DATA/oracle/Excel/Totle_restore/' ZIP='/usr/bin/unzip' zipfunction(){ $ZIP$1-d${tmp_dir} TXT=`find${tmp_dir}-nametmp_*.txt` cp$TXT${res_dir} rm-rf${tmp_dir}* } foriin`find${DIR}-name*_${LDATE}.zip-execls{}\;` do zipfunction$i done cd${DIR}scripts/ if[$?-eq0];then /bin/python34${DIR}scripts/GLP_excel.py fi if[!-d${DIR}scripts/${MON}];then mkdir-p${DIR}scripts/${MON} fi mv${DIR}scripts/Oralce_bak.xlsx${DIR}scripts/${MON}/GLP_${DATE}.xlsx cd${DIR}scripts/${MON}/ /bin/mailx-rxuel@anchnet.com-s"Oracle-Excel-report"-a${DIR}scripts/${MON}/GLP_${DATE}.xlsxOraclebak@anchnet.com<${DIR}scripts/${MON}/GLP_${DATE}.xlsx rm-rf${DIR}Totle_restore/*
Python脚本将文件集中处理生成Excel:(python写的不是很好,初步完成生成报表功能。)
#!/bin/envpython34 importxlsxwriter #定义excel对象workbook workbook=xlsxwriter.Workbook("Oracle.xlsx") #MysqLsheet格式定义 worksheet_M=workbook.add_worksheet('MysqL备份详情表') worksheet_M.set_column('A:K',12) worksheet_M.set_row(0,17) worksheet_M.set_column('C:C',20) worksheet_M.set_column('H:H',58) #MysqLDWsheet格式定义 worksheet_MDW=workbook.add_worksheet('MysqL-DW备份详情表') worksheet_MDW.set_column('A:K',12) worksheet_MDW.set_row(0,17) worksheet_MDW.set_column('C:C',20) worksheet_MDW.set_column('H:H',58) #Oraclesheet格式定义 worksheet_O=workbook.add_worksheet('ORACLE备份详情表') worksheet_O.set_column('A:K',12) worksheet_O.set_row(0,17) worksheet_O.set_column('G:H',40) worksheet_O.set_column('C:C',16) #NFSsheet格式定义 worksheet_N=workbook.add_worksheet('NFS备份详情表') worksheet_N.set_column('A:K',14) worksheet_N.set_row(0,17) worksheet_N.set_column('H:H',59) #定义表头格式 merge_format=workbook.add_format({ 'bold':1,'border':1,'align':'center','valign':'vcenter','fg_color':'#FAEBD7' }) #表各项目名称格式 name_format=workbook.add_format({ 'bold':1,'fg_color':'#E0FFFF' }) #表内容格式 normal_format=workbook.add_format({ 'align':'center' }) #写入个表项目名称函数 defset_title(file_list,row,col,worksheet): foriinfile_list: worksheet.write(row,i,name_format) col+=1 #写入表内容函数 defset_content(file_content,worksheet): withopen(file_content,'r')asF: foriinF: listnum=list(i.split(',')) col=0 forjinlistnum: worksheet.write(row,j,normal_format) col+=1 row+=1 #写入MysqLsheet表头 worksheet_M.merge_range('A1:K1','MysqL备份详情表',merge_format) worksheet_M.merge_range('A12:K12','MysqL还原详情表',merge_format) #写入MysqLDWsheet表头 worksheet_MDW.merge_range('A1:K1','MysqL-DW备份详情表',merge_format) worksheet_MDW.merge_range('A12:K12','MysqL-DW还原详情表',merge_format) #写入Oraclesheet表头 worksheet_O.merge_range('A1:K1','ORACLE备份详情表',merge_format) worksheet_O.merge_range('A11:K11','ORACLE传输详情表',merge_format) worksheet_O.merge_range('A21:K21','ORACLE还原详情表',merge_format) #写入NFSsheet表头 worksheet_N.merge_range('A1:J1','NFS备份详情表',merge_format) worksheet_N.merge_range('A12:J12','vsftp备份详情表',merge_format) #定义MysqL表各项目名称 MysqL_Baklist=['备份日期','备份对象','备份类型','备份周期','备份开始时间','备份结束时间','备份状态','备份文件','是否压缩','备份文件大小','是否补备'] MysqL_Reslist=['还原日期','还原对象','还原类型','还原周期','还原开始时间','还原状态','库数目','库数目对比、还原详情','补还原'] #定义MysqL-DW表各项目名称 MysqLDW_Baklist=['备份日期','是否补备'] MysqLDW_Reslist=['还原日期','补还原'] #定义Oracle表各项目名称 Oracle_Baklist=['备份日期','是否补备'] Oracle_Tralist=['传输日期','传输对象','类型','传输周期','开始时间','scp传输打包状态','rsync状态','rsync文件','rsync重传'] Oracle_Reslist=['还原日期','还原详情','补还原'] #定义NFS表各项目名称 Rsync_list=['备份日期','日志文件','是否补备'] Vsftp_list=['备份日期','是否补备'] #写入MysqL表项目名称 set_title(MysqL_Baklist,row=1,col=0,worksheet=worksheet_M) set_title(MysqL_Reslist,row=12,worksheet=worksheet_M) #写入MysqL-DW表项目名称 set_title(MysqLDW_Baklist,worksheet=worksheet_MDW) set_title(MysqLDW_Reslist,worksheet=worksheet_MDW) #写入Oracle表项目名称 set_title(Oracle_Baklist,worksheet=worksheet_O) set_title(Oracle_Tralist,row=11,worksheet=worksheet_O) set_title(Oracle_Reslist,row=21,worksheet=worksheet_O) #写入NFS表项目名称 set_title(Rsync_list,worksheet=worksheet_N) set_title(Vsftp_list,worksheet=worksheet_N) #定义MysqL内容数据文件路径 MysqLB_file='/DATA/oracle/Excel/Totle_restore/tmp_MysqLB.txt' MysqLR_file='/DATA/oracle/Excel/Totle_restore/tmp_MysqLR.txt' #定义MysqL-DW内容数据文件路径 MysqLDWB_file='/DATA/oracle/Excel/Totle_restore/tmp_MysqLDWB.txt' MysqLDWR_file='/DATA/oracle/Excel/Totle_restore/tmp_MysqLDWR.txt' #定义Oracle内容数据文件路径 OracleB_file='/DATA/oracle/Excel/Totle_restore/tmp_OracleB.txt' OracleT_file='/DATA/oracle/Excel/Totle_restore/tmp_OracleT.txt' OracleR_file='/DATA/oracle/Excel/Totle_restore/tmp_OracleR.txt' #定义NFS内容数据文件路径 Rsync_file='/DATA/oracle/Excel/Totle_restore/tmp_rsync.txt' Vsftp_file='/DATA/oracle/Excel/Totle_restore/tmp_vsftpd.txt' #写入MysqL数据内容 set_content(MysqLB_file,row=2,worksheet=worksheet_M) set_content(MysqLR_file,row=13,worksheet=worksheet_M) #写入MysqL数据内容 set_content(MysqLDWB_file,worksheet=worksheet_MDW) set_content(MysqLDWR_file,worksheet=worksheet_MDW) #写入Oracle数据内容 set_content(OracleB_file,worksheet=worksheet_O) set_content(OracleT_file,worksheet=worksheet_O) set_content(OracleR_file,row=22,worksheet=worksheet_O) #写入NFS数据内容 set_content(Rsync_file,worksheet=worksheet_N) set_content(Vsftp_file,worksheet=worksheet_N) #关闭workbook workbook.close()
报表查看:
原文链接:https://www.f2er.com/oracle/207141.html