[Oracle DB] Thực hành backup full và backup incremental
Như chúng ta đã biết, việc backup/ restore dữ liệu trên DB là nhiệm vụ tối quan trọng của một DBA. Vậy hôm nay chúng ta sẽ thử mô phỏng lại tình huống backup toàn bộ dữ liệu trong database (level0) và backup phần tăng thêm (level1) sau khi đã có bản backup full.
===
-- Giả sử ta có một DB với tham số như sau, đây cũng chính là tham số DB test của tôi:
oracle@db2 10.0.2.15:scriptbk$ env | grep -i oracl ORACLE_UNQNAME=cdb1 DB_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 USER=oracle LD_LIBRARY_PATH=/u01/app/oracle/product/19.0.0/dbhome_1/lib:/lib:/usr/lib ORACLE_SID=cdb1 ORACLE_BASE=/u01/app/oracle ORACLE_HOSTNAME=db2.localdomain MAIL=/var/spool/mail/oracle PATH=/u01/app/oracle/product/19.0.0/dbhome_1/bin:/usr/sbin:/usr/local/bin:/u01/app/oracle/product/19.0.0/dbhome_1/bin:/usr/sbin:/usr/local/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/oracle/.local/bin:/home/oracle/bin:/home/oracle/.local/bin:/home/oracle/bin HOME=/home/oracle LOGNAME=oracle CLASSPATH=/u01/app/oracle/product/19.0.0/dbhome_1/jlib:/u01/app/oracle/product/19.0.0/dbhome_1/rdbms/jlib ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
-- Vậy để bắt đầu viết thủ tục, tôi sẽ qui hoạch folder dùng cho việc chứa script và backup file:
oracle@db2 10.0.2.15:backup$ pwd
/u01/backup
oracle@db2 10.0.2.15:backup$ tree -L 2
.
├── level0
│ ├── arc_20240422_CDB1_092otvf8_9_092otvf8_1_1
│ ├── control_file_c-1136356795-20240422-04
│ ├── data_file_20240422_CDB1_062otv1i_6
│ └── data_file_20240422_CDB1_072otve9_7
├── level1
│ ├── arc_20240422_CDB1_0f2ou2rd_15_0f2ou2rd_1_1
│ ├── control_file_c-1136356795-20240422-05
│ ├── control_file_c-1136356795-20240422-06
│ └── data_file_20240422_CDB1_0c2ou2mn_12
├── log
│ ├── 20240422_level0_9342.log
│ └── 20240422_level1_12904.log
└── scriptbk
├── level0.rman
├── level0.sh
├── level1.rman
└── level1.sh
4 directories, 14 files-- Trong đó:
- Thư mục "scriptbk" chứa các script tập hợp các câu lệnh chạy backup.
- Thư mục "log" chứa log tập trung cho quá trình backup.
- Thư mục "level0" và "level1" chứa các backup file, là kết quả cuối cùng của quá trình backup.
I. Backup level0 (full)
1.1. Tạo script:
-- Tạo script RMAN với tham số level0 và định dạng tên các backup file. Tại bước này cần ghi nhớ option COMPRESSED để dung lượng bản backup nhỏ nhất có thể:
oracle@db2 10.0.2.15:scriptbk$ cat ./level0.rman
# Script for backup full
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/backup/level0/control_file_%F';
run {
CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT OBSOLETE;
CROSSCHECK ARCHIVELOG ALL;
delete noprompt expired archivelog all;
BACKUP AS COMPRESSED BACKUPSET DEVICE TYPE DISK INCREMENTAL LEVEL 0 DATABASE FORMAT '/u01/backup/level0/data_file_%T_%d_%u_%s' FILESPERSET 10 MAXSETSIZE 32G TAG LEVEL0;
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP AS COMPRESSED BACKUPSET DEVICE TYPE DISK ARCHIVELOG ALL FORMAT '/u01/backup/level0/arc_%T_%d_%u_%s_%U' FILESPERSET
10 TAG ARCH;
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-2';
}
EXIT;-- Tạo bash script khai báo biến và gọi chạy script RMAN:
oracle@db2 10.0.2.15:scriptbk$ cat level0.sh
# Lấy PID của quy trình hiện tại
PID=$$
# Ghi PID vào tệp tin
echo $PID > /u01/backup/scriptbk/script_pid.pid
# Script for backup full
logfile=/u01/backup/log/$(date +%Y%m%d)_level0.log
export ORACLE_SID=cdb1
export NLS_DATE_FORMAT="yyyy-mm-dd hh24:mi:ss"
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
# Thêm PID vào tên file log
#log_file="/u01/backup/log/$(date +%Y%m%d)_level0_${PID}.log"
log_file="/u01/backup/log/$(date +%Y%m%d)_level0.log"
# Ghi thông tin PID vào file log
echo "PID: $PID" >> $log_file
# Chạy lệnh RMAN và ghi log vào file
rman target / nocatalog log=$log_file cmdfile=/u01/backup/scriptbk/level0.rman
# Thoát khỏi script
exit1.2. Chạy thử và kiểm tra kết quả:
-- Vì đây là môi trường test nên chúng ta sẽ chủ động chạy tay script "level0.sh". Đối với môi trường Prod cần phải đặt crontab thực thi theo chiến lược backup nhất định. Đối với việc chạy thủ công một script, tôi thường dùng lựa chọn nohup để job thực thi không phụ thuộc vào phiên làm việc:
nohup /u01/backup/scriptbk/level0.sh &
-- Ta có thể xem file log sinh ra trong quá trình backup:
Starting backup at 2024-04-22 22:16:18 using channel ORA_DISK_1 channel ORA_DISK_1: starting compressed incremental level 0 datafile backup set channel ORA_DISK_1: specifying datafile(s) in backup set input datafile file number=00025 name=/u01/app/oracle/oradata/CDB1/DATA.DBF input datafile file number=00005 name=/u01/app/oracle/oradata/CDB1/undotbs01.dbf input datafile file number=00068 name=/u01/app/oracle/oradata/CDB1/INDX.DBF input datafile file number=00003 name=/u01/app/oracle/oradata/CDB1/sysaux01.dbf input datafile file number=00001 name=/u01/app/oracle/oradata/CDB1/system01.dbf input datafile file number=00007 name=/u01/app/oracle/oradata/CDB1/users01.dbf channel ORA_DISK_1: starting piece 1 at 2024-04-22 22:16:18 channel ORA_DISK_1: finished piece 1 at 2024-04-22 22:23:05 piece handle=/u01/backup/level0/data_file_20240422_CDB1_062otv1i_6 tag=LEVEL0 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:06:47 channel ORA_DISK_1: starting compressed incremental level 0 datafile backup set channel ORA_DISK_1: specifying datafile(s) in backup set input datafile file number=00004 name=/u01/app/oracle/oradata/CDB1/pdbseed/sysaux01.dbf input datafile file number=00006 name=/u01/app/oracle/oradata/CDB1/pdbseed/undotbs01.dbf input datafile file number=00002 name=/u01/app/oracle/oradata/CDB1/pdbseed/system01.dbf channel ORA_DISK_1: starting piece 1 at 2024-04-22 22:23:06 channel ORA_DISK_1: finished piece 1 at 2024-04-22 22:23:31 piece handle=/u01/backup/level0/data_file_20240422_CDB1_072otve9_7 tag=LEVEL0 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:25 Finished backup at 2024-04-22 22:23:31 Starting Control File and SPFILE Autobackup at 2024-04-22 22:23:31 piece handle=/u01/backup/level0/control_file_c-1136356795-20240422-02 comment=NONE Finished Control File and SPFILE Autobackup at 2024-04-22 22:23:34
-- Kiểm tra các backup file được xuất ra sau quá trình chạy:
-- Ở đây ta quan sát thấy tổng dung lượng các backup file là 2.7 GB trong khi đó tổng dung lượng các data file + control file + archive log trên DB của tôi là khoảng 20 GB. Tức là với tùy chọn COMPRESSED, backup file đã được nén lại cỡ 6~8 lần so với tổng dung lượng các file dữ liệu trên DB.
II. Backup level1 (incremental)
-- Để làm rõ hiệu quả của việc backup phần tăng thêm, tôi sẽ làm dữ liệu trên DB biến đổi tăng thêm:
- Tạo bảng "NGHIEPVU".
- Chèn 1 triệu bản ghi vào bảng "NGHIEPVU".
- Thực hiện backup phần tăng thêm.
-- Sau khi chèn dữ liệu, bảng mới sẽ có dung lượng khoảng 60 MB, đồng thời sẽ có một lượng archive log được sinh tương ứng. Thủ tục tạo bảng và chèn dữ liệu:
--watch -n 5 'echo "SELECT JOB_NAME,SLAVE_OS_PROCESS_ID,ELAPSED_TIME,CPU_USED FROM USER_SCHEDULER_RUNNING_JOBS;" | sqlplus tuantn/*****@cdb1'
SELECT *--JOB_NAME,SLAVE_OS_PROCESS_ID,ELAPSED_TIME,CPU_USED
FROM USER_SCHEDULER_RUNNING_JOBS;
SELECT * FROM ALL_SCHEDULER_JOB_RUN_DETAILS
ORDER BY LOG_ID DESC;
--GRANT EXECUTE ON DBMS_LOCK TO TUANTN;
BEGIN
-- Stop the job first
DBMS_SCHEDULER.STOP_JOB(
job_name => 'TUANTN.INSERT_EMPLOYEE_S01',
force => TRUE -- Use force to immediately stop the job
);
-- Removed the sleep delay
-- Now drop the job
DBMS_SCHEDULER.DROP_JOB(
job_name => 'TUANTN.INSERT_EMPLOYEE_S01'
);
END;
/
--CREATE TABLE
CREATE TABLE TUANTN.NGHIEPVU
(
ID NUMBER,
NAME VARCHAR2(255 BYTE),
DATETIME TIMESTAMP(6),
SALARY NUMBER(10,2),
CREDITCARD CHAR(12 BYTE)
)
TABLESPACE DATA
NOLOGGING
NOCOMPRESS
NOCACHE
;
--INSERT
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'INSERT01',
job_type => 'PLSQL_BLOCK',
job_action => q'[
DECLARE
v_start_date TIMESTAMP := TO_TIMESTAMP('2024-01-01 00:00:01', 'YYYY-MM-DD HH24:MI:SS');
v_end_date TIMESTAMP := TO_TIMESTAMP('2024-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS');
v_diff_seconds NUMBER;
v_name VARCHAR2(255);
v_creditcard CHAR(12);
v_datetime TIMESTAMP;
BEGIN
-- Calculate the difference in seconds between the start and end dates
SELECT (EXTRACT(DAY FROM (v_end_date - v_start_date)) * 86400 +
EXTRACT(HOUR FROM (v_end_date - v_start_date)) * 3600 +
EXTRACT(MINUTE FROM (v_end_date - v_start_date)) * 60 +
EXTRACT(SECOND FROM (v_end_date - v_start_date)))
INTO v_diff_seconds
FROM dual;
FOR i IN 1..1000000 LOOP
v_name := 'Employee ' || TO_CHAR(i);
v_creditcard := LPAD(TRUNC(DBMS_RANDOM.VALUE(100000000000, 999999999999)), 12, '0');
-- Add a random interval, up to the difference calculated, to the start date
v_datetime := v_start_date + NUMTODSINTERVAL(TRUNC(DBMS_RANDOM.VALUE(0, v_diff_seconds)), 'SECOND');
INSERT /*+ APPEND*/ INTO TUANTN.NGHIEPVU (ID, Name, Datetime, Salary, CreditCard)
VALUES (i, v_name, v_datetime, DBMS_RANDOM.VALUE(10000, 20000), v_creditcard);
IF MOD(i, 500000) = 0 THEN
COMMIT;
DBMS_LOCK.SLEEP(5); -- Pause for 5 seconds after each commit to reduce load
END IF;
END LOOP;
COMMIT; -- Ensure the final commit
END;
]',
start_date => SYSTIMESTAMP,
repeat_interval => NULL,
end_date => NULL,
enabled => TRUE,
auto_drop => TRUE,
comments => ''
);
END;
/
--GATHER
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'GATHER_11',
job_type => 'PLSQL_BLOCK',
job_action => q'[
DECLARE
l_table_name VARCHAR2 (30) := 'NGHIEPVU';
BEGIN
DBMS_STATS.GATHER_TABLE_STATS (
ownname => 'TUANTN',
tabname => l_table_name,
method_opt => 'FOR ALL COLUMNS SIZE AUTO',
estimate_percent => NULL,
granularity => 'ALL',
cascade => TRUE
);
END;
]',
start_date => SYSTIMESTAMP,
repeat_interval => NULL,
end_date => NULL,
enabled => TRUE,
auto_drop => TRUE,
comments => ''
);
END;
/2.1. Tạo script:
-- Script RMAN:
oracle@db2 10.0.2.15:scriptbk$ cat ./level1.rman
# Script for backup incremental
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/backup/level1/control_file_%F';
run {
CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT OBSOLETE;
CROSSCHECK ARCHIVELOG ALL;
delete noprompt expired archivelog all;
BACKUP AS COMPRESSED BACKUPSET DEVICE TYPE DISK INCREMENTAL LEVEL 1 DATABASE FORMAT '/u01/backup/level1/data_file_%T_%d_%u_%s' FILESPERSET 10 MAXSETSIZE 32G TAG LEVEL1;
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP AS COMPRESSED BACKUPSET DEVICE TYPE DISK ARCHIVELOG ALL FORMAT '/u01/backup/level1/arc_%T_%d_%u_%s_%U' FILESPERSET
10 TAG ARCH;
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-1';
}
EXIT;-- Thủ tục khai báo biến môi trường và gọi chạy script RMAN. Như các bạn thấy, tôi chỉ cần thay tên script RMAN là được:
oracle@db2 10.0.2.15:scriptbk$ cat ./level1.sh
# Lấy PID của quy trình hiện tại
PID=$$
# Ghi PID vào tệp tin
echo $PID > /u01/backup/scriptbk/script_pid.pid
# Script for backup full
logfile=/u01/backup/log/$(date +%Y%m%d)_level1.log
export ORACLE_SID=cdb1
export NLS_DATE_FORMAT="yyyy-mm-dd hh24:mi:ss"
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
# Thêm PID vào tên file log
log_file="/u01/backup/log/$(date +%Y%m%d)_level1_${PID}.log"
# Ghi thông tin PID vào file log
echo "PID: $PID" >> $log_file
# Chạy lệnh RMAN và ghi log vào file
rman target / nocatalog log=$log_file cmdfile=/u01/backup/scriptbk/level1.rman
# Thoát khỏi script
exit2.2. Chạy thử và kiểm nghiệm kết quả:
-- Log file trong quá trình backup phần dữ liệu tăng thêm:
Starting backup at 2024-04-22 23:21:17 current log archived using channel ORA_DISK_1 channel ORA_DISK_1: starting compressed archived log backup set channel ORA_DISK_1: specifying archived log(s) in backup set input archived log thread=1 sequence=539 RECID=3 STAMP=1166999016 input archived log thread=1 sequence=540 RECID=4 STAMP=1166999016 input archived log thread=1 sequence=541 RECID=5 STAMP=1167000251 input archived log thread=1 sequence=542 RECID=6 STAMP=1167002477 input archived log thread=1 sequence=543 RECID=7 STAMP=1167002477 channel ORA_DISK_1: starting piece 1 at 2024-04-22 23:21:17 channel ORA_DISK_1: finished piece 1 at 2024-04-22 23:21:32 piece handle=/u01/backup/level1/arc_20240422_CDB1_0f2ou2rd_15_0f2ou2rd_1_1 tag=ARCH comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15 Finished backup at 2024-04-22 23:21:32 Starting Control File and SPFILE Autobackup at 2024-04-22 23:21:32 piece handle=/u01/backup/level1/control_file_c-1136356795-20240422-06 comment=NONE Finished Control File and SPFILE Autobackup at 2024-04-22 23:21:33
-- Dung lượng các backup file tăng thêm:
===
Nhận xét
Đăng nhận xét