oracle row_rowscn的值是否与导入一起使用?

8cdiaqws  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(121)

我有一个表,其中包含数百万行与rowdemendency启用,我把它转储。现在我想导入此表的数据与特定的年份和rowdependency值。如果我导入的表只有日期条件,它将返回正确的值,如果我添加rowdemendency值,它将返回不同的错误行。
例如

Id ora_rowscn
1, 123456
2  123457
3  123458
4  123459
5  123450

字符串
select * from tb1 where id >2它返回3行,如果加上and orw_rowscn <'123459',它什么也不返回。根据我的理解,这种行为正常。它是正确的还是我做错了什么?有没有一种方法可以让我得到特定的日期和行依赖性值?
所需的输出是
3 123458

66bbxpm5

66bbxpm51#

如果您导出 * 文件 * 而不仅仅是表,则ORA_ROWSCN似乎会被保留。常规的数据泵导出和导入总是会更改SCN,因此Oracle没有理由正常保存这些额外信息。但是,由于可传输表空间复制整个数据文件,因此这些额外的SCN信息会随文件一起沿着。
您可能希望仅为这一个表创建一个单独的对象,这样就不需要复制很多额外的对象。

危险

这个解决方案在我的机器上工作,这是我唯一能保证的。这是部分未记录的行为,它可能在其他版本,版本或平台上不起作用。然后还有一个问题,即ORA_ROWSCN值偶尔会根据表的查询方式而改变,即使表没有改变。ORA_ROWSCN不是设计用于这种方式的,但如果你幸运的话,也许对你有用
在应用此解决方案之前,您需要仔细测试它。

脚本

我的脚本主要基于this helpful tutorial about transportable tablespaces from Oracle-Base。我将表更改为一个更简单的表,以证明ORA_ROWSCN保持不变,更改了一些连接和物理属性以匹配我的系统,并重新Map了模式名称和数据库名称,以证明如何将数据复制到同一数据库,但作为不同的模式。
该脚本有点混乱,您需要进行一些重大更改以使其适合您的环境。

sqlplus /@orclpdb as sysdba

CREATE TABLESPACE test_data
  DATAFILE 'D:\19C\APP\JON\ORADATA\ORCL\ORCLPDB\test_data01.dbf'
  SIZE 1M AUTOEXTEND ON NEXT 1M;

CREATE USER test_user IDENTIFIED BY test_user
  DEFAULT TABLESPACE test_data
  TEMPORARY TABLESPACE temp
  QUOTA UNLIMITED ON test_data;

GRANT CREATE SESSION, CREATE TABLE TO test_user;

create table test_user.test1(a number) rowdependencies;

begin
    for i in 1 .. 10 loop
        insert into test_user.test1 values(i);
        commit;
    end loop;
end;
/

select a, trim(to_char(ora_rowscn, '999999999999999')) from test_user.test1 order by a;

From original schema:
A   TRIM(TO_CHAR(ORA_ROWSCN,'999999999999999'))
1   39460713200691
2   39460713200694
3   39460713200697
4   39460713200699
5   39460713200702
6   39460713200704
7   39460713200706
8   39460713200708
9   39460713200710
10  39460713200712

begin
    SYS.DBMS_TTS.TRANSPORT_SET_CHECK(ts_list => 'TEST_DATA', incl_constraints => TRUE);
end;
/

SELECT * FROM sys.transport_set_violations;

ALTER TABLESPACE test_data READ ONLY;

--Modern versions always have this directory working.
-- On my PC: D:\19c\app\jon\admin\orcl\dpdump/9943A0901A94486A900B0716D7E1B70F
select * from dba_directories where directory_name = 'DATA_PUMP_DIR';

expdp userid=\"/@orclpdb as sysdba\" directory=DATA_PUMP_DIR transport_tablespaces=test_data dumpfile=test_data.dmp logfile=test_data_exp.log

-- Copy the datafile to the same location, but with a different name.
copy "D:\19C\APP\JON\ORADATA\ORCL\ORCLPDB\test_data01.dbf" "D:\19C\APP\JON\ORADATA\ORCL\ORCLPDB\test_data02.dbf"

ALTER TABLESPACE test_data READ WRITE;

-- TARGET DB (I'm using the same DB):
CREATE USER test_user2 IDENTIFIED BY test_user2;
GRANT CREATE SESSION, CREATE TABLE TO test_user2;

impdp userid=\"/@orclpdb as sysdba\" directory=DATA_PUMP_DIR dumpfile=test_data.dmp logfile=test_data_imp.log remap_schema=test_user:test_user2 REMAP_TABLESPACE=test_data:test_data2 transport_datafiles='D:\19C\APP\JON\ORADATA\ORCL\ORCLPDB\test_data02.dbf'

select a, trim(to_char(ora_rowscn, '999999999999999')) from test_user2.test1 order by a;

From new schema - notice how the values are the same as above:
A   TRIM(TO_CHAR(ORA_ROWSCN,'999999999999999'))
1   39460713200691
2   39460713200694
3   39460713200697
4   39460713200699
5   39460713200702
6   39460713200704
7   39460713200706
8   39460713200708
9   39460713200710
10  39460713200712

字符串

相关问题