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