作者 | JiekeXu
来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)
如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)
大家好,我是 JiekeXu,江湖人称“强哥”,很高兴又和大家见面了,今天和大家一起来看看Oracle 表空间和数据文件遇到的坑,欢迎点击上方蓝字“JiekeXu DBA之路”关注我的公众号,标星或置顶,更多干货第一时间到达!
目 录
前 言
正 文
db_files 的坑
解决生产问题
表空间限制的坑
1)、查询数据库基本信息和块大小
2)、查看表空间类型(是否为大文件表空间)
3)、查看数据文件存放路径,大小:
4)、查看参数及 dba_data_files 总大小
5)、查看表空间使用率及存储磁盘使用率
6)、扩容表空间
总 结
参考链接
前 言
本文适用于普通的标准的 8k 块大小的 Oracle 企业版数据库,10g、11g、19c 均可适用,但对于 ODA,一体机可能有所区别,请慎重使用。
————————————————————————————
微信公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
腾讯云:https://cloud.tencent.com/developer/user/5645107
————————————————————————————
正 文
db_files 的坑
记录一下年前遇到的一个关于表空间扩容的小问题,大家都知道对于 Oracle 普通的表空间直接 alter tablespace XX add datafile 添加数据文件则就可以扩容了。但是当执行此命令时却报错了 ORA-00059。
SQL> alter tablespace PROD_DATA add datafile '+DATA' size 30g;
alter tablespace DWD_DATA add datafile '+DATA' size 30g
*
ERROR at line 1:
ORA-00059: maximum number of DB_FILES exceeded
SQL> exit
Disconnected
[oracle@JiekeXu ~]$ oerr ora 58
00058, 00000, "DB_BLOCK_SIZE must be %s to mount this database (not %s)"
// *Cause: DB_BLOCK_SIZE initialization parameter is wrong for the database
// being mounted. It does not match the value used to create the
// database.
// *Action: Fix the value of the DB_BLOCK_SIZE parameter or mount a database
// that matches the value.
[oracle@JiekeXu ~]$ oerr ora 59
00059, 00000, "maximum number of DB_FILES exceeded"
// *Cause: The value of the DB_FILES initialization parameter was exceeded.
// *Action: Increase the value of the DB_FILES parameter and warm start.
报错很明显,DB_FILES 达到最大值了,oerr 给出的答案也很合理,增加 DB_FILES 的值,然后重启数据库。
查看数据库 DB_FILES 参数,果然是默认的 200,刚好 dba_data_files 也已经达到了 200 个,所以添加数据文件时则直接报错 ORA-00059 了,查看后台 alert 日志报错一样。这就实属被坑了一把,生产环境又不能随便修改参数重启,只能申请变更窗口,坑呀。
SQL> show parameter DB_FILES
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 200
SQL> select count(*) from dba_data_files;
COUNT(*)
----------
200
-- 查看后台 alert 日志报错一样
2024-02-24T14:11:43.317617+08:00
alter tablespace PROD_DATA add datafile '+DATA' size 30g
2024-02-24T14:12:31.614611+08:00
ORA-59 signalled during: alter tablespace PROD_DATA add datafile '+DATA' size 30g...
DB_FILES 是 Oracle 比较重要的一个参数,当你的数据量不太大的时候(大概 5TB
以内,200*30G),这个参数不用修改是没有问题的,但你不能保证这个库以后的数据增长量不大于5TB,所以一般在建库的时候随着其他核心参数一起调整了,但这个库是前人 19年创建的,参数几乎都是默认值,也由于当时数据量较少的缘故,所以到现在也没去关注这个参数。
那么,这个参数应该改为多少才合适呢?对于 RAC+ADG 而言是否可以滚动重启实例呢?我们来看看官方文档吧。如下图所示,DB_FILES 的默认值为 200,可以在 PDB 级别修改,最小值则是数据库中数据文件的绝对文件数中最大值,最大值则取决于操作系统。RAC 实例则需要全部重启方可生效,如果增加 DB_FILES 的值,则必须关闭并重新启动所有访问数据库的实例,新值才能生效,如果您有一个主库和备库,那么它们应该具有相同的此参数值。https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/DB_FILES.html#GUID-DD8C2F18-F04D-43F7-A9C3-5EAAAB9E9DEE
考虑将数据文件添加到表空间时可能存在的限制
将数据文件添加到表空间时需要考虑一些限制。
您可以将数据文件添加到传统的小文件表空间,但要遵守以下限制:
操作系统通常对进程可以同时打开的文件数施加限制。当达到打开文件的操作系统限制时,无法创建更多数据文件。
操作系统对数据文件的数量和大小施加了限制。
该数据库对任何实例打开的任何 Oracle 数据库的数据文件数施加了最大限制。此限制是特定于操作系统的。
不能超过超过 DB_FILES 参数指定的数据文件数。
发出CREATE DATABASE或CREATE CONTROLFILE语句时,MAXDATAFILES参数指定控制文件的数据文件部分的初始大小。但是,如果尝试添加数量大于MAXDATAFILES但小于或等于DB_FILES的新文件,则控制文件将自动展开,以便数据文件部分可以容纳更多文件。
确定 DB_FILES 初始化参数的值
启动 Oracle Database 实例时,DB_FILES 初始化参数指示要为数据文件信息保留的 SGA 空间量,从而指示可以为实例创建的最大数据文件数。此限制适用于实例的生命周期。您可以更改 DB_FILES 的值(通过更改初始化参数设置),但新值在您关闭并重新启动实例之前不会生效。
在确定 DB_FILES 的值时,请考虑以下因素:
如果 DB_FILES 的值太低,则在不先关闭数据库的情况下,无法添加超出限制的数据文件。
如果 DB_FILES 的值太高,则不必要地消耗内存。
参考官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-data-files-and-temp-files.html#GUID-CAC446B4-7E44-419B-9A4C-306677CD95E0
由此可见这个参数,主备库均要修改且重启生效,RAC 不能滚动重启,需要全部重启,ADG 备库也要修改并重启生效。那么这个值既然依赖操作系统,改为多少合适呢?以前运维的系统中有遇到过 1000、2000、4000、5000、8000 大概这几个值的,那么本次我们来修改为 100000 试试呢?通过测试在 Linux 虚拟机下可以看出 DB_FILES 参数最大支持 65534,则同一个库下数据文件最多有 65534 个。
SQL> show parameter spfile
SQL> create pfile='/tmp/pfile_20240229.ora' from spfile;
File created.
SQL> show parameter db_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 200
SQL> alter system set db_files=100000 scope=spfile;
System altered.
SQL> shu immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-01131: DB_FILES system parameter value 100000 exceeds limit of 65534
ORA-01078: failure in processing system parameters
既然已经知道了最大值,那么生产环境则可以选择一个适合的值,比如 2000、4000 等,也不能太大,不然和我上面测试一样,当设置为 65534 时需要 750M 左右的 shared pool 才能启动成功,设置为 10000 时需要 296M 的 shared pool 才能启动成功,无奈则设置成 5000 时可以正常启动。
SQL*Plus: Release 12.2.0.1.0 Production on Fri Mar 1 00:27:51 2024
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to an idle instance.
00:27:52 SYS@JiekeXu> startup pfile='/tmp/pfile_20240229.ora'
ORA-00371: not enough shared pool memory, should be at least 310153892 bytes
00:27:58 SYS@JiekeXu> !vi /tmp/pfile_20240229.ora
00:28:48 SYS@JiekeXu> startup pfile='/tmp/pfile_20240229.ora'
ORACLE instance started.
Total System Global Area 2147483648 bytes
Fixed Size 8794848 bytes
Variable Size 2080378144 bytes
Database Buffers 50331648 bytes
Redo Buffers 7979008 bytes
Database mounted.
Database opened.
00:29:11 SYS@JiekeXu> show parameter db_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 5000
00:29:19 SYS@JiekeXu>
00:31:06 SYS@JiekeXu> select 781994571/1024/1024/1024 from dual;
781994571/1024/1024/1024
------------------------
.728289197
Elapsed: 00:00:00.00
00:31:35 SYS@JiekeXu> select 781994571/1024/1024 MB from dual;
MB
----------
745.768138
Elapsed: 00:00:00.00
00:31:42 SYS@JiekeXu> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
allow_group_access_to_sga boolean FALSE
lock_sga boolean FALSE
pre_page_sga boolean TRUE
sga_max_size big integer 2G
sga_min_size big integer 0
sga_target big integer 0
unified_audit_sga_queue_size integer 1048576
00:31:50 SYS@JiekeXu>
00:32:14 SYS@JiekeXu> show parameter share
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
max_shared_servers integer
shared_memory_address integer 0
shared_pool_reserved_size big integer 13421772
shared_pool_size big integer 256M
shared_server_sessions integer
shared_servers integer 1
00:32:25 SYS@JiekeXu> select 310153892/1024/1024 MB from dual;
MB
----------
295.785801
解决生产问题
通过上面的验证测试我们已经知道了大概,接下来我们则需要对生产环境的参数进行修改和重启了。如下表空间使用率已经超过 90% 了,需要扩容但是由于 DB_FILES 默认为 200,dba_data_files 也已经达到了 200,所以我忙需要修改此参数为 2048 然后先重启备库再同时重启主库 RAC。
SQL> SELECT a.tablespace_name,round(total/1024/1024/1024) "Total g",
2 round(free/1024/1024/1024) "Free g",ROUND((total-free)/total,4)*100 "USED%"
3 FROM (SELECT tablespace_name,SUM(bytes) free FROM
4 DBA_FREE_SPACE
5 GROUP BY tablespace_name ) a,
6 (SELECT tablespace_name,SUM(bytes) total FROM DBA_DATA_FILES
7 GROUP BY tablespace_name) b
8 WHERE a.tablespace_name=b.tablespace_name and ROUND((total-free)/total,4)*100 >= 85
9 ORDER BY 4;
TABLESPACE_NAME Total g Free g USED%
------------------------------ ---------- ---------- ----------
EW_DATA 334 49 85.21
OS_DATA 2516 261 89.61
DD_DATA 2195 176 91.98
SQL> alter tablespace DD_DATA add datafile '+DATA' size 30g;
alter tablespace DD_DATA add datafile '+DATA' size 30g
*
ERROR at line 1:
ORA-00059: maximum number of DB_FILES exceeded
SQL> show parameter DB_FILES
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 200
SQL> select count(*) from dba_data_files;
COUNT(*)
----------
200
--后台 alert 日志告警信息
2024-02-24T14:11:43.317617+08:00
alter tablespace DD_DATA add datafile '+DATA' size 30g
2024-02-24T14:12:31.614611+08:00
ORA-59 signalled during: alter tablespace DD_DATA add datafile '+DATA' size 30g...
--查看应用登录总连接
ps -ef | grep -i local=no | grep -v grep | awk '{print $2}' | wc -l
$ sys
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 24 14:08:14 2024
Version 19.15.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.15.0.0.0
SQL>
SQL> alter system set db_files=2048 scope=spfile sid='*';
System altered.
SQL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 1.6106E+11 bytes
Fixed Size 37218432 bytes
Variable Size 9.3952E+10 bytes
Database Buffers 6.6572E+10 bytes
Redo Buffers 499650560 bytes
Database mounted.
Database opened.
如上启动实例时报错 ORA-32004,有过期的参数倒也没有其他问题,可以忽略正常启动,也可以去 alert 日志中查找 Deprecated 过期的参数将其删除掉重启也行,看个人意愿了。
============================================
_serial_direct_read = "NEVER"
_optim_peek_user_binds = FALSE
pga_aggregate_target = 30G
_optimizer_mjc_enabled = FALSE
deferred_segment_creation= FALSE
parallel_force_local = TRUE
_optimizer_use_feedback = FALSE
_sql_plan_directive_mgmt_control= 0
_optimizer_ads_use_result_cache= FALSE
_optimizer_dsdir_usage_control= 0
optimizer_adaptive_plans = FALSE
_optimizer_gather_stats_on_load_index= FALSE
_optimizer_gather_stats_on_conventional_dml= FALSE
diagnostic_dest = "/u01/app/oracle"
Deprecated system parameters with specified values:
cluster_database_instances
SQL> show parameter cluster_database_instances
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cluster_database_instances integer 2
SQL> show parameter db_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 2048
SQL>
MySQL OCP 学习资料
表空间限制的坑
Oracle 数据库将表空间中的数据在物理上存储为数据文件。
每个非分区模式对象和对象的每个分区都存储在它自己的段中,它只属于一个表空间。例如,非分区表的数据存储在单个段中,最终也存储在一个表空间中。表空间和数据文件密切相关, 但又有重要区别:
每个表空间包含一个或多个数据文件, 这需要遵从运行 Oracle 数据库的操作系统。
数据库数据被集中地存储在位于每个数据库表空间的数据文件中。
段可以跨越一个或多个数据文件,但它不能跨多个表空间。
数据库必须有 SYSTEM 表空间和 SYSAUX 表空间。Oracle 数据库自动在数据库创建过程中为 SYSTEM 表空间分配数据库的第一个数据文件。
SYSTEM 表空间包含数据字典,它是包含数据库元数据的一组表。通常,数据库也有一个 UNDO 表空间和临时表空间 (通常称为 TEMP)。
大文件表空间扩容
对于大文件表空间而言只有一个数据文件,所以扩容就比较简单,如果有空闲存储空间的话,直接 resize 即可。
ALTER TABLESPACE ORCL_DAT RESIZE 11000G;
小文件表空间扩容
对于小文件表空间而言有一个或多个数据文件,如果有空闲存储空间的话,直接 resize 原有数据文件到仅小于 32G 即可,也可以直接添加数据文件。
alter tablespace ORCL_DATA add datafile '/var/ora_data02/oradata/ORCL/ORCL_DataB_1025.dbf' size 30G;
如下是一个 10g 库小文件扩容示例,仅供参考。
1)、查询数据库基本信息和块大小
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Nov 19 20:42:49 2023
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> set line 345
col instance_name for a15
col host_name for a30
select inst_id,INSTANCE_NAME,HOST_name,status,version,STARTUP_TIME from gv$instance;
SQL> SQL> SQL>
INST_ID INSTANCE_NAME HOST_NAME STATUS VERSION STARTUP_TIME
---------- --------------- ------------------------------ ------------ ----------------- ------------
1 ORCL XF0000YX OPEN 10.2.0.4.0 06-NOV-21
SQL> show parameter db_block_size
NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
db_block_size integer 8192
2)、查看表空间类型(是否为大文件表空间)
select name,bigfile from v$tablespace where name='&name';
SQL> select name ,bigfile from v$tablespace where name='&name';
Enter value for name: ORCL_DATAB
old 1: select name ,bigfile from v$tablespace where name='&name'
new 1: select name ,bigfile from v$tablespace where name='ORCL_DATAB'
NAME BIG
------------------------------ ---
ORCL_DATAB NO
Elapsed: 00:00:00.01
3)、查看数据文件存放路径,大小:
SQL> set line 9999 pages 9999
SQL> col file_name for a66
select file_id,tablespace_name,file_name,bytes/1024/1024 mb ,autoextensible from dba_data_files where tablespace_name='ORCL_DATAB' order by tablespace_name desc;
----省略部分显示,总共 1023 行----
2042 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1013.dbf 4096 NO
2043 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1014.dbf 4096 NO
2044 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1015.dbf 4096 NO
2045 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1016.dbf 4096 NO
2046 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1017.dbf 4096 NO
2047 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1018.dbf 4096 NO
2048 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1019.dbf 4096 NO
2049 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1020.dbf 4096 NO
2050 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1021.dbf 4096 NO
2051 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1022.dbf 4096 NO
2052 ORCL_DATAB /var/ora_data/oradata/ORCL/ORCL_DataB_1023.dbf 4096 NO
1023 rows selected.
Elapsed: 00:00:01.09
4)、查看参数及 dba_data_files 总大小
SQL> select count(file_name) from dba_data_files;
COUNT(FILE_NAME)
----------------
2422
Elapsed: 00:00:00.28
SQL> show parameter db_files
NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
db_files integer 5000
5)、查看表空间使用率及存储磁盘使用率
如下是以前的惠普 UNIX 系统
SQL> set pages 345 timing on
col TABLESPACE_NAME for a28
SELECT a.tablespace_name,round(total/1024/1024/1024) "Total g",round(free/1024/1024/1024) "Free g",ROUND((total-free)/total,4)*100 "USED%"
FROM (SELECT tablespace_name,SUM(bytes) free FROM DBA_FREE_SPACE GROUP BY tablespace_name ) a,(SELECT tablespace_name,SUM(bytes) total FROM DBA_DATA_FILES
GROUP BY tablespace_name) b WHERE a.tablespace_name=b.tablespace_name ORDER BY 4;
SQL> SQL> 2 3
TABLESPACE_NAME Total g Free g USED%
---------------------------- ---------- ---------- ----------
ORCL_UNDO 100 100 0
POWERCENTER 219 218 .55
UNDOTBS1 1002 981 2.18
SYSTEM 33 32 2.72
ANTIF_TB 192 183 4.46
USERS 54 48 9.52
SYSAUX 6 4 38.41
ORCL_DATAA 13512 4352 67.79
ORCL_DATAC 4140 1187 71.34
ORCL_INDEX 2584 677 73.8
ORCL_DATAB 6094 1467 75.92
11 rows selected.
Elapsed: 00:00:04.62
SQL> !bdf
Filesystem kbytes used avail %used Mounted on
/dev/vg00/lvol3 1048576 392632 651712 38% /
/dev/vg00/lvol1 1835008 562656 1262456 31% /stand
/dev/vg00/lvol8 8912896 3246256 5628640 37% /var
/dev/ORCLdatavg/ora_data_lv02
14410530816 11017427096 3366595912 77% /var/ora_data02
/dev/ORCLdatavg/ora_data_lv01
20955955200 20360127344 591174080 97% /var/ora_data
/dev/vg00/lvol7 7405568 3782936 3594384 51% /usr
/dev/vg00/lvol4 10485760 4700584 5740800 45% /tmp
/dev/vg00/lvol6 11599872 6659344 4901976 58% /opt
/dev/ORCLvg01/lvol_ORCL01
102400000 61129934 38696156 61% /opt/ORCL
/dev/vg00/lvinstall
10485760 4085065 6000758 41% /install
/dev/vg00/lvol5 2097152 35888 2045264 2% /home
/dev/ORCLvg01/lvol_ORCL02
102400000 15970491 81027767 16% /home/ORCL
/dev/archvg/archlv 5364776960 156564944 5167523472 3% /arch
附:UNIX 系统常用命令
bdf 以 KB 为单位查看大小
以G为单位查看文件夹/文件大小
du -sk * | awk '{print $1/1024/1024,$2}'
du -sk *.dmp | awk '{print $1/1024/1024,$2}'
关机和重启
关机: shutdown -hy 0
重启: shutdown -ry 0 --如无法重启,可使用reboot
查看所有硬件信息:#print_manifest
查看CPU信息:#ioscan -fnkC processor
查看网卡:# lanscan
查看网卡的ip地址:
# ifconfig lan0
# more /etc/rc.config.d/netconf
查看接口IP及掩码配置:# netstat -rnv
查看操作系统版本和 license:#uname -a
查看物理内存大小:# dmesg
查看硬盘 # ioscan -fnC disk
硬盘的个数 # ioscan -funC disk
硬盘的大小信息 # diskinfo /dev/rdsk/c1t0d0
查看扫描到的新磁盘:
# ioscan -fNnkC disk
# ioscan -m lun
HP-UX主要使用HFS和VXFS两种文件系统
insf -e -C disk 扫描新盘
格式化磁盘(一般不进行此操作) #mediainit /dev/rdsk/c2t1d0
查看是否同一块盘 ## ioscan -m dsf
HP-UX 11i v3 操作系统默认开启NMP,通过 scsimgr 命令进行确认:
# scsimgr get_attr -a leg_mpath_enable
查看磁盘的wwid: scsimgr lun_map -D /dev/rdisk/disk41 |grep WWID
#ioscan -fnC disk
ioscan是扫描并列出所有设备和发现的其他设备,
-f表示显示完整列表,
-C表示类别,
-k表示扫描内核的设备文件,默认是扫描机器实际有的,
-n表示只列出/dev/下的设备文件。
fc 口查看
#ioscan -fnC fc
#fcmsutil /dev/fcoc0
查看路由信息 #netstat -an
6)、扩容表空间
SQL> alter tablespace ORCL_DATAB add datafile '/var/ora_data02/oradata/ORCL/ORCL_DataB_1025.dbf' size 30G;
alter tablespace ORCL_DATAB add datafile '/var/ora_data02/oradata/ORCL/ORCL_DataB_1025.dbf' size 30G
*
ERROR at line 1:
ORA-01686: max # files (1023) reached for the tablespace ORCL_DATAB
Elapsed: 00:02:10.89
SQL>
SQL> select count(file_name) from dba_data_files where tablespace_name='ORCL_DATAB';
COUNT(FILE_NAME)
----------------
1023
Elapsed: 00:00:00.18
--通过 oerr 也给出了解释办法,resize 已存在的数据文件,或者迁移一些对象到其他表空间。
$ oerr ORA 01686
01686, 00000, "max # files (%s) reached for the tablespace %s"
// *Cause: The number of files for a given tablespace has reached its maximum
// value
// *Action: Resize existing files in the tablespace, or partition the objects
// among multiple tablespaces, or move some objects to a different
// tablespace.
-- 后台 alert 日志记录如下:
Thu Nov 19 20:28:07 2023
alter tablespace ORCL_DATAB add datafile '/var/ora_data02/oradata/ORCL/ORCL_DataB_1025.dbf' size 30G
Thu Nov 19 20:30:18 2023
ORA-1686 signalled during: alter tablespace ORCL_DATAB add datafile '/var/ora_data02/oradata/ORCL/ORCL_DataB_1025.dbf' size 30G...
官方文档中也有对数据文件的描述:数据文件是操作系统的物理文件,用于存储数据库中所有逻辑结构的数据。必须为每个表空间显式地创建它们。Oracle 数据库为每个数据文件分配两个相关的文件号,一个是绝对文件号,另一个是相对文件号,用于唯一标识数据文件。下面介绍了这些编号:
绝对文件号:此文件号可用于许多引用数据文件而不使用文件名的 SQL 语句。绝对文件号可以在 VDATAFILE 或 VTEMPFILE 视图的 file# 列中,或在 DBA_DATA_FILES 或 DBA_TEMP_FILES 视图的 file_ID 列中找到。
相对文件号:对于中小型数据库,相对文件号通常与绝对文件号具有相同的值。然而,当数据库中的数据文件数量超过阈值(通常为1023)时,相对文件数量与绝对文件数量不同。在 bigfile 表空间中,相对文件号始终为 1024(在 OS/390 平台上为 4096)。
除了上面遇到的两例问题外,还有可能会遇到错将表空间数据文件添加到 RAC 本地的问题,这个问题在 12c 以后也比较简单,可以直接在线移动数据文件到 ASM,如果是 11g 环境,可以参考我以前写的《案例|RAC 添加表空间误将数据文件放本地处理办法》。当然还有可能会遇到在文件系统级别直接删除了数据文件的处理办法,这个案例也可以参考《在 Oracle 归档模式下直接 rm dbf 数据文件并重启数据库还有救吗?》,其他情况暂时没有遇到,如有遇到的小伙伴可以一起交流讨论。
提供怎么的讨论呢,因为微信公众号没有留言功能,互动体验感不是很好,所以去年我建立了微信公众号同名的群社区,在微信群里为大家提供更加友好的交流氛围(PS:那些考证的,买云服务的,个人推广涨粉的人请绕道,一经发现全网拉黑)。于是在去年年中的时候建立了微信群,目前已经扩展到②群,也邀请了行业内的一些大佬,包括十几位 ACE(Oracle、MySQL、PG 方向),几位 Oracle 原厂工程师、前 Oracle 工程师,几十位 OCM、OCP 等大多数行业大佬,同时也邀请了几位 MySQL 大佬及 PG 大佬,大半年以来群里每天基本上都有聊天信息,算是我见到的最活跃的社群了,两个小时不看群,就一堆消息,目前②群还有一些坑位,限时免费开放,同时也会不定期在群里举行抽奖送书活动,如果有感兴趣的朋友可以添加我微信【JiekeXu_DBA】私聊我进群,谢谢。
总 结
最后总结记录一下,对于 8k 大小的数据块而言,普通单个表空间(非大文件表空间)数据文件个数不能大于等于 1024 个(即每个表空间最大 1023 个数据文件),每个数据文件大小也不能超过 32G(即每个数据文件可以设置为 32767M),数据库总的数据文件最多有 65534 个,但也受操作系统和 shared pool 内存的限制,不能过大也不能过小,按照库数据量大小可设置为 2000、4000、6000、8000 等值。
当然,对于大文件表空间文件只能有一个,如果为大文件表空间需要检查 asm 磁盘组的 compatible.rdbms 值,如果该值 <=10.1.0.0.0 大文件表空间最大 16T,compatible.rdbms>10.1 大文件表空间最大 128TB。如果是其他非 8k 标准块大小,情况有所不同。
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.15.0.0.0
SQL> col name for a20
SQL> col value for a30
SQL> select name,value,GROUP_NUMBER from v$asm_attribute where name='compatible.rdbms';
NAME VALUE GROUP_NUMBER
-------------------- ------------------------------ ------------
compatible.rdbms 10.1.0.0.0 1
compatible.rdbms 10.1.0.0.0 2
compatible.rdbms 10.1.0.0.0 3
参考链接
https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/DB_FILES.html#GUID-DD8C2F18-F04D-43F7-A9C3-5EAAAB9E9DEE
https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/physical-storage-structures.html#GUID-A878011D-2E59-45F6-A529-F60383AAE945
https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-data-files-and-temp-files.html#GUID-B1805034-94ED-4887-94B4-369FB8AAE416
全文完,希望可以帮到正在阅读的你,如果觉得此文对你有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
欢迎关注我公众号【JiekeXu DBA之路】,第一时间一起学习新知识!以下四个地址可以找到我,其他地址均属于盗版侵权爬取我的文章,而且代码格式、图片等均有错乱,不方便阅读,欢迎来我公众号或者墨天轮地址关注我,第一时间收获最新消息。
欢迎关注我的公众号【JiekeXu DBA之路】,第一时间一起学习新知识!————————————————————————————
公众号:JiekeXu DBA之路
CSDN :https://blog.csdn.net/JiekeXu
墨天轮:https://www.modb.pro/u/4347
腾讯云:https://cloud.tencent.com/developer/user/5645107
————————————————————————————
分享几个数据库备份脚本
一文搞懂 Oracle 统计信息
我的 Oracle ACE 心路历程
Oracle 主流版本不同架构下的静默安装指南
关机重启导致 ASM 磁盘丢失数据库无法启动
Oracle SQL 性能分析(SPA)原理与实战演练
Oracle 11g 升级到 19c 需要关注的几个问题
Windows 10 环境下 MySQL 8.0.33 安装指南
SQL 大全(四)|数据库迁移升级时常用 SQL 语句
OGG|使用 OGG19c 迁移 Oracle11g 到 19C(第二版)
Oracle 大数据量导出工具——sqluldr2 的安装与使用
从国产数据库调研报告中你都能了解哪些信息及我的总结建议
使用数据泵利用 rowid 分片导出导入 lob 大表及最佳实践
在归档模式下直接 rm dbf 数据文件并重启数据库还有救吗?