杨廷琨(yangtingkun)
云和恩墨 CTO
高级咨询顾问,Oracle ACE 总监,ITPUB Oracle 数据库管理版版主
Oracle初始化参数之多,变化之繁复可能,我们又如何去分辨哪些参数来自缺省设置,哪些又经过修改调整呢?
Oracle 在视图 V$SYSTEM_PARAMETER 中提供了一个列 ISDEFAULT,表示当前设置的值是否是数据库的默认值:SQL> select name, value, isdefault 2 from v$system_parameter3 where name = 'open_cursors';
NAME VALUE ISDEFAULT------------------------------ ------------------------------------- ---------open_cursors 400 FALSE
SQL> select isdefault, count(*)2 from v$system_parameter3 group by isdefault;
ISDEFAULT COUNT(*)--------- ----------TRUE 267FALSE 22
根据这个结果可以看到,数据库中绝大部分的初始化参数设置都是默认值。
我们再来看一下修改一个默认参数,等值情况:SQL> select name, value, isdefault2 from v$system_parameter3 where name = 'undo_retention';
NAME VALUE ISDEFAULT------------------------------ -------------------------------------------------- ---------undo_retention 900 TRUE
SQL> select sid, name, value2 from v$spparameter3 where name = 'undo_retention';
SID NAME VALUE---------- ------------------------------ ---------------------------* undo_retention
SQL> alter system set undo_retention = 900;
系统已更改。
SQL> select name, value, isdefault2 from v$system_parameter3 where name = 'undo_retention';
NAME VALUE ISDEFAULT------------------------------ -------------------------------------------------- ---------undo_retention 900 TRUE
SQL> select sid, name, value2 from v$spparameter3 where name = 'undo_retention';
SID NAME VALUE---------- ------------------------------ ----------------------------* undo_retention 900
对于手工设置的初始化参数与系统默认值相同的情况,通过 v$system_parameter 视图是无法区分的。
同样通过查询 V$SPPARAMETER 视图检查 SPFILE 的设置也不准确,因为初始化参赛可能是通过 PFILE 设置的,或者是实例启动后由 ALTER SYSTEM 命令进行过修改。
对于这种情况,通过 CREATE PFILE FROM MEMORY 或 CREATE 的方式是可以看到的参数变化的,不过既然这种方法能够查询得到,那么数据库中一定是在默写地方进行了记录。
实际上查询 V$SYSTEM_PARAMETER4 视图就可以获取到所有用户设置的初始化参数。SQL> select sid, name, display_value value2 from v$system_parameter43 where name not like '/_%' escape '/';
SID NAME VALUE---------- ------------------------------ -----------------------------------------------test1 processes 150test1 spfile +DATA/test/spfiletest.oratest1 resource_manager_plan SCHEDULER[0x2C0E]:DEFAULT_MAINTENANCE_PLANtest1 sga_target 740Mtest1 control_files +DATA/test/controlfile/current.529.684067899test1 db_block_size 8192test1 compatible 11.1.0.0.0test1 log_archive_configtest1 log_archive_dest_1 LOCATION=/data/oracle/oradata/test/archivelogtest1 log_buffer 4197376test1 cluster_database TRUEtest1 cluster_database_instances 3test1 db_create_file_dest +DATAtest1 thread 1test1 undo_tablespace UNDOTBS1test1 undo_retention 900test1 instance_number 1test1 remote_login_passwordfile SHAREDtest1 db_domaintest1 plsql_warnings DISABLE:ALLtest1 result_cache_max_size 3808Ktest1 core_dump_dest /data/oracle/diag/rdbms/test/test1/cdumptest1 audit_file_dest /data/oracle/admin/test/adumptest1 audit_trail DBtest1 db_name testtest1 open_cursors 400test1 optimizer_mode ALL_ROWStest1 query_rewrite_enabled TRUEtest1 pga_aggregate_target 245Mtest1 optimizer_dynamic_sampling 2test1 skip_unusable_indexes TRUEtest1 diagnostic_dest /data/oracle
已选择32行。
而事实上,当数据库执行 CREATE PFILE FROM MEMORY 命令时,Oracle 创建 PFILE 的数据源就是 V$SYSTEM_PARAMETER4 这个视图。
前面介绍了很多种查询初始化参数的方法,其实还有一个方法也是很有用的,就是通过 alert 文件检查数据库加载的所有非默认值的初始化参数。SQL> shutdown immediate数据库已经关闭。已经卸载数据库。ORACLE 例程已经关闭。SQL> startupORACLE 例程已经启动。
Total System Global Area 776896512 bytesFixed Size 2098776 bytesVariable Size 246077864 bytesDatabase Buffers 524288000 bytesRedo Buffers 4431872 bytes数据库装载完毕。数据库已经打开。
SQL> hostbash-3.00$ tail -200 /data/oracle/diag/rdbms/test/test1/trace/alert_test1.log Sat Jun 13 15:20:03 2009Stopping background process SMCOStopping background process FBDAShutting down instance: further logons disabledShutting down archive processesArchiving is disabled...Sat Jun 13 15:20:19 2009Instance shutdown completeSat Jun 13 15:20:22 2009Some alert messages have been suppressed because they were produced too earlyStarting ORACLE instance (normal)LICENSE_MAX_SESSION = 0LICENSE_SESSIONS_WARNING = 0Autotune of undo retention is turned on. LICENSE_MAX_USERS = 0SYS auditing is disabledStarting up ORACLE RDBMS Version: 11.1.0.6.0.Using parameter settings in server-side pfile /data/oracle/product/11.1/database/dbs/inittest1.oraSystem parameters with non-default values:processes = 150spfile = "+DATA/test/spfiletest.ora"sga_target = 740Mcontrol_files = "+DATA/test/controlfile/current.529.684067899"db_block_size = 8192compatible = "11.1.0.0.0"log_archive_config = ""log_archive_dest_1 = "LOCATION=/data/oracle/oradata/test/archivelog"cluster_database = TRUEcluster_database_instances= 3db_create_file_dest = "+DATA"thread = 1undo_tablespace = "UNDOTBS1"undo_retention = 900instance_number = 1remote_login_passwordfile= "SHARED"db_domain = ""audit_file_dest = "/data/oracle/admin/test/adump"audit_trail = "DB"db_name = "test"open_cursors = 500pga_aggregate_target = 245Mdiagnostic_dest = "/data/oracle"Cluster communication is configured to use the following interface(s) for this instance172.0.2.62cluster interconnect IPC version:Oracle UDP/IP (generic)IPC Vendor 1 proto 2Sat Jun 13 15:20:23 2009PMON started with pid=2, OS id=19138 Sat Jun 13 15:20:23 2009VKTM started with pid=4, OS id=19140 at elevated priorityVKTM running at (20)ms precisionSat Jun 13 15:20:24 2009DIAG started with pid=6, OS id=19144 Sat Jun 13 15:20:24 2009DBRM started with pid=8, OS id=19146 ...Completed: ALTER DATABASE OPENSat Jun 13 15:20:41 2009Starting background process CJQ0Sat Jun 13 15:20:41 2009CJQ0 started with pid=64, OS id=19434 Setting Resource Manager plan SCHEDULER[0x2C0E]:DEFAULT_MAINTENANCE_PLAN via scheduler windowSetting Resource Manager plan DEFAULT_MAINTENANCE_PLAN via parameter
检查 alert 文件的方法不但可以获取当前实例所有非默认初始化参数的信息,还是初始化参数文件丢失后用来恢复初始化参数文件的一种方法。如何加入"云和恩墨大讲堂"微信群