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

相关推荐
纯纯沙口11 分钟前
Qt—用SQLite实现简单的注册登录界面
数据库·sqlite
南棱笑笑生20 分钟前
20250512给NanoPi NEO core开发板在Ubuntu core20.04系统更新boot.img
linux·运维·ubuntu
初次见面我叫泰隆24 分钟前
MySQL——3、数据类型
数据库·mysql
小锋学长生活大爆炸38 分钟前
【教程】Docker更换存储位置
运维·docker·容器
zxrhhm44 分钟前
Oracle 中的虚拟列Virtual Columns和PostgreSQL Generated Columns生成列
postgresql·oracle·vr
一叶屋檐1 小时前
Neo4j 图书馆借阅系统知识图谱设计
服务器·数据库·cypher
愚润求学1 小时前
【Linux】动静态库链接原理
linux·运维·服务器·开发语言·笔记
云攀登者-望正茂2 小时前
无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成
运维·jenkins·argocd
好吃的肘子2 小时前
MongoDB 应用实战
大数据·开发语言·数据库·算法·mongodb·全文检索
weixin_472339462 小时前
MySQL MCP 使用案例
数据库·mysql