سلام.
گرفتن یک rman backup که قابلیت restore داشته باشه یکی از الزامات کار dba هاست. اگر در مواقع بروز مشکل عجیب و غریب که نیاز به برگردوندن rman backup داشته باشیم، اون به هر دلیلی برنگرده، مشکل رو میشه از سمت dba دید. توصیه بر اینه که بصورت دوره ای بک آپها رو روی سیستم دیگری برگردونید که اگر مشکلی وجود داره، خودش رو در این حین نشون بده.
اول از همه توصیه میکنم که بک آپ رو روی محلی غیر از سرور نگه داری کنید. از تیم datacenter یا زیرساخت خواهش کنید که فضایی رو به این منظور در اختیارتون قرار بده. حتماً با مدیر مربوطه این مطلب رو هماهنگ کنید که تا چند روز میخواد بک آپ نگه داره و بر اساس درخواست اون retention policy رو تنظیم کنید و میزان فضای مورد نیازتون رو بدست بیارید. توصیه میکنم که حدود 30 درصد این عدد رو بیشتر در نظر بگیرید تا رشد آینده و همچنین روزهایی که به هر دلیلی آرشیو لاگ بیشتر تولید میشه رو هم در نظر گرفته باشیم.
من به دلایلی روی دیتابیس اصلی rman میگیریم. از این دلایل میشه به چک کردن block corruption و همچنین امکان switch log اشاره کرد.
حالا میریم سراغ crontab که باید یک اسکریپت قابل اجرا رو schedule کنیم.
در لینوکس زمانی که اسکریپتی تحت cron اجرا میشه، در حقیقت یک child هست از bash و حتی اگر در bash_profile پارامترهای محیطی رو export کرده باشید، وارد این child نمیشه. بنابراین حتماً در اسکریپت ابتدا پارامترهای محیطی رو export کنید:
[oracle@vahiddb01 ~]$ crontab -l
00 21 * * * /BKP-RMAN-18/scripts/full_backup_vahiddb.sh
ساعت 21 هر شب رو برای اجرای اسکریپت انتخاب کردم. حالا بریم سراغ اسکریپت لینوکسی:
export ORACLE_HOSTNAME=vahiddb01.rhrac.rh
export ORACLE_UNQNAME=vahiddb
export ORACLE_BASE=/u01/app/oracle
export DB_HOME=$ORACLE_BASE/product/21.3.0/db_1
export ORACLE_HOME=$DB_HOME
export ORACLE_SID=vahiddb1
export BASE_PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$BASE_PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
$ORACLE_HOME/bin/sqlplus / as sysdba @/home/oracle/scripts/rman/createPfileFromSpfile.sql > /BKP-RMAN-18/vahiddbbackup/pfile_`date +%Y-%m-%d--%H-%M-%S`.ora
$ORACLE_HOME/bin/rman target / cmdfile=/BKP-RMAN-18/scripts/rman_full_script.rman log=/BKP-RMAN-18/vahiddbbackup/vahiddb__full_`date +%Y-%m-%d--%H-%M-%S`_disk.log
همونطور که می بینید تو خط قبل از اجرای دستور بک اپ یک دستور با sqlplus اجرا شده. محتوای اون دستور sql این هست:
[oracle@vahiddb01 ~]$ cat /home/oracle/scripts/rman/createPfileFromSpfile.sql
create pfile='/BKP-RMAN-18/vahiddbbackup/vahiddb_pfile.ora' from spfile;
exit;
کاری که انجام میده اینه که یک pfile هم کنار بک آپ نگه میدارم.
حالا میرم سراغ خود اسکریپت بک آپ:
[oracle@vahiddb01 ~]$ cat /BKP-RMAN-18/scripts/rman_full_script.rman
run{
allocate channel c1 device type disk format '/BKP-RMAN-18/vahiddbbackup/vahiddb_full_%T_%U';
allocate channel c2 device type disk format '/BKP-RMAN-18/vahiddbbackup/vahiddb_full_%T_%U';
allocate channel c3 device type disk format '/BKP-RMAN-18/vahiddbbackup/vahiddb_full_%T_%U';
allocate channel c4 device type disk format '/BKP-RMAN-18/vahiddbbackup/vahiddb_full_%T_%U';
allocate channel c5 device type disk format '/BKP-RMAN-18/vahiddbbackup/vahiddb_full_%T_%U';
allocate channel c6 device type disk format '/BKP-RMAN-18/vahiddbbackup/vahiddb_full_%T_%U';
allocate channel c7 device type disk format '/BKP-RMAN-18/vahiddbbackup/vahiddb_full_%T_%U';
allocate channel c8 device type disk format '/BKP-RMAN-18/vahiddbbackup/vahiddb_full_%T_%U';
allocate channel c9 device type disk format '/BKP-RMAN-18/vahiddbbackup/vahiddb_full_%T_%U';
allocate channel c10 device type disk format '/BKP-RMAN-18/vahiddbbackup/vahiddb_full_%T_%U';
crosscheck archivelog all;
delete noprompt obsolete;
delete noprompt expired backup;
delete noprompt expired archivelog all;
backup incremental level 0 cumulative filesperset = 5 as COMPRESSED BACKUPSET tag 'VAHIDDB_DAILY' database;
BACKUP AS BACKUPSET archivelog all format '/BKP-RMAN-18/vahiddbbackup/arch_vahiddb_%T_%U';
backup current controlfile format '/BKP-RMAN-18/vahiddbbackup/vahiddb_control_file__%T_%U';
sql 'alter system switch all logfile';
BACKUP AS BACKUPSET archivelog all not backed up format '/BKP-RMAN-18/vahiddbbackup/arch_vahiddb_%T_%U';
crosscheck archivelog all;
delete force archivelog all backed up 3 times to device type disk;
delete noprompt obsolete;
}
چند تا نکته به تجربه وارد این اسکریپت شده. یکی اینکه قبل از بک آپ گرفتن، هر چیزی که OBSOLETE یا EXPIRED هست رو پاک میکنم. گاهاً دستی یک فایلی که از RETENTION POLICY خارج هست و قدیمی هست پاک میشه و در زمان بک اپ ممکنه بگه من بهش احتیاج دارم که این چهار خط اول جلوی این مشکل رو میگیره. مطلب بعدی اینکه در هر فایل بک اپ حداکثر 5 فایل گنجونده میشه که در صورتی که فقط به یک فایل برای ریستور احتیاج داشته باشید، زمان کمتری طول میکشه تا فایل مربوطه بارگزاری بشه. اما نکته خیلی مهم که بسیار در بازگردوندن دیتابیس کمک میکنه اینه که بعد از اینکه کنترل فایل رو بک آپ می گیریم، یکبار سوئیچ لاگ می زنیم که هر آنچه در ONLINE LOG هست هم وارد فایلهای آرشیو بشه و از هر آرشیو لاگی که بک آپ تهیه نشده هم بعدش بک اپ می گیریم.