暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle数据库表空间操作深度学习

Gladlyknow 2019-12-03
485

本文意在提供一种学习oracle内在运行原理的方法。在这里记录一下,参考了盖总解决问题的思路。如有雷同,实属正常。


SQL> create tablespace wbbtest datafile                                             '/oracle/app/oracle/wangbb/wangbb/wbbtest.dbf' size 10M autoextend on;

Tablespace created.

SQL> alter session set events '10046 trace name context forever,level 12';

Session altered.

SQL> drop tablespace wbbtest;

Tablespace dropped.

SQL> alter session set events '10046 trace name context off';

Session altered

SQL> select * from v$diag_info;

'''''''*************************************************'''''''''''''''''''''''''''''''''''

VALUE

/oracle/app/oracle/diag/rdbms/wangbb/wangbb/trace/wangbb_ora_2029.trc

将跟踪文件进行转换:

SQL> !tkprof oracle/app/oracle/diag/rdbms/wangbb/wangbb/trace/wangbb_ora_2029.trc home/oracle/2029.txt

TKPROF: Release 11.2.0.4.0 - Development on Mon Dec 2 08:54:20 2019

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.


$ vim 2029.txt 


以下输出显示了绑定变量, 这个 SQL 更新了 TS$字典表,将表空间 2(ts# = 1)更新 name=’WANGBB’, Online$=3,完成了这一步骤的操作:


以下文本截取部分txt文件

.........................................

update ts$ set name=:2,online$=:3,contents$=:4,undofile#=:5,undoblock#=:6,

  blocksize=:7,dflmaxext=:8,dflinit=:9,dflincr=:10,dflextpct=:11,dflminext=

  :12,dflminlen=:13,owner#=:14,scnwrp=:15,scnbas=:16,pitrscnwrp=:17,

  pitrscnbas=:18,dflogging=:19,bitmapped=:20,inc#=:21,flags=:22,plugged=:23,

  spare1=:24,spare2=:25,affstrength=:26

where

 ts#=:1


call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        2      0.00       0.00          0          0          0           0

Execute      2      0.00       0.01          0          4          3           2

Fetch        0      0.00       0.00          0          0          0           0

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        4      0.00       0.01          0          4          3           2


Misses in library cache during parse: 0

Optimizer mode: CHOOSE

Parsing user id: SYS   (recursive depth: 1)

Number of plan statistics captured: 1


Rows (1st) Rows (avg) Rows (max)  Row Source Operation

---------- ---------- ----------  ---------------------------------------------------

         0          0          0  UPDATE  TS$ (cr=2 pr=0 pw=0 time=234 us)

         1          1          1   TABLE ACCESS CLUSTER TS$ (cr=2 pr=0 pw=0 time=30 us cost=1 size=87 card=1)

         1          1          1    INDEX UNIQUE SCAN I_TS# (cr=1 pr=0 pw=0 time=11 us cost=0 size=0 card=1)(object id 7)



可以看到数据库更新

..........................................

接下来的操作更新了 file$字典表,可以看到将此表空间的状态更改状态;

(status$=:4)

update file$ set blocks=:2,ts#=DECODE(:3,-1,NULL,:3),status$=:4, relfile#=

  DECODE(:5,0,NULL,:5),maxextend=:6,inc=:7,crscnwrp=:8,crscnbas=:9,spare1=

  DECODE(:10,0,NULL,:10)

where

 file#=:1


可以查看file$表,看到此时的file#=10 的文件状态已经更改为1了。

而此时查询 dba_tablespaces 视图时,是看不到这些状态位 3 的表空间信息的:

SQL> select file_id,tablespace_name from dba_data_files;

   FILE_ID TABLESPACE_NAME

---------- ------------------------------

         4 USERS

         2 SYSAUX

         1 SYSTEM

         3 MWS_SYS

         5 UNDOWBB

         6 MWS_RTM

         7 MWS_APP

         8 MWS_FILE

         9 MWS_BASELINE

rows selected.


这是因为在创建视图时, Oracle 对 online$字段进行了过滤:


create or replace view DBA_TABLESPACES

(TABLESPACE_NAME, BLOCK_SIZE, INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS,

MAX_EXTENTS, PCT_INCREASE, MIN_EXTLEN,STATUS, CONTENTS, LOGGING,

FORCE_LOGGING, EXTENT_MANAGEMENT, ALLOCATION_TYPE, PLUGGED_IN,

SEGMENT_SPACE_MANAGEMENT, DEF_TAB_COMPRESSION, RETENTION, BIGFILE)

as select ts.name, ts.blocksize, ts.blocksize * ts.dflinit,

decode(bitand(ts.flags, 3), 1, to_number(NULL), ts.blocksize * ts.dflincr),

ts.dflminext,

decode(ts.contents$, 1, to_number(NULL), ts.dflmaxext),

decode(bitand(ts.flags, 3), 1, to_number(NULL), ts.dflextpct),

ts.blocksize * ts.dflminlen,

decode(ts.online$, 1, 'ONLINE', 2, 'OFFLINE',

4, 'READ ONLY', 'UNDEFINED'),

decode(ts.contents$, 0, (decode(bitand(ts.flags, 16), 16, 'UNDO',

'PERMANENT')), 1, 'TEMPORARY'),

decode(bitand(ts.dflogging, 1), 0, 'NOLOGGING', 1, 'LOGGING'),

decode(bitand(ts.dflogging, 2), 0, 'NO', 2, 'YES'),decode(ts.bitmapped, 0, 'DICTIONARY', 'LOCAL'),

decode(bitand(ts.flags, 3), 0, 'USER', 1, 'SYSTEM', 2, 'UNIFORM', 'UNDEFINED'),

decode(ts.plugged, 0, 'NO', 'YES'),

decode(bitand(ts.flags,32), 32,'AUTO', 'MANUAL'),

decode(bitand(ts.flags,64), 64,'ENABLED', 'DISABLED'),

decode(bitand(ts.flags,16), 16, (decode(bitand(ts.flags, 512), 512,

'GUARANTEE', 'NOGUARANTEE')), 'NOT APPLY'),

decode(bitand(ts.flags,256), 256, 'YES', 'NO')

from sys.ts$ ts

where ts.online$ != 3

and bitand(flags,2048) != 2048

/

如果我们进一步的创建一个新的表空间, Oracle 会重用之前 file$中删除的文件号:


SQL> create tablespace test datafile '/oracle/app/oracle/wangbb/wangbb/test.dbf' size 10M autoextend on;

Tablespace created.

SQL> select ts#,name,online$ from ts$;

       TS# NAME                              ONLINE$

---------- ------------------------------ ----------

         0 SYSTEM                                  1

         1 SYSAUX                                  1

         2 UNDOTBS1                                3

         3 TEMP                                    1

         4 USERS                                   1

         5 UNDOTBS2                                3

         6 UNDOWBB                                 1

         7 Gladly                                  3

         8 MWS_SYS                                 1

         9 MWS_RTM                                 1

        10 MWS_APP                                 1


       TS# NAME                              ONLINE$

---------- ------------------------------ ----------

        11 MWS_FILE                                1

        12 MWS_BASELINE                            1

        13 WBBTEST                                 3

        14 TEST                                    1

15 rows selected.

SQL> select file#,relfile#,inc,status$,blocks,ts#,crscnwrp,crscnbas from file$;

     FILE#   RELFILE#        INC    STATUS$     BLOCKS        TS#   CRSCNWRP   CRSCNBAS

---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------

         1          1       1280          2      64000          0          0          7

         2          2       1280          2      51200          1          0       1834

         3          3      12800          2      64000          8          0    1087001

         4          4        160          2        640          4          0      16143

         5          5       1280          2      12800          6          0     988116

         6          6      12800          2      64000          9          0    1087275

         7          7      12800          2      64000         10          0    1087548

         8          8      25600          2     256000         11          0    1087820

         9          9      12800          2      64000         12          0    1088093

        10         10          1          2       1280         14          0    1259837

10 rows selected.


而如果我们重建的表空间与之前删除的同名,则 Oracle 会重用之前的表空间信息

SQL> create tablespace WBBTEST datafile                                          '/oracle/app/oracle/wangbb/wangbb/wbbtext.dbf' size 10M;

Tablespace created.

SQL> select file#,relfile#,inc,status$,blocks,ts#,crscnwrp,crscnbas from file$ where file# > 8;


     FILE#   RELFILE#        INC    STATUS$     BLOCKS        TS#   CRSCNWRP   CRSCNBAS

---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------

         9          9      12800          2      64000         12          0    1088093

        10         10          1          2       1280         14          0    1259837

        11         11          0          2       1280         13          0    1260160


    了解此操作的详细过程可在遇到问题时更快的找到真相

  • 例如模拟数据库的00600错误;

  • 查看ts$表相关内容,然后将测试表空间的相关信息删除;

SQL> select ts#,name,online$ from ts$;

       TS# NAME                              ONLINE$

---------- ------------------------------ ----------

         0 SYSTEM                                  1

         1 SYSAUX                                  1

         2 UNDOTBS1                                3

         3 TEMP                                    1

         4 USERS                                   1

         5 UNDOTBS2                                3

         6 UNDOWBB                                 1

         7 Gladly                                  3

         8 MWS_SYS                                 1

         9 MWS_RTM                                 1

        10 MWS_APP                                 1


       TS# NAME                              ONLINE$

---------- ------------------------------ ----------

        11 MWS_FILE                                1

        12 MWS_BASELINE                            1

        13 WBBTEST                                 1

        14 TEST                                    1

15 rows selected.

SQL> delete from ts$ where ts#=13;

 row deleted.

SQL> commit;

Commit complete.

SQL> 


  • 测试表空间删除,使用正常语句drop tablespace 删除测试表空间。此时数据库的反映与数据库的版本有关。

  • 数据库环境

         操作系统:windows

         数据库   :10.2.0.1

截取告警日志:

Mon Dec 02 11:40:13 2019

drop tablespace wbbtest

Mon Dec 02 11:40:13 2019

Errors in file e:\oracle\product\10.2.0\db_1\admin\orcl\udump\orcl_ora_13704.trc:

ORA-00600: 内部错误代码, 参数: [4348], [U], [0], [8], [], [], [], []

*** SERVICE NAME:(SYS$USERS) 2019-12-02 11:40:13.516

*** SESSION ID:(145.11637) 2019-12-02 11:40:13.516

*** 2019-12-02 11:40:13.516

ksedmp: internal or fatal error

ORA-00600: 内部错误代码, 参数: [4348], [U], [0], [8], [], [], [], []

Current SQL statement for this session:

数据库操作:

----- Call Stack Trace -----

calling              call     entry                argument values in hex      

location             type     point                (? means dubious value)     

-------------------- -------- -------------------- ----------------------------

SQL> shu immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。

Total System Global Area  293601280 bytes

Fixed Size                  1248600 bytes

Variable Size              75498152 bytes

Database Buffers          209715200 bytes

Redo Buffers                7139328 bytes

数据库装载完毕。

数据库已经打开。

SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME

------------------------------

SYSTEM

UNDOTBS1

SYSAUX

TEMP

USERS

EXAMPLE

UNDO02

已选择7行。

SQL> drop tablespace wbbtest;

drop tablespace wbbtest

*

第 1 行出现错误:

ORA-00959: 表空间 'WBBTEST' 不存在

SQL>


数据库此时将运行一段时间然后崩溃;

查看数据库告警日志:

Tue Dec 03 08:57:02 2019

Errors in file e:\oracle\product\10.2.0\db_1\admin\orcl\bdump\orcl_smon_23444.trc:

ORA-00600: internal error code, arguments: [kccocx_01], [], [], [], [], [], [], []

ORA-00600: internal error code, arguments: [25015], [8], [8], [7], [], [], [], []

Tue Dec 03 08:57:02 2019

ORACLE Instance orcl (pid = 8) - Error 600 encountered while recovering transaction (16, 4).

Tue Dec 03 08:57:02 2019

Errors in file e:\oracle\product\10.2.0\db_1\admin\orcl\bdump\orcl_smon_23444.trc:

ORA-00600: internal error code, arguments: [25015], [8], [8], [7], [], [], [], []



SQL> select ADDR,KTUXEUSN,KTUXESLT,KTUXESQN,KTUXESIZ,KTUXECFL from x$ktuxe where ktuxeusn=6 and ktuxeslt=42;

ADDR KTUXEUSN KTUXESLT KTUXESQN KTUXESIZ KTUXECFL

-------- ---------- ---------- ---------- ---------- -------------------

094878F0 16 4 332 1 DEA

SQL> select distinct KTUXECFL,count(*) from x$ktuxe group by KTUXECFL;

KTUXECFL COUNT(*)

------------------------ ----------

DEAD        1

NONE        481


1. 如果此时我们将 16 号回滚段标记为损坏,则可以避免回滚时出现的问题,正常无误的启

动数据库:

SQL> alter system set "_corrupted_rollback_segments"='_SYSSMU16$' scope=spfile;

系统已更改。

SQL> alter system set "_offline_rollback_segments"='_SYSSMU16$' scope=spfile;

系统已更改。

SQL> shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

.......

如果此时尝试 DROP 回滚段,则数据库还会出现 600 错误:

2. SQL> drop rollback segment "_SYSSMU6$";

drop rollback segment "_SYSSMU6$"

* 第

1 行出现错误:

ORA-00607: 当更改数据块时出现内部错误

ORA-00600: 内部错误代码, 参数: [kddummy_blkchk], [2], [89], [38508], [], [], [], []


3. SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;

系统已更改。

SQL> shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount;

ORACLE 例程已经启动。

Total System Global Area 612368384 bytes

Fixed Size 1298160 bytes

Variable Size 167772432 bytes

Database Buffers 436207616 bytes

Redo Buffers 7090176 bytes

数据库装载完毕。

4. SQL> recover database using backup controlfile until cancel;

ORA-00279: 更改 1011115 (在 08/09/2010 17:52:04 生成) 对于线程 1 是必需的

ORA-00289: 建议: D:\ORACLE\10.2.0\RDBMS\ARC00006_0726573063.001

ORA-00280: 更改 1011115 (用于线程 1) 在序列 #6 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

cancel

介质恢复已取消。

SQL> alter database open resetlogs;

数据库已更改。

5. SQL> create undo tablespace undotbs2 datafile size 10M;

表空间已创建。

SQL> alter system set undo_tablespace=undotbs2;

系统已更改。

6. SQL> alter tablespace undotbs1 offline;

表空间已更改。

SQL> drop tablespace undotbs1;

表空间已删除。

SQL> drop tablespace WBBTEST;

表空间已删除。


  • 11G环境

         操作系统:linux6.8

         数据库   :11.2.0.4

drop tablespace WBBTEST

*

ERROR at line 1:

ORA-00959: tablespace 'WBBTEST' does not exist

此时尝试关闭数据库

此时数据库不会有任何报错,但是wbbtest表空间已不存在。就像蒸发了一样。查询不到

有意思的是,如果数据库中有表存在此表空间中的话表名将直接隐藏。但是却不影响其他对表的dml操作。即虽然从相应的视图中看不到对象,但对象确实实际存在并且是可以操作的。


SQL> select segment_name,tablespace_name from dba_segments where owner='SCOTT';

SEGMENT_NAME                                                                      TABLESPACE_NAME

--------------------------------------------------------------------------------- ------------------------------

PK_EMP                                                                            USERS

PK_DEPT                                                                           USERS

WANGBB                                                                            USERS

SALGRADE                                                                          USERS

EMP                                                                               USERS

DEPT                                                                              USERS

SQL> conn scott/tiger

Connected.

SQL> select * from w;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7898 SMITH      CLERK           7902 17-DEC-80        800                    20

      7898 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7898 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7898 JONES      MANAGER         7839 02-APR-81       2975                    20

      7898 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7898 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7898 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7898 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7898 KING       PRESIDENT            17-NOV-81       5000                    10

      7898 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7898 ADAMS      CLERK           7788 23-MAY-87       1100                    20


     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7898 JAMES      CLERK           7698 03-DEC-81        950                    30

      7898 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7898 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

SQL> update w set empno=7788;

14 rows updated.

SQL> commit;

SQL> select table_name from user_tables;

TABLE_NAME

------------------------------

DEPT

EMP

BONUS

SALGRADE

WANGBB

SQL> 



此实验只是提供了解决问题的一种思路。更深的理解oracle运行原理,遇到类似的问题才不会慌。

文章转载自Gladlyknow,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论