Oracle扩展表空间
Oracle的表空间扩展,一般方法是,对已存在表空间数据文件设置新的大小。
在实际应用场景中,通常还会遇到更多问题,比如设置大小报错,文件超出32G了,需要新增表空间文件。
新增文件报错,文件数超出了预设值。修改预设值不生效,要重起数据库实例才生效。重起数据库实例主库生效后,备份库还需要重起同步生效。
等更多问题会遇到和需要解决,日常还需要巡检表空间的使用情况,表空间文件大小、文件数、文件路径,所以记录此篇。
查看表空间使用情况
--表空间巡查(按GB)
select a.tablespace_name as "表空间名","最大空间(GB)","占用空间(GB)",("占用空间(GB)"-"剩余空间(GB)") as "使用空间(GB)",round(("占用空间(GB)"-"剩余空间(GB)")/"占用空间(GB)"*100,2) as "使用率1(%)"
,round(("占用空间(GB)"-"剩余空间(GB)")/"最大空间(GB)"*100,2) as "使用率2(%)"
from (select tablespace_name,sum(decode(AUTOEXTENSIBLE,'NO',bytes,'YES',maxbytes))/1024/1024/1024 as "最大空间(GB)",sum(bytes)/1024/1024/1024 as "占用空间(GB)" from dba_data_files group by tablespace_name) a
,(select tablespace_name,sum(bytes)/1024/1024/1024 as "剩余空间(GB)" from dba_free_space group by tablespace_name) b
where a.tablespace_name=b.tablespace_name order by 6 desc;
查单个表空间情况
select df.BYTES/1024/1024/1024,df.* from dba_data_files df where df.TABLESPACE_NAME='CPOE_DATA'
表空间扩展
--表空间扩展方法一,对已存在表空间数据文件设置新的大小,单位M。示例:
alter database datafile '/vdb2/service/oracle/data/oracle/oradata/orcl/user04.dbf' resize 32736m
如果报错:ORA-01144: File size (5242880 blocks) exceeds maximum of 4194303 blocks
那就是超出最大限制了,如果此时的表空间已经最大化了,建议新增一个对应表空间的数据文件并设定大小。
由于Oracle的Rowid中使用22位来代表Block号,这22位最多只能代表2^22-1(4194303)个数据块,而在我们一般情况下使用的数据块大小为8k,所以数据文件的理论大小最大为: 31.9999924G。
--查看表空间文件 隐藏参数,db_files 值为文件数。
show parameter file;
--查看表空间db_files值
show parameter db_files
新增数据文件
--新增表空间,并指定大小
alter tablespace '表空间名称' add datafile '表空间位置' size '容量大小';
--示例
alter tablespace mytable01 add datafile '/vdb2/service/oracle/data/oracle/oradata/orcl/users06.dbf' size 32736m;
--新增表空间,并指定大小,设置自动增长,并限定最大值。示例
alter tablespace CPOE_DATA add datafile '+DATA/xxxxxx/datafile/cpoe_data.11122.322233' size 2000m autoextend on maxsize 34359721984;
----给当前表空间添加数据文件并自动扩容,没有最大限制。缺省默认值最大扩展到32G.(不指定文件名,只指定路径,会自动生成)
alter tablespace CPOE_DATA add datafile '+DATA' size 1024M autoextend on next 1024M; --测试可用
alter tablespace CPOE_DATA add datafile size 2048M autoextend on next 1024M maxsize unlimited; --未测试
--添加数据文件后,检查一下。查看表空间文件列表名和创建时间
select vdf.name,vdf.CREATION_TIME from v$datafile vdf;
--查表空间文件创建时间和大小
select vdf.name,vdf.CREATION_TIME,vdf.BYTES/1024/1024/1024 as size_G,vdf.BLOCKS/1024/1024/1024 as BLOCKS_size_G,vdf.CREATE_BYTES/1024/1024/1024 as CREATEsize_G ,vdf.* from v$datafile vdf order by vdf.CREATION_TIME desc;
--表字段解释
BYTES:当前文件大小,0的话表示不可访问
BLOCKS :当前文件块大小,0的话表示不可访问
CREATE_BYTES:创建时候的大小
BLOCK_SIZE:文件的块大小
NAME:文件的名字
--修改表空间 文件数量
alter system set db_files=3000 scope=spfile; --测试可用
如报错,ORA-02095: 无法修改指定的初始化参数,需要重起数据库才能生效。
--重起数据库
--登陆服务器
su - oracle 切换到oracle用户,前后都有空格
ps -ef |grep pmon 查找关健字pmon进程
export ORACLE_SID=abczzzjyyyyyhis1 --设置当前环境默认查看实例
sqlplus / as sysdba --运行sqlplus命令,进入sqlplus环境,--以系统管理员(sysdba)身份连接数据库
--查看状态gv$instance
select instance_name,status from gv$instance;
--数据库实例重起前的准备工作
--归档命令
alter system archive log current 是归档当前的重做日志文件,不管自动归档有没有打都归档。这样后就可以将所有的归档都备份出来了。这样做是为了保证数据的完整和一致。
--生成全局检查点命令
alter system checkpoint global; --生成全局检查点命令
crsctl stat res -t 查看CRSD管理的资源状态
crsctl stat res -t -init 查看OHASD管理的资源的状态
--数据库实例重起
--关闭数据库实例
srvctl stop database -d 数据库名 -o immediate --在操作系统下执行
如要你只是想关闭RAC某几个节点上的数据库,可用下面的命令:srvctl stop instance -d 数据库名 -i 节点1,节点2
在重起前,先归档并手工生成一个检查点,关闭后,再启动数据库时能加快速度并减少一些出错机率。归档命令(alter system archive all或alter system switch logfile) 生成检查点命令(alter system checkpoint)
--起动当前登陆的数据库实例
startup
--查看监听状态
!lsnrctl status
--手工强制将数据库实例注册到监听
alter system register;
--备库恢复
shutdown immediate
startup mount;
alter database recover managed standby database using current logfile disconnect from session;