Data PumpによるOracle/DBのバックアップ

Data Pump(expdp)でOracle/DBのバックアップを行うpythonスクリプトの例

・バックアップ対象はデータベース全体
・エラー時にはメール送信
・ダンプファイルとログファイルはZIPで書庫化
・バックアップ(書庫)の数が最大保有数を越えた場合、古いものから削除

サンプルコード:

import datetime
import os
import sys
import subprocess
import smtplib
import zipfile
import glob
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formatdate

#メール送信用コンスタント
SMTP_SERVER = "xxx.co.jp"           #SMTPサーバーのホスト名かIPアドレス
SMTP_PORT = 25                      #SMTPポート番号
MAIL_FROM_ADDR = "xxxx@xxx.co.jp"   #送信元メールアドレス
MAIL_TO_ADDR = "yyy@yyy.co.jp"      #送信先メールアドレス
MAIL_CHARSET = "ISO-2022-JP"        #符号化方式

#バックアップ実行用コンスタント
OUT_FOLDER = "C:\\Backup\\Export\\" #保存先フォルダー
EXP_ACCOUNT = "OracleId"            #Oracleアカウント
EXP_PASSWD = "OraclePassword"       #Oracleパスワード
EXP_JOB_PREF = "ExpFull"            #ジョブ名のプリフィックス
BACKUP_HOLD_COUNT = 5               #バックアップファイル最大保有数

#メール送信用関数
def SendMail(MailSubject, MailBody):
    msg = MIMEText(MailBody.encode(MAIL_CHARSET), 'plain', MAIL_CHARSET)
    msg['Subject'] = Header(MailSubject, MAIL_CHARSET)
    msg['From'] = MAIL_FROM_ADDR
    msg['To'] = MAIL_TO_ADDR
    msg['Date'] = formatdate(localtime=True)
    smtp = smtplib.SMTP(SMTP_SERVER)
    smtp.sendmail(MAIL_FROM_ADDR, MAIL_TO_ADDR, msg.as_string())
    smtp.close()

#バックアップファイル名、ログファイル名の作成
dtStart = datetime.datetime.now()
sBFile = dtStart.strftime("F_EXP%Y%m%d.DMP")
sLFile = dtStart.strftime("F_EXP%Y%m%d.LOG")
sZFile = dtStart.strftime("F_EXP%Y%m%d.ZIP")
sJobName = EXP_JOB_PREF + dtStart.strftime("%Y%m%d")
sBFullName = OUT_FOLDER + sBFile
sLFullName = OUT_FOLDER + sLFile
sZFullName = OUT_FOLDER + sZFile

#既存ファイルの削除
if(os.path.exists(sBFullName)):
    os.remove(sBFullName)
if(os.path.exists(sLFullName)):
    os.remove(sLFullName)
if(os.path.exists(sZFullName)):
    os.remove(sZFullName)

#expdp 起動
sCommand = "expdp " + EXP_ACCOUNT + "/" + EXP_PASSWD + " FULL=Y DIRECTORY=expdp_dir1 JOB_NAME=" + sJobName + " DUMPFILE=" + sBFile + " LOGFILE=" + sLFile
iRtnCD = subprocess.call(sCommand)

#エラー時はメール送信
if iRtnCD != 0 or not os.path.exists(sBFullName):
    mailsub = u"Full Export ジョブが失敗しました。"
    mailbody = os.path.abspath(__file__) + "が失敗しました。\n失敗した処理:エクスポート\nジョブ開始時刻:" + dtStart.strftime("%Y/%m/%d %H:%M:%S") + "\nジョブ終了時刻:" + datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    SendMail(mailsub, mailbody)
    sys.exit(1)
    
#バックアップファイルとログファイルを圧縮
try:
    zip = zipfile.ZipFile(sZFullName, 'w', zipfile.ZIP_DEFLATED) 
    zip.write(sBFullName, sBFile)
    zip.write(sLFullName, sLFile)
    zip.close()
except:
    #エラー時はメール送信
    mailsub = u"Full Export ジョブが失敗しました。"
    mailbody = os.path.abspath(__file__) + "が失敗しました。\n失敗した処理:ファイル圧縮(ZIP処理)\nジョブ開始時刻:" + dtStart.strftime("%Y/%m/%d %H:%M:%S") + "\nジョブ終了時刻:" + datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    SendMail(mailsub, mailbody)
    sys.exit(1)

#バックアップファイルとログファイルを削除
if(os.path.exists(sBFullName)):
    os.remove(sBFullName)
if(os.path.exists(sLFullName)):
    os.remove(sLFullName)

#バックアップ最大保有数を超えている場合は古いものから削除
bkfiles = glob.glob(OUT_FOLDER + "F_EXP*.ZIP")
bkfiles.sort()
if len(bkfiles) > BACKUP_HOLD_COUNT:
    delto = (len(bkfiles) -  BACKUP_HOLD_COUNT)
    for bkfile in bkfiles[:delto]:
        os.remove(bkfile)        

#終了
sys.exit()

シェアする

  • このエントリーをはてなブックマークに追加

フォローする