• 数据字典 dba_free_space及相对文件号RELATIVE_FNO 小结


    1.1 dba_free_space

    1.1.1 概述

    SQL> desc dba_free_space;

    Name Type Nullable Default Comments

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

    TABLESPACE_NAME VARCHAR2(30) Y Name of the tablespace containing the extent

    FILE_ID NUMBER Y ID number of the file containing the extent

    BLOCK_ID NUMBER Y Starting block number of the extent

    BYTES NUMBER Y Size of the extent in bytes

    BLOCKS NUMBER Y Size of the extent in ORACLE blocks

    RELATIVE_FNO NUMBER Y Relative number of the file containing the extent

    以上是数据库自带的解释,下面再稍加以解释 。

    TABLESPACE_NAME 表空间的名字

    FILE_ID                 数据库中文件编号,全库唯一的文件编号

    BLOCK_ID              数据库每个区开始的块号

    BYTES 以BLOCK_ID  开始的区还剩余的空间大小(以bytes为单位)

    BLOCKS 以BLOCK_ID 开始的区还剩余的空间大小(以块为单位)

    RELATIVE_FNO        包含以BLOCK_ID开始的区的相对文件号,表空间内唯一的文件编号(1-1023一个循环)

    1.1.2 BYTES与BLOCKS

    BYTES与BLOCKS都表示每个区中剩余的表空间大小,前都以bytes为单位,后者以数据块为单位。假定数据块的大小为8K,那么将有以下关系,BYTES/8/1024 = BLOCKS。例如:

    clip_image002

    1.1.3 RELATIVE_FNO

    RELATIVE_FNO表空间内的相对文件编号,范围为1-1023,超过1023后,将重新从1开始计数。该号码会尽量与文件编号FILE_ID保持一致。

    2 相对文件号测试

    2.1 准备脚本

    测试如下:

    $ mkdir /tmp/orcl

    SQL> create tablespace tsp_1 datafile '/tmp/orcl/tsp_1.dbf' size 1M;

    此时查询该视图

    clip_image004

    这里文件号为14,相对文件号为14,从区中编号为8的块开始,共有120个块空余,即983040 bytes空余空间。这里总计127个块,创建表空间时为1M, 1*1024/8=128。这里需要注意的是,数据库计算空间的最小单位是数据块,虽然创建的是128个块,但这里分配的是127个块。

    SQL> set serverout on size 99999;

    SQL> begin

    2 for i in 2 .. 1023 loop

    3 dbms_output.put_line( 'alter tablespace tsp_1 add datafile ''/tmp/orcl/tsp_' || i || '.dbf'' size 1M;');

    4 end loop;

    5 end;

    6

    7 /

    将这些语句放到一个文件中。

    $ vi /tmp/orcl/add_file.sql

    alter tablespace tsp_1 add datafile '/tmp/orcl/tsp_2.dbf' size 1M;

    alter tablespace tsp_1 add datafile '/tmp/orcl/tsp_8.dbf' size 1M;

    ……

    ……

    alter tablespace tsp_1 add datafile '/tmp/orcl/tsp_13.dbf' size 1M;

    alter tablespace tsp_1 add datafile '/tmp/orcl/tsp_1023.dbf' size 1M;

    2.2 查看空间

    查看空间/tmp是直接挂载在/根目录下的,足够创建这1G的文件。

    $ df -h

    Filesystem Size Used Avail Use% Mounted on

    /dev/sda3 44G 25G 18G 59% /

    tmpfs 940M 346M 594M 37% /dev/shm

    /dev/sda1 194M 28M 157M 15% /boot

    2.3 设置参数

    更改数据库参数设置

    SQL> show parameter files;

    NAME TYPE VALUE

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

    control_files string +DATA_ASM/orcl/controlfile/current.260.891681141

    db_files integer 200

    filesystemio_options string none

    session_max_open_files integer 10

    这个200决定了当前数据库最多有200个数据文件。

    SQL> alter system set db_files = 1023 scope=spfile;

    System altered

    然后重启数据库。

    如果重新后参数仍然是200,没有生效,则进行以下操作:

    SQL> alter database backup controlfile to trace as '/tmp/orcl/controlfile.ctl';

    cat /tmp/orcl/controlfile.ctl

    可以看到有下面一段内容:

    STARTUP NOMOUNT

    CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 200

    MAXINSTANCES 8

    MAXLOGHISTORY 292

    MAXDATAFILES 为 200,所以db_files改了也没有变化。这里我们就需要重建控制文件以修改该参数。

    2.4 重建控制文件

    shutdown immediate

    STARTUP NOMOUNT

    重建控制文件前要备份数据库,我是虚拟机,直接将整个虚拟机进行了备份。

    将以下重建控制文件的脚本放入一个文件中。

    vi create_ctl.sql

    CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 200

    MAXINSTANCES 8

    MAXLOGHISTORY 292

    LOGFILE

    GROUP 1 '+DATA_ASM/orcl/onlinelog/group_1.261.891681143' SIZE 50M BLOCKSIZE 512,

    GROUP 2 '+DATA_ASM/orcl/onlinelog/group_2.262.891681149' SIZE 50M BLOCKSIZE 512,

    GROUP 3 '+DATA_ASM/orcl/onlinelog/group_3.263.891681155' SIZE 50M BLOCKSIZE 512

    -- STANDBY LOGFILE

    DATAFILE

    '+DATA_ASM/orcl/datafile/system.256.891681005',

    ……

    ……

    '/tmp/orcl/tsp_1.dbf',

    '/tmp/orcl/tsp_2.dbf',

    '/tmp/orcl/tsp_3.dbf',

    ……

    ……

    '/tmp/orcl/tsp_187.dbf'

    CHARACTER SET AL32UTF8

    ;

    重建控制文件的完整脚本太长这里略一部分,实际执行时根据自己具体的内容执行即可。

    $ sqlplus / as sysdba

    SQL> @create_ctl.sql;

    Control file created.

    SQL> alter database open resetlogs;

    Database altered.

    2.5 再次设置参数

    再次更换参数并重启数据库:

    alter system set db_files = 1024 scope=spfile;

    SQL> show parameter db_files;

    NAME TYPE VALUE

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

    db_files integer 1024

    SQL>

    2.6 继续创建表空间

    创建完毕后进行查看,可以看到该表空间文件编号从14开始,相对文件号也从14开始

    clip_image006

    clip_image008

    可以看到最后一行相对文件号又从1开始计数了。

    而在数据库中SYSTEM表空间的相对文件默认为1,这表明相对文件号在数据库中是可以重复的,这也是“相对”的原因。

    clip_image010

    2.7 相对文件号小结

    相对文件号范围为1-1023,默认从表空间内最小的文件号开始计数,比如一个表空间有三个文件编号分别为14、15、16的文件时,相对文件为也会默认从14开始编号,依次为14、15、16,它会尽量地与文件编号保持一致,直到1023后,才开始从1重新计数。

    测试完毕,删除测试表空间,同时删除数据文件:

    SQL> drop tablespace tsp_1 including contents and datafiles;

  • 相关阅读:
    Binary Tree Level Order Traversal
    Search a 2D Matrix
    Minimum Path Sum
    Remove Duplicates from Sorted Array II
    AngularJS 过滤器
    AngularJS 控制器
    AngularJS ng-model 指令
    AngularJS Scope(作用域)
    AngularJS 指令
    AngularJS表达式
  • 原文地址:https://www.cnblogs.com/perfei/p/5230360.html
Copyright © 2020-2023  润新知