DM7使用DMRAMN對多次故障恢復後使用不同資料庫的歸檔進行恢復

eric0435發表於2021-01-06

使用DMRAMN對多次故障恢復後使用不同資料庫的歸檔進行恢復
在實際應用中可能會遇到以下還原場景:
1) 建立一個資料庫D1。
2) 運算元據庫並執行資料庫備份B1。
3) 繼續運算元據庫的過程中資料庫故障,此時生成的歸檔為A1。
4) 利用備份B1和歸檔A1將資料庫D1恢復到目標庫D2,此時資料庫D2為D1故障前的狀態。
5) 啟動資料庫D2,運算元據庫過程中資料庫第二次故障,此時生成的歸檔為A2。
歸檔A1、A2屬於不同的資料庫,使用備份B1和歸檔A1、A2是否可以恢復資料庫到第二次故障發生前的狀態呢?下面將舉例詳細說明如何使用不同資料庫的歸檔恢復資料庫到最新狀態,具體步驟如下:

1) 建立源庫D1,即待備份的資料庫,然後啟動資料庫並配置歸檔,歸檔目錄為1) 建立源庫D1,即待備份的資料庫,然後啟動資料庫並配置歸檔,歸檔目錄為/dm_home/dmdba/dmdbms/data/d1_arch。

[dmdba@shard1 data]$ dminit path=/dm_home/dmdba/dmdbms/data db_name=d1 instance_name=d1 port_num=5237 unicode_flag=0
initdb V7.1.6.46-Build(2018.02.08-89107)ENT
db version: 0x7000a
file dm.key not found, use default license!
License will expire on 2020-07-03
 log file path: /dm_home/dmdba/dmdbms/data/d1/d101.log
 log file path: /dm_home/dmdba/dmdbms/data/d1/d102.log
write to dir [/dm_home/dmdba/dmdbms/data/d1].
create dm database success. 2020-06-19 16:47:51
[root@shard1 root]# ./dm_service_installer.sh -i /dm_home/dmdba/dmdbms/data/d1/dm.ini -p d1 -t dmserver
ln -s '/usr/lib/systemd/system/DmServiced1.service' '/etc/systemd/system/multi-user.target.wants/DmServiced1.service'
Finished to create the service (DmServiced1)
[root@shard1 root]# service DmServiced1 start
Redirecting to /bin/systemctl start  DmServiced1.service

--連線資料庫配置歸檔

[dmdba@shard1 ~]$ disql SYSDBA/SYSDBA@localhost:5237
Server[localhost:5237]:mode is normal, state is open
login used time: 9.972(ms)
disql V7.1.6.46-Build(2018.02.08-89107)ENT
Connected to: DM 7.1.6.46
SQL> alter database mount;
executed successfully
used time: 00:00:01.845. Execute id is 0.
SQL> alter database add archivelog 'dest=/dm_home/dmdba/dmdbms/data/d1_arch,type=local,file_size=256,space_limit=10240';
executed successfully
used time: 22.257(ms). Execute id is 0.
SQL> alter database archivelog;
executed successfully
used time: 31.716(ms). Execute id is 0.
SQL> alter database open;
executed successfully
used time: 823.762(ms). Execute id is 0.
SQL> select permanent_magic;
LINEID     PERMANENT_MAGIC
---------- ---------------
1          -836921674
used time: 2.193(ms). Execute id is 807.
SQL> select db_magic from v$rlog;
LINEID     DB_MAGIC
---------- -----------
1          -811309012
used time: 1.365(ms). Execute id is 808.

2) 運算元據庫的同時備份資料庫,備份集為B1。此處以向表中迴圈插入資料為例運算元據庫。

SQL> create table tab_for_recover_01(c1 int);
executed successfully
used time: 22.960(ms). Execute id is 809.
SQL> begin
2   for i in 1 .. 100000 loop
3    insert into tab_for_recover_01 values(i);
4   end loop;
5   commit;
6   end;
7   /
DMSQL executed successfully
used time: 00:00:01.612. Execute id is 810.

插入資料的同時,另外一個會話備份資料庫

SQL> backup database full to b1 backupset '/dm_home/dmdba/dmdbms/backup/b1' device type disk backupinfo 'dameng database full backup online' maxpiecesize 2048;
executed successfully
used time: 00:00:01.920. Execute id is 813.

3) 繼續向資料庫插入資料一段時間後殺掉伺服器,模擬伺服器故障。從備份後到伺服器故障這段時間的生成的歸檔稱為A1。

SQL> begin
2   for i in 100001 .. 199999 loop
3    insert into tab_for_recover_01 values(i);
4   end loop;
5   commit;
6   end;
7   /
DMSQL executed successfully
used time: 00:00:01.633. Execute id is 814.
[root@shard1 root]# ps -ef | grep dmserver
dmdba     9749     1  1 16:49 ?        00:00:09 /dm_home/dmdba/dmdbms/bin/dmserver /dm_home/dmdba/dmdbms/data/d1/dm.ini -noconsole
root     13497  9392  0 17:03 pts/11   00:00:00 grep --color=auto dmserver
[root@shard1 root]# kill -9 9749
[root@shard1 root]# ps -ef | grep dmserver
root     13598  9392  0 17:04 pts/11   00:00:00 grep --color=auto dmserver

4) 建立目標庫D2,即待還原的庫,並配置歸檔(參考3.1.2小節),歸檔目錄與資料庫D1相同。

[dmdba@shard1 data]$ dminit path=/dm_home/dmdba/dmdbms/data db_name=d2 instance_name=d2 port_num=5238 unicode_flag=0
initdb V7.1.6.46-Build(2018.02.08-89107)ENT
db version: 0x7000a
file dm.key not found, use default license!
License will expire on 2020-07-03
 log file path: /dm_home/dmdba/dmdbms/data/d2/d201.log
 log file path: /dm_home/dmdba/dmdbms/data/d2/d202.log
write to dir [/dm_home/dmdba/dmdbms/data/d2].
create dm database success. 2020-06-19 17:11:54
[root@shard1 root]# ./dm_service_installer.sh -i /dm_home/dmdba/dmdbms/data/d2/dm.ini -p d2 -t dmserver
ln -s '/usr/lib/systemd/system/DmServiced2.service' '/etc/systemd/system/multi-user.target.wants/DmServiced2.service'
Finished to create the service (DmServiced2)
[root@shard1 root]# service DmServiced2 start
Redirecting to /bin/systemctl start  DmServiced2.service
[dmdba@shard1 ~]$ disql SYSDBA/SYSDBA@localhost:5238
Server[localhost:5238]:mode is normal, state is open
login used time: 9.862(ms)
disql V7.1.6.46-Build(2018.02.08-89107)ENT
Connected to: DM 7.1.6.46
SQL> alter database mount;
executed successfully
used time: 00:00:01.844. Execute id is 0.
SQL> alter database add archivelog 'dest=/dm_home/dmdba/dmdbms/data/d2_arch,type=local,file_size=256,space_limit=10240';
executed successfully
used time: 40.105(ms). Execute id is 0.
SQL> alter database archivelog;
executed successfully
used time: 31.716(ms). Execute id is 0.
SQL> alter database open;
executed successfully
used time: 675.370(ms). Execute id is 0.

5) 啟動DMRMAN工具,利用備份集B1和歸檔A1恢復資料庫D2到D1故障前的狀態。

[root@shard1 root]# service DmServiced2 stop
Redirecting to /bin/systemctl stop  DmServiced2.service
RMAN> restore database '/dm_home/dmdba/dmdbms/data/d2/dm.ini' from backupset '/dm_home/dmdba/dmdbms/backup/b1';
restore database '/dm_home/dmdba/dmdbms/data/d2/dm.ini' from backupset '/dm_home/dmdba/dmdbms/backup/b1';
file dm.key not found, use default license!
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[4].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[3].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[2].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[1].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[0].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running, write dmrman info.
RESTORE DATABASE  CHECK......
RESTORE DATABASE , dbf collect......
RESTORE DATABASE , dbf refresh ......
RESTORE BACKUPSET [/dm_home/dmdba/dmdbms/backup/b1] START......
total 3 packages processed...
RESTORE DATABASE , UPDATE ctl file......
RESTORE DATABASE , REBUILD key file......
RESTORE DATABASE , CHECK db info......
RESTORE DATABASE , UPDATE db info......
total 4 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 15382.524(ms)
RMAN> recover database '/dm_home/dmdba/dmdbms/data/d2/dm.ini' with archivedir '/dm_home/dmdba/dmdbms/data/d1_arch';
recover database '/dm_home/dmdba/dmdbms/data/d2/dm.ini' with archivedir '/dm_home/dmdba/dmdbms/data/d1_arch';
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[4].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[3].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[2].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[1].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[0].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running, write dmrman info.
EP[0] max_lsn: 134425
total redo pages:32768
EP[0] Recover LSN from 134426 to 235404.
Recover from archive log finished, time used:0.910s.
recover successfully!
time used: 8038.102(ms)

6)啟動目標庫D2,向資料庫中繼續插入資料。

[root@shard1 root]# service DmServiced2 start
Redirecting to /bin/systemctl start  DmServiced2.service
[dmdba@shard1 ~]$ disql SYSDBA/SYSDBA@localhost:5238
Server[localhost:5238]:mode is normal, state is open
login used time: 9.853(ms)
disql V7.1.6.46-Build(2018.02.08-89107)ENT
Connected to: DM 7.1.6.46
SConnected to: DM 7.1.6.46
SQL> select permanent_magic;
LINEID     PERMANENT_MAGIC
---------- ---------------
1          -836921674
used time: 2.479(ms). Execute id is 3.
SQL> select db_magic from v$rlog;
LINEID     DB_MAGIC
---------- -----------
1          1621992964
used time: 1.784(ms). Execute id is 4.

恢復後目標庫的db_magic與源庫的不一樣,因為每次恢復後都會發生改變。

SQL> select count(*) from tab_for_recover_01;
LINEID     COUNT(*)
---------- --------------------
1          199999
used time: 1.256(ms). Execute id is 5.
SQL> begin
2   for i in 200000 .. 300000 loop
3    insert into tab_for_recover_01 values(i);
4   end loop;
5   commit;
6   end;
7   /
DMSQL executed successfully
used time: 00:00:01.274. Execute id is 7.

7) 插入資料一段時間後,殺掉伺服器,模擬伺服器第二次故障。資料庫D2啟動到第二次故障之間產生的歸檔為A2。

SQL> select count(*) from tab_for_recover_01;
LINEID     COUNT(*)
---------- --------------------
1          300000
used time: 0.387(ms). Execute id is 8.
[root@shard1 root]# ps -ef | grep dmserver
dmdba    23093     1  1 17:49 ?        00:00:01 /dm_home/dmdba/dmdbms/bin/dmserver /dm_home/dmdba/dmdbms/data/d2/dm.ini -noconsole
root     23629  9392  0 17:51 pts/11   00:00:00 grep --color=auto dmserver
[root@shard1 root]# kill -9 23093
[root@shard1 root]# ps -ef | grep dmserver
root     23701  9392  0 17:51 pts/11   00:00:00 grep --color=auto dmserver

8) 恢復目標庫D2到第一次故障前的狀態。恢復一次,目標庫的DB_MAGIC都會改變,因此歸檔A1、A2的DB_MAGIC不同,屬於不同的資料庫。第一次恢復只能先重做歸檔A1,即恢復到第一次故障前的狀態。

RMAN> restore database '/dm_home/dmdba/dmdbms/data/d2/dm.ini' from backupset '/dm_home/dmdba/dmdbms/backup/b1';
restore database '/dm_home/dmdba/dmdbms/data/d2/dm.ini' from backupset '/dm_home/dmdba/dmdbms/backup/b1';
file dm.key not found, use default license!
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[4].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[3].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[2].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[1].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[0].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running, write dmrman info.
RESTORE DATABASE  CHECK......
RESTORE DATABASE , dbf collect......
RESTORE DATABASE , dbf refresh ......
RESTORE BACKUPSET [/dm_home/dmdba/dmdbms/backup/b1] START......
total 3 packages processed...
RESTORE DATABASE , UPDATE ctl file......
RESTORE DATABASE , REBUILD key file......
RESTORE DATABASE , CHECK db info......
RESTORE DATABASE , UPDATE db info......
total 4 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 13519.050(ms)
RMAN> recover database '/dm_home/dmdba/dmdbms/data/d2/dm.ini' with archivedir '/dm_home/dmdba/dmdbms/data/d1_arch';
recover database '/dm_home/dmdba/dmdbms/data/d2/dm.ini' with archivedir '/dm_home/dmdba/dmdbms/data/d1_arch';
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[4].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[3].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[2].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[1].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[0].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running, write dmrman info.
EP[0] max_lsn: 134425
total redo pages:32768
total redo pages:50909
total redo pages:25326
EP[0] Recover LSN from 134426 to 339536.
Recover from archive log finished, time used:1.557s.
recover successfully!
time used: 8040.986(ms)

9) 檢視歸檔A2的DB_MAGIC。

[dmdba@shard1 d2_arch]$ ls -lrt
總用量 12800
-rw-r--r-- 1 dmdba dinstall  13093376 6月  19 17:51 ARCHIVE_LOCAL1_20200619174912579_0.log
-rw-r--r-- 1 dmdba dinstall 268435456 6月  19 17:51 ARCHIVE_LOCAL1_20200619175139125_0.log
[dmdba@shard1 d2_arch]$ dmrachk arch_fil=/dm_home/dmdba/dmdbms/data/d2_arch/ARCHIVE_LOCAL1_20200619174912579_0.log
rachk V7.1.6.46-Build(2018.02.08-89107)ENT
/*******************************************************************/
archive file /dm_home/dmdba/dmdbms/data/d2_arch/ARCHIVE_LOCAL1_20200619174912579_0.log itemize.
version        : 0x7004
status         : INACTIVE
n_rpags        : 25565
db_magic       : 1621992964
pemnt_magic    : -836921674
arch_lsn       : 339537
arch_seq       : 0
clsn           : 442123
next_seq       : 25564
file len       : 13093376
file free      : 13093376
create time    : 2020-06-19 17:49:12
close time     : 2020-06-19 17:51:39
crc_check      : TRUE
/*******************************************************************/
The SUMMARY(seqno[0]):
total files: 1
okey files: 1
fail file: 0
repeat file: 0
the rachk tool running cost 0.691 ms
[dmdba@shard1 d2_arch]$ dmrachk arch_fil=/dm_home/dmdba/dmdbms/data/d2_arch/ARCHIVE_LOCAL1_20200619175139125_0.log
rachk V7.1.6.46-Build(2018.02.08-89107)ENT
/*******************************************************************/
archive file /dm_home/dmdba/dmdbms/data/d2_arch/ARCHIVE_LOCAL1_20200619175139125_0.log itemize.
version        : 0x7004
status         : ACTIVE
n_rpags        : 0
db_magic       : 1621992964
pemnt_magic    : -836921674
arch_lsn       : 0
arch_seq       : 0
clsn           : 0
next_seq       : 0
file len       : 268435456
file free      : 4096
create time    : 2020-06-19 17:51:39
close time     : 2020-06-19 17:51:39
crc_check      : TRUE
/*******************************************************************/
check archive file /dm_home/dmdba/dmdbms/data/d2_arch/ARCHIVE_LOCAL1_20200619175139125_0.log, encounter 1 error, as follow:
the archive file /dm_home/dmdba/dmdbms/data/d2_arch/ARCHIVE_LOCAL1_20200619175139125_0.log encounter no data.
The SUMMARY(seqno[0]):
total files: 1
okey files: 0
fail file: 1
repeat file: 0
the rachk tool running cost 0.267 ms

10) 修改目標庫D2的DB_MAGIC與歸檔A2一致。若要利用歸檔恢復,必須保證資料庫的DB_MAGIC與歸檔的DB_MAGIC一致。由步驟8的查詢可知,歸檔A2的DB_MAGIC為1449535319。修改資料庫的DB_MAGIC需要修改SYSTEM.DBF和DAMENG_FOR_RES01.log兩個檔案,步驟如下:
--修改檔案SYSTEM.DBF

[dmdba@shard1 d2_arch]$ dmmdf type=1 file=/dm_home/dmdba/dmdbms/data/d2/SYSTEM.DBF
dmmdf V7.1.6.46-Build(2018.02.08-89107)ENT
**********************************************************
1 db_magic=-779140962
2 next_trxid=1127
3 pemnt_magic=-836921674
**********************************************************
Please input which parameter you want to change(1-3), q to quit: 1
Please input new value: 1621992964
**********************************************************
1 db_magic=1621992964
2 next_trxid=1127
3 pemnt_magic=-836921674
**********************************************************
Do you want to save the change to file (y/n): y
Save to file success!

--修改檔案d201.log

[dmdba@shard1 d2_arch]$ dmmdf type=2 file=/dm_home/dmdba/dmdbms/data/d2/d201.log
dmmdf V7.1.6.46-Build(2018.02.08-89107)ENT
**********************************************************
1 sig = DMRLOG
2 ver = 7004
3 chksum = 0
4 dbversion = 0x7000a
5 sta = 1
6 n_magic = 14
7 db_magic = -779140962
8 clsn_fil = 0
10 next_seq = 0
11 arch_seq = 0
12 len = 268435456
13 free = 4096
14 clsn = 339536
15 clsn_off = 4096
16 arch_lsn = 0
17 pemnt_magic = -836921674
18 fil_id = 0
19 crc_check = 1
**********************************************************
You can only reset sta(5) or db_magic (7) or clsn (14) or pemnt_magic(17) or fil_id(18).
Please input the num which one you want to change, q to quit: 7
Input the new value: 1621992964
**********************************************************
1 sig = DMRLOG
2 ver = 7004
3 chksum = 0
4 dbversion = 0x7000a
5 sta = 1
6 n_magic = 14
7 db_magic = 1621992964
8 clsn_fil = 0
10 next_seq = 0
11 arch_seq = 0
12 len = 268435456
13 free = 4096
14 clsn = 339536
15 clsn_off = 4096
16 arch_lsn = 0
17 pemnt_magic = -836921674
18 fil_id = 0
19 crc_check = 1
**********************************************************
Do you want to quit and save the change to file (y/n): y
Save to file success!

--修改檔案d202.log

[dmdba@shard1 d2_arch]$ dmmdf type=2 file=/dm_home/dmdba/dmdbms/data/d2/d202.log
dmmdf V7.1.6.46-Build(2018.02.08-89107)ENT
**********************************************************
1 sig = DMRLOG
2 ver = 7004
3 chksum = 0
4 dbversion = 0x7000a
5 sta = 0
6 n_magic = 14
7 db_magic = -779140962
8 clsn_fil = 0
10 next_seq = 0
11 arch_seq = 0
12 len = 268435456
13 free = 4096
14 clsn = 0
15 clsn_off = 0
16 arch_lsn = 0
17 pemnt_magic = -836921674
18 fil_id = 1
19 crc_check = 1
**********************************************************
You can only reset sta(5) or db_magic (7) or clsn (14) or pemnt_magic(17) or fil_id(18).
Please input the num which one you want to change, q to quit: 7
Input the new value: 1621992964
**********************************************************
1 sig = DMRLOG
2 ver = 7004
3 chksum = 0
4 dbversion = 0x7000a
5 sta = 0
6 n_magic = 14
7 db_magic = 1621992964
8 clsn_fil = 0
10 next_seq = 0
11 arch_seq = 0
12 len = 268435456
13 free = 4096
14 clsn = 0
15 clsn_off = 0
16 arch_lsn = 0
17 pemnt_magic = -836921674
18 fil_id = 1
19 crc_check = 1
**********************************************************
Do you want to quit and save the change to file (y/n): y
Save to file success!

11) 利用歸檔A2恢復資料庫至第二次故障前的狀態。

RMAN> recover database '/dm_home/dmdba/dmdbms/data/d2/dm.ini' with archivedir '/dm_home/dmdba/dmdbms/data/d2_arch';
recover database '/dm_home/dmdba/dmdbms/data/d2/dm.ini' with archivedir '/dm_home/dmdba/dmdbms/data/d2_arch';
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[4].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[3].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[2].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[1].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running...[0].
checking if the database under system path [/dm_home/dmdba/dmdbms/data/d2] is running, write dmrman info.
EP[0] max_lsn: 339536
EP[0] Recover LSN from 339537 to 442123.
Recover from archive log finished, time used:1.077s.
recover successfully!
time used: 8048.396(ms)

12)驗證資料

[root@shard1 root]# service DmServiced2 start
Redirecting to /bin/systemctl start  DmServiced2.service
SQL> select count(*) from tab_for_recover_01;
LINEID     COUNT(*)
---------- --------------------
1          300000
used time: 3.022(ms). Execute id is 3.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2747749/,如需轉載,請註明出處,否則將追究法律責任。

相關文章