摘要: 有些时候需要将Oracle的多个数据文件以及日志文件重定位或者迁移到新的分区或新的位置,比如磁盘空间不足,或因为特殊需求。对于这种情形可以采取批量迁移的方式将多个数据文件或者日志文件实现一次性迁移。当然备份恢复也是其中的方式之一。本文主要描述如何使用批量方式来迁移数据文件,日志文件。如需要也可以将整个数据库迁移到新的位置以及重命名数据库。 1、环境及需求 robin@SZDB:~&g...
阅读全文
迁移数据库的方法有多种,较为常用的则是使用RMAN来迁移。使用RMAN迁移数据库属于数据库的物理备份与恢复范畴,整个过程中数据库的相关信息是完整地镜像。因此,基于此种方式还原恢复的数据库用于测试会使得与真实的生产环境差异相对较小。本文描述了使用RMAN来还原Oracle 10g数据库的过程。
一、主要步骤
1、备份数据库
2、ftp备份到目的服务器
3、为目标数据库创建项目目录
4、为目标数据库创建pfile或spfile(使用RMAN还原或复制原pfile到目的服务器)
5、还原控制文件
6、还原数据文件
7、OPEN 数据库
其实,这几个步骤比较好理解,整个实质是对数据库体系结构以及数据库整个启动过程的理解。
下面对此进行一下描述
a、首先需要为实例的运行环境创建相应的目录,如dump位置,datafile位置,以及archive位置等等
如果是恢复到不同的路径,则后续RMAN时需要使用set newname for datafile 方式更新到控制文件
b、实例需要pfile来启动,因此需要恢复pfile或spfile,然后将数据库切换到nomount状态
c、接下来的一步是通过控制文件将数据库切换到mount状态,因此需要恢复控制文件,然后再mount
d、mount之后就可以对数据库进行还原(restore)操作
e、还原完毕之后是对数据库进行恢复(recovery)操作(restore和recover需要基于控制文件的备份信息或恢复目录)
f、最后是open数据库
二、迁移演示
1、备份原数据库
此处演示的源数据库与目标数据库使用相同的版本为Oracle 10g R2(10.2.0.3),操作系统都为suse 10 +Sp3
备份过程略,有关备份脚本,请参考:linux 下RMAN备份shell脚本:http://blog.csdn.net/robinson_0612/article/details/8029245
2、ftp所有的备份文件到需要恢复的服务器上
打包整个备份集ftp到目标服务器或scp到目标服务器
下面是ftp到目标服务器解压后包含的文件
oracle@2go-devDB01uv:/u02/database/SY5221_RMAN/20121013> ls -hltr total 9.4G -rw-r--r-- 1 oracle oinstall 3.0K 2012-10-16 09:48 initSY5221.ora -rw-r--r-- 1 oracle oinstall 2.7G 2012-10-16 10:02 SY5221_lev0_201210130630_4unnkjvi_1_1 -rw-r--r-- 1 oracle oinstall 3.1G 2012-10-16 10:04 SY5221_lev0_201210130630_4vnnkjvi_1_1 -rw-r--r-- 1 oracle oinstall 938M 2012-10-16 10:07 SY5221_lev0_201210130630_arc_51nnkk2h_1_1 -rw-r--r-- 1 oracle oinstall 935M 2012-10-16 10:08 SY5221_lev0_201210130630_arc_52nnkk2h_1_1 -rw-r--r-- 1 oracle oinstall 930M 2012-10-16 10:10 SY5221_lev0_201210130630_arc_53nnkk31_1_1 -rw-r--r-- 1 oracle oinstall 15M 2012-10-16 10:10 SY5221_lev0_cntl_bak_c-1468911009-20121013-00 -rw-r--r-- 1 oracle oinstall 15M 2012-10-16 10:10 SY5221_lev0_cntl_bak_c-1468911009-20121013-01 -rw-r--r-- 1 oracle oinstall 910M 2012-10-16 10:11 SY5221_lev0_201210130630_arc_54nnkk32_1_1 |
3、创建所需的目录(使用oracle用户)
oracle@2go-devDB01uv:~> more mkdir_sy5221.sh mkdir -p /u02/database/SY5221/flash_recovery_area mkdir -p /u02/database/SY5221 mkdir -p /u02/database/SY5221/archive mkdir -p /u02/database/SY5221/backup mkdir -p /u02/database/SY5221/bdump mkdir -p /u02/database/SY5221/cdump mkdir -p /u02/database/SY5221/udump mkdir -p /u02/database/SY5221/controlf mkdir -p /u02/database/SY5221/oradata mkdir -p /u02/database/SY5221/redolog mkdir -p /u02/database/SY5221/undo mkdir -p /u02/database/SY5221/temp mkdir -p /u02/database/SY5221/ref_data mkdir -p /u02/database/SY5221/BNR mkdir -p /u02/database/SY5221/BNR/full mkdir -p /u02/database/SY5221/BNR/dump mkdir -p /u02/database/SY5221/dbcreatelogs ORACLE_SID=SY5221; export ORACLE_SID oracle@2go-devDB01uv:~> chmod u+x mkdir_sy5221.sh oracle@2go-devDB01uv:~> ./mkdir_sy5221.sh |
4、创建密码文件
5、使用pfile启动实例到nomount状态
6、恢复控制文件并切换到mount状态
#再开一个session oracle@2go-devDB01uv:~> export ORACLE_SID=SY5221 oracle@2go-devDB01uv:~> $ORACLE_HOME/bin/rman target / RMAN> restore controlfile from '/u02/database/SY5221_RMAN/20121013/SY5221_lev0_cntl.bak_c-1468911009-20121013-01'; RMAN> alter database mount; |
7、指定备份文件所在目录
RMAN> catalog start with '/u02/database/SY5221_RMAN/20121013'; #此命令用于扫描整个目录的备份片或者归档日志文件等 |
8、还原数据库
9、恢复数据库
RMAN> recover database; unable to find archive log archive log thread=1 sequence=143388 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of recover command at 10/16/2012 11:32:54 RMAN-06054: media recovery requesting unknown log: thread 1 seq 143388 lowscn 608805162 #由于未复制联机日志文件,此时提示需要seqence 143388,scn 608805162 #在sqlplus提示符下继续介质恢复 SQL> conn / as sysdba Connected. idle> recover database until cancel; ORA-00283: recovery session canceled due to errors ORA-01610: recovery using the BACKUP CONTROLFILE option must be done SQL> recover database using backup controlfile until cancel; ORA-00279: change 608805162 generated at 10/13/2012 06:31:44 needed for thread 1 ORA-00289: suggestion : /u02/database/SY5221/archive/arch_668881377_1_143388.arc ORA-00280: change 608805162 for thread 1 is in sequence #143388 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} cancel #输入cancel,完成介质恢复 Media recovery cancelled. |
10、open 数据库
#如果open 不成功,请尝试shutdown 之后再次open,如果仍然不成功使用隐藏参数_allow_resetlogs_corruption打开数据库
SQL> alter database open resetlogs; Database altered. |
11、一致性关闭数据库并重启数据库
SQL> shutdown immediate; SQL> startup |
之前写过一篇性能测试新手误区(五):这是性能问题么,主要讲一个有效的性能问题应该是什么样的,其中提到了定位的问题。但是那篇文章只说了WHAT,并没有说HOW,只说tester要有明确的定位,却没提如何才能定位。实际工作中,我也总是接到这种问题,所以还是要写一篇关于方法的文章,来说说HOW TO DO。
以一个典型的WEB系统来举例,性能问题一般体现在客户端请求后的响应时间上。在性能测试过程中,即压力增大到某个程度后,响应时间指标迅速增长。但如那篇文章所说,这只能叫做一个现象,测试人员需要找到问题所在,HOW TO DO?
首先要搞清楚,客户端从发出请求直到看到最终结果,共经历了哪些过程。如果绘制出一张完整的路径图,我们的问题必将定位到这张图中的某一点上。下面是我画的一个常见的WEB系统请求的流转过程。
客户发出一个请求,这个请求首先会到达中间件的监听端口,专门的监听线程负责接待它,并将它分配给一个空闲的HTTP处理线程。HTTP线程根据请求内容,去执行相应的程序代码,这里会涉及程序的内部资源,比如专用的线程、一些队列等,程序的内部也许还有多个组件,依然可以拆分。再往后,从中间件维护的数据库连接池中取出一个空闲连接,通过它来与数据库进行交互。数据库收到查询请求后,同样需要找到一个可用的执行线程,然后才能执行具体的SQL,这里又会牵扯到很多数据库的内部资源,如锁、缓存等等。
可以看到,从用户点击鼠标发出请求,到显示器上展现出结果,实际是经过了很多处理过程的,这里的每一个节点出现问题,都会导致我们最终看到的“响应慢”现象出现(这里不考虑操作系统层面、网络层面等一些外层的因素)。
理解了这个过程,只需采取一些科学的方法即可逐渐逼近问题根源,那就是层层剥离、不断排除。从实际经验来看,数据库端最容易出问题,那么首先就要对其进行验证。数据库的性能一般是直接体现在SQL的执行效率上,我们可以捕获到出现问题时所有执行过的SQL,看其耗时是否正常。如果判断数据库端没有问题,那么再来到中间件端,这里又可分为应用服务器本身和我们自己的程序,可以先看看最容易验证的部分,应用服务器本身通常维护了一些线程池,很容易可以观察到它们的使用情况,如果这里没有发现异常,那么问题很可能就出现在我们程序的代码内部。如果在某一点上发现了异常现象,不要急于断定这里就是问题根源,而是要同时观察与之相邻节点的表现,一个节点的故障通常也会导致另一节点的异常。
一个很有效的排查手段就是日志,在每一个节点上输出接收到的请求和处理结果的日志,通常都会很容易的发现问题。
大致思路就是这样,总结起来其实很简单。一是要理解请求处理的完整流程,二是通过科学合理的方法去分析。
最后推荐个比较典型的问题排查过程供大家体会,超级奇怪的“黑色10秒钟”。我自己也有一些这种很有代表性的分析过程,有时间整理好也贴上来。
一、测试组的任务职责和测试的基本概念:
在软件系统开发完成后,必须进行测试和评价,以确定软件质量是否达到预定目标,这样才能保证软件系统安全可靠地运行。通过软件测试可以尽可能地和尽可能多地找出各种隐藏的错误和缺陷,及时进行修改和弥补。软件测试将直接影响到软件产品的最终质量。
测试组的任务是用尽可能高的精度测试所开发的软件产品与规定需求的差距及其应用时的适用性。如果发现缺陷,则软件产品不能通过验收和使用,并退回给开发组。测试组的另一个任务是制定软件应用计划,负责计划在生产领域如何正确地使用程序及数据库。
测试组的职责是确定测试过程、测试计划和组织测试过程及执行测试,但是不负责被测试系统的质量。
测试组能够有效地、成功地完成任务的关键因素是要有专门的测试设备、现代化的测试数据库和测试工具。
在软件开发过程中,需要采用分析的质量保证措施来对软件产品进行测试和评价。分析的质量保证措施包括静态测试和动态测试。静态测试在对软件进行分析、检查和测试时,不实际运行被测试的程序。动态测试是通过运行程序来检验软件的动态特性和运行结果的正确性,并根据程序的运行过程对程序进行评价的过程。动态测试是依据经验进行测试的过程。它试图使用定量的输入,依靠经验来调整程序,使其与规范的偏差在容许的范围内,容许值取决于质量需求。动态测试也可以看成是一个评价和验证系统或系统部件的过程,它采用人工的或自动的方法来辨别实际成果与期望成果的差别,并使系统满足规定的需求。
动态测试中常用的技术概念:
1、测试:可看成是运行程序的过程,其目标是找出错误。
2、调试:找出引起错误的原因的过程。它要规定怎样修改错误、检查修改后对程序的影响并进行修改。调试错误后要进行再测试。
3、错误:是指计算值、观测值、测量值之间,或条件与真值之间,不符合规定的或理论上的正确值或条件。
4、缺陷:是指与期望值或特征值的偏差。缺陷能影响程序的功能,例如:一个程序可能有好的功能,但其可维护性可能很差。缺陷可以发生在所有产品质量规范规定的特性中。
5、失效:是指功能部件执行其功能的能力丧失。一个部件的失效或影响较高层单元的运行或产生严重的后果。失效将影响产品的可靠性。
6、故障:是指功能部件不能执行所要求的功能。可能由错误、缺陷或失效引起。故障可影响程序的有效性。
二、软件测试规范:
测试组在测试过程中应遵循一定的命名和设计规范,以此来保证程序的标准化和可维护性。测试组需要遵循的规范暂时包括如下几个:VB编程命名规范、数据库命名规范、数据库设计规范。具体内容请参考各文件。
测试中发现的问题和测试方法规范如下:
1、软件错误等级定义表(Error Class)
失效等级 | 定义 |
1 | 可造成重大损失,用户认为不允许出现的错误 |
2 | 可造成较大损失,用户认为发生率应很低的错误 |
3 | 损失不大,但需要查找原因的错误,记入错误统计 |
4 | 可不查找错误原因,不记入错误统计 |
2、软件错误类型定义表(Error Type)
错误类型 | 定义 |
1 | 需求分析错误 |
2 | 程序代码错误 |
3 | 设计错误 |
3、常用软件测试方法(Testing Method)
序号 | 测试类型 | 简述 |
1 | 黑盒法 | 即功能测试,完全基于软件功能和需求的测试 |
2 | 白盒法 | 即结构测试,已知程序的内部逻辑,覆盖全部代码的测试 |
3 | 单元测试 | 最小函数、模块、类的测试 |
4 | 增量集成测试 | 增加新功能后进行的部分测试 |
5 | 集成测试 | 对由各部分组合起来的程序的测试 |
6 | 功能测试 | 黑盒类测试,测试软件同功能需求的适合度 |
7 | 健全性测试 | 常作为初始测试,确定一个新的软件版本是否表现正常,以应付更强的测试 |
8 | 回归测试 | 修复或调整好软件环境之后重新测试 |
9 | 认同测试 | 基于最终用户说明书的测试 |
10 | 负载测试 | 测试应用程序在重负载下的承受能力 |
11 | 性能测试 | 测试应用程序在重负载下的性能 |
12 | 可用性测试 | 测试软件操作及界面友好性 |
13 | 安装/卸载测试 | 测试软件安装、卸载过程 |
14 | 数据一致性测试 | 测试意外情况发生时,数据是否能保证一致性 |
15 | 验收测试 | 获知用户对软件是否满意 |
16 | 比较测试 | 在同类产品中比较软件的优缺点 |
17 | @测试 | 软件开发将结束时进行该测试 |
18 | β测试 | 当开发和测试工作实质上完成时进行该测试 |
建议采用以下测试方法:
1、黑盒法(Black Box);
2、白盒法(White Box);
3、可用性测试(Usability Testing);
4、单元测试(Unit Testing);
5、集成测试(Integrate Testing);
6、功能测试(Function Testing);
7、负载测试(Overload Testing);
8、性能测试(Ability Testing);
9、安装/卸载测试(Install / Uninstall Testing);
10、验收测试或@测试(Check&Accept Testing);
一、需求整理方面
完整详尽的需求规格说明书会有以下好处:
1、便于与客户沟通
尽可能地以书面形式将客户对产品的功能需求、性能指标、技术参数记录下来,在开发之前若需与客户沟通,便可以产品需求规格说明书为依据与客户沟通,看是否存在认识上和理解上的差异。必要时可请客户签字以表确认。
例如:赵教授相关项目是一个典型的例子,启动之初,需求上不太明确,我们应敦促其写好需求文档,然后我们和其讨论具体需求规格。或者引导客户将需求逐渐表达出来,我们将规格需求整理好,发至客户公司,让其确认,这样更方便促进对项目的理解,避免产生偏差,造成不必要的时间上的浪费。
2、便于开发团队内部使用
一个描述详细的产品性能指标说明书,便于开发人员和项目负责人对产品各项功能的认识达到统一,利于开发人员尽快理解产品的各项功能、性能,尽快开始展开工作,提高工作效率,也便于其他相关产品开发人员理解产品的性能。
例如:我们的钥匙产品,功能虽然不是特别复杂,但是初接触钥匙时,可能会对各种钥匙的功能、特性、用途以及名称产生疑惑,如果事先有各种钥匙各项功能以及用途的详细说明,以及各种钥匙之间都有哪些联系的详细说明,可能更便于开发人员对产品的理解,尽快开始相关工作。
3、便于后期产品的测试和形成说明书
有了产品需求说明书,也就有了产品的各项功能指标,略加修改,就可以成为指导测试人员进行测试各项功能、性能的依据。也可以略加修改成为产品的说明书,便于客户阅读。
二、开发与文档
1、文档的完整性
文档描述尽量做到完整、充分、易于理解,对于协议文档最好每个协议命令有格式方面的描述,也有示例,便于开发人员理解,开发人员拿到文档之后,基本对文档所描述的产品或协议理解了90%以上,这样就能够花尽量少的时间,就达到理解的目的。完备、描述清晰的文档,也便于后期测试产品时核查,后期升级同类产品时也能够用于参考。
2、软件与文档版本的一致性
开发人员手中的技术文档不是最新的技术文档,或者各个技术人员手中的技术文档版本不同,内容略有差异,这时开发人员对于所要开发产品的性能指标或技术细节理解可能就会产生偏差,如果技术文档中描述的技术协议不同,就会造成开发人员合作开发同类产品时,某些技术点对接不成功,经反复沟通,对照代码与文档,最后才发现不一致的地方。这样就会造成工作效率的下降。
这个问题在我们的开发过程中有时也会存在,例如:GPRS产品的通讯协议与软件程序不一致,开发期间,有时会以产品功能为准,这时就应该修改技术协议,否则,后期其他开发人员用到此产品和协议时,会非常费解,因为技术协议和产品运行结果的实际情况不一致。应该以何为准呢?虽然不会造成大的后果,但对后期的类似新产品开发、前后台对接都会造成一些影响,影响进度和效率。
建议安装使用版本控制软件,并且养成及时更新文档的好习惯。
3、代码的重查
随着开发产品的增多,开发经验的积累,开发人员的水平也逐渐提高了,有时候回头看自己以前写的代码,可能会发现有很多可以优化的地方,可以提高代码的效率节省资源,另外,也可能会发现代码中潜在的bug,一直没有发现,这个bug可能会在某种情况下触发,造成产品出现问题。代码重查就是要提前发现程序中潜在的问题,及早修正。
建议把代码重查作为我们开发人员的一个好习惯,逐渐养成。
三、建立全面完整的测试机制
在产品出厂之前,进行全面而细致的测试非常重要,不论我们的硬件产品还是软件产品。否则到了客户那里出现这样那样的问题,会造成坏的影响。
我们现在基本是每人负责一个产品,此时就需要将产品性能、技术参数、各个功能点罗列齐全,客户有新的功能需求提出来,我们就把新增加的功能点添加到需求文档中,同时添加到测试文档中。如果对产品的测试流程有影响,也要对测试流程进行相应的调整,便于后期测试人员对产品进行全面的测试。
测试方面可能会存在的问题,一般是开发人员或客户发现某一个问题之后,反馈给研发部,开发人员将产品问题修改之后,提交给测试人员测试这一功能点,若这一功能点不再出现这一问题,即大功告成。其实开发人员修改此功能之后,可能会影响其他功能,应将产品交给测试人员进行全面测试。测试人员将整体功能按照测试流程全部重新测试一遍,以保证其他功能没有受到影响。
例如:湖南的设备曾出现的问题,有功总不等于尖峰平谷之和。以前是相等的。后来有其它问题修改之后,代码上可能动到了这一部分,但是由于客户要求匆忙,没有时间让测试人员进行全面的测试,以至于后来遗留了这个问题,当时是由后台软件弥补了这个问题。
测试产品应该尽量形成常态化和规范化,不久前见到有一套“客户”编写的短信设备测试流程图,我们更应该对每个产品建立这样一套的流程图,便于测试人员测试,也便于新员工的快速掌握。否则测试步骤不同可能就得不到正确的结果。这样的步骤也可以后期形成用户的操作说明书。
如果没有完整且全面的测试机制,产品的性能可能完全依赖于某个开发人员的责任心和技术水平。产品的性能就会因技术人员的状态变化受到太大的影响。有完整且全面的测试机制的话,就可以尽早发现问题,解决问题,尽量避免在客户使用时产生问题。
四、建立常见问题集
随着产品的生产、使用,我们都尽力保证产品不出现问题,但再完善的测试条件和测试手段可能还是与用户的现实环境有差别,产品出现问题也是在所难免。可能是软件的问题,或者某一个硬件的问题,有时候这些问题存在普遍性,我们可以更改,有时候一些问题比较偶然,不太常见。另外,有时候我们内部测试人员分工可能不同。不同的测试人员测试不同种类的产品,对自己负责的产品熟悉,别人负责的产品不熟悉,当因为某测试人员另有工作安排时,他负责的产品别人可能不太熟悉,遇到问题不知该如何解决。
有时候某些问题解决不了,还要麻烦开发人员亲自解决。
如果我们养成了解决了某类问题,将此类问题,汇集起来的好习惯,积少成多,分门别类的总结下来,某类产品常见的问题和解决方法就能够汇集成册,能够方便测试维修人员进行测试和维修,这样也能适当减轻开发人员的维修任务,并且提高了效率,有了积累。
例如:不久前测试短信设备,测试人员一直说短信设备有问题,发某个命令后,短信设备会死机。但在我们研发部这里一直测不出所说的问题,后来发现是跟设备电压有关,使用备用电池,并且电压低于 6.8V时,会出现死机的问题,而在研发部一直接的交流电,所以没有这个问题。但是这个事情是后来才听其他测试人员说才知道的,此前陈杰和我都不知道有此问题,双方都测了好多遍,在测试该短信设备时,就花了一些本不该花的时间,感觉有些冤枉。如果此前有问题集,当中提到了这个问题,我想我们就不会再花费时间在上面了。
五、其他建议
1、工作的计划性
开发工作需协调有序进行,不因某些原因(如某个开发人员忙于其他事情)而耽搁整个开发进程。
某一段时间内,各开发人员将该时间段内的工作计划提交总工,总工可将需协调合作的项目协调好,对时间进行统筹安排。最好不要看到一件干一件,最后时间可能会拉得过长。
2、项目的总结
建立事后分析报告:在某一个项目或产品生产发布之后,对整个需求、研发、测试、生产、销售过程的分析描述,分析各个过程中遇到的问题,解决的过程,以及该产品有哪些优点、闪光点,以总结经验,优点以后可以继续推广使用,遇到的困难以及产品存在的缺陷,在以后尽量弥补和避免,以期以后可以做得更好。
最后
每遇到一个问题,我们都应当庆幸,因为现在公司规模还小,现在遇到这个问题,我们还有时间和精力去审视这个问题出现的原因,并且避免以后再出现类似的问题。以后随着公司规模扩大,市场扩大,再出现某些问题,可能就会造成极大的恶劣影响。所以现在每次遇到问题时,无论是产品缺陷还是其他非技术性问题,我觉得这都是好事,我们目前就是要遇到问题,并解决问题,逐步建立起机制,避免类似问题的发生,逐步完善并成长。
公司已经有着自己的运行机制和方法,可能需要不断的完善和进步,以上几点建议只是我个人的建议和看法,希望能对我们产品的开发和生产有益处,同时希望能起到抛砖引玉的作用,让我们大家能进行思考,完善自我,让我们的事业蒸蒸日上。
在手动恢复数据库时,有时候需要在SQL*Plus提示符以及操作系统提示符,RMAN提示符下来回切换显得有些繁琐。实际上RMAN为我们提供了命令行下执行一些简单的SQL语句以及PL/SQL的方法,以避免上述情形。本文描述了RMAN提示符下的一些常用命令及其用法。
1、RMAN提示符下执行SQL语句
语法: SQL '<command>' ;
语法比较简单,就是提示符下输入SQL,后接SQL命令,命令用单引号括起来
command 通常为可执行的SQL命令语句,也可以为PL/SQL块
使用限制
如果SQL语句中包含文件名,则文件名及路径需要使用两个单引号括起来,整个SQL语句首尾需要使用双引号
可以执行SQL查询语句,但是无任何结果输出
RMAN提示符下常用的命令
startup [nomount | mount], shutdown immediate
alter system archive log current
alter database open [resetlogs]
2、演示RMAN提示符下执行SQL语句
a、执行常用的starup, alter SQL 语句
robin@SZDB:~> export ORACLE_SID=GOBO1 robin@SZDB:~> rman target / Recovery Manager: Release 10.2.0.3.0 - Production on Tue Jun 4 11:04:26 2013 Copyright (c) 1982, 2005, Oracle. All rights reserved. connected to target database (not started) RMAN> startup nomount; Oracle instance started Total System Global Area 536870912 bytes Fixed Size 2074080 bytes Variable Size 314575392 bytes Database Buffers 213909504 bytes Redo Buffers 6311936 bytes RMAN> alter database mount; using target database control file instead of recovery catalog database mounted RMAN> alter database open; database opened RMAN> list copy of archivelog all; --->查看当前数据库的归档日志,列出了1个已归档日志 List of Archived Log Copies Key Thrd Seq S Low Time Name ------- ---- ------- - ----------------- ---- 2084 1 8 A 20130604 09:53:17 /u02/database/GOBO1/archive/arch_816906485_1_8.arc
RMAN> sql ' alter system archive log current '; --->对当前日志进行归档 sql statement: alter system archive log current RMAN> list copy of archivelog all; --->归档后可以看到多出了1个已归档日志 List of Archived Log Copies Key Thrd Seq S Low Time Name ------- ---- ------- - ----------------- ---- 2084 1 8 A 20130604 09:53:17 /u02/database/GOBO1/archive/arch_816906485_1_8.arc 2085 1 9 A 20130604 10:46:36 /u02/database/GOBO1/archive/arch_816906485_1_9.arc |
b、执行SQL查询语句,如下,没有任何结果输出
RMAN> sql 'select sysdate from dual'; sql statement: select sysdate from dual RMAN> sql ' select * from v$database '; sql statement: select * from v$database |
c、执行带有路径及文件名的SQL语句
--下面的执行那个中没有使用双引号开头以及双单引号括住路径,收到错误提示 RMAN> sql ' create tablespace ts1 datafile '/u02/database/GOBO1/oradata/ts1.dbf' size 10m '; RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-00558: error encountered while parsing input commands RMAN-01006: error signalled during parse RMAN-02001: unrecognized punctuation symbol "/" --下面的SQL语句被成功执行 RMAN> sql "create tablespace ts1 datafile ''/u02/database/GOBO1/oradata/ts1.dbf'' size 10m"; sql statement: create tablespace ts1 datafile ''/u02/database/GOBO1/oradata/ts1.dbf'' size 10m |
d、执行PL/SQL块
RMAN> sql ' begin dbms_lock.sleep(3); end;'; sql statement: begin dbms_lock.sleep(3); end; |
e、rman块命令方式执行PL/SQL块
RMAN> run{ 2> sql ' begin dbms_lock.sleep(3); end; '; 3> } sql statement: begin dbms_lock.sleep(3); end; RMAN> run { 2> sql ' drop tablespace ts1 including contents and datafiles '; 3> } sql statement: drop tablespace ts1 including contents and datafiles RMAN> shutdown immediate; database closed database dismounted Oracle instance shut down |
f、切换到系统提示符下
RMAN> host; robin@SZDB:~> exit exit host command complete RMAN> |
做了几年了开发一直没有总结什么,回到了家乡的小城做了一名培训班的教员,教授
软件开发的知识。细小的知识从头细细嚼来,别有一番滋味。或是以前遗漏的太多,或是确实没有系统的
学习过,教学生的过程中自己也对教材有了一遍系统深入的学习。虽然教的和学的都很肤浅,但是为了帮助学生们理解,然后自己也会思考为什么会这样?这种来自于最基础的思考,一直向上反馈,发现这种思考原来可以令自己进步的非常快。虽然目前还在思考入门阶段的问题,已经受益良多了。那么如果把之前的开发中的问题都思考一遍,又能收获多少能?写写博客吧,一直告诉学生们这是一个好的习惯,可自己却从来没有身体力行。那么,就从现在开始......
面向对象
面向对象是一种开发思想,最应该记住的一句话是万物皆对象。为了让程序更好的被理解和编写,把现实生活中描述事物的方式和思路融合进入,就成了面向对象的思想。把生活中的事物融合进程序中那么就需要描述,描述分为特征和行为两方面,而不同类别的对象特征和行为具有巨大的差异,为了更好的制定描述每一类事物的方式,那么提取来一个编程世界中的类的概念,等同于生活中的类型的概念,每一种事物都应该是有类型的。然后生活中的事物按不同的方面进行分类的话,可以划入不同的类别,所有编程中的类也是一个公说公有理,婆说婆有理的玩意,相当的抽象,具有相当的不确定性和随意性。
类的构成:
Java中的类,包含属性和方法。属性即类中的变量,可分静态变量、实例变量(全局变量)、局部变量(存在于方法中,声明周期仅限于该方法的调用阶段)
C#中的类,包含字段、属性和方法。字段对应java中的属性,C#中的属性对象java中的get和set访问器,是对字段的封装,方法一样,都是描述行为。
类成员的调用:
实例成员由对象调用。静态成员由类调用。但是在java中静态成员也可以被实例调用,相当于班上的每一个学生都可以任意的支配班费了,很不好的一个问题。C#在这方面严格限制了,静态成员只能有类进行调用。
三大特性-封装
封装:为了隐藏内部的实现细节,达到对数据安全性的保护和代码重用的效果的一种手段。
封装无处不在,看似简单却可无限延伸。并没有一个明确的关键字来表示封装。既然是思想,是手段,所有在java中和c#中是没有语法区别的。仅仅是他们在借助访问修饰符来达到封装的效果时,两种语言的访问修饰符是不一样的。
Java中:
private:私有的,仅内部可以访问
dufault:默认的,同一包的内部可以访问。
protected:受保护的,同一包中或者是不同包的子类中可以访问。
public:公共的,任何地方可以访问。
特点:有明确的大小统属关系:private < default < protected < public
C#中(引入程序集的概念。命名空间类似于java中的包,但它是逻辑分组不同于java中的包是物理分组,程序集类似于一个项目):
private:私有的,仅内部可以访问。
intenal:内部的,同一程序集的内部可以访问,同default。
protected:受保护的,子类中可以访问,和java中protected是不同的,此处范围要小些,同程序集的非子类不能访问。
proteted intenal:是intenal和protected访问范围的并集。
public:公共的,任何地方可以访问。
特点:没有明确的大小统属关系,intenal和protected的访问范围大小是分不清的。
三大特性-继承
继承:目的是为了让一个类拥有另一个类的属性和方法。
Java中:使用extends表示使用继承
重写的要求:a、方法名、返回值类型、参数相同;b、访问修饰符访问范围要大于或等于父类方法访问修饰符;
访问父类成员:使用super关键字,可使用super(参数);在构造方法中指定调用父类一个构造方法。
C#中:使用:表示使用继承
重写的要求:a、方法名、返回值类型、参数、访问修饰符相同;b、父类方法被virtual修饰,子类方法被override修饰
访问父类成功:使用base关键字,在构造方法后使用:base(参数);指定调用父类构造方法,base不能使用在静态环境中,不能调用父类静态成员。
覆盖:使用new关键字。在c#中引入覆盖的内容,对父类的非virtual方法,也就是不可重写的方法,使用覆盖,可以覆盖掉父类的方法。对覆盖我的看法是为了弥补必须被virtual修饰的方法才能重写这个限制可能带来的问题,但是能不用就不用,覆盖意义不大,或者说是我还没有真切体会到覆盖的实际作用和使用场合,有高人可以评论解惑。
判断是否重写成功的依据:使用父类的引用指向子类的对象,如果该方法调用的是父类方法说明重写不成功,如果调用到子类方法,说明重写成功。
三大特性-多态
多态:同一种行为的多种存在形态。表现形式有:重载、重写。
重载要求:a、同一类中;b、方法名相同;c、参数不同(参数个数、类型、顺序)。
调用时根据传入的参数来决定调用到哪一方法。
抽象类和接口
抽象类:使用abstract修饰的类称为抽象类。
来源:在我看来,抽象类的来源是值得仔细琢磨一下,有利于加深理解。现实生活中存在很多这样的问题,也就是我们知道这一类事物都会做这个动作(方法),但是并不知道它如何去做,比如我们都知道动物为动,但是每个动物你不知道它如何去动。这个时候定义这个Animal类时,就需要一个move方法,只有方法头(描述会做什么事情),没有方法体(描述如何去做这件事情),那么这个方法比较特殊,我们就标记为抽象方法,使用abstract修饰。
那么Animal类中有了抽象方法,假如你实例化了Animal类,当你调用move方法时,会出现什么样的问题呢?未知,因为它并没有描述如何去做。所以为了避免出现这种未知的情况,比如把Animal类定义为抽象类,显著特点就是不能实例化。一个不能实例化的类,他的非静态成员是不可被调用的,那么这样的类存在的意义在于什么呢?
所以总结:抽象类存在的意义在于被继承。抽象类是为了抽象方法而存在的,有构造方法却不能被实例化。语法上java和c#在这方面是一样的,不再细说。
接口:制定的一组规则和规范,让实现类都满足这个规则和规范,在实际应用中能很大程序增加程序的灵活性。面向接口编程,我的理解也不是特别深,也不是我一两句可以讲清楚。有高人可以在后面贴贴自己的心得,学习学习。
区别:C#中,实现类如果没有实现接口中所有的方法,则比如把自己定义为抽象类并且把未实现的方法重新抄写一遍定义为抽象方法。
总结
一直以来是做java开发的,教学的需要才学习c#,有相通之处,学起来很快。这里仅仅关注语法,对于大牛们都在搞协议,搞底层,是看不上这个的。
仅以此文抛砖引玉,该喷喷,该砸砸,别人身攻击就好了。
合理的为
数据库表上创建战略性索引,可以极大程度的提高了查询性能。但事实上日常中我们所创建的索引并非战略性索引,恰恰是大量冗余或是根本没有用到的索引耗用了大量的存储空间,导致DML性能低下。
Oracle 提供了索引监控特性来初略判断未使用到的索引。本文描述如何使用Oracle 索引的监控。
1、冗余索引的弊端
大量冗余和无用的索引导致整个数据库性能低下,耗用了大量的CPU与I/O开销,具体表现如下:
a、耗用大量的存储空间(索引段的维护与管理)
b、增加了DML完成的时间
c、耗用大量统计信息(索引)收集的时间
d、结构性验证时间
f、增加了恢复所需的时间
2、单个索引监控
a、对于单个索引的监控,可以使用下面的命令来完成
alter index <INDEX_NAME> monitoring usage; |
b、关闭索引监控
alter index <INDEX_NAME> nomonitoring usage; |
c、观察监控结果(查询v$object_usage视图)
select * from v$object_usage |
3、schema级别索引监控(不含SYS用户)
a、直接执行脚本来开启索引监控
robin@SZDB:~/dba_scripts/custom/sql> more idx_monitor_on.sql SET HEADING OFF FEEDBACK OFF TERMOUT OFF ECHO OFF; SET PAGESIZE 0; SPOOL /tmp/mnt_idx.sql
SELECT 'ALTER INDEX ' || owner || '.' || index_name || ' MONITORING USAGE;' FROM dba_indexes WHERE owner IN (SELECT username FROM dba_users WHERE account_status = 'OPEN') AND owner NOT IN ('SYS', 'SYSTEM', 'PERFSTAT', 'MGMT_VIEW', 'MONITOR', 'SYSMAN', 'DBSNMP');
SPOOL OFF; @/tmp/mnt_idx.sql; SET HEADING ON FEEDBACK ON TERMOUT ON; SET PAGESIZE 80;
SELECT index_name, monitoring, used, start_monitoring, end_monitoring FROM v$object_usage;
ho rm -rf /tmp/mnt_idx.sql |
b、禁用索引监控
robin@SZDB:~/dba_scripts/custom/sql> more idx_monitor_off.sql SET HEADING OFF FEEDBACK OFF TERMOUT OFF ECHO OFF; SET PAGESIZE 0; SPOOL /tmp/un_mnt_idx.sql SELECT 'ALTER INDEX ' || owner || '.' || index_name || ' NOMONITORING USAGE;' FROM dba_indexes WHERE owner IN (SELECT username FROM dba_users WHERE account_status = 'OPEN') AND owner NOT IN ('SYS', 'SYSTEM', 'PERFSTAT', 'MGMT_VIEW', 'MONITOR', 'SYSMAN', 'DBSNMP');
SPOOL OFF; @/tmp/un_mnt_idx.sql; SET HEADING ON FEEDBACK ON TERMOUT ON; SET PAGESIZE 80;
SELECT index_name, monitoring, used, start_monitoring, end_monitoring FROM v$object_usage;
ho rm -rf /tmp/un_mnt_idx.sql |
c、查看索引监控结果
set linesize 190 SELECT u.name owner, io.name index_name, t.name table_name, DECODE (BITAND (i.flags, 65536), 0, 'NO', 'YES') monitoring, DECODE (BITAND (ou.flags, 1), 0, 'NO', 'YES') used, ou.start_monitoring start_monitoring, ou.end_monitoring end_monitoring FROM sys.user$ u, sys.obj$ io, sys.obj$ t, sys.ind$ i, sys.object_usage ou WHERE i.obj# = ou.obj# AND io.obj# = ou.obj# AND t.obj# = i.bo# AND u.user# = io.owner# AND u.name=decode(upper('&input_owner'),'ALL',u.name,upper('&input_owner')); |
4、演示索引监控
a、单个索引监控
-->演示环境 scott@CNMMBO> select * from v$version where rownum<2;
BANNER ---------------------------------------------------------------- Oracle Database 10g Release 10.2.0.3.0 - 64bit Production
-->创建测试表 scott@CNMMBO> create table tb_emp as select * from emp;
-->为测试表创建索引 scott@CNMMBO> create index i_tb_emp_empno on tb_emp(empno);
-->收集统计信息 scott@CNMMBO> exec dbms_stats.gather_table_stats('SCOTT','TB_EMP',cascade=>true);
-->查看索引信息 scott@CNMMBO> @idx_info Enter value for owner: scott Enter value for table_name: tb_emp
Table Name INDEX_NAME CL_NAM CL_POS STATUS IDX_TYP DSCD ------------------------- ------------------------------ -------------------- ------ -------- --------------- ---- TB_EMP I_TB_EMP_EMPNO EMPNO 1 VALID NORMAL ASC
-->查看索引使用情况 -->此时use列为NO,表明索引未被使用到 scott@CNMMBO> @idx_usage_tb Enter value for 1: tb_emp Enter value for 2: all Enter value for 2: all
Table Name INDEX_NAME USE START_MONITORING END_MONITORING ------------------------- ------------------------------ --- ------------------- ------------------- TB_EMP I_TB_EMP_EMPNO NO 03/19/2013 17:43:49
-->实施即席查询 scott@CNMMBO> select empno,ename,job from tb_emp where empno=7788;
EMPNO ENAME JOB ---------- ---------- --------- 7788 SCOTT ANALYST
-->再次查看时USE列已经为YES scott@CNMMBO> @idx_usage_tb Enter value for 1: tb_emp Enter value for 2: all Enter value for 2: all
Table Name INDEX_NAME USE START_MONITORING END_MONITORING ------------------------- ------------------------------ --- ------------------- ------------------- TB_EMP I_TB_EMP_EMPNO YES 03/19/2013 17:43:49
-->禁用索引监控 scott@CNMMBO> alter index I_TB_EMP_EMPNO nomonitoring usage;
Index altered. |
b、schema级别的索引监控
-->切换到另外一个数据库cnbo1 scott@CNMMBO> conn goex_admin/xxxxx@cnbo1 Connected.
-->下面的查询表明没有表开启索引监控 goex_admin@CNBO1> @idx_usage;
no rows selected
-->开启索引监控 goex_admin@CNBO1> @idx_monitor_on
INDEX_NAME MON USE START_MONITORING END_MONITORING ------------------------------ --- --- ------------------- ------------------- PK_AAH YES NO 03/19/2013 17:48:32 IDX_GOAAE1 YES NO 03/19/2013 17:48:32 PK_GOAAT YES NO 03/19/2013 17:48:32 PK_GOAACTL YES NO 03/19/2013 17:48:32 ....... ................
-->关闭索引监控 goex_admin@CNBO1> @idx_monitor_off INDEX_NAME MON USE START_MONITORING END_MONITORING ------------------------------ --- --- ------------------- ------------------- PK_GOARL NO NO 03/19/2013 17:48:30 03/19/2013 17:50:02 IDX_GOAQU1 NO NO 03/19/2013 17:48:30 03/19/2013 17:50:02 IDX_GOAQU2 NO NO 03/19/2013 17:48:30 03/19/2013 17:50:02
-->连接到原来的db,查看曾经开启索引监控的使用情况 goex_admin@CNBO1> conn scott/tiger@cnmmbo
Connected.
goex_admin@CNMMBO> @idx_usage Enter value for input_owner: GOEX_ADMIN Enter value for input_owner: GOEX_ADMIN
OWNER INDEX_NAME Table Name MON USE START_MONITORING END_MONITORING --------------- ------------------------------ ------------------------- --- --- ------------------- ---------------- SCOTT I_TB_EMP_EMPNO TB_EMP NO YES 03/19/2013 17:43:49 03/19/2013 17:46:04 GOEX_ADMIN ACC_GRP_EXT_INFO_TBL_LOG_PK ACC_GRP_EXT_INFO_TBL_LOG YES YES 02/22/2013 15:58:42 GOEX_ADMIN IDX_TDCL_CONTRACT_NUM TRADE_CLIENT_TBL YES YES 02/22/2013 15:58:42 GOEX_ADMIN IDX_TDCL_SETTLED_DATE TRADE_CLIENT_TBL YES YES 02/22/2013 15:58:42 GOEX_ADMIN IDX_TDCL_ACC_NUM TRADE_CLIENT_TBL YES YES 02/22/2013 15:58:41 GOEX_ADMIN IDX_TDCL_INSTRU_ID TRADE_CLIENT_TBL YES YES 02/22/2013 15:58:42 |
5、索引监控的建议与弊端
a、选择数据库高峰期实施索引监控,以及尽可能使用较长的监控周期来判断索引是否被使用
b、可以对特定时间段实施多次监控以判断索引的使用频率(初略值)
c、索引监控在一定程度上耗用系统资源,一旦监控完毕后应即时关闭以避免其带来的额外开销
d、索引监控仅仅从索引的使用与否来描述索引使用,并未提供详细的索引使用频率,b点提到的方法也只是初略值
路由器作为骨干网络核心交换设备之一,在网络中充当着网络交通站的职责,它将网络数据包通过既定规则进行转发和交换,从而使网络客户端节点设备能有效使用网络来进行信息的交换和交流。这样,网络中路由器相关的配置参数就成为了非常重要的网络基础资料之一。我单位企业网属于中等规模广域网范畴,下级接入路由器及汇聚层路由器有几十台之多。这些路由器一旦故障需要进行硬件更换时,路由器配置资料的查找总是让人头痛的问题之一,为此笔者使用
Linux系统提供的TFTP服务器及apache网页服务器结合规划配置了方便的路由资料备份系统解决以上问题。因为目前主流的Linux系统基本是由RedHat及Debian衍生出来的发行版。所以笔者分别就以上两个
操作系统的配置进行叙述,希望能给其他用户以帮助。
一、Debian下配置TFTP及apache服务器
(一)TFTP服务器配置
1、TFTP服务器组件安装
在Debian中可以使用新立得软件包管理器搜索tftpd-hpa软件包,并勾选“标记以便安装”选项,然后点击应用按扭,系统将自动进行该组件包的安装。用户也可是直接再命令行下执行apt-get install tftpd-hpa来进行安装命令模式如下:
root@AkBirdofpreyWorkStation:~# apt-get install tftpd-hpa |
之后系统将创建相关的应用启动脚本及配置文件,并会在跟目录下创建/srv/tftp目录。
2、TFTP配置文件及相关目录权限修改
系统安装完TFTP服务组件后,会自动创建TFTP服务需要的用户组及配置文件,该文件为/etc/default/tftpd-hpa,初始配置内容如下:
- # /etc/default/tftpd-hpa
- TFTP_USERNAME="tftp"
- TFTP_DIRECTORY="/srv/tftp"
- TFTP_ADDRESS="0.0.0.0:69"
- TFTP_OPTIONS="-secure"
|
我们需要将该文件修改为如下内容:
- # /etc/default/tftpd-hpa
- TFTP_USERNAME="tftp"
- TFTP_DIRECTORY="/srv/tftp"
- TFTP_ADDRESS="0.0.0.0:69"
- TFTP_OPTIONS="-l -c -secure"
|
其中在TFTP_OPTIONS选项中加入了-l -c参数,这样当我们使用路由器参数备份命令时,可以将文件顺利的上传之TFTP服务器目录。
于此同时我们需要修改TFTP服务器指定目录的用户及属组,命令模式如下:
root@AkBirdofpreyWorkStation:/etc/default# chown tftp:tftp /srv/tftp |
这样/srv/tftp目录的属组就修改为了tftp用户,修改用户属组必须要进行,笔者测试中发现,TFTP服务组件安装后/srv/tftp目录的属组为root,如果不进行用户属组修改时,当使用路由器参数备份命令时,服务器将会出现transfer time out错误。
此时只要使用/etc/init.d/tftpd-hpa restart重启TFTP服务,TFTP服务器应该就可以正常使用了,命令模式如下:
- root@AkBirdofpreyWorkStation:/etc/default# /etc/init.d/tftpd-hpa restart
- [ ok ] Restarting HPA's tftpd: in.tftpd.
|
我们需要将它修改为如下内容:
- <VirtualHost *:80>
- ServerAdmin webmaster@localhost
- #DocumentRoot /var/www
- DocumentRoot /srv/tftp
- <Directory />
- Options FollowSymLinks Indexes
- AllowOverride All
- <limit GET POST OPTIONS PROPFIND>
- Order allow,deny
- Allow from all
- </Limit>
- </Directory>
- #<Directory /var/www/>
- #<Directory /var/www/>
- #Options Indexes FollowSymLinks MultiViews
- #AllowOverride None
- #Order allow,deny
- #allow from all
- #</Directory>
- ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
- <Directory "/usr/lib/cgi-bin">
- AllowOverride None
- Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
- Order allow,deny
- Allow from all
- </Directory>
- ErrorLog ${APACHE_LOG_DIR}/error.log
- # Possible values include: debug, info, notice, warn, error, crit,
- # alert, emerg.
- LogLevel warn
- CustomLog ${APACHE_LOG_DIR}/access.log combined
- </VirtualHost>
|
使用vi命令编辑/srv/tftp/.htaccess文件,命令模式如下:
root@AkBirdofpreyWorkStation:/# vi /srv/tftp/.htaccess |
文件内容如下:
AuthUserFile /etc/secure.user ##用户帐号密码文件名
AuthName akcwdCA 用户登录认证信息提示
AuthType Basic
- <Limit GET>
- require valid-user
- </Limit>
|
使用htpasswd -c /etc/secure.user建立用户密码文件,命令模式如下:
root@AkBirdofpreyWorkStation:/# htpasswd -c /etc/secure.user user1 |
程序会提示你输入两次用户的口令,然后用户密码文件就已经创建,user1这个用户也同时创建完成了。
使用命令/etc/init.d/apache2 restart重启apache服务器,命令模式如下:
- root@AkBirdofpreyWorkStation:/# /etc/init.d/apache2 restart
- [....] Restarting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.1.253 for ServerName
- ... waiting .apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.1.253 for ServerName
- . ok
|
(二)apache服务器服务器配置
1、apache服务器服务器组件安装
该组件安装和TFTP服务组件安装差别不大,用户可以选择图形界面或者命令行界面进行安装即可
2、apache服务器服务器配置
因为之前笔者一直较多的使用RedHat及其衍生Linux版本。使用Debian/Linux系统后发现apache服务器配置文件与RedHat及其衍生Linux版本apache服务器配置文件差别很大,Debian/Linux系统的apache服务器配置文件没有被集中在像httpd.conf文件中,而是被分别放置在了不同的配置文件里。因为路由器资料涉及到安全性问题,因此我们配置的apache服务器访问时需要进行用户安全审核,下面我们来做具体配置。
Debian/Linux系统的apache服务器配置文件保存在/etc/apache2中,使用vi /etc/apache2/apache2.conf查看帮助中的对该目录结构对应配置文件的说明,我们需要修改的配置文件为 /etc/apache2/sites-enabled/000-default,该文件实际才是apache用户定义的配置文件,其中包括服务器目录以及访问权限等内容,初始配置文件为如下内容:
- <VirtualHost *:80>
- ServerAdmin webmaster@localhost
- DocumentRoot /var/www
- <Directory />
- Options FollowSymLinks Indexes
- AllowOverride None
- </Directory>
- <Directory /var/www/>
- <Directory /var/www/>
- Options Indexes FollowSymLinks MultiViews
- AllowOverride None
- Order allow,deny
- allow from all
- </Directory>
- ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
- <Directory "/usr/lib/cgi-bin">
- AllowOverride None
- Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
- Order allow,deny
- Allow from all
- </Directory>
- ErrorLog ${APACHE_LOG_DIR}/error.log
- # Possible values include: debug, info, notice, warn, error, crit,
- # alert, emerg.
- LogLevel warn
- CustomLog ${APACHE_LOG_DIR}/access.log combined
- </VirtualHost>
|
我们需要将它修改为如下内容:
- <VirtualHost *:80>
- ServerAdmin webmaster@localhost
- #DocumentRoot /var/www
- DocumentRoot /srv/tftp
- <Directory />
- Options FollowSymLinks Indexes
- AllowOverride All
- <limit GET POST OPTIONS PROPFIND>
- Order allow,deny
- Allow from all
- </Limit>
- </Directory>
- #<Directory /var/www/>
- #<Directory /var/www/>
- #Options Indexes FollowSymLinks MultiViews
- #AllowOverride None
- #Order allow,deny
- #allow from all
- #</Directory>
- ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
- <Directory "/usr/lib/cgi-bin">
- AllowOverride None
- Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
- Order allow,deny
- Allow from all
- </Directory>
- ErrorLog ${APACHE_LOG_DIR}/error.log
- # Possible values include: debug, info, notice, warn, error, crit,
- # alert, emerg.
- LogLevel warn
- CustomLog ${APACHE_LOG_DIR}/access.log combined
- </VirtualHost>
|
使用vi命令编辑/srv/tftp/.htaccess文件,命令模式如下:
root@AkBirdofpreyWorkStation:/# vi /srv/tftp/.htaccess |
文件内容如下:
AuthUserFile /etc/secure.user ##用户帐号密码文件名
AuthName akcwdCA 用户登录认证信息提示
AuthType Basic
- <Limit GET>
- require valid-user
- </Limit>
|
使用htpasswd -c /etc/secure.user建立用户密码文件,命令模式如下:
root@AkBirdofpreyWorkStation:/# htpasswd -c /etc/secure.user user1 |
程序会提示你输入两次用户的口令,然后用户密码文件就已经创建,user1这个用户也同时创建完成了。
使用命令/etc/init.d/apache2 restart重启apache服务器,命令模式如下:
- root@AkBirdofpreyWorkStation:/# /etc/init.d/apache2 restart
- [....] Restarting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.1.253 for ServerName
- ... waiting .apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.1.253 for ServerName
- . ok
|