金蝶云星空ORACLE数据库安装及完善工作要求金蝶软件(中国)有限公司金蝶云星空基础系统部2018-06-27张华福时间位置内容作者2018-02-0118:052数据库安装创建添加补丁号16086769张华福2018-03-2216:206创建合适的表空间添加6.1张华福2018-04-1910:292数据库安装创建添加补丁号17306264张华福2018-04-1910:332数据库安装创建修改最新补丁集号张华福2014-04-2314:302数据库安装创建添加:提示。张华福2018-04-2518:104.4删除临时表信息添加:EXEC动态语句张华福2018-04-2608:384.2采集统计信息添加:采集索引统计信息崔智刚2018-05-3018:032数据库安装创建添加补丁号16311211_11204171017张华福2018-06-2711:082数据库安装创建14275161;22113854;19855835;19174639;24739928;23665623;20907061;18498878;张华福本文主要强调ORACLE数据库服务器环境的安装软件及版本,以及安装完成后的后续完善工作。以确保数据库以比较健壮的状态投入生产,尽量避免已知的问题影响生产库的运营文章不涉及到软件的安装方法步骤。1服务器系统软件,数据库版本安装推荐:1数据库服务器的操作系统,推荐使用ORACLELINUX6.9。2数据库软件版本,要求安装11204企业版(不支持标准版),单节点或RAC环境均可,推荐使用RAC。2数据库安装创建完毕后,需要进行下列的完善工作,1打上最新的补丁集,如:ORACLE11204,截止至2018年04月,ORACLE11204数据库,当前最新版本的补丁集为20180417日发布(使用CSI服务号,到ORACLE的SUPPRT网站下载),此外,还需要打上下列小补丁(ONE-OFFPATCH):14275161,16086769_112041,16311211_11204171017,17306264_11204170418,18841764,18498878_112040,19174639_112040,19678658_11204171017,19692824(使用linux7时才需要),19855835_112044,20907061_11204180116,22113854_112040,23665623_11204171017,24739928_11204180417,24921392,p27475913_112040_Linux-x86-64.zip--GI版本,p27338049_112040_Linux-x86-64.zip--纯数据库版。提示:1PSU补丁集在单节点环境使用纯数据库版,在RAC环境使用GI版本。2优先打补丁集(强烈建议),再打小补丁(建议)。3解压后,请按照解压出来的readme.html/txt文档(解压目录里)说明安装。4有时补丁集和小补丁可能会存在冲突,如:在打补丁19678658前,做补丁间冲突检查,[oracle@rac12/backup/soft/p19678658/19678658]$opatchprereqCheckConflictAgainstOHWithDetail-ph./此时,该命令的反馈结果,可能会包含类似这种信息:(ConflictwithCompositePatch27338049),遇上这种情况,通常得再到SUPPORT网站,寻找该补丁的最新补丁集,如上:19678658_11204171017补丁19678658和27338049集有冲突,但19678658_11204171017和该补丁集没有冲突,此时,得选择后者来打。如下检查:[oracle@rac11/backup/soft/opatch/p19678658_11204171017/19678658]$opatchprereqCheckConflictAgainstOHWithDetail-ph./OracleInterimPatchInstallerversion11.2.0.3.19Copyright(c)2018,OracleCorporation.Allrightsreserved.PREREQsessionOracleHome:/home/app/11.2.4/product/db_1CentralInventory:/home/app/oraInventoryfrom:/home/app/11.2.4/product/db_1/oraInst.locOPatchversion:11.2.0.3.19OUIversion:11.2.0.4.0Logfilelocation:/home/app/11.2.4/product/db_1/cfgtoollogs/opatch/opatch2018-06-01_09-39-55AM_1.logInvokingprereq"checkconflictagainstohwithdetail"Prereq"checkConflictAgainstOHWithDetail"passed.OPatchsucceeded.[oracle@rac11/backup/soft/opatch/p19678658_11204171017/19678658]$5当往rac环境打补丁16311211_11204171017后,数据库将无法MOUNT。原因:控制文件放在ASM的某个DISKGROUP上,而该DISKGROUP的GROUP为asmadmin,与数据库软件的安装属主(通常都是oracle账户),下的$ORACLE_HOME/bin/oracle,该文件的group不一样,该文件的group此时一般为oinstall,故导致$ORACLE_HOME/bin/oracle报权限不足,无法读取该diskgroup上的控制文件,故,无法启动数据库。解决方法如下演示(文档ID1378747.1):[oracle@rac11/backup/soft/opatch]$cd$ORACLE_HOME/bin[oracle@rac11/home/app/11.2.4/product/db_1/bin]$ls-lrtoracle-rwsr-s--x1oracleoinstall239837496May3017:22oracle<--------------经分析,是因为oracle文件的属于从asmadmin变成oinstall的原因[oracle@rac11/home/app/11.2.4/product/db_1/bin]$exitlogout[root@rac11~]#su-gridLastlogin:WedMay3014:44:28CST2018onpts/2[grid@rac11~]$cd$ORACLE_HOME/bin<---------------来到grid账户的此目录下,执行下面的操作[grid@rac11/home/app/11.2.4/grid/home/bin]$./setasmgidwrapo=/home/app/11.2.4/product/db_1/bin/oracle<---------------修改oracle文件的属主(数据库软件的安装属主(通常都是oracle账户)的bin目录下的oracle文件)[grid@rac11/home/app/11.2.4/grid/home/bin]$ls-lrt/home/app/11.2.4/product/db_1/bin/oracle-rwsr-s--x1oracleasmadmin239837496May3017:22/home/app/11.2.4/product/db_1/bin/oracle所有节点都要重复上述操作,之后即可正常启动数据库。若看不懂这一条,那就不要往RAC环境打补丁16311211_11204171017。6上面列举的小补丁(如:16311211),尽量寻找发布时间晚的补丁,因为,早先的版本,可能存在与PSU补丁集冲突的情况,而后面出的版本,则可能已经解决了此冲突。如补丁:16311211,会与20180417补丁集冲突;但若是16311211_11204171017,还是同一补丁,但不会与上述补丁集冲突。2初始化参数,下面的参数值,只是通常情况下的设置(或可根据服务器的硬件条件自行修改配置),要想系统效率最优,得依据数据库实际的运行情况逐步作微调。2.1给数据库服务器配置HugePgaes,详见文档:如何给linux环境下的oracle数据库服务器设置HugePages.2.2修改数据库参数:alterprofiledefaultLIMITPASSWORD_LIFE_TIMEUNLIMITED;altersystemsetprocesses=600scope=spfilesid='*';altersystemsetcontrol_file_record_keep_time=21scope=spfilesid='*';altersystemsetopen_cursors=300scope=spfilesid='*';altersystemsetsession_cached_cursors=300scope=spfilesid='*';altersystemsetaudit_trail=NONEscope=spfilesid='*';altersystemsetrecyclebin=offscope=spfilesid='*';altersystemsetlog_archive_dest_1='location=use_db_recovery_file_dest'scope=bothsid='*';altersystemsetfast_start_mttr_target=300scope=bothsid='*';altersystemsetstreams_pool_size=100mscope=spfilesid='*';altersystemsetarchive_lag_target=1200;altersystemset"_optimizer_use_feedback"=falsescope=spfilesid='*';altersystemset"_optimizer_invalidation_period"=60scope=bothsid='*';altersystemsetdb_securefile=alwaysscope=bothsid='*';altersystemsetfilesystemio_options=setallscope=spfilesid=’*’;修改结束后,需重启数据库,才能确保上述修改生效。3将数据库设置成归档模式,并开启最小附加日志,如下操作:3.1启用db_reocvery_file_dest参数,设置好归档日志存放路径,SYS@k3db1>showparameterdb_recoveryNAMETYPEVALUE-----------------------------------------------------------------------------db_recovery_file_deststringdb_recovery_file_dest_sizebiginteger0SYS@k3db1>altersystemsetdb_recovery_file_dest_size=50g;--此参数值按实际情况设置。Systemaltered.Elapsed:00:00:00.04SYS@k3db1>altersystemsetdb_recovery_file_dest='+FLASH';--此参数值按实际情况设置。Systemaltered.Elapsed:00:00:00.03altersystemsetlog_archive_dest_1='location=use_db_recovery_file_dest'scope=bothsid='*';同时在两节点上执行:关闭数据库,设置归档模式,都设置了归档模式后,再打开库。2节点1,节点2上。Shutdownimmediate;3节点1,节点2上。Startupmount;4节点1,节点2上。Alterdatabasearchivelog;Alterdatabaseaddsupplementallogdata;--开启最小附加日志Alterdatabaseaddsupplementallogdata;5节点1,节点2上。Alterdatabaseopen;4制定作业,定时采集系统表,业务表的统计信息,4.1使用sqlplus工具,以sys身份,登录生产库,创建定时作业(下同),采集系统表,每天早上5点(按需求更改)运行。Createorreplaceprocedurepro_analyze_dictasbegindbms_stats.gather_dictionary_stats();dbms_stats.gather_fixed_objects_stats();Endpro_analyze_dict;/Begindbms_scheduler.create_job(job_name=>'JOB_ANALYZE_DICT',job_type=>'PLSQL_BLOCK',job_action=>'BEGINpro_analyze_dict;END;',repeat_interval=>'FREQ=DAILY;BYHOUR=05;BYMINUTE=5;',enabled=>true);End;/4.2创建采集业务表的定时作业,每天早上1点(按需求更改)运行。Createorreplaceprocedurepro_analyze_statsasora_20005exception;ora_25191exception;pragmaexception_init(ora_20005,-20005);pragmaexception_init(ora_25191,-25191);/*ORA-25191:cannotreferenceoverflowtableofanindex-organizedtableORA-20005:objectstatisticsarelocked(stattype=ALL)*/begin--2017-11-0310:46Dbms_stats.flush_database_monitoring_info();foriin(selectusernamefromdba_userswhereusernamein('K3CLOUD3','K3CLOUD'))loopforjin(selectowner,'"'||table_name||'"'table_namefromdba_tablesawhereownerin(i.username)andtemporary='N'andtable_namenotlike'TMP%'andnotexists(select1fromdba_mview_logswherelog_ownerin(i.username)andlog_table=a.table_name)orderbyowner,last_analyzednullsfirst)loopbegindbms_stats.gather_table_stats(j.owner,j.table_name,method_opt=>'forallcolumnssize254',degree=>2,casacde=>true);exceptionwhenora_20005orora_25191thennull;end;endloop;--2017-10-0910:36gathervirtualcolumnstatsforjin(selectowner,'"'||table_name||'"'table_name,column_namefromdba_tab_colswhereownerin(i.username)andvirtual_column='YES'andtable_namenotlike'TMP%'anddata_type<>'XMLTYPE'andhidden_column='NO')loopbegindbms_stats.gather_table_stats(j.owner,j.table_name,method_opt=>'forcolumns'||j.column_name||'size254',casacde=>true);exceptionwhenora_20005orora_25191thennull;end;endloop;endloop;Endpro_analyze_stats;/Begindbms_scheduler.create_job(job_name=>'JOB_ANALYZE_STATS',job_type=>'PLSQL_BLOCK',job_action=>'BEGINpro_analyze_stats;END;',repeat_interval=>'FREQ=DAILY;BYHOUR=01;BYMINUTE=30;',enabled=>true);End;/说明:红色部分,改为要存放业务数据的账户名(下同)。--4.3创建一作业,每天早上3点(按需求更改)删除过期(24小时以前创建)的临时表--创建删除临时表的过程。createorreplaceprocedurepro_purge_tmptableasora_942exception;pragmaexception_init(ora_942,-942);ora_54exception;pragmaexception_init(ora_54,-54);v_msgvarchar2(300);beginforiin(selectusernamefromdba_userswhereusernamein('K3CLOUD3','K3CLOUD'))loopforjin(selecta.owner,a.table_namefromdba_tablesa,dba_objectsbwherea.ownerin(i.username)anda.table_namelike'TMP%'andlength(a.table_name)=30andb.ownerin(i.username)andb.object_type='TABLE'andb.object_namelike'TMP%'andb.created<(sysdate-1)and(a.owner=b.owneranda.table_name=b.object_name))loopbegin--dbms_output.put_line(j.table_name);executeimmediate'droptable'||j.owner||'.'||j.table_name||'purge';exceptionwhenothersthennull;end;endloop;beginexecuteimmediate'deletefrom'||i.username||'.t_bas_temporarytablenameawherenotexists(select1fromdba_tableswhereowner='''||i.username||'''andtable_name=a.ftablename)';commit;end;endloop;endpro_purge_tmptable;/Begindbms_scheduler.create_job(job_name=>'JOB_PURGE_TMPTABLE',job_type=>'PLSQL_BLOCK',job_action=>'BEGINpro_purge_tmptable;END;',repeat_interval=>'FREQ=DAILY;BYHOUR=03;BYMINUTE=0;',enabled=>true);End;/说明:脚本中,红色部分,是用于业务运营的数据库账户。2,据我了解,这些临时表都应该记录在该账户下的:T_BAS_TEMPORARYTABLENAME此表中。但由于该表中对临时表的创建时间,FCREATEDATE字段,没有强制NOTNULL,我担心某些记录没时间,这样,若读取该表的数据来做删除操作,这些没时间的记录,将被漏掉。SYS@orcl>desct_bas_temporarytablenameNameNull?Type---------------------------------------------------------------FTABLENAMENOTNULLVARCHAR2(30)FCREATEDATEDATEFUSERTOKENVARCHAR2(36)FPROCESSTYPENUMBER(10)FUSERTRANSACTIONIDVARCHAR2(200)--4.4创建一作业,每30分钟运行一次,删除5分钟前采集的临时表的统计信息。Createorreplaceprocedurepro_delete_tm_statsasora_20005exception;pragmaexception_init(ora_20005,-20005);beginforiin(selectowner,table_name,last_analyzed,num_rowsfromdba_tableswhereownerin('K3CLOUD3','K3CLOUD')andtemporary='Y'andlast_analyzedisnotnullandlast_analyzed<(sysdate-1/288)orderbyowner,table_name)loopbegindbms_stats.delete_table_stats(i.owner,i.table_name,no_invalidate=>false);--for12c,2018-04-2518:10executeimmediate'analyzetable'||i.owner||'.'||i.table_name||'deletestatistics';exceptionwhenora_20005thennull;end;endloop;End;Begindbms_scheduler.create_job(job_name=>'JOB_DELETE_TM_STATS',job_type=>'PLSQL_BLOCK',job_action=>'BEGINPRO_DELETE_TM_STATS;END;',repeat_interval=>'FREQ=MINUTELY;INTERVAL=30;',enabled=>true);End;/4.5关闭系统自带的统计信息等功能。execdbms_auto_task_admin.disable(client_name=>'autospaceadvisor',operation=>NULL,window_name=>null);execdbms_auto_task_admin.disable(client_name=>'sqltuningadvisor',operation=>null,window_name=>null);execdbms_auto_task_admin.disable(client_name=>'autooptimizerstatscollection',operation=>NULL,window_name=>NULL);5制定合适的备份策略,5.1通常情况下,我们都是以物理备份为主,逻辑备份为辅,也就是,主要使用rman备份,同时辅以expdp导出备份。5.2对于rman的备份策略,基本有两者:5.2.1保留几份全库备份(包括全库备份以后的所有日志,以保障可用该备份恢复自该备份以来的任意时间点),但此策略只要求有备份,不保障能往回追溯N天以来,故,不常用。5.2.2保留恢复最近N天以来的备份。使用此策略,可以保障备份集,可以恢复从现在开始,往回追溯N天以来的任意时间点。这是最常用的备份保留策略,基本上,我们都使用此策略。5.2.3对于需要保留N天以来的备份策略,需要依据甲方的业务需求来制定。比如:甲方要求,需要保留一个月以来的备份数据,也就是,从现在开始,往回追溯31天以来,这个范围内的任意时间点,都必须可以恢复。5.2.4保留N天以来的备份集,消耗的是备份集的存放空间,因此,若磁盘存储不足,得向甲方说明,要求甲方配备足够的磁盘空间(需考虑后续库数据量的持续增长情况)。5.2.5若有条件给生产库搭建DataGuard环境,建议启动DG库的数据库闪回功能。默认情况下,DG库能够闪回最近24小时以内任意时间点的数据。5.3制定好备份策略后,需要持续观察至少一个备份周期的时间,以确保备份策略进入正常的循环工作状态。对于生产数据库,备份重于一切。我们要求,自生产系统投入使用开始,就必须确保备份策略进行良性运行工作状态,DBA需要根据生产系统的运行情况,制定合理的巡检计划,检查包括备份策略在内的运行状态,以策安全。6创建合适的表空间,6.1新建的表空间必须是本地空间管理方式(LMT),不可以DMT。同时,建议使用默认的ASSM段管理方式,因为SECUREFILELOB字段,无法保存在以MSSM方式的段管理表空间下(ORA-43853)。6.2不同的数据库账户,创建各自的表空间,也就是,该表空间只用于存放该账户的数据对象。6.3表空间通常分3类,1数据表空间,2索引表空间,3LOB数据类型表空间。顾名思义,数据表空间存放数据,索引表空间存放索引,LOB表空间存放该账户下所有LOB类型的字段,也就是,从各表中,领出该字段迁移到此表空间上。6.4当生产系统运行一段时间后,可能会出现尺寸比较大的表,可考虑为这些大表创建新的表空间(EXTENT值放大些,比如:100M,500M,1G等),建好后,采用在线重定义的方法迁移。6.5后续若对表作分区,可针对大表创建新的数据表空间,和索引表空间,比如:创建EXTENT=100M的数据表空间(存放表分区),EXTENT=50M的索引表空间(存放分区索引)。EXTENT的尺寸多少适合,得看实际表的情况,也可以不止建一套,可建多套。7推荐使用最新版本的ORACHK工具(到ORACLE的SUPPORT网站下载)检查数据库环境的当前状况,并根据该工具的检查报告,做合适的修改。