自学内容网 自学内容网

Oracle表空间管理(三)

  1. List item

本篇介绍自定义表空间及数据文件的管理,这里所说的自定义就是指业务或者DBA自己创建的表空间及其对应的数据文件,也就是后续作为DBA要运维管理的核心数据。全是干货,看完这篇,表空间及其数据文件的管理你就全部拿下了!!

业务表空间管理

1. 表空间创建

语法:
CREATE TABLESPACE 表空间名字
DATAFILE ‘数据文件详细信息’
[EXTENT MANAGEMENT { LOCAL
{AUTOALLOCATE | UNIFORM [SIZE INTETER [K|M] ] } } ]
举例:
– 创建大小为100mb的永久表空间TEST01,禁止自动扩展数据文件:

create tablespace TEST01 logging datafile '/oradata/TEST01.dbf' size 100m reuse autoextend off;

– 创建永久表空间TEST02,允许自动扩展数据文件,本地管理方式:

create tablespace TEST02 logging datafile '/oradata/TEST02.dbf' size 100m reuse autoextend on next 10m maxsize 200m extent management local;

– 创建永久表空间TEST03,允许自动扩展数据文件,本地管理方式,区分配方式为自动分配

create tablespace TEST03 logging
datafile'/oradata/TEST03.dbf' size 100m
reuse autoextend on next 10m maxsize 200m
extent management local autoallocate;

– 创建永久表空间TEST04,允许自动扩展数据文件,本地管理方式,区分配方式为定制分配

create tablespace TEST04
logging
datafile'/oradata/TEST04.dbf' size 100m
reuse autoextend on next 10m maxsize 200m
extent management local uniform size 10m;

2. 管理表空间

通过alter tablespace命令该表空间中数据文件的位置(或名字)
–首先把该表空间设置为脱机状态

alter tablespace tbs_data offline normal;

– 手动创建TEST03文件夹,并且复制TEST03.dbf到TEST03文件夹,重命名为TEST03_1.dbf

alter tablespace tbs_data rename datafile
'/oradata/ORCL/tbs_data01.dbf'
to
'/oradata/tbs_data01.dbf';

–最后把该表空间设置为联机状态

alter tablespace TEST03 online;

3. 删除表空间

删除表空间test01 及其对应的数据文件

drop tablespace test01 including contents and datafiles;

4. 查询表空间使用情况

查询表空间的free space

select tablespace_name, count(*) AS extends,round(sum(bytes) / 1024 / 1024, 2) AS
MB,sum(blocks) AS blocks from dba_free_space group BY tablespace_name;

–查询表空间的总容量

select tablespace_name, sum(bytes) / 1024 / 1024 as MB from dba_data_files group
by tablespace_name;

–查询表空间使用率

SELECT total.tablespace_name,
Round(total.MB, 2) AS Total_MB,
Round(total.MB - free.MB, 2) AS Used_MB,
Round(( 1 - free.MB / total.MB ) * 100, 2)
|| '%' AS Used_Pct
FROM (SELECT tablespace_name,
Sum(bytes) / 1024 / 1024 AS MB
FROM dba_free_space
GROUP BY tablespace_name) free,
(SELECT tablespace_name,
Sum(bytes) / 1024 / 1024 AS MB
FROM dba_data_files
GROUP BY tablespace_name) total
WHERE free.tablespace_name = total.tablespace_name;

5. 表空间扩容:表空间的扩容有4种方式:

第一种方式:表空间增加数据文件

alter tablespace test02 add datafile '/oradata/test02_2.DBF' size 100M;

第二种方式:表空间增加数据文件,设置自增长,限制最大值

alter tablespace test02 add datafile '/oradata/test02_3.DBF' size 100M autoextend
on maxsize 1024M;

第三种方式:已存在表空间数据文件设置自增长

alter database datafile '/oradata/TEST02.dbf' autoextend on maxsize 2048M;

第四种方式:已存在表空间数据文件重新设置大小

alter database datafile '/oradata/test02_3.DBF' resize 500M;

补充:redo的管理

1. redo日志状态查看

select group#,thread#,sequence#,bytes/1024/1024
size_MB,members,archived,status,first_change#,to_char(FIRST_TIME,'yyyy-mm-dd
hh24:mi:ss') first_time from v$log;

2. 添加redo日志组

SQL> alter database add logfile group 4
('/oradata/orcl/redo04a.log','/oradata/orcl/redo04b.log') size 100M;

3. 添加redo日志成员

SQL> alter database add logfile group 5 ('/oradata/redo05a.log') size 10M;

–>给group 5添加一个日志成员

SQL> alter database add logfile member '/oradata/redo05b.log' to group 5;

4.删除redo日志组

检查日志组状态

SQL> select group#,thread#,sequence#,bytes/1024/1024
size_MB,members,archived,status,first_change#,to_char(FIRST_TIME,'yyyy-mm-dd
hh24:mi:ss') first_time from v$log;

当archvied状态为yes,status状态为inactive or unused状态时,可以删除该redolog group。

SQL> alter database drop logfile group 5;

查询redo信息
V l o g V log V logVlogfile

5. redolog损坏的恢复

在做下面实验之前,请先对数据库进行一次全库备份。

mkdir /u01/backup
vim full.sh
#!
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.3/db_1
export ORACLE_SID=orcl
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export PATH=$ORACLE_HOME/bin:$PATH
rman target / log /u01/backup/rman_full.log append<<EOF
run
{allocate channel c1 type disk;
allocate channel c2 type disk;
backup database filesperset 4 format '/u01/backup/full_%d_%T_%s_%p';
sql 'alter system archive log current';
sql 'alter system archive log current';
sql 'alter system archive log current';
backup archivelog all format '/u01/backup/arch_%d_%T_%s_%p' delete input;
backup current controlfile format '/u01/backup/ctl_%d_%T_%s_%p';
crosscheck backup;
crosscheck archivelog all;
delete noprompt obsolete;
delete noprompt expired backup;
delete noprompt expired archivelog all;
}
EOF

– 非当前日志组成员损坏
检查redolog日志组状态

SQL> select group#,thread#,sequence#,bytes/1024/1024
size_MB,members,archived,status,first_change#,to_char(FIRST_TIME,'yyyy-mm-dd
hh24:mi:ss') first_time from v$log;

正常关闭数据库

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

删除日志组4的一个日志组成员

SQL> ! rm -f /oradata/orcl/redo04b.log

启动数据库,数据库可以正常启动但是在alert log 日志中报错误。
检查日志状态

SQL> select a.group#,a.thread#,b.member,a.bytes/1024/1024
size_MB,a.members,a.archived,a.status from v$log a,v$logfile b where
a.group#=b.group#;
SQL> select a.group#,b.status,b.member from v$log a join v$logfile b on
a.group#=b.group# where b.status='INVALID';

–>遇到这种情况使用alter database clear方式重建group.

SQL> alter database clear logfile group 4;
Database altered
SQL> select * from v$logfile;

当前日志组损坏
这种状态处理起来是比较麻烦的。需要做不完全恢复或者强制打开,这些都是有可能导致数据丢失的。因此我
们要尽量避免这种情况的发生,对每组日志进行镜像就是一个不错的方法。
–>恢复方法:
1)如果有归档和备份,用不完全恢复。
SQL>startup mount;
SQL>recover database until cancel; 先选择auto尽可能多的利用归档日志进行恢复,然后再次执行
SQL>recover database until cancel; 这次输入cancel,完成不完全恢复
用resetlogs打开数据
SQL>alter database open resetlogs;
2)强制恢复, 这种方法可能会导致数据不一致
sql>startup mount;
sql>alter system set “_allow_resetlogs_corruption”=true scope=spfile;
SQL> shutdown abort
sql>startup mount;
sql>recover database until cancel;
sql>alter database open resetlogs;
–>使用该隐含参数将库来起来以后,需要将数据导出然后重新建库。

本篇涉及到的备份还原操作后续博文会重点专题介绍。

码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,后续不定期分享DB核心知识和排障案例及经验、性能调优等。


原文地址:https://blog.csdn.net/qq_45732829/article/details/142534123

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!