现在ORACLE多租户使用越来越多,如果某个PDB的某个表空间中表出现了误操作,如何能快速处理呢?
我们知道,从ORACLE 11G开始, ORACLE就提供了表空间基于时间点的恢复,那么,如果是12C以上,使用了PDB,PDB中的表空间是否支持PITR呢 ?
目录
1.2 创建两个表空间 tsp_test1,tsp_test2
答案是肯定的,下午以实际例子说明:
1.模拟环境
1.1 环境说明
ORACLE 19C 19.23+LINUX 9.4
DB:ORCLDB
PDB: pdborcl
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDBORCL READ WRITE NO
。。。
1.2 创建两个表空间 tsp_test1,tsp_test2
SQL> conn sys/oracle_4U@192.168.133.120:1521/pdborcl as sysdba;
SQL> create tablespace tsp_test1 datafile '/u01/app/oracle/oradata/ORCLCDB/pdborcl/tsp_test1.dbf' size 10m ;
SQL> create tablespace tsp_test2 datafile '/u01/app/oracle/oradata/ORCLCDB/pdborcl/tsp_test2.dbf' size 10m ;
1.3 创建测试表
SQL> conn hr/hr@192.168.133.120:1521/pdborcl
SQL> create table dept2 tablespace tsp_test2 as select * from departments;
SQL> create table emp1 tablespace tsp_test1 as select * from emp;
SQL> create index idx_dept on dept2(department_id) tablespace tsp_test2;
SQL> alter table dept2 modify (department_id constraint pk_dept2 primary key);
SQL> alter table emp1 add constraint fk_emp1_deptid foreign key (department_id)
references dept2;
SQL> select count(*) from emp1;
COUNT(*)
----------
107
SQL> select count(*) from dept2;
COUNT(*)
----------
27
1.4 获取当前时间
SQL> select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
19-MAY-24 10.23.32.420449 AM +08:00
2.模拟故障
--截断表
SQL> truncate table emp1;
Table truncated.
--验证数据
SQL> select count(*) from dept2;
COUNT(*)
----------
27
SQL> select count(*) from emp1;
COUNT(*)
----------
0
SQL> exit
EMP1数据已经截断
3.使用TSPITR恢复表空间到故障之前时间
3.1 检查恢复表空间自包含性
SQL> CONN sys/oracle_4U@192.168.133.120:1521/pdborcl as sysdba
Connected.
SQL> exec dbms_tts.transport_set_check('TSP_TEST1',TRUE);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
VIOLATIONS
--------------------------------------------------------------------------------
ORA-39906: Constraint FK_EMP1_DEPTID between table HR.DEPT2 in tablespace TSP_TE
ST2 and table HR.EMP1 in tablespace TSP_TEST1.
--以上表明:只恢复 TSP_TEST1表空间不行,因为EMP1的外键引用了DEPT2的主键,而DEPT2在TSP_TEST2表空间,具体可以看 transport_set_violations 的内容。
--如果只想恢复某一个表空间,那么,要把相关联的表空间一起恢复,或者,去掉之间的关系。
--我们这里,把两个表空间一起恢复
SQL> exec dbms_tts.transport_set_check('TSP_TEST1,TSP_TEST2',TRUE);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
no rows selected
--现在看来没有输出,说明两个表空间是自保函的,这个内容和以前的NONCDB是一样的。
3.2 连接到CDB$ROOT进行表空间恢复
--如果连接到PDB进行恢复,会报错RMAN-06617,如下:
RMAN> recover tablespace tsp_test1,tsp_test2
2> until time "to_date('2024-05-19 10:23:32','yyyy-mm-dd hh24:mi:ss')"
3> auxiliary destination '/tmp/aux';
Starting recover at 2024-05-19 10:36:25
using target database control file instead of recovery catalog
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 05/19/2024 10:36:26
RMAN-06617: UNTIL TIME (2024-05-19 10:23:32) is ahead of last NEXT TIME in archived logs (2024-05-19 09:49:55)
RMAN> exit
--连接到CDB$root后,不再报错。
[oracle@dbserver ~]$ rman target /
Recovery Manager: Release 19.0.0.0.0 - Production on Sun May 19 10:44:38 2024
Version 19.22.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
connected to target database: ORCLCDB (DBID=2931055914)
RMAN> recover tablespace pdborcl:tsp_test1,pdborcl:tsp_test2
2> until time "to_date('2024-05-19 10:23:32','yyyy-mm-dd hh24:mi:ss')"
3> auxiliary destination '/tmp/aux';
--自动构造辅助库,整个库恢复到指定时间
Starting recover at 2024-05-19 10:45:27
using target database control file instead of recovery catalog
current log archived
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=398 device type=DISK
RMAN-05026: warning: presuming following set of tablespaces applies to specified point-in-timeList of tablespaces expected to have UNDO segments
Tablespace SYSTEM
Tablespace PDBORCL:SYSTEM
Tablespace UNDOTBS1
Tablespace PDBORCL:UNDOTBS1Creating automatic instance, with SID='jvmt'
initialization parameters used for automatic instance:
db_name=ORCLCDB
db_unique_name=jvmt_p
Oracle 19C PDB表空间基于时间点恢复实例

最低0.47元/天 解锁文章
1597

被折叠的 条评论
为什么被折叠?



