=======================================================
0、测试结论:
测试结果:设置 ErrorStack 级别为 1 时产生 Trace 的日志量最小,大小为 308K,同时在 alert 日志中也存在记录。
1、准备测试数据:
sqlplus / as sysdba
show pdbs
alter session set container=pdb;
create table my_part_table
(
id int not null,
addr varchar2(20))
partition by range (id)
(
partition p1 values less than (1000),
partition P2 values less than (2000),
partition P3 values less than (maxvalue)
);
insert into my_part_table values(1,'addr1');
insert into my_part_table values(2,'addr2');
insert into my_part_table values(3,'addr3');
insert into my_part_table values(1001,'addr1001');
insert into my_part_table values(1002,'addr1002');
insert into my_part_table values(1003,'addr1003');
insert into my_part_table values(2001,'addr2001');
insert into my_part_table values(2002,'addr2002');
insert into my_part_table values(2003,'addr2003');
commit;
select rowid,a.* from my_part_table partition(p1) a;
select rowid,a.* from my_part_table partition(p2) a;
select rowid,a.* from my_part_table partition(p3) a;
2、设置 ErrorStack 级别为 3 时捕获跟踪详细日志:
alter session set events='14402 trace name errorstack forever,level 3';
3、执行对 Oracle 分区表分区字段更新操作:
update my_part_table set id=3001 where id=1;
4、检查产生的日志量:
set linesize 200 pagesize 999
col tracefile format a100
select spid,tracefile from v$process a where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
ls -ltrh <通过上述查询得出的 trace 文件名>
测试结果:设置 ErrorStack 级别为 3 时产生 Trace 的日志量为 5.4M,同时在 alert 日志中也存在记录。
5、设置 ErrorStack 级别为 1 时产生的日志量:
conn / as sysdba
alter session set container=pdb;
alter session set events='14402 trace name errorstack forever,level 1';
update my_part_table set id=3002 where id=2;
set linesize 200 pagesize 999
col tracefile format a100
select spid,tracefile from v$process a where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
ls -ltrh <通过上述查询得出的 trace 文件名>
测试结果:设置 ErrorStack 级别为 1 时产生 Trace 的日志量为 308K,同时在 alert 日志中也存在记录。
6、设置 ErrorStack 级别为 0 时产生的日志量:
conn / as sysdba
alter session set container=pdb;
alter session set events='14402 trace name errorstack forever,level 0';
update my_part_table set id=3003 where id=3;
set linesize 200 pagesize 999
col tracefile format a100
select spid,tracefile from v$process a where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
ls -ltrh <通过上述查询得出的 trace 文件名>
测试结果:设置 ErrorStack 级别为 0 时不产生 Trace 日志,同时在 alert 日志中不存在记录。
=======================================================
附录 1 - 测试日志:
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB READ WRITE NO
SQL> alter session set container=pdb;
Session altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB READ WRITE NO
SQL> create table my_part_table
2 (
3 id int not null,
4 addr varchar2(20))
5 partition by range (id)
6 (
7 partition p1 values less than (1000),
8 partition P2 values less than (2000),
9 partition P3 values less than (maxvalue)
10 );
Table created.
SQL> insert into my_part_table values(1,'addr1');
1 row created.
SQL> insert into my_part_table values(2,'addr2');
1 row created.
SQL> insert into my_part_table values(3,'addr3');
1 row created.
SQL> insert into my_part_table values(1001,'addr1001');
1 row created.
SQL> insert into my_part_table values(1002,'addr1002');
1 row created.
SQL> insert into my_part_table values(1003,'addr1003');
1 row created.
SQL> insert into my_part_table values(2001,'addr2001');
1 row created.
SQL> insert into my_part_table values(2002,'addr2002');
1 row created.
SQL> insert into my_part_table values(2003,'addr2003');
1 row created.
SQL> commit;
Commit complete.
SQL> select rowid,a.* from my_part_table partition(p1) a;
ROWID ID ADDR
------------------ ---------- --------------------
AAAF28AABAAAHmxAAA 1 addr1
AAAF28AABAAAHmxAAB 2 addr2
AAAF28AABAAAHmxAAC 3 addr3
SQL> select rowid,a.* from my_part_table partition(p2) a;
ROWID ID ADDR
------------------ ---------- --------------------
AAAF29AABAAAHm5AAA 1001 addr1001
AAAF29AABAAAHm5AAB 1002 addr1002
AAAF29AABAAAHm5AAC 1003 addr1003
SQL> select rowid,a.* from my_part_table partition(p3) a;
ROWID ID ADDR
------------------ ---------- --------------------
AAAF2+AABAAAHnBAAA 2001 addr2001
AAAF2+AABAAAHnBAAB 2002 addr2002
AAAF2+AABAAAHnBAAC 2003 addr2003
SQL> alter session set events='14402 trace name errorstack forever,level 3';
Session altered.
SQL> update my_part_table set id=3001 where id=1;
update my_part_table set id=3001 where id=1
*
ERROR at line 1:
ORA-14402: updating partition key column would cause a partition change
SQL> set linesize 200 pagesize 999
SQL> col tracefile format a100
SQL> select spid,tracefile from v$process a where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
SPID TRACEFILE
------------------------ ----------------------------------------------------------------------------------------------------
53919 /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_53919.trc
SQL> host ls -ltrh /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_53919.trc
-rw-r----- 1 oracle asmadmin 5.4M Sep 21 10:40 /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_53919.trc
SQL> host tail -15 /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/alert_yqbdb1.log
Pluggable database PDB opened read write
Completed: alter pluggable database pdb open
2023-09-21T10:40:05.964639+08:00
PDB(3):Errors in file /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_53919.trc:
ORA-14402: updating partition key column would cause a partition change
2023-09-21T10:40:08.246821+08:00
PDB(3):*****************************************************************
PDB(3):An internal routine has requested a dump of selected redo.
PDB(3):This usually happens following a specific internal error, when
PDB(3):analysis of the redo logs will help Oracle Support with the
PDB(3):diagnosis.
PDB(3):It is recommended that you retain all the redo logs generated (by
PDB(3):all the instances) during the past 12 hours, in case additional
PDB(3):redo dumps are required to help with the diagnosis.
PDB(3):*****************************************************************
SQL> conn / as sysdba
Connected.
SQL> alter session set container=pdb;
Session altered.
SQL> alter session set events='14402 trace name errorstack forever,level 1';
Session altered.
SQL> update my_part_table set id=3002 where id=2;
update my_part_table set id=3002 where id=2
*
ERROR at line 1:
ORA-14402: updating partition key column would cause a partition change
SQL> set linesize 200 pagesize 999
SQL> col tracefile format a100
SQL> select spid,tracefile from v$process a where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
SPID TRACEFILE
------------------------ ----------------------------------------------------------------------------------------------------
69852 /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_69852.trc
SQL> host ls -ltrh /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_69852.trc
-rw-r----- 1 oracle asmadmin 308K Sep 21 11:05 /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_69852.trc
SQL> host tail -15 /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/alert_yqbdb1.log
PDB(3):Errors in file /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_53919.trc:
ORA-14402: updating partition key column would cause a partition change
2023-09-21T10:40:08.246821+08:00
PDB(3):*****************************************************************
PDB(3):An internal routine has requested a dump of selected redo.
PDB(3):This usually happens following a specific internal error, when
PDB(3):analysis of the redo logs will help Oracle Support with the
PDB(3):diagnosis.
PDB(3):It is recommended that you retain all the redo logs generated (by
PDB(3):all the instances) during the past 12 hours, in case additional
PDB(3):redo dumps are required to help with the diagnosis.
PDB(3):*****************************************************************
2023-09-21T11:05:30.198564+08:00
PDB(3):Errors in file /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_69852.trc:
ORA-14402: updating partition key column would cause a partition change
SQL> conn / as sysdba
Connected.
SQL> alter session set container=pdb;
Session altered.
SQL> alter session set events='14402 trace name errorstack forever,level 0';
Session altered.
SQL> update my_part_table set id=3003 where id=3;
update my_part_table set id=3003 where id=3
*
ERROR at line 1:
ORA-14402: updating partition key column would cause a partition change
SQL> set linesize 200 pagesize 999
SQL> col tracefile format a100
SQL> select spid,tracefile from v$process a where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
SPID TRACEFILE
------------------------ ----------------------------------------------------------------------------------------------------
81453 /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_81453.trc
SQL> host ls -ltrh /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_81453.trc
ls: cannot access /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_81453.trc: No such file or directory
SQL> host tail -15 /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/alert_yqbdb1.log
PDB(3):Errors in file /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_53919.trc:
ORA-14402: updating partition key column would cause a partition change
2023-09-21T10:40:08.246821+08:00
PDB(3):*****************************************************************
PDB(3):An internal routine has requested a dump of selected redo.
PDB(3):This usually happens following a specific internal error, when
PDB(3):analysis of the redo logs will help Oracle Support with the
PDB(3):diagnosis.
PDB(3):It is recommended that you retain all the redo logs generated (by
PDB(3):all the instances) during the past 12 hours, in case additional
PDB(3):redo dumps are required to help with the diagnosis.
PDB(3):*****************************************************************
2023-09-21T11:05:30.198564+08:00
PDB(3):Errors in file /oracle/app/oracle/diag/rdbms/yqbdb/yqbdb1/trace/yqbdb1_ora_69852.trc:
ORA-14402: updating partition key column would cause a partition change
SQL>
附录 2 - 解决 Oracle 分区表不能更新分区字段的方法:
默认情况下,Oracle 分区表对于分区字段是不允许进行 update 操作的,如果更新就会报 ORA-14402 错误,解决方法是临时开启表的 row movement 属性:
alter table my_part_table enable row movement;
update my_part_table set id=3003 where id=3;
commit;
select rowid,a.* from my_part_table partition(p1) a;
select rowid,a.* from my_part_table partition(p2) a;
select rowid,a.* from my_part_table partition(p3) a;
alter table my_part_table disable row movement;
update my_part_table set id=3002 where id=2;
限制:对于普通表( heap-organized )行迁移后 rowid 会发生变化,对于索引表( index-organized )rowid 虽然依然有效但是其实际对应的物理构成是错误的。
测试日志:
SQL> conn / as sysdba
Connected.
SQL> alter session set container=pdb;
Session altered.
SQL> select rowid,a.* from my_part_table partition(p1) a;
ROWID ID ADDR
------------------ ---------- --------------------
AAAF3HAABAAAHnJAAA 1 addr1
AAAF3HAABAAAHnJAAB 2 addr2
AAAF3HAABAAAHnJAAC 3 addr3
SQL> select rowid,a.* from my_part_table partition(p2) a;
ROWID ID ADDR
------------------ ---------- --------------------
AAAF3IAABAAAHnRAAA 1001 addr1001
AAAF3IAABAAAHnRAAB 1002 addr1002
AAAF3IAABAAAHnRAAC 1003 addr1003
SQL> select rowid,a.* from my_part_table partition(p3) a;
ROWID ID ADDR
------------------ ---------- --------------------
AAAF3JAABAAAHnZAAA 2001 addr2001
AAAF3JAABAAAHnZAAB 2002 addr2002
AAAF3JAABAAAHnZAAC 2003 addr2003
SQL> update my_part_table set id=3003 where id=3;
update my_part_table set id=3003 where id=3
*
ERROR at line 1:
ORA-14402: updating partition key column would cause a partition change
SQL> alter table my_part_table enable row movement;
Table altered.
SQL> update my_part_table set id=3003 where id=3;
1 row updated.
SQL> commit;
Commit complete.
SQL> select rowid,a.* from my_part_table partition(p1) a;
ROWID ID ADDR
------------------ ---------- --------------------
AAAF3HAABAAAHnJAAA 1 addr1
AAAF3HAABAAAHnJAAB 2 addr2
SQL> select rowid,a.* from my_part_table partition(p2) a;
ROWID ID ADDR
------------------ ---------- --------------------
AAAF3IAABAAAHnRAAA 1001 addr1001
AAAF3IAABAAAHnRAAB 1002 addr1002
AAAF3IAABAAAHnRAAC 1003 addr1003
SQL> select rowid,a.* from my_part_table partition(p3) a;
ROWID ID ADDR
------------------ ---------- --------------------
AAAF3JAABAAAHnZAAA 2001 addr2001
AAAF3JAABAAAHnZAAB 2002 addr2002
AAAF3JAABAAAHnZAAC 2003 addr2003
AAAF3JAABAAAHnZAAD 3003 addr3
SQL> alter table my_part_table disable row movement;
Table altered.
SQL> update my_part_table set id=3002 where id=2;
update my_part_table set id=3002 where id=2
*
ERROR at line 1:
ORA-14402: updating partition key column would cause a partition change