MAXDATAFILES 和 DB_FILES是用来限制数据文件数量的参数,MAXDATAFILES是在创建数据库的时候指定,存储于控制文件中,DB_FILES存储于参数文件中,
是静态参数,修改DB_FILES需要重启数据库。下面对这两个参数的几个重要方面进行讨论。
一、在RAC中能否滚动修改 DB_FILES
DB_FILES是一个静态参数,修改是需要重启才能生效的,但是在RAC数据库中能不能分别对单个实例进行修改,然后分别重启各个实例?或者修改时指定sid='*',
然后分别重启每个实例,保证数据库持续提供服务?这个问题的结论很无情,上面的方法都不行。如果采用上面的方法修改DB_FILES,再重启实例时将出现下面的
错误:
-
ORA-01105: mount is incompatible with mounts by other instances
-
ORA-01174: DB_FILES is 300 buts needs to be 200 to be compatible
结论:修改DB_FILES参数必须同时重启整个数据库,因为Oracle要求这个参数在数据库范围内是一致的,不能在RAC中进行滚动修改。
在RAC中,还有下面的几个参数也是要求在数据库范围内是一致的:ACTIVE_INSTANCE_COUNT,CLUSTER_DATABASE_INSTANCES, COMPATIBLE, CONTROL_FILES, DB_NAME, DB_UNIQUE_NAME, UNDO_MANAGEMENT。
二、修改MAXDATAFILES参数是否需要重建控制文件
前文已经提到,MAXDATAFILES参数是存储在控制文件中的,那么如果数据文件的数量达到了MAXDATAFILES值,要修改MAXDATAFILES值需要重建控制文件吗?下面
对这个问题进行探究:
实验环境为11.2.0.3:
-
SQL> select * from v$version;
-
BANNER
-
--------------------------------------------------------------------------------
-
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
-
PL/SQL Release 11.2.0.3.0 - Production
-
CORE 11.2.0.3.0 Production
-
TNS for Linux: Version 11.2.0.3.0 - Production
-
NLSRTL Version 11.2.0.3.0 - Production
DB_FILES目前为200:
-
SQL> show parameter db_files
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
-
db_files integer 200
MAXDATAFILES目前为100:
-
SQL> oradebug setmypid;
-
Statement processed.
-
SQL> oradebug tracefile_name;
-
/oracle/app/oracle/diag/rdbms/gyl/gyl/trace/gyl_ora_2517.trc
-
-
SQL> alter database backup controlfile to trace;
-
more /oracle/app/oracle/diag/rdbms/gyl/gyl/trace/gyl_ora_2517.trc
-
......省略部分输出
-
CREATE CONTROLFILE REUSE DATABASE "GYL" NORESETLOGS NOARCHIVELOG
-
MAXLOGFILES 16
-
MAXLOGMEMBERS 3
-
MAXDATAFILES 100
-
MAXINSTANCES 8
-
MAXLOGHISTORY 292
下面向数据库中添加数据文件,观察数据文件数量能到达多少:
-
--使用下面的shell脚本生成添加数据文件的语句
-
# !/bin/bash
-
# echo "add tablespace"
-
for ((i=1;i<200;i++))
-
do
-
echo "alter tablespace test add datafile '/oradata/gyl/test${i}.dbf' size 2m;">>/tmp/add_datafile.sql
-
done
--添加数据文件
-
SQL>@/tmp/add_datafile.sql
-
......省略部分输出
-
-
alter tablespace test add datafile '/oradata/gyl/test194.dbf' size 2m
-
*
-
ERROR at line 1:
-
ORA-00059: maximum number of DB_FILES exceeded
-
......出现报错退出后,查询数据文件的数量:
-
-
SQL> select count(*) from dba_data_files;
-
-
COUNT(*)
-
----------
-
200
数据文件的数量已经超过MAXDATAFILES,到达了DB_FILES限制时才出现报错,注意,这里没有查询临时文件的数量,因为DB_FILES不对临时文件进行限制。再观察此时的MAXDATAFILES参数值:
-
SQL> oradebug setmypid;
-
Statement processed.
-
SQL> oradebug tracefile_name;
-
/oracle/app/oracle/diag/rdbms/gyl/gyl/trace/gyl_ora_2724.trc
-
SQL> alter database backup controlfile to trace;
-
-
Database altered.
-
-
more /oracle/app/oracle/diag/rdbms/gyl/gyl/trace/gyl_ora_2724.trc
-
......省略部分输出
-
CREATE CONTROLFILE REUSE DATABASE "GYL" NORESETLOGS NOARCHIVELOG
-
MAXLOGFILES 16
-
MAXLOGMEMBERS 3
-
MAXDATAFILES 200
-
MAXINSTANCES 8
-
MAXLOGHISTORY 292
此时的MAXDATAFILES参数值已经自动变为200,与DB_FILES值相同。
继续上面的实验,接下来观察如果修改DB_FILES,MAXDATAFILES参数会不会立即进行调整,以便适应DB_FILES参数:
-
SQL> alter system set db_files=300 scope=spfile;
-
-
SQL> shutdown immediate;
-
-
SQL> startup
-
-
SQL> show parameter db_files
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
-
db_files integer 300
-
SQL> oradebug setmypid
-
Statement processed.
-
SQL> oradebug tracefile_name;
-
/oracle/app/oracle/diag/rdbms/gyl/gyl/trace/gyl_ora_28531.trc
-
SQL> alter database backup controlfile to trace;
-
more /oracle/app/oracle/diag/rdbms/gyl/gyl/trace/gyl_ora_28531.trc
-
......省略部分输出
-
CREATE CONTROLFILE REUSE DATABASE "GYL" RESETLOGS NOARCHIVELOG
-
MAXLOGFILES 16
-
MAXLOGMEMBERS 3
-
MAXDATAFILES 200
-
MAXINSTANCES 8
-
MAXLOGHISTORY 292
结论:在oracle 8i 及以上版本中,MAXDATAFILES参数会自动调整达到DB_FILES值,因此不需要重建控制文件来修改MAXDATAFILES参数,但是
修改DB_FILES的值后MAXDATAFILES参数不会立即进行调整,而是会在有新的数据文件添加到数据库且超过了MAXDATAFILES时进行调整。
三、在Oracle 8i以后,MAXDATAFILES参数是不是已经没有限制
从前面的结论可以看出,MAXDATAFILES参数能够自动调整以适应DB_FILES,但是MAXDATAFILES参数是有上限的,不能无限的增大。在10g和11g中,
MAXDATAFILES的上限为65534。DB_FILES的上限也是65534,DB_FILES设置超过65534后数据库将不能启动:
-
SQL> alter system set db_files=65535 scope=spfile;
-
-
System altered.
-
-
SQL> shutdown immediate;
-
Database closed.
-
Database dismounted.
-
ORACLE instance shut down.
-
SQL> startup
-
ORA-01131: DB_FILES system parameter value 65535 exceeds limit of 65534
结论:10g、11g中MAXDATAFILES的上限为65534,不能超过这个限制。
除了MAXDATAFILES外,Oracle数据库中还存在一些其他限制,具体如下:
10g限制
CREATE CONTROLFILE and CREATE DATABASE Parameters
File Size Limits
11g限制
Table C-1 CREATE CONTROLFILE and CREATE DATABASE Parameters
File Size Limits
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29821678/viewspace-1756675/
,如需转载,请注明出处,否则将追究法律责任。