1、 Oracle 数据库安装及运维工作指南金蝶软件(中国)有限公司K3 CLOUD 基础系统部2017-04-10张华福本文主要强调 ORACLE 数据库服务器环境的安装软件及版本,以及安装完成后的后续完善工作。以确保数据库以比较完善的状态投入生产,尽可能避免已知的问题影响生产库的运营。文章不涉及到软件的安装方法步骤。1 服务器系统软件,数据库版本安装推荐:1 数据库服务器的操作系统,推荐使用 ORACLE LINUX6.8。2 数据库软件版本,要求安装 11204,单节点或 RAC 环境均可,推荐使用 RAC。2 数据库安装创建完毕后,需要进行下列的完善工作,1 打上最新的补丁集,如:ORAC
2、LE 11204,截止至 2017 年 4 月,ORACLE11204 数据库, 当前最新版本的补丁集为 20161018 日发布的,p24436338_112040_Linux-x86-64_GI_20161018.zip -rac 版本, p24006111_112040_Linux-x86-64_DB_20161018.zip -纯数据库版。请按照补丁集上的 readme.html,把补丁集打到 GI, 数据库上。2 初始化参数,下面的参数值,只是通常情况下的设置(或可根据服务器的硬件条件自行修改配置) ,要想系统效率最优,得依据数据库实际的运行情况逐步作微调(注意,下面的命令,在 RA
3、C 和单节点环境下,稍有不同) 。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=spfi
4、le 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=1
5、00m 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
6、k3db1show parameter db_recoveryNAME TYPE VALUE- - -db_recovery_file_dest stringdb_recovery_file_dest_size big integer 0SYSk3db1alter system set db_recovery_file_dest_size=50g; - 此参数值按实际情况设置。System altered.Elapsed: 00:00:00.04SYSk3db1alter system set db_recovery_file_dest=+FLASH; - 此参数值按实际情况设置。System
7、 altered.Elapsed: 00:00:00.03alter 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;-
8、 开启最小附加日志alter database add supplemental log data;5 节点 1,节点 2 上。Alter database open;3 制定作业,定时采集系统表,业务表的统计信息,3.1 以 sys 身份,使用 sqlplus 工具,登录生产库,创建定时作业,采集系统表,每周日早上 7 点开始运行。create procedure pro_analyze_dict as begindbms_stats.gather_dictionary_stats();dbms_stats.gather_fixed_objects_stats();end pro_analy
9、ze_dict;/begindbms_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_n
10、ame= PROC_ANALYZE_DICT);begindbms_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;/begindbms_scheduler.create_job(job_name = JOB_ANALYZE_DICT,
11、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 d
12、bms_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 identifie
13、d 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;gr
14、ant 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 asbeginfor i in (select owner, table_name from dba_tables a where owner in (LNZHONGYI,ZHONGYICS) and temporary=N
15、 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) loopdbms_stats.gather_table_stats(i.owner,i.table_name);end loop;for i in (select owner, table_name from dba_tables where owner in
16、 (LNZHONGYI,ZHONGYICS) and temporary=Y and last_analyzed is not nullorder by owner, table_name) loopdbms_stats.delete_table_stats(i.owner,i.table_name);end loop;end pro_analyze_stats;/说明:红色部分,是业务账户名,请根据实际情况更改。蓝色部分,用于清空临时表(ORACLE 定义的临时表)的统计信息,这在 11G 版本是可行的,到了 12C, ORACLE 对临时表的统计信息作了进一步的改进,需要分情况处理了。be
17、gindbms_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;/说明:红色部分说明的是作业的运行时间点,可以更改。begindbms_scheduler.create_program(prog
18、ram_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;/begindbms_scheduler.create_job(job_name = JOB_ANALYZE_STATS,program_name = PROC_ANALYZE_STATS,schedule_name = SCHEDULE_DAIL
19、Y_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 awhere owner=LNZHONGYI and table_name like TMP% and length(table_na
20、me) = 30and 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 desc lnzhongyi.t_bas_temporarytablenameName Null? Type - - -FTABLENAME NOT NULL VARCHAR2(30)FCREATEDATE DATEFUSERTOKEN VARCHAR2(36)FPROCESSTYPE
21、 NUMBER(10)FUSERTRANSACTIONID VARCHAR2(200)- 创建作业运行用的时间表,每小时运行一次。begindbms_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
22、 = );end;/- 创建作业运行的 PROGRAM。begindbms_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;/- 创建定期作业, begindbms_scheduler.create_job(job_name =
23、 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 保留几份全库备份(包括全库备份以后的所有日志,以保障可用该备份恢复自该备份以来的任意时间点) ,但此策略只要求有备份,不保障能往回追
24、溯 N 天以来,故,不常用。4.2.2 保留恢复最近 N 天以来的备份。使用此策略,可以保障备份集,可以恢复从现在开始,往回追溯 N 天以来的任意时间点。这是最常用的备份保留策略,基本上,我们都使用此策略。4.2.3 对于需要保留 多少天 以来的备份策略,需要依据甲方的业务需求来制定。比如:甲方要求,需要保留一个月以来的备份数据,也就是,从现在开始,往回追溯 31 天以来,这个范围内的任意时间点,都必须可以恢复。4.2.4 保留 N 天以来的备份集,消耗的是备份集的存放空间,因此,若磁盘存储不足,得向甲方说明,要求甲方配备足够的磁盘空间。(需要考虑后续库的数据量持续增长情况)4.2.5 制定好
25、备份策略后,需要持续观察至少一个备份周期的时间,以确保备份策略进入循环的工作状态。对于生产数据库,备份重于一切,我们要求,自生产系统投入使用开始,就必须确保备份策略进行良性运行工作状态,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 工具检查数据库环境的当前状况,并根据该工具的检查报告,做合适的修改。