NC数据库日常维护.docx
《NC数据库日常维护.docx》由会员分享,可在线阅读,更多相关《NC数据库日常维护.docx(31页珍藏版)》请在冰豆网上搜索。
NC数据库日常维护
目录
一.日常操作2
(一)Oracle数据库2
1.数据库的启动:
2
2.用户口令的修改:
2
3.数据库参数文件SPFILE与PFILE2
(二).DB2数据库的常用操作3
二.备份与恢复3
(一)Oracle的逻辑备份与恢复3
1.逻辑备份3
2.逻辑恢复4
(二)DB2的备份与恢复4
1.备份4
2.恢复5
三.执行统计分析更新5
(一)Oracle:
5
(二)DB25
(三)SQLServer6
四.重建索引6
(一)oracle6
(二)db26
(三)sqlserver:
7
附件一.纠正oracle临时表统计信息的方案8
附件二.Oracle客户端连接服务器的出错处理13
附件三.Oracle优化说明14
一.日常操作
(一)Oracle数据库
1.数据库的启动:
(1)启动数据库实例(Unix/Linux系统需切换到Oracle用户下):
sqlplus“/assysdba”
startup(启动数据库实例)
shutdownimmediate(关闭数据库实例)
(2)启动/关闭数据库监听进程.
lsnrctl
LSNRCTL>start(启动监听)
LSNRCTL>stop(关闭监听)
2.用户口令的修改:
SQL>ALTERUSER“用户名”IDENTIFIEDBY“新口令”
如果数据库管理员的口令丢失,可执行如下步骤:
sqlplus“/assysdba”
SQL>ALTERUSER“sys”IDENTIFIEDBY“新口令”
SQL>ALTERUSER“system”IDENTIFIEDBY“新口令”
3.数据库参数文件SPFILE与PFILE
(假设Oracle安装在D:
\Oracle目录下)
(1)SPFILE文件:
存储在D:
\Oracle\ora92\database目录下,为二进制的参数文件,无法直接编辑.
文件名为”SPFILE+例程名.ora”
(2)PFILE文件:
存储在D:
\Oracle\ora92\database目录下,为文本的参数文件,可直接修改.文件名为”init+例程名.ora”,打开此文件,内容为”IFILE=’d:
\oracle\admin\实例名\pfile\init.ora’”,也就是说真正的参数文件为init.ora,此文件为文本文件,可直接编辑.
(3)数据库启动所使用的参数文件.
数据库启动时,首先寻找”SPFILE+例程名.ora”文件,若文件存在,就按照文件设
置的参数启动例程;若”SPFILE+例程名.ora”文件不存在,转向寻找”init+例程名.ora”文件,按照”init+例程名.ora”文件里指定的实际参数文件init.ora的参数启动例程.
(4)SPFILE和PFILE的相互转换.
a)用SPFILE文件创建PFILE文件.
Createspfile=’spfile路径’frompfile=’pfile路径’;
b)用PFILE文件创建SPFILE文件.
Createpfile=’pfile路径’fromspfile=’spfile路径’;
(二).DB2数据库的常用操作
1.启动数据库
db2start
2.停止数据库
db2stop
3.连接数据库
db2connecttoo_yduserdb2usingpwd
4.读数据库管理程序配置
db2getdbmcfg
5.写数据库管理程序配置
db2updatedbmcfgusing参数名参数值
6.读数据库的配置
db2connectto数据库名userdb2usingpwd
db2getdbcfgfor数据库名
7.写数据库的配置
db2connectto数据库名userdb2usingpwd
db2updatedbcfgfor数据库名using参数名参数值
8.关闭所有应用连接
db2forceapplicationall
9.执行一个sql文件
db2–tfsql文件名
(文件中每一条命令用;结束)
10.列出所有的系统表
listtablesforsystem
二.备份与恢复
(一)Oracle的逻辑备份与恢复
1.逻辑备份
使用EXP命令,exphelp=y得到所有关于exp命令的参数
例:
将nc30用户的所有数据备份到nc30bak.dmp文件中.
expnc30/1@ncdbowner=nc30file=nc30bak.dmplog=exp.log
其中:
nc30/1:
nc的Oracle用户名与密码
ncdb:
Oracle的实例名
nc30bak.dmp:
为导出文件
exp.log:
导出过程的log文件.
2.逻辑恢复
使用IMP命令,用imphelp=y得到所有关于exp命令的参数
例:
将nc30bak.dmp文件中的nc30用户的所有数据恢复到nc30new用户下.
impnc30new/1@ncdbfromuser=nc30touser=nc30newfile=nc30bak.dmplog=imp.log
其中:
nc30/1:
要导入的Oracle用户名与密码
ncdb:
Oracle的实例名
nc30:
导出时的Oracle用户名
nc30new:
要导入数据到此Oracle用户下
nc30bak.dmp:
为导出文件
imp.log:
导入过程的log文件.
(二)DB2的备份与恢复
1.备份
通过DB2控制中心图形界面备份,右键点击选中的数据库,选择备份数据库,根据提示操作即可;
命令行操作
db2backupdbdbnametobackupdir
注释:
该命令有丰富参数,可以使用命令db2?
backupdb查看。
在命令行下输入db2?
msg,msg可以是错误提示信息如SQL1013N,也可以是某个命令如backupdb。
注意事项
windows服务器的备份文件放在一个较深的目录结构下,注意复制时要保留目录结构,例:
C:
\MYDB.0\DB2\NODE0000\CATN0000\20030401\120001.001
备份如果提示有活动应用程序连接,则在确认事务都已经提交后,断调连接后再备份
db2forceapplicationall
对于用于不同操作系统下数据库恢复目的的数据库备份:
假如,你的数据库在AIX平台上,你想在WIN平台上来恢复数据环境,可用dbmove来做。
dbmove只导出了表结构与表数据,而其他如视图等对象并没有被创建,所以还要用db2look做一个库结构的备份。
操作步骤如下所示:
db2look–ddbname–udb2inst1–e–od:
\credb.sql–idb2inst1–wdb2inst1
db2movedbnameexport–tcdb2inst1–udb2inst1–pdb2inst1
2.恢复
通过控制中心图形界面恢复,右键点击指定实例下面的数据库,选择“根据备份创建数据库”,根据提示操作;
命令行操作
db2restoredbdbnamefrombackupdir
对于通过dbmove来的数据我们如何做恢复呢?
步骤如下:
dbmovedbnameimport–tcdb2inst1–udb2inst1–pdb2inst1
db2connecttodbnameuserdb2inst1usingdb2inst1
db2–tvfd:
\credb.sql>credb.log
执行以上步骤后打开credb.log文件查看有哪些异常,在日志文件中前半部份涉及到创建表的语句会报错,因为通过dbmove后表已创建起来,我们把他当做正常错误来看待。
关键是要看后面的涉及到表的约束条件及索引、视图、触发器的建立是否正常。
三.执行统计分析更新
作用:
保证统计信息的最新与准确性最好每周做一下统计信息更新:
(一)Oracle:
使用sqlplus以要更新的用户身份登陆到数据库,执行:
begin
dbms_stats.gather_schema_stats(ownname=>‘(用户名)’,cascade=>TRUE);
end;
上述语句会把该用户模式下的所有表、索引的统计信息更新。
如果只想更新其中某个对象的统计信息,可执行analyzetable表名 computestatisticsanalyzetable表名computestatisticsforallindexes;analyzetable表名computestatisticsforallcolumns;
(二)DB2
以表的所有者的用户权限登陆数据库,执行:
reorgchkupdatestatisticsontableall
上述语句会更新该数据库内该用户所拥有的所有表、索引的统计信息
如果只想更新其中某个对象的统计信息,可执行
RUNSTATSONTABLE(表名)andindexesall
(三)SQLServer
使用QueryAnalyzer登陆到SQLServer,执行:
use用户数据库名称
sp_updatestats
上述语句会把该数据库内的所有表、索引的统计信息更新。
如果只想更新其中某个对象的统计信息,可执行:
UPDATESTATISTICS表名
四.重建索引
如果系统已经运行三月以上,并且数据变化很大,可以考虑重建索引.
(一)oracle
执行:
setpagesize20000
spoolc:
\index.sql;
select‘alterindex‘||index_name||’rebuildonline;’fromuser_indexes;
spooloff;
编辑c:
\index.sql文件,删除除’alterindex......’外的其他内容。
运行:
@@c:
\index.sql;
(二)db2
在用户数据库先执行:
select‘REORGTABLE‘||rtrim(TBCREATOR)||’.’||TBNAME||’INDEX‘||rtrim(CREATOR)||’.’||NAMEfromsysibm.sysindexes
然后把运行结果执行
(三)sqlserver:
在用户数据库先执行:
select‘dbccdbreindex(‘+name+’)’fromsysobjectswherextype=’u’
然后把运行结果执行
附件一.纠正oracle临时表统计信息的方案
针对NC产品版本:
1.NC产品230打过临时表patch的用户
2.NC产品V30用户
1.问题描述
nc产品运行中,当遇到多表关联查询包含临时表的时候,往往会出现执行时间较长的效率问题。
2.问题原因
这是因为oracle的cost优化器,在处理没有统计信息的临时表时,经常会选择不良的执行计划,导致一个查询耗时很长的显像。
3.解决方法
根据nc产品的sql特征,认为,手工对临时表指定统计信息,是对于这个问题较好的解决方案。
为了避免复杂手工命令步骤,提供以下存储过程来统一实现多个临时表的统计信息指定。
请大家务必严格按步骤执行。
4.结果描述
避免了oracle在有关临时表查询是选择不良的执行计划,提高了类似查询的执行效率.
5.执行步骤
(1)创建procudure:
在sqlplus中以在nc的用户下执行以下创建procedure的脚本:
CREATEORREPLACEPROCEDUREINRT_STATISTICS
AS
V_TABLENAMEVARCHAR2(50);--table的名称
V_USERNAMEVARCHAR2(50);
V_SQLVARCHAR2(500);
V_SQL1VARCHAR2(500);
--游标
CURSORCUR_TABLEIS
SELECTTABLE_NAMEFROMUSER_TABLESWHERETABLESPACE_NAMEISNULL;
BEGIN
SELECTUSERINTOV_USERNAMEFROMDUAL;
OPENCUR_TABLE;
LOOP
FETCHCUR_TABLEINTOV_TABLENAME;
EXITWHENCUR_TABLE%NOTFOUND;
V_SQL:
='analyzetable'||V_TABLENAME||'deletestatistics';
V_SQL1:
='BEGINdbms_stats.set_table_stats(ownname=>'''||V_USERNAME||''',tabname=>'''||V_TABLENAME||''',numrows=>2000,numblks=>70);END;';
EXECUTEIMMEDIATEV_SQL;
EXECUTEIMMEDIATEV_SQL1;
ENDLOOP;
V_SQL:
='BEGINdbms_stats.set_table_stats(ownname=>'''||V_USERNAME||''',tabname=>''IA_ENDHANDLE'',numrows=>1000,numblks=>15);END;';
EXECUTEIMMEDIATEV_SQL;
V_SQL:
='BEGINdbms_stats.set_table_stats(ownname=>'''||V_USERNAME||''',tabname=>''FA_TEMP_DEP_N'',numrows=>10000,numblks=>100);END;';
EXECUTEIMMEDIATEV_SQL;
--关闭游标
CLOSECUR_TABLE;
EXCEPTION
WHENOTHERSTHEN
IFCUR_TABLE%ISOPENTHEN
CLOSECUR_TABLE;
ENDIF;
ENDINRT_STATISTICS;
/
如果得到以下提示,表示创建成功:
Procedurecreated(或同意的中文提示)。
如:
MicrosoftWindows2000[Version5.00.2195]
(C)版权所有1985-2000MicrosoftCorp.
C:
\DocumentsandSettings\duanl>sqlplus
SQL*Plus:
Release8.1.7.0.0-Productionon星期一9月2713:
05:
532004
(c)Copyright2000OracleCorporation.Allrightsreserved.
请输入用户名:
NCUSER
请输入口令:
连接到:
Oracle8iEnterpriseEditionRelease8.1.7.4.1-Production
WiththePartitioningoption
JServerRelease8.1.7.4.1-Production
SQL>CREATEORREPLACEPROCEDUREINRT_STATISTICS
2AS
3V_TABLENAMEVARCHAR2(50);--table的名称
4V_USERNAMEVARCHAR2(50);
5V_SQLVARCHAR2(500);
6V_SQL1VARCHAR2(500);
7
8--游标
9
10CURSORCUR_TABLEIS
11SELECTTABLE_NAMEFROMUSER_TABLESWHERETABLESPACE_NAMEISNULL;
12
13BEGIN
14SELECTUSERINTOV_USERNAMEFROMDUAL;
15
16OPENCUR_TABLE;
17LOOP
18FETCHCUR_TABLEINTOV_TABLENAME;
19
20EXITWHENCUR_TABLE%NOTFOUND;
21
22V_SQL:
='analyzetable'||V_TABLENAME||'deletestatistics';
23V_SQL1:
='BEGINdbms_stats.set_table_stats(ownname=>'''||V_USERNAME
||''',tabname=>'''||V_TABLENAME||''',numrows=>2000,numblks=>70);END;';
24
25EXECUTEIMMEDIATEV_SQL;
26EXECUTEIMMEDIATEV_SQL1;
27
28ENDLOOP;
29
30V_SQL:
='BEGINdbms_stats.set_table_stats(ownname=>'''||V_USERNAME||'
'',tabname=>''IA_ENDHANDLE'',numrows=>1000,numblks=>15);END;';
31EXECUTEIMMEDIATEV_SQL;
32
33V_SQL:
='BEGINdbms_stats.set_table_stats(ownname=>'''||V_USERNAME||'
'',tabname=>''FA_TEMP_DEP_N'',numrows=>10000,numblks=>100);END;';
34EXECUTEIMMEDIATEV_SQL;
35
36--关闭游标
37CLOSECUR_TABLE;
38
39EXCEPTION
40WHENOTHERSTHEN
41IFCUR_TABLE%ISOPENTHEN
42CLOSECUR_TABLE;
43ENDIF;
44ENDINRT_STATISTICS;
45/
过程已创建。
(2)执行该存储过程:
a.如
(1)得到成功提示后,在nc用户下执行:
execINRT_STATISTICS;
指定临时表统计信息。
SQL>execINRT_STATISTICS;
PL/SQL过程已成功完成。
b.如
(1)返回有错误提示,执行:
showerror
并把显示结果发回NC本部设计部。
SQL>showerror
PROCEDUREINRT_STATISTICS出现错误:
LINE/COLERROR
-------------------------------------------------------------------------
30/73PLS-00103:
出现符号
"',tabname=>'IA_ENDHANDLE',numrows=>1000,numblks=>15);END;"在需要
下列之一时:
.(*@%&=-+;>atinmodnotrem<>or!
=or~=>=
<=<>andorlikebetweenisnullisnot||isdangling
符号"."被替换为
"',tabname=>'IA_ENDHANDLE',numrows=>1000,numblks=>15);END;"
后继续。
6.另外提供定制job
定时完成这个功能的脚本,
将存储过程定时job:
variablejobnonumber;
variableinstnonumber;
begin
selectinstance_numberinto:
instnofromv$instance;
dbms_job.submit(:
jobno,'BEGININRT_STATISTICS;END;',trunc(trunc(sysdate)+23/24,'HH'),'trunc(SYSDATE+1,''HH'')',TRUE,:
instno);
commit;
end;
/
SQL>variablejobnonumber;
SQL>variableinstnonumber;
SQL>begin
2selectinstance_numberinto:
instnofromv$instance;
3dbms_job.submit(:
jobno,'BEGININRT_STATISTICS;END;',trunc(trunc(sysdate)+23/24,'HH'),'trunc(SYSDATE+1,''HH'')',TRUE,:
instno);
4commit;
5end;
6/
PL/SQL过程已成功完成。
这个可代替上述步骤5-
(2)a
时间定制为每天晚上11点.
要执行这个job,必须先确定数据库参数:
job_queue_processes
在sqlplus中用这个命令来查看参数:
showparameterjob_queue_processes
如果该参数值为0,在sqlplus中用以下命令先进行修改:
altersystemsetjob_queue_processes=10;
SQL>showparameterjob_queue_processes
NAMETYPEVALUE
-------------------------------------------------------------------------
job_queue_processesinteger4
SQL>altersystemsetjob_queue_processes=10;
系统已更改。
7.相关说明
以上提供的方案,对数据库系统资源消耗较小,可以在业务使用的时候执行.
附件二.Oracle客户端连接服务器的出错处理
一.ORA-12560:
TNS:
协议适配器错误
造成ORA-12560:
TNS:
协议适配器错误的问题的原因有三个:
1.监听服务没有起起来。
windows平台个一如下操作:
开始---程序---管理工具---服务,打开服务面板,启动oraclehome92TNSlistener服务。