当前位置:文档之家› Oracle数据库安装及运维工作指南

Oracle数据库安装及运维工作指南

Oracle数据库安装及运维工作指南
Oracle数据库安装及运维工作指南

Oracle数据库安装及运维工作指南

金蝶软件(中国)有限公司

K3 CLOUD 基础系统部

2017-04-10

张华福

本文主要强调ORACLE 数据库服务器环境的安装软件及版本,以及安装完成后的后续完善工作。以确保数据库以比较完善的状态投入生产,尽可能避免已知的问题影响生产库的运营。文章不涉及到软件的安装方法步骤。

1 服务器系统软件,数据库版本安装推荐:

1 数据库服务器的操作系统,推荐使用ORACLE LINUX6.8。

2 数据库软件版本,要求安装11204,单节点或RAC环境均可,推荐使用RAC。

2 数据库安装创建完毕后,需要进行下列的完善工作,

1 打上最新的补丁集,如:ORACLE 11204,截止至2017年4月,ORACLE11204 数据库, 当前最新版本的补丁集为20161018 日发布的,

p2*******_112040_Linux-x86-64_GI_20161018.zip --rac 版本,

p2*******_112040_Linux-x86-64_DB_20161018.zip --纯数据库版。

请按照补丁集上的readme.html,把补丁集打到GI, 数据库上。

2 初始化参数,下面的参数值,只是通常情况下的设置(或可根据服务器的硬件条件自行修改配置),要想系统效率最优,得依据数据库实际的运行情况逐步作微调(注意,下面的命令,在RAC和单节点环境下,稍有不同)。

alter profile default LIMIT PASSWORD_LIFE_TIME UNLIMITED;

alter system set processes=500 scope=spfile sid='*';

alter system set control_file_record_keep_time=21 scope=spfile sid='*';

alter system set open_cursors=300 scope=spfile sid='*';

alter system set session_cached_cursors=300 scope=spfile sid='*';

alter system set audit_trail=NONE scope=spfile sid='*';

alter system set recyclebin=off scope=spfile sid='*';

alter system set log_archive_dest_1='location=use_db_recovery_file_dest' scope=both sid='*';

alter system set fast_start_mttr_target = 30 scope=both sid='*';

alter system set streams_pool_size=100m scope=spfile sid='*';

alter system set archive_lag_target = 1200;

alter system set "_optimizer_use_feedback"= false scope=spfile sid='*';

alter system set "_optimizer_invalidation_period"=60 scope=both sid='*';

修改结束后,需重启数据库,才能确保上述修改生效。

3 将数据库设置成归档模式,并开启最小附加日志.

3.1 启用db_reocvery_file_dest 参数,设置好归档日志存放路径,

SYS@k3db1>show parameter db_recovery

NAME TYPE VALUE

-----------------------------------------------------------------------------

db_recovery_file_dest string

db_recovery_file_dest_size big integer 0

SYS@k3db1>alter system set db_recovery_file_dest_size=50g; --此参数值按实际情况设置。

System altered.

Elapsed: 00:00:00.04

SYS@k3db1>alter system set db_recovery_file_dest='+FLASH'; --此参数值按实际情况设置。

System altered.

Elapsed: 00:00:00.03

alter system set log_archive_dest_1='location=use_db_recovery_file_dest' scope=both sid='*';

同时在两节点上执行:关闭数据库,设置归档模式,都设置了归档模式后,再打开数据库。

2节点1,节点2上。

Shutdown immediate;

3 节点1,节点2上。

Startup mount;

4 节点1,节点2上。

Alter database archivelog;

Alter database add supplemental log data;

--开启最小附加日志

alter database add supplemental log data;

5 节点1,节点2上。

Alter database open;

3 制定作业,定时采集系统表,业务表的统计信息,

3.1 以sys 身份,使用sqlplus 工具,登录生产库,创建定时作业,采集系统表,每周日早上7点开始运行。

create procedure pro_analyze_dict as

begin

dbms_stats.gather_dictionary_stats();

dbms_stats.gather_fixed_objects_stats();

end pro_analyze_dict;

/

begin

dbms_scheduler.create_schedule

(schedule_name => 'SCHEDULE_SUNDAY_AT_0700',

start_date => TO_DATE('2016-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'),

end_date => NULL,

repeat_interval => 'FREQ=WEEKLY;BYDAY=SUN;BYHOUR=07; BYMINUTE=00; BYSECOND=0', comments => '');

end;

/

exec dbms_scheduler.drop_program(program_name=> 'PROC_ANALYZE_DICT');

begin

dbms_scheduler.create_program

(program_name => 'PROC_ANALYZE_DICT',

program_type => 'PLSQL_BLOCK',

program_action => 'BEGIN pro_analyze_dict; END;',

number_of_arguments => 0,

enabled => TRUE,

comments => '2016-08-07 07:00:00');

end;

/

begin

dbms_scheduler.create_job

(job_name => 'JOB_ANALYZE_DICT',

program_name => 'PROC_ANALYZE_DICT',

schedule_name => 'SCHEDULE_SUNDAY_AT_0700',

enabled => TRUE,

comments => 'zhang.huafu, analyze sys tables'' stats and fixed objects'' stats');

end;

/

3.2 关闭系统自带的统计信息等功能。

exec dbms_auto_task_admin.disable(client_name => 'auto space advisor', operation => NULL, window_name => null);

exec dbms_auto_task_admin.disable(client_name => 'sql tuning advisor',operation => null, window_name => null);

exec dbms_auto_task_admin.disable(client_name => 'auto optimizer stats collection', operation => NULL, window_name => NULL);

3.3 以sys 身份,用sqlplus 工具,登录生产库,创建一个常用的管理账户,并授予合适的权限:

create user manager identified by "20160803";

grant dba to manager;

grant drop any table to manager;

grant delete any table to manager;

grant select any table to manager;

grant select on dba_tables to manager;

grant select on dba_objects to manager;

grant select on dba_recyclebin to manager;

grant select on dba_mview_logs to manager;

grant analyze any to manager;

grant update(failure_count) on sys.scheduler$_job to manager;

--3.3.1 以manager 身份登录,创建采集业务表的定时作业,每天早上5点运行。

create or replace procedure manager.pro_analyze_stats as

begin

for i in (select owner, table_name from dba_tables a where owner in ('LNZHONGYI','ZHONGYICS') and temporary='N' and table_name not like 'TMP%'

and not exists (select 1 from dba_mview_logs where log_owner=a.owner and log_table=a.table_name) order by owner, last_analyzed nulls first) loop

dbms_stats.gather_table_stats(i.owner,i.table_name);

end loop;

for i in (select owner, table_name from dba_tables where owner in ('LNZHONGYI','ZHONGYICS') and temporary='Y' and last_analyzed is not null

order by owner, table_name) loop

dbms_stats.delete_table_stats(i.owner,i.table_name);

end loop;

end pro_analyze_stats;

/

说明:红色部分,是业务账户名,请根据实际情况更改。

蓝色部分,用于清空临时表(ORACLE定义的临时表)的统计信息,这在11G版本是可行的,到了12C,ORACLE对临时表的统计信息作了进一步的改进,需要分情况处理了。

begin

dbms_scheduler.create_schedule

(schedule_name => 'SCHEDULE_DAILY_AT_0510',

start_date => TO_DATE('2016-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'),

end_date => NULL,

repeat_interval => 'FREQ=DAILY; BYHOUR=05; BYMINUTE=10; BYSECOND=0',

comments => '');

end;

/

说明:红色部分说明的是作业的运行时间点,可以更改。

begin

dbms_scheduler.create_program

(program_name => 'PROC_ANALYZE_STATS',

program_type => 'PLSQL_BLOCK',

program_action => 'BEGIN pro_analyze_stats; END;',

number_of_arguments => 0,

enabled => TRUE,

comments => '2017-03-13 13:56');

end;

/

begin

dbms_scheduler.create_job

(job_name => 'JOB_ANALYZE_STATS',

program_name => 'PROC_ANALYZE_STATS',

schedule_name => 'SCHEDULE_DAILY_AT_0510',

enabled => TRUE,

comments => 'zhang.huafu, analyze tables'' stats');

end;

/

--3.3.2 创建一作业,删除过期的临时表

--创建删除临时表的过程。

create or replace procedure manager.pro_purge_tmptable as

begin

for i in (select table_name, last_analyzed from dba_tables a

where owner='LNZHONGYI' and table_name like 'TMP%' and length(table_name) >= 30

and exists (select 1 from dba_objects where owner='LNZHONGYI'

and object_type='TABLE' and object_name like 'TMP%' and object_name=a.table_name and created < sysdate - 1) ) loop

begin

execute immediate 'drop table LNZHONGYI.'||i.table_name||' purge';

end;

end loop;

delete from lnzhongyi.t_bas_temporarytablename a where not exists (select 1 from dba_tables where owner='LNZHONGYI' and table_name=a.ftablename);

commit;

end pro_purge_tmptable;

/

说明:1 脚本中,红色部分,是用于业务运营的数据库账户。

2 据我了解,这些临时表都应该记录在该账户下的:T_BAS_TEMPORARYTABLENAME 此表中。但由于该表中对临时表的创建时间,FCREATEDATE字段,没有强制NOT NULL,我担心某些记录没时间,这样,若读取该表的数据来做删除操作,这些没时间的记录,将被漏掉。

SYS@orcl>desc lnzhongyi.t_bas_temporarytablename

Name Null? Type

---------------------------------------------------------------

FTABLENAME NOT NULL VARCHAR2(30) FCREATEDATE DATE

FUSERTOKEN VARCHAR2(36) FPROCESSTYPE NUMBER(10) FUSERTRANSACTIONID VARCHAR2(200)

--创建作业运行用的时间表,每小时运行一次。

begin

dbms_scheduler.create_schedule

(schedule_name => 'SCHEDULE_HOURLY_INTERVAL_1',

start_date => TO_DATE('2017-04-18 15:00:00','YYYY-MM-DD HH24:MI:SS'),

end_date => NULL,

repeat_interval => 'FREQ=HOURLY; INTERVAL=1; BYMINUTE=17; BYSECOND=30',

comments => '');

end;

/

--创建作业运行的PROGRAM。

begin

dbms_scheduler.create_program

(program_name => 'PROC_PURGE_TMPTABLE',

program_type => 'PLSQL_BLOCK',

program_action => 'BEGIN pro_purge_tmptable; END;',

number_of_arguments => 0,

enabled => TRUE,

comments => '2016-08-04 06:30:00');

end;

/

--创建定期作业,

begin

dbms_scheduler.create_job

(job_name => 'JOB_PURGE_TMPTABLE',

program_name => 'PROC_PURGE_TMPTABLE',

schedule_name => 'SCHEDULE_HOURLY_INTERVAL_1',

enabled => TRUE,

comments => '');

end;

/

4 制定合适的备份策略,

4.1 通常情况下,我们都是以物理备份为主,逻辑备份为辅,也就是,主要使用rman 备份,同时辅以expdp 导出备份。

4.2 对于rman 的备份策略,基本有两者

4.2.1 保留几份全库备份(包括全库备份以后的所有日志,以保障可用该备份恢复自该备份以来的任意时间点),但此策略只要求有备份,

不保障能往回追溯N天以来,故,不常用。

4.2.2 保留恢复最近N天以来的备份。使用此策略,可以保障备份集,可以恢复从现在开始,往回追溯N 天以来的任意时间点。

这是最常用的备份保留策略,基本上,我们都使用此策略。

4.2.3 对于需要保留多少天以来的备份策略,需要依据甲方的业务需求来制定。比如:甲方要求,需要保留一个月以来的备份数据,

也就是,从现在开始,往回追溯31 天以来,这个范围内的任意时间点,都必须可以恢复。

4.2.4 保留N 天以来的备份集,消耗的是备份集的存放空间,因此,若磁盘存储不足,得向甲方说明,要求甲方配备足够的磁盘空间。

(需要考虑后续库的数据量持续增长情况)

4.2.5 制定好备份策略后,需要持续观察至少一个备份周期的时间,以确保备份策略进入循环的工作状态。

对于生产数据库,备份重于一切,我们要求,自生产系统投入使用开始,就必须确保备份策略进行良性运行工作状态,DBA需要根据生产系统的

运行情况,制定合理的巡检计划,检查包括备份策略在内的运行状态,以策安全。

5 创建合适的表空间,

5.1 不同的数据库账户,创建各自的表空间,也就是,该表空间只存放该账户下的对象。

5.2 表空间通常分3类,1 数据表空间,2 索引表空间,3 LOB 数据类型表空间。

顾名思义,数据表空间存放数据,索引表空间存放索引,LOB表空间存放该账户下所有

LOB 类型的字段,也就是,从各表中,领出该字段迁移到此表空间上。

5.3 当生产系统运行一段时间后,可能会出现尺寸比较大的表,可考虑为这些大表创建

新的表空间(EXTENT 值放大些,比如:100M,500M,1G等),建好后,采用在线重定义的方法迁移。

5.4 后续若对表作分区,可针对大表创建新的数据表空间,和索引表空间,比如:创建

EXTENT=100M的数据表空间(存放表分区),EXTENT=50M的索引表空间(存放分区索引)。

EXTENT的尺寸多少适合,得看实际表的情况,也可以不止建一套,可建多套。

6 推荐使用最新的ORACHK工具检查数据库环境的当前状况,并根据该工具的检查报告,做合适的修改。

相关主题
文本预览
相关文档 最新文档