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

Oracle11G Rac集群控制文件的缩减

331

Part1查询控制文件信息

查询控制文件路径和大小

select v.*,round(BLOCK_SIZE*FILE_SIZE_BLKS/1024/1024,2) from v$controlfile v;

STATUS NAME                          IS_RECOVERY_DEST_FILE    BLOCK_SIZE  FILE_SIZE_BLKS ROUND(BLOCK_SIZE*FILE_SIZE_BLKS/1024/1024,2)
------- --------------------------------------------------- ------------------------  -----------  --------------  -------------------------------------------
       +DATA/dev1/controlfile/current.256.1136586383       NO                       16384          1466            22.91

登录asmcmd查看控制文件大小

以防万一复制出来操作
ASMCMD> cp Current.256.1136586383 /tmp
copying +DATA/DEV1/CONTROLFILE/Current.256.1136586383 -> /tmp/Current.256.1136586383

查看文件大小
du -sh /tmp/Current.256.1136586383 
23M /tmp/Current.256.1136586383

#######################################################################################

或者直接在ASMCMD里操作
ASMCMD> ls -s   
Block_Size  Blocks     Bytes     Space  Name
     16384    1467  24035328  25165824  Current.256.1136586383
Bytes是控制文件大小 22.92M

查看控制文件内部构造(前五个)

SELECT
    type AS "区域类型",
    records_total AS "预分配记录数",
    record_size AS "单条记录大小(字节)",
    -- 核心计算:区域总大小 = 记录数 × 每条大小
    ROUND((records_total * record_size) / 1024 /1024, 2) AS "总大小(MB)"
FROM v$controlfile_record_section
ORDER BY (records_total * record_size) DESC;


区域类型                          预分配记录数          单条记录大小(字节)     总大小(MB)
---------------------------- ----------------- -------------------------- ------------
ARCHIVED LOG                  4480         584                       2.5
FILENAME                      4674         524                      2.34
PROXY COPY                      1004         928                       .89
DATAFILE COPY                    1000         736                        .7
BACKUP PIECE                    1000         736                        .7

数据库内部构造中英文对比

ARCHIVED LOG                归档日志
FILENAME                         文件名
PROXY COPY                         代理副本
DATAFILE COPY                       数据文件副本
BACKUP PIECE                       备份片
DATABASE BLOCK CORRUPTION             数据库块损坏
FOREIGN ARCHIVED LOG                外部归档日志
DATAFILE                           数据文件
RESTORE POINT                    恢复点
GUARANTEED RESTORE POINT             保证恢复点
CKPT PROGRESS                       检查点进度
BACKUP DATAFILE                     备份数据文件
OFFLINE RANGE                       脱机范围
FLASHBACK LOG                       闪回日志
DELETED OBJECT                     已删除对象
TABLESPACE                         表空间
TEMPORARY FILENAME                  临时文件名
RMAN CONFIGURATION                  RMAN 配置
BACKUP SET                     备份集
COPY CORRUPTION                   副本损坏
BACKUP CORRUPTION                  备份损坏
BACKUP REDOLOG                    备份重做日志
DATAFILE HISTORY                   数据文件历史
REMOVABLE RECOVERY FILES             可移动恢复文件
INSTANCE SPACE RESERVATION            实例空间预留
RMAN STATUS                      RMAN 状态
DATABASE INCARNATION                数据库版本
LOG HISTORY                         日志历史
BACKUP SPFILE                       备份 SPFILE
REDO LOG                           重做日志
STANDBY DATABASE MATRIX              备用数据库矩阵
REDO THREAD                         重做线程
ACM OPERATION                       ACM 操作
MTTR                              平均故障恢复时间
THREAD INSTANCE NAME MAPPING           线程实例名称映射
DATABASE                           数据库
RECOVERY DESTINATION                 恢复目标

我百度了一下网上的信息,大多数都是因为闪回和归档太大导致的控制文件大小剧增

查询现存的数据库归档,deleted表示归档是否删除,name一定要指定对,因为可能会有ADG,所以只需要看本地实际存在的就行。

查询现存的数据库归档,deleted表示归档是否删除,name一定要指定对,因为可能会有ADG,所以只需要看本地实际存在的就行。

SELECT 
    COUNT(1) AS "现存归档条数",
    ROUND(SUM(BLOCKS * BLOCK_SIZE) / 1024 / 1024,2) AS "总大小(MB)",
    MIN(FIRST_TIME) AS "最早归档时间",
    MAX(COMPLETION_TIME) AS "最新归档时间"
FROM v$archived_log 
WHERE 
    name IS NOT NULL  -- 确保是有效归档
    AND deleted = 'NO' -- 未被删除
    AND standby_dest = 'NO' -- 排除备用库归档;

现存归档条数   总大小(MB)   最早归档时间  最新归档时间
---------- -------------- ------------ ------------
      2330  361791.38       05-MAY-25   17-AUG-25

Part2尝试缩减控制文件

2.1、清理归档

crosscheck archivelog all;
delete noprompt archivelog all completed before 'sysdate-1/24';
SELECT 
    COUNT(1) AS "现存归档条数",
    ROUND(SUM(BLOCKS * BLOCK_SIZE) / 1024 / 1024,2) AS "总大小(MB)",
    MIN(FIRST_TIME) AS "最早归档时间",
    MAX(COMPLETION_TIME) AS "最新归档时间"
FROM v$archived_log 
WHERE 
    name IS NOT NULL  -- 确保是有效归档
    AND deleted = 'NO' -- 未被删除
    AND standby_dest = 'NO' -- 排除备用库归档;

空值代表清理完毕

刷新检查点

网上说这两个方法都行,我就都执行了
alter system checkpoint;

ALTER SYSTEM ARCHIVE LOG CURRENT;

查询控制文件大小没变化

select v.*,round(BLOCK_SIZE*FILE_SIZE_BLKS/1024/1024,2) from v$controlfile v;

2.2、MOS推荐操作

按照mos清理控制文件归档信息

su - oracle
sqlplus / as sysdba
execute sys.dbms_backup_restore.resetCfileSection( 11);

su - oracle
rman target /
catalog start with '+ARCH'; 
输入yes确定,注册成功

刷新检查点

网上说这两个方法都行,我就都执行了
alter system checkpoint;

ALTER SYSTEM ARCHIVE LOG CURRENT;

查询控制文件大小

select v.*,round(BLOCK_SIZE*FILE_SIZE_BLKS/1024/1024,2) from v$controlfile v;

控制文件大小还是没变化

2.3、重建控制文件(危险)

备份控制文件

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

查询控制文件路径

SQL> show parameter control_files

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
control_files        string  +DATA/ojndev1/controlfile/current.256.1209483215

删除控制文件

su - grid
asmcmd 
cd +DATA/ojndev1/controlfile/
rm -f current.256.1209483215

重启数据库

su - grid
##其中dev6指的是数据库实例
srvctl start database -d dev6

SQL> startup
ORACLE instance started.

Total System Global Area 4977278976 bytes
Fixed Size      2261768 bytes
Variable Size   1006636280 bytes
Database Buffers  3959422976 bytes
Redo Buffers      8957952 bytes
ORA-00205: error in identifying control file, check alert log for more info
启动数据库报错了

后台alert报警日志有更具体的信息

ORA-00210: cannot open the specified control file
ORA-00202: control file: '+DATA/dev1/controlfile/current.256.1136586383'
ORA-17503: ksfdopn:2 Failed to open file +DATA/dev1/controlfile/current.256.1136586383
ORA-15012: ASM file '+DATA/dev1/controlfile/current.256.1136586383' does not exist

如果是集群,需要先关闭集群参数

alter system set cluster_database=FALSE scope=spfile sid='*';

shutdown immediate

startup nomount;

##集群需要关闭数据库参数,否则会报错 重建过程出错: ORA-01503: CREATE CONTROLFILE failed ORA-12720: operation requires database is in EXCLUSIVE mode

打开控制文件备份,摘取所需信息

cat /tmp/ora.trace
注意两点,一个是 -- 都是注释,可以去掉,第二个是控制文件里的创建信息都有重复的,选取一份就行


##启动到nomount状态
STARTUP NOMOUNT

##创建控制文件里的基础信息
CREATE CONTROLFILE REUSE DATABASE "DEV1" NORESETLOGS FORCE LOGGING ARCHIVELOG
    MAXLOGFILES 192
    MAXLOGMEMBERS 3
    MAXDATAFILES 1024
    MAXINSTANCES 32
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '+DATA/DEV1/onlinelog/group_1.257.1136586383'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '+DATA/DEV1/onlinelog/group_2.258.1136586387'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '+DATA/DEV1/onlinelog/group_3.265.1136588301'  SIZE 50M BLOCKSIZE 512,
  GROUP 4 '+DATA/DEV1/onlinelog/group_4.266.1136588305'  SIZE 50M BLOCKSIZE 512,
  GROUP 5 '+REDO1/DEV1/onlinelog/group_5.256.1137165825'  SIZE 512M BLOCKSIZE 512,
  GROUP 6 '+REDO1/DEV1/onlinelog/group_6.257.1137165845'  SIZE 512M BLOCKSIZE 512,
  GROUP 7 '+REDO1/DEV1/onlinelog/group_7.258.1137165869'  SIZE 512M BLOCKSIZE 512,
  GROUP 8 '+REDO1/DEV1/onlinelog/group_8.259.1137165895'  SIZE 512M BLOCKSIZE 512,
  GROUP 9 '+REDO1/DEV1/onlinelog/group_9.260.1137165919'  SIZE 512M BLOCKSIZE 512,
  GROUP 10 '+REDO1/DEV1/onlinelog/group_10.261.1137165945'  SIZE 512M BLOCKSIZE 512,
  GROUP 11 '+REDO1/DEV1/onlinelog/group_11.262.1137165967'  SIZE 512M BLOCKSIZE 512,
  GROUP 12 '+REDO1/DEV1/onlinelog/group_12.263.1137165991'  SIZE 512M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '+DATA/DEV1/datafile/system.259.1136586391',
  '+DATA/DEV1/datafile/sysaux.260.1136586395',
  '+DATA/DEV1/datafile/undotbs1.261.1136586401',
  '+DATA/DEV1/datafile/undotbs2.263.1136586411',
  '+DATA/DEV1/datafile/users.264.1136586413',
  '+DATA/DEV1/datafile/data216.279.1143817619',
  '+DATA/DEV1/datafile/data118.269.1146082531',
  '+DATA/DEV1/datafile/data201.270.1140513811',
  '+DATA/DEV1/datafile/data202.271.1140514565',
  '+DATA/DEV1/datafile/data203.272.1140515325',
  '+DATA/DEV1/datafile/data204.273.1140516139',
  '+DATA/DEV1/datafile/data205.274.1140517355',
  '+DATA/DEV1/datafile/data206.275.1140518125',
  '+DATA/DEV1/datafile/data207.276.1140518967',
  '+DATA/DEV1/datafile/data117.268.1146082829',
  '+DATA/DEV1/datafile/data208.284.1140686939',
  '+DATA/DEV1/datafile/data209.285.1140687429',
  '+DATA/DEV1/datafile/data209.286.1140688513',
  '+DATA/DEV1/datafile/data210.287.1140688719',
  '+DATA/DEV1/datafile/data211.288.1140690141',
  '+DATA/DEV1/datafile/data211.289.1140690991',
  '+DATA/DEV1/datafile/data212.290.1140692383',
  '+DATA/DEV1/datafile/data212.291.1140693221',
  '+DATA/DEV1/datafile/data213.292.1140693931',
  '+DATA/DEV1/datafile/data213.293.1140695049',
  '+DATA/DEV1/datafile/data214.294.1140695737',
  '+DATA/DEV1/datafile/data214.295.1140696435',
  '+DATA/DEV1/datafile/data.296.1140697115',
  '+DATA/DEV1/datafile/ram.297.1140697417',
  '+DATA/DEV1/datafile/data209.298.1140698281',
  '+DATA/DEV1/datafile/data215.299.1140777177',
  '+DATA/DEV1/datafile/le.300.1140814863',
  '+DATA/DEV1/datafile/ta.301.1141232877',
  '+DATA/DEV1/datafile/data117.302.1146082981',
  '+DATA/DEV1/datafile/data119.303.1146083149',
  '+DATA/DEV1/datafile/data119.304.1146083319',
  '+DATA/DEV1/datafile/data101.305.1146172563',
  '+DATA/DEV1/datafile/data101.306.1146172873',
  '+DATA/DEV1/datafile/data112.307.1146216447',
  '+DATA/DEV1/datafile/data114.308.1146216763',
  '+DATA/DEV1/datafile/data121.309.1146217091',
  '+DATA/DEV1/datafile/data121.310.1146217501',
  '+DATA/DEV1/datafile/data120.311.1146218151',
  '+DATA/DEV1/datafile/data120.312.1146218465',
  '+DATA/DEV1/datafile/data.313.1146396267',
  '+DATA/DEV1/datafile/bis.314.1146398503',
  '+DATA/DEV1/datafile/data101.315.1157060861',
  '+DATA/DEV1/datafile/data102.316.1157061107',
  '+DATA/DEV1/datafile/data103.317.1157061489',
  '+DATA/DEV1/datafile/data121.318.1157064139',
  '+DATA/DEV1/datafile/data217.319.1164661325',
  '+DATA/DEV1/datafile/data1.320.1166440571',
  '+DATA/DEV1/datafile/data218.321.1180952741',
  '+DATA/DEV1/datafile/data218.322.1180953329',
  '+DATA/DEV1/datafile/data219.323.1180954095',
  '+DATA/DEV1/datafile/data220.324.1180994957',
  '+DATA/DEV1/datafile/data209.325.1181209855',
  '+DATA/DEV1/datafile/ggtbs.326.1190308823'
CHARACTER SET ZHS16GBK
;

##查看是否需要恢复库(我这里不需要)
RECOVER DATABASE

##强制数据库立即归档当前所有尚未归档的在线重做日志文件 (Online Redo Log Files)。
ALTER SYSTEM ARCHIVE LOG ALL;

##启动数据库
ALTER DATABASE OPEN;

但是报错没有临时表空间

ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA/dev1/tempfile/temp.262.1136586401' SIZE 32767M REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
ALTER TABLESPACE CWTEMP027 ADD TEMPFILE '+DATA/dev1/tempfile/temp027.277.1140538611' SIZE 5120M REUSE AUTOEXTEND OFF;
ALTER TABLESPACE CWTEMP206 ADD TEMPFILE '+DATA/dev1/tempfile/temp206.278.1140538613' SIZE 5120M REUSE AUTOEXTEND OFF;
ALTER TABLESPACE CWTEMP202 ADD TEMPFILE '+DATA/dev1/tempfile/temp202.280.1140538615' SIZE 5120M REUSE AUTOEXTEND OFF;
ALTER TABLESPACE CWTEMP205 ADD TEMPFILE '+DATA/dev1/tempfile/temp205.281.1140538617' SIZE 5120M REUSE AUTOEXTEND OFF;
ALTER TABLESPACE CWTEMP203 ADD TEMPFILE '+DATA/dev1/tempfile/temp203.282.1140538619' SIZE 5120M REUSE AUTOEXTEND OFF;
ALTER TABLESPACE CWTEMP201 ADD TEMPFILE '+DATA/dev1/tempfile/temp201.283.1140538671' SIZE 5120M REUSE AUTOEXTEND OFF;

检查控制文件信息发现已经自动更新了

SQL> show parameter control_files

NAME         TYPE              VALUE
---------------  ----------- ------------------------------
control_files   string    +DATA/ojndev1/controlfile/current.256.1209483215

重启数据库

##修改回集群参数
su - oracle
sqlplus / as sysdba
alter system set cluster_database=True scope=spfile sid='*';

##重启数据库集群
su - grid
srvctl start database -d dev6

查看控制文件构造和大小

SELECT
    type AS "区域类型",
    records_total AS "预分配记录数",
    record_size AS "单条记录大小(字节)",
    -- 核心计算:区域总大小 = 记录数 × 每条大小
    ROUND((records_total * record_size) / 1024 /1024, 2) AS "总大小(MB)"
FROM v$controlfile_record_section
ORDER BY (records_total * record_size) DESC;


区域类型                 预分配记录数 单条记录大小(字节) 总大小(MB)
---------------------------- ----------------- -------------------------- ------------
FILENAME               4674           524   2.34
PROXY COPY              1004           928    .89
DATAFILE COPY             1000         736     .7
BACKUP PIECE             1000         736     .7
DATABASE BLOCK CORRUPTION    8384          80    .64
FOREIGN ARCHIVED LOG       1002         604    .58
DATAFILE            1024         520    .51
RESTORE POINT              2083         212    .42
GUARANTEED RESTORE POINT    2048         212    .41
CKPT PROGRESS                35        8180    .27
OFFLINE RANGE              1063         200     .2
BACKUP DATAFILE            1063         200     .2
ARCHIVED LOG               308         584    .17

数据库层面检查总大小

select v.*,round(BLOCK_SIZE*FILE_SIZE_BLKS/1024/1024,2) from v$controlfile v;

STATUS NAME                          IS_RECOVERY_DEST_FILE    BLOCK_SIZE  FILE_SIZE_BLKS ROUND(BLOCK_SIZE*FILE_SIZE_BLKS/1024/1024,2)
------- --------------------------------------------------- ------------------------  -----------  --------------  -------------------------------------------
       +DATA/ojndev1/controlfile/current.256.1136586383       NO                       16384          1466            17.94

服务器层面查看

ASMCMD>  ls -s Current.256.1209483215
Block_Size  Blocks     Bytes     Space  Name
     16384    1149  18825216  25165824  Current.256.1209483215

可以确定控制文件的确缩小了

从22.92M重建以后缩小到17.94M

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论