Apa itu inkarnasi anak yatim?

9

Inkarnasi dijelaskan dalam jawaban untuk pertanyaan lain di situs ini. Jawabannya menyebutkan inkarnasi 'yatim piatu':

... Ada faktor-faktor lain yang menghasilkan inkarnasi YAIMU dan backup OBSOLETE ...

Saya melihat dari dokumen Oracle yang V$DATABASE_INCARNATIONmenyertakan STATUSkolom yang dapat memiliki nilai ORPHAN, CURRENTatau PARENT, yang harus terkait.

Apa itu inkarnasi 'yatim piatu', dan langkah apa yang akan menghasilkan baris dengan STATUS= ORPHANdalam V$DATABASE_INCARNATION?

Jack mengatakan coba topanswers.xyz
sumber

Jawaban:

8

Berikut ini adalah grafik singkat yang akan saya gunakan untuk menjelaskan kapan anak yatim dibuat dalam inkarnasi database. Ini adalah variasi dari grafik yang saya gunakan untuk menjelaskan inkarnasi dalam jawaban saya atas pertanyaan. Adakah yang bisa menjelaskan kepada saya konsep "inkarnasi" dalam database Oracle dengan cara yang mudah dimengerti?

Saya harap Anda menikmati perjalanan.

                                          restore db    +-----+     +-----+     +-----+          
                                          recover db    | 2>3 | --> |  3  | --> |  3  | -->  ... 
                                          resetlogs     +-----+     +-----+     +-----+  ^       
                                                            ^ Incarn   3           3     |    3  
                                                           /  SCN #   500         600    |   700 
                                                          /                              |          
                                                         /                               |          
             restore db    +-----+          +-----+     +-----+                          |          
             recover db    | 1>2 | -------> |  2  | --> |  2  | -->  ...                 |          
             resetlogs     +-----+          +-----+     +-----+  ^                       |          
                           ^       Incarn.     2 \         2     |    2                  |          
                          /        SCN #      300 \       400    |   500                 |          
                         /                         \             |                       |          
                        /                           + --------------------+              |          
        +-----+     +-----+     +-----+                          |         \    +-----+  |  +-----+ 
    --> |  1  | --> |  1  | --> |  1  | -->   ...                |          +-> | 2>4 | --> |  4  | 
        +-----+     +-----+     +-----+  ^                       |   restore db +-----+  |  +-----+ 
Incarn.    1           1           1     |     1           2     |   recover db          |     4    
SCN #     100         200         300    |    400         400    |   resetlogs           |    400   
                                         |                       |                       |          
Backup   11:00 ----- 12:00 ----- 13:00 ----- 14:00 ----- 15:00 ----- 16:00 ----- 17:00 ----- 18:00  
                                         |                       |                       |          
Restore/                                (1)                     (2)                     (3)         
Recovery                                                                                            

Memulihkan Database ke Titik Waktu (1)

Di suatu tempat sedikit setelah 13:00 (13:00) seseorang memutuskan bahwa database harus dikembalikan ke 12:00 (12 tengah hari). DBA baik memicu sekelompok perintah RMAN untuk mengembalikan database ke titik waktu atau mengklik jalannya melalui GUI yang fantastis untuk memulai pemulihan / pemulihan dari vendor pihak ke-3.

RMAN mengambil cadangan FULL dari database dan semua backup Log Arsip dari disk / tape dan mengembalikannya ke disk. Dalam fase pemulihan RMAN akan memeriksa bahwa semua informasi yang relevan tersedia dan memutar semua transaksi yang sudah selesai ke Poin Waktu dan memutar kembali semua transaksi yang belum selesai ke Poin Waktu, untuk memastikan database dalam keadaan konsisten.

Sebelum basis data dapat dibuka untuk masyarakat umum, basis data harus memastikan bahwa semua cadangan di masa mendatang tidak bertentangan dengan cadangan sebelumnya. Ini adalah saat inkarnasi baru harus dibuat dan itu terjadi ketika Anda menjalankan perintah berikut untuk membuka database:

ALTER DATABASE OPEN RESETLOGS;

Anda dapat menjalankan skrip berikut terhadap instance Anda untuk mengambil tampilan hierarkis dari inkarnasi Anda (saat ini):

set pages 50               --- repeat header every 50 records
set lines 230              --- set lines(ize) length to 230
column path format a40     --- set column path to alpha-numeric 40
alter sessiosn set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
                           --- set date format of date columns to something more detailed
select 
    INCARNATION#, 
    PRIOR_INCARNATION#, 
    RESETLOGS_CHANGE#, 
    RESETLOGS_TIME, 
    STATUS, 
    SYS_CONNECT_BY_PATH(INCARNATION#, ' -> ') Path 
    FROM v$database_incarnation 
    WHERE LEVEL >=1 START WITH INCARNATION# = '1' 
        CONNECT BY PRIOR INCARNATION# = PRIOR_INCARNATION# 
    ORDER BY LEVEL, Path, RESETLOGS_TIME;

Inkarnasi database saat ini akan serupa dengan ini:

INCARNATION# PRIOR_INCARNATION# RESETLOGS_CHANGE# RESETLOGS_TIME      STATUS  PATH
------------ ------------------ ----------------- ------------------- ------- --------------------
           1                  0                 1 2017-03-08 15:57:31 PARENT   -> 1
           2                  1               200 2018-07-27 13:20:00 CURRENT  -> 1 -> 2

Dengan menggunakan grafik, kita dapat melihat bahwa kita telah berpindah dari jalur yang berisi inkarnasi 1 ke jalur dengan inkarnasi 2, karena kita telah membuka database dengan RESETLOGSdan database telah membuat inkarnasi baru.

Memulihkan Database ke Titik Waktu (2)

Mari kita kembali berasumsi bahwa basis data terus berjalan setelah tindakan pemulihan / pemulihan pertama dan sedikit setelah pukul 15:00 (15:00) seseorang memutuskan perlu ba pemulihan baru / pemulihan kembali ke jam penuh pada pukul 15:00 (15:00) pada hari yang sama.

RMAN akan mengembalikan file, memulihkan basis data dan memulai ALTER DATABASE OPEN RESETLOGSuntuk mengembalikan basis data. INCARNATION # sekarang akan diatur ke 3 dan cadangan pertama pukul 16:00 akan berisi informasi:

INCARNATION#    3
SCN#           500
Time......... 16:00

Jika kita menanyakan inkarnasi dalam database menggunakan skrip di atas kita akan mendapatkan sesuatu seperti ini:

INCARNATION# PRIOR_INCARNATION# RESETLOGS_CHANGE# RESETLOGS_TIME      STATUS  PATH
------------ ------------------ ----------------- ------------------- ------- --------------------
           1                  0                 1 2017-03-08 15:57:31 PARENT   -> 1
           2                  1               200 2018-07-27 13:20:00 PARENT   -> 1 -> 2
           3                  2               400 2018-07-27 15:20:00 CURRENT  -> 1 -> 2 -> 3

Mengembalikan Database ke Titik Waktu (3)

Mari kita kembali berasumsi bahwa database terus berjalan setelah tindakan pemulihan / pemulihan kedua dan sedikit setelah 17:00 (17:00) seseorang memutuskan perlu ada pemulihan / pemulihan baru kembali ke 14:00 (14:00) pada hari yang sama.

RMAN akan mengembalikan file, memulihkan basis data dan memulai ALTER DATABASE OPEN RESETLOGSuntuk mengembalikan basis data. INCARNATION # sekarang akan diatur ke 4 dan cadangan pertama pukul 18:00 akan berisi informasi:

INCARNATION#    4
SCN#           400
Time......... 18:00

Jika kita menanyakan inkarnasi dalam database menggunakan skrip di atas kita akan mendapatkan sesuatu seperti ini:

INCARNATION# PRIOR_INCARNATION# RESETLOGS_CHANGE# RESETLOGS_TIME      STATUS  PATH
------------ ------------------ ----------------- ------------------- ------- --------------------
           1                  0                 1 2017-03-08 15:57:31 PARENT   -> 1
           2                  1               200 2018-07-16 13:20:00 PARENT   -> 1 -> 2
           3                  2               400 2018-07-17 15:20:00 ORPHAN   -> 1 -> 2 -> 3
           4                  2               300 2018-07-17 17:20:00 CURRENT  -> 1 -> 2 -> 4

Apa yang telah terjadi? Kami punya anak yatim!

Inkarnasi yatim ...

Jika Anda melihat grafiknya, saat ini kami berdiri di alun-alun pukul 18:00 (6 sore) dengan Inkarnasi 4 dan SCN 400. Sekarang jika Anda mengikuti garis itu kembali ke awal, Anda dapat melihat bahwa kita akan beralih dari inkarnasi 4 kembali ke inkarnasi 2 dan kemudian kembali ke inkarnasi 1, yaitu saat database dibuat.

Ini juga sesuai dengan (disederhanakan) output skrip saya.

INCARNATION# PRIOR_INCARNATION# RESETLOGS_CHANGE# RESETLOGS_TIME      STATUS  PATH
------------ ------------------ ----------------- ------------------- ------- --------------------
           4                  2               300 2018-07-17 17:20:00 CURRENT  -> 1 -> 2 -> 4

Jadi apa yang terjadi dengan inkarnasi 3? Apakah Inkarnasi 3 buruk atau basi atau apa yang menyebabkannya?

Menjawab

Tidak, inkarnasi 3 tidak buruk, hanya yatim piatu.

Pada skala yang lebih besar dengan lebih banyak waktu antara backup dan restore, Anda masih bisa mengembalikan / memulihkan database ke titik waktu dalam garis keturunan inkarnasi 3. Anda akan mematikan perintah berikut:

RESET DATABASE TO INCARNATION 3;

... dan kemudian pulihkan / pulihkan basis data ke titik waktu seperti yang Anda lakukan lainnya mengembalikan / memulihkan basis data.

Apa ORPHANstatusnya memberitahu Anda, adalah bahwa inkarnasi 3 tidak lagi terkait dengan keadaan saat ini dari database dengan inkarnasi saat ini 4. Inkarnasi 3 yatim tidak lagi diperlukan untuk mengembalikan / memulihkan database sepanjang timeline saat ini.

... Menghasilkan Pencadangan Usang

Sekarang melihat cadangan database sehubungan dengan inkarnasi yatim, RMAN menentukan bahwa cadangan inkarnasi yatim adalah OBSOLETE. Tapi itu adalah cerita untuk ...

John alias hot2use
sumber
7

RC_DATABASE_INCARNATION

Anak yatim jika ini adalah inkarnasi tidak lancar yang bukan merupakan leluhur langsung dari inkarnasi saat ini.

Langkah-langkah mereproduksi:

SQL> select incarnation#, status from v$database_incarnation;

INCARNATION# STATUS
------------ -------
           1 PARENT
           2 CURRENT

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    3393014

SQL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size                  8628936 bytes
Variable Size             394265912 bytes
Database Buffers          662700032 bytes
Redo Buffers                8146944 bytes
Database mounted.
SQL> flashback database to scn 3393014;

Flashback complete.

SQL> alter database open resetlogs;

Database altered.

SQL> select incarnation#, status from v$database_incarnation;

INCARNATION# STATUS
------------ -------
           1 PARENT
           2 PARENT
           3 CURRENT

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    3393975

SQL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size                  8628936 bytes
Variable Size             394265912 bytes
Database Buffers          662700032 bytes
Redo Buffers                8146944 bytes
Database mounted.
SQL> flashback database to scn 3393200;

Flashback complete.

SQL> alter database open resetlogs;

Database altered.

SQL> select incarnation#, status from v$database_incarnation;

INCARNATION# STATUS
------------ -------
           1 PARENT
           2 PARENT
           3 PARENT
           4 CURRENT

SQL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size                  8628936 bytes
Variable Size             394265912 bytes
Database Buffers          662700032 bytes
Redo Buffers                8146944 bytes
Database mounted.
SQL> flashback database to scn 3393014;

Flashback complete.

SQL> alter database open resetlogs;

Database altered.

SQL> select incarnation#, status from v$database_incarnation;

INCARNATION# STATUS
------------ -------
           1 PARENT
           2 PARENT
           3 ORPHAN
           4 ORPHAN
           5 CURRENT
Balazs Papp
sumber