
数据库参数修改存在风险,仅供参考
## 1.登录数据库,创建参数文件备份
`sqlplus / as sysdba` 用SYSDBA登录数据库
```sql
show parameter spfile; --显示spfile文件存储位置
host cp /home/oracle/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora /home/oracle/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora.bak
create pfile='/tmp/init_eas.ora' from spfile;
```
## 2.修改参数
### 1.内存参数(以64G物理内存为例)
```sql
alter system reset memory_target scope=spfile sid='*'; --出错表明该参数没有设置,请忽略
alter system reset memory_max_target scope=spfile sid='*'; --出错表明该参数没有设置,请忽略
alter system set sga_max_size=44G scope=spfile sid='*';
alter system set sga_target=44G scope=spfile sid='*';
alter system set db_cache_size=30G scope=spfile sid='*';
alter system set shared_pool_size=12G scope=spfile sid='*';
alter system set pga_aggregate_target=4G scope=spfile sid='*';
```
### 2.进程及会话数(默认150)
```sql
show parameter process;
show parameter sessions; --查看进程及会话数
alter system set processes=1200 scope=spfile;
alter system set sessions=1325 scope=spfile; --修改进程及会话数
```
### 3.游标数
```sql
show parameter open_cursors; --查看游标数
select count(*) from v$open_cursor; --查看当前打开的游标数目
alter system set open_cursors=1000 scope=both; --修改最大游标数
```
### 4.关于审计
```sql
--考虑关闭审计(oracle 11g 默认打开审计)
alter system set audit_trail=none sid='*' scope=spfile;
--说明:11g 默认打开数据库审计,为了避免审计带来的 SYSTEM 表空间的过多占用,可以关闭审计。
--最近一年审计记录
select * from aud$ where substr(sysdate-NTIMESTAMP#,2,9)<360;
--清理数据库审计
truncate table sys.aud$ reuse storage;
alter table sys.aud$ deallocate unused keep 25000m;
alter table sys.aud$ deallocate unused keep 20000m;
alter table sys.aud$ deallocate unused keep 15000m;
alter table sys.aud$ deallocate unused keep 10000m;
alter table sys.aud$ deallocate unused keep 5000m;
alter table sys.aud$ deallocate unused keep 2000m;
alter table sys.aud$ deallocate unused keep 500m;
alter table sys.aud$ deallocate unused keep 250m;
alter table sys.aud$ deallocate unused keep 10m;
```
### 5.关于维护任务
```sql
exec dbms_scheduler.disable( 'ORACLE_OCM.MGMT_CONFIG_JOB' );
exec dbms_scheduler.disable( 'ORACLE_OCM.MGMT_STATS_CONFIG_JOB' );
--说明:关闭一些不需要的维护任务,这两个属于 ORACLE_OCM 的任务不关闭,可能会在 alert日志中报错。
```
### 6.考虑是否关闭自动收集直方图
```sql
exec DBMS_STATS.SET_GLOBAL_PREFS( 'method_opt','FOR ALL COLUMNS SIZE 1' );
--或者
exec DBMS_STATS.SET_PARAM( 'method_opt','FOR ALL COLUMNS SIZE 1' );
--说明:为减少统计信息收集时间,同时为避免直方图引起的 SQL 执行计划不稳定,可以在数据库全局级关闭自方图的收集,对于部分需要收集直方图的表列,可以使用 DBMS_STATS.SET_TABLE_PREFS 过程来设置
```
### 7.关闭 auto space advisor
```sql
BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE(
client_name => 'auto space advisor',
operation => NULL,
window_name => NULL);
END;
/
--说明:关闭数据库的空间 Advisor,避免消耗过多的 IO,还有避免出现这个任务引起的 library cache lock。
```
### 8.关闭 auto spl tuning
```sql
BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE(
client_name => 'sql tuning advisor',
operation => NULL,
window_name => NULL);
END;
/
--说明:关闭数据库的 SQL 自动调整 Advisor,避免消耗过多的资源。
```
### 9.调整时间窗口
```sql
--查询窗口定义详情--10g
select window_name,repeat_interval,duration,enabled from dba_scheduler_windows;
--查询窗口定义详情--11g和12c(周一到周五每晚10点开始收集统计信息,duration是4h;周六周日早上6点开始收集统计信息,duration是20h)
select window_name,repeat_interval,duration,enabled from dba_scheduler_windows;
--根据具体业务情况调整
EXECUTE DBMS_SCHEDULER.SET_ATTRIBUTE('SATURDAY_WINDOW','repeat_interval','freq=daily;byday=SAT;byhour=22;byminute=0;bysecond=0');
EXECUTE DBMS_SCHEDULER.SET_ATTRIBUTE('SUNDAY_WINDOW','repeat_interval','freq=daily;byday=SUN;byhour=22;byminute=0;bysecond=0');
EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('SATURDAY_WINDOW', 'duration', '+000 08:00:00');
EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('SUNDAY_WINDOW', 'duration', '+000 08:00:00');
exec dbms_scheduler.disable('WEEKNIGHT_WINDOW', TRUE);
exec dbms_scheduler.disable('WEEKEND_WINDOW', TRUE);
--说明:一些业务系统即使在周末,也同样处于正常的业务工作状态,比如面向公众的业务系统,在月底(虽然是周末)有批处理操作的系统,以及节假日调整的周末等,建议调整周六和周日窗口的起止时间和窗口时间长度,避免有时候周六或周日影响业务性能。
```
### 10.修改隐藏参数
```sql
alter system set "_optimizer_adaptive_cursor_sharing"=false sid='*' scope=spfile;
alter system set "_optimizer_extended_cursor_sharing"=none sid='*' scope=spfile;
alte