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核心知识和排障案例及经验、性能调优等。

相关推荐
zpjing~.~35 分钟前
Mongo 分页判断是否有下一页
数据库
2401_8576009536 分钟前
技术与教育的融合:构建现代成绩管理系统
数据库·oracle
2301_819287121 小时前
ce第六次作业
linux·运维·服务器·网络
秋恬意1 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
CIb0la1 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生
武汉联从信息1 小时前
如何使用linux日志管理工具来管理oracle osb服务器日志文件?
linux·运维·服务器
天天进步20151 小时前
STUN服务器实现NAT穿透
运维·服务器
潇湘秦1 小时前
一文了解Oracle数据库如何连接(1)
数据库·oracle
雅冰石1 小时前
oracle怎样使用logmnr恢复误删除的数据
数据库·oracle
web前端神器1 小时前
mongodb给不同的库设置不同的密码进行连接
数据库·mongodb