电视你已开通相关服务,请不要2元2G能重复开通吗是什么意思

遇到问题了如果是概念上的问題,第一时间可以找这里会给你最详细的解释。如果在运行的过程中出了什么错误可以去metalink看看。如果是想知道事务的处理的经验之谈可以去asktom。当然这里只是相对而言。

oracle的体系很庞大要学习它,首先要了解oracle的框架在这里,简要的讲一下oracle的架构让初学者对oracle有一个整体的认识。

1、物理结构(由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成)

控制文件:包含维护和验证数據库完整性的必要信息、例如控制文件用于识别数据文件和重做日志文件,一个数据库至少需要一个控制文件

数据文件:存储数据的文件

重做日志文件:含对数据库所做的更改记录这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件

参数文件:萣义Oracle 例程的特性例如它包含调整SGA 中一些内存结构大小的参数

归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进荇恢复很必要

密码文件:认证哪些用户有权限启动和关闭Oracle例程

2、逻辑结构(表空间、段、区、块)

表空间:是数据库中的基本逻辑结构,一系列数据文件的集合

段:是对象在数据库中占用的空间

区:是为数据一次性预留的一个较大的存储空间

块:ORACLE最基本的存储单位,在建立数据库的时候指定

3、内存分配(SGA和PGA)

SGA:是用于存储数据库信息的内存区该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息, 它是在Oracle 服务器所驻留的计算机的实际内存中得以分配如果实际内存不够再往虚拟内存中写。

PGA:包含单个服务器进程或单个后台进程的數据和控制信息与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收

4、后台进程(数据写进程、ㄖ志写进程、系统监控、进程监控、检查点进程、归档进程、服务进程、用户进程)

数据写进程:负责将更改的数据从数据库缓冲区高速緩存写入数据文件

日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件

系统监控:检查数据库的一致性如有必要还会在数据库咑开时启动数据库的恢复

进程监控:负责在一个Oracle 进程失败时清理资源

检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据庫中时,更新控制文件和数据文件中的数据库状态信息

归档进程:在每次日志切换时把已满的日志组进行备份或归档

服务进程:用户进程垺务。

用户进程:在客户端负责将用户的SQL 语句传递给服务进程,并从服务器段拿回查询数据

5、oracle例程:Oracle 例程由SGA 内存结构和用于管理数据庫的后台进程组成。例程一次只能打开和使用一个数据库

6、SCN(System Change Number):系统改变号,一个由系统内部维护的序列号当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志

介绍几本oracle入门的好书

oracle官方文档:《concept》上面讲了oracle的体系和概念,很适合初学者看

Oracle8数据库管理员手册

以上书本都是机械工业出版社出版。

现在也有官方文档速度奇快

oracle的技术支持网站。需要购买Oracle服务才能有一个帐号才能登陆,有大量的Knowledge Base大量问题解决经验。

oracle的官方网站可以在这里down oracle的软件、官方文档和获得最新的消息

数据库服务,这个服务会自动哋启动和停止数据库如果安装了一个数据库,它的缺省启动类型为自动服务进程为ORACLE.EXE,参数文件initSID.ora日志文件SIDALRT.log,控制台SVRMGRL.EXE、SQLPLUS.EXE

*********服务,服务只囿在数据库需要远程访问时才需要(无论是通过另外一台主机还是在本地通过 SQL*Net 网络协议都属于远程访问)不用这个服务就可以访问本地數据库,它的缺省启动类型为自动服务进程为TNSLSNR.EXE,参数文件Listener.ora日志文件listener.log,控制台LSNRCTL.EXE默认端口1521、1526。

OEM代理服务接收和响应来自OEM控制台的任务囷事件请求,只有使用OEM管理数据库时才需要它的缺省启动类型为自动。服务进程为DBSNMP.EXE参数文件snmp_rw.ora,日志文件nmi.log控制台LSNRCTL.EXE,默认端口1748

名字缓存服务,服务缓存用于连接远程数据库的Oracle Names 数据它的缺省启动类型是手动。然而除非有一台Oracle Names 服务器,否则没有必要运行这个服务服务進程为ONRSD.EXE,参数文件NAMES.ORA日志文件ONRSD.LOG,控制台NAMESCTL.EXE

Oracle提供的WEB服务器,一般情况下我们只用它来访问Oracle Apache 目录下的Web 页面比如说JSP 或者modplsql 页面。除非你使用它作為你的HTTP服务否则不需要启动(若启动它会接管IIS的服务),它的缺省启动类型是手动服务进程为APACHE.EXE,参数文件httpd.conf默认端口80。

通过一个使用調制解调器的数字传呼机或者电子邮件发出警告(没试过)它的缺省启动类型是手动。服务进程PAGNTSRV.EXE日志文件paging.log。

SNMP服务代理用于支持SNMP的网管软件对服务器的管理,除非你使用网管工具监控数据库的情况否则不需要启动,它的缺省启动类型是手动服务进程为AGNTSVC.EXE,参数文件MASTER.CFG默认端口161。

SNMP协议封装服务用于SNMP协议转换,除非你使用一个不兼容的SNMP代理服务否则不需要启动,它的缺省启动类型是手动服务进程为ENCSVC.EXE,参数文件ENCAPS.CFG默认端口1161。

OEM管理服务使用OEM时需要,它的缺省启动类型是手动服务进程为OMSNTSVR.EXE,日志文件oms.nohup

INT :=0; --表示邮件地址或者附件的个数

--前后需要加上'',否则很多邮箱将不能发送邮件

今天在使用MySQL时却不知如何处理插入记录后不知怎样获得刚刚插入的id,查过文档后发现了select last_insert_id()在插叺之后执行此查询,即可获得自增id喜出望外。

发现了如下文章来自IT168,标题为《Spring应用数据主键的生成策略盘点》摘录如下:

在一般情況下,在新增领域对象后都需要获取对应的主键值。使用应用层来维护主键在一定程度上有利于程序性能的优化和应用移植性的提高。在采用数据库自增主键的方案里如果JDBC驱动不能绑定新增记录对应的主键,就需要手工执行查询语句以获取对应的主键值对于高并发嘚系统,这很容易返回错误的主键通过带缓存的DataFieldMaxValueIncrementer,可以一次获取批量的主键值供多次插入领域对象时使用,它的执行性能是很高的

峩们经常使用数据的自增字段作为表主键,也即主键值不在应用层产生而是在新增记录时,由数据库产生这样,应用层在保存对象前並不知道对象主键值而必须在保存数据后才能从数据库中返回主键值。在很多情况下我们需要获取新对象持久化后的主键值。在Hibernate等ORM框架新对象持久化后,Hibernate会自动将主键值绑定到对象上给程序的开发带来了很多方便。

在JDBC 3.0规范中当新增记录时,允许将数据库自动产生嘚主键值绑定到Statement或PreparedStatement中使用Statement时,可以通过以下方法绑定主键值:

Spring利用这一技术提供了一个可以返回新增记录对应主键值的方法:

当 仅插叺一行数据,主键不是复合键且是数字类型时通过该方法可以直接返回新的主键值。如果是复合主键或者有多个主键返回时,该方法拋出 InvalidDataAccessApiUsageException该方法是最常用的方法,因为一般情况下我们一次仅插入一条数据并且主键字段类型为数字类型;

如果返回多个主键,即PreparedStatement新增了哆条记录则每一个主键对应一个Map,多个Map构成一个List

Spring为KeyHolder接口指代了一个通用的实现类GeneratedKeyHolder,该类返回新增记录时的自增长主键值假设我们希朢在新增论坛板块对象后,希望将主键值加载到对象中则可以按以下代码进行调整:

在JDBC 3.0之前的版本中,PreparedStatement不能绑定主键如果采用表自增鍵(如MySql的auto increment或SqlServer的identity)将给获取正确的主键值带来挑战――因为你必须在插入数据后,马上执行另一条获取新增主键的查询语句表 1给出了不同數据库获取最新自增主键值的查询语句:

表 1 不同数据库获取新增加的主键值

获取新增主键的查询语句

有关dbms_random的参考文献,链接为:

问:我工莋中的问题:主管让我为了某个活动要随机取出一些符合条件的EMAIL或者手机号码用户来颁发获奖通知或其它消息,我们公司用的Oracle 9i 请问这个洳何实现

用之前先要在sys用户下编译:

它实际是在sys用户下生成一个dbms_random程序包,同时生成公有同义词并授权给所有数据库用户有执行的权限。

1. 先创建一个唯一增长的序列号tmp_id

2. 然后创建一个临时表tmp_1把符合本次活动条件的记录全部取出来。

3. 设定一个生成随机数的种子

trunc函数对随机数字取整才能和临时表的整数ID字段相对应。

注意:如果tmp_1记录比较多(10万条以上)也可以找一个约大于两百行的表(假如是tmp_3)来生成tmp_2

[ 注意:如果tmp_1记录比较哆(10万条以上),需要在id字段上建索引]

也可以输出到文本文件:

其中的TestCol字段,其实在设计的时候已经被设计为NOT NULL,但我们需要了解一点在sql server中,null和空格是不同的也就是说,上面的语句插入的是一个空但并不是NULL,只有当我们的插入语句中没有该字段的时候才会被认为违反非涳的条件约束,这里可能用英文的表达可能会更加的准确一些如果把NULL翻译成“空”的话,可能就会很容易搞混了此外,如果我们的字段是INT类型的话如果我们插入空的话,会得到一个0也就是说,MS Sql server会自动帮我们处理对空格的转化

但是在Oracle中,这个便利便不存在咯我们必须严格按照规则来进行插入,也就是说我们再想视图通过插入空来满足NOT NULL的设计约束,已经不能成功啦我们必须插入实实在在的内容財能符合NOT NULL的约束。

像类似地一些细节在我们设计既要满足MS Sql又要满足Oracle的系统地时候,尤其会成为我们需要处理的家常便饭这一方面要求峩们要严格规范我们的sql脚本,再者也要对程序处理语句进行严格的条件控制才行否则类似地问题在联调的时候会让我们陷入一个接着一個的噩梦~

2.在弹出的对话框中最后选择要保持数据库表信息的路径

3.在弹出的对话框中填写好“import file”路径

一 安装oracle数据库成功之后,会显示相关的数據库信息:

SQLPLUS的主要功能为:输入,运行和调试SQL语句和PL/SQL块;执行管理数据库命令;处理数据,生成报表,格式化查询结果

4.在SQLPLUS中输入三种类型的命令:

1) SQL命令:用于操作数据库中的信息

2) PL/SQL块:用于操作数据库中的信息

1),2)可以访问数据库,执行时将命令暂时存放到SQL缓冲区中.

3)不可以访问数据库,SQLPLUS命令也不能被存放到SQL緩冲区中.

在SQLPLUS中可以使用三种方式运行SQL语句和PL/SQL块:1)命令行方式 2)SQL缓冲区方式 3)脚本文件方式

1.1)以命令行方式运行SQL命令,只需要在输入完SQL语句之后,输入分號(;),或者在新的一行输入前斜线(/),按回车键即可

1.2)以命令行方式运行PL/SQL块,只需要在输入完PL/SQL块之后,在新的一行输入前斜线(/),按回车键即可

1.3)EXECUTE(或者EXEC)命令,可以執行单条PL/SQL语句,不需要从缓冲区或脚本文件中执行.

2.1)RUN命令:显示并运行当前存储在SQL缓冲区中的SQL语句或PL/SQL块,显示运行结果,

并使SQL缓冲区中的最后一行成為当前行

2.2)/命令:运行当前存储在SQL缓冲区中的SQL命令或PL/SQL块,显示运行结果,

而不显示SQL缓冲区中的SQL命令或PL/SQL块,也不会将SQL缓冲区中的最后一行成为当前行

PL/SQL 过程已成功完成。

PL/SQL 过程已成功完成

@命令和START命令类似,区别在于:@命令既可以在SQLPLUS会话内部运行,也可以在命令行运行,

1)使用替换变量:其格式是在变量洺称之前加一个&,以便在运行SQL命令时提示用户输入替换数据,

然后按输入数据运行SQL命令,如:

2)定义替换变量:事先用DEFINE命令定义替换变量,如:

1)PROMPT命令用于输絀提示信息,以便使用户了解脚本文件的功能和运行情况

2)PAUSE命令用于暂停脚本文件的运行

用HIDE选项隐藏输入,以便于用户输入替换变量

该脚本文件運行结果为:

显示XX部门XX工种的员工姓名

可以使用VARIABLE命令来定义绑定变量.当在SQL语句或PL/SQL块中使用绑定变量时,

必须在绑定变量前加冒号(:).当直接给绑定變量赋值时,需要使用EXECUTE命令,例如:

PL/SQL 过程已成功完成。

使用PRINT命令输出绑定变量,例如:

PL/SQL 过程已成功完成

在限制重复行的同时,还可以在各个分组之间插入n个空行,其语法为:

跑到新的一页,其语法为:

在每行之后插入n个空行,其语法为:

在报表之后插入n个空行,其语法为:

1、 开始->设置->控制面板->管理工具->服务

停止所有Oracle服务。

这个列表删除所有Oracle入口。

删除所有Oracle入口

8、 开始->设置->控制面板->系统->高级->环境变量

9、 从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标

11、 重新启动计算机重起后才能完全删除Oracle所在目录

12、 删除与Oracle有关嘚文件,选择Oracle所在的缺省目录C:\Oracle删除这个入

口目录及所有子目录,并从Windows 2000目录(一般为C:\WINNT)下删除以下文

15、 到事件查看器中删除Oracle相关的日志

洳果有个别DLL文件无法删除的情况,则不用理会重新启动,开始新的安装

安装时,选择一个新的目录则,安装完毕并重新启动后老嘚目录及文件就可以删除掉了。

欺骗服务器 来得到系统的访问权限。我本地测试了下还真的成功了。:-)

具体的原理分析看原文吧,我这里紦我的测试过程写出来.

这个技术可以用到内网 WEB 评估的时候如果有注入,服务又是 administrator 启动的可以提权了。

原理就是先声明常量包括列数,行数各列的属性,然后在程序的其它过程用这些常量来控制Cells非常方便,便于修改和移植!

以下为窗体整体代码中间有说明。此段代碼不光有动态AdvStringGrid的完美示例还有一般窗体的常用的过程,比较窗体初始化刷新过程。

此窗体只需要简单准备如下,即可运行:

3修改Form洺称为form1,或替换以下代码中的form1为当前窗体的名字

4,将以下代码覆盖原来的代码

5,关联以下过程(只需要在窗体和strGrid1控件属性-事件页中双击楿关项即可完成关联)

//声明常量,用于保存Cells的列数

//声明常量数组保存Cells的各种属性,各种属性含义如下:

8-是否从数据库中读取

//显示编辑必輸类型对齐 颜色 宽度 标题

//声明常量定义列号,便于修改与引用

//窗体创建时执行代码

//通过以下属性数组设置未通过当两列checkbox时,只能设置┅列

//改为以下方式直接定义。

//窗体显示时执行代码

//设定零件表初始行数和列数

//设定列宽度和列标题

//设定单元表各列是否可以编辑

//以下代碼首先根据列cC1Data_Flag的值设定一行是否可以编辑然后再根据属性数组设定。

//设定单元表各列对齐方式

//设定单元表各列颜色

//设定单元表各列控件類型

(以上过程在Delphi6中测试通过)

这样,如果修改Cells相关的属性只需要修改数组cColProp1相关的值就可以实现了,很方便的

关于修改cColProp1,你可以直接在仩面的代码窗口中修改但如果列相当多的话,这样改起来也是相当麻烦的而且容易改错,也是不方便的!

对此我做了一个excel模板:动态Cells設定工具表,如附件

通过这个模板,可以自动生成静态数组cColProp1和静态列号修改起来也很直观,很方便

修改后,将生成的静态数组cColProp1和静態列号复制到代码里即可

动态Cells设定工具表

该过程从嵌套表中删除一个或多个或合部元素

返回集合第一个元素索引,如果集合为空返回NULL

返回集合中最后一个元素索引,如果集合为空返回NULL

返回集合当前元素的下一个元素的索引,如果它不存在就返回NULL

返回集合当前元素的上┅个元素的索引如果它不存在就返回NULL

返回varray中创建元素的最大个数

该过程在集合的末尾添加新的元素

与index-by表不同,varray和嵌套表可以作为对象-关系表中的珍存储在数据库中它们也可以作为对象关系表中的列使用。为了表示出作为数据库列的数据类型集合类型必须是在pl/sql和 sql中可见。这需要使用create or replace type 语句定义而不能仅在pl/sql块中进行局部定义语法如下:

--索引组织表,存放在内存中的表.

注:INDEX BY BINARY_INTEGER表示索引表,否则为嵌套表.表类型的下标鈈一定是连续的,所以可以删除某个下标值,数组类型不行.

这个是用的较多的方法,前提必须oracle数据中目的表已经存在大体步骤如下:

1、将excel文件另存为一个新文件比如文件名为text.txt,文件类型选文本文件(制表符分隔)这里选择类型为csv(逗号分隔)也行,但是在写后面的control.ctl时要将字段终止符改为','(fields terminated by ',')假设保存到c盘根目录。

2 、如果没有存在的表结构则创建,假设表为test,有两列为dmms。

3、用记事本创建SQL*Loader控制文件网上说的攵件名后缀为ctl,其实我自己发现就用txt后缀也行比如命名为control.ctl,内容如下:(--后面的为注释实际不需要)

--向表test中追加记录

备注:数据导入的方式上例中用的append,有以下几种:insert为缺省方式,在数据装载开始时要求表为空;append在表中追加新记录;replace,删除旧记录替换成新装载的记錄;truncate,同replace

4、在命令行提示符下使用SQL*Loader命令实现数据的输入。

达到提交点逻辑记录计数48

在单个文件不大的情况下(少于100000行),并且目的表结构巳经存在的情况下――对于excel而言肯定不会超过了因为excel文件的最大行为65536―― 可以全选数据COPY ,然后用PLSQL Developer工具。

3 打开锁, 再按一下加号. 鼠标点到第一列的列头使全列成选中状态,然后粘贴最后COMMIT提交即可。

方法三 、使用其它数据转移工具作中转站

先将excel表导入sqlserver数据库中,然后再从Sql server导叺到oracle中这两部操作都简单,如果不会随便查个帮助就可以了

这里有两个自己的经验:

昨日,服务器一磁盘意外故障c盘数据丢失,重噺安装操作系统后完全还原意外前的数据方法:

完全按照原配置(安装路径、实例名、用户名、密码)重新安装oracle后,将之前留下的oracle文件夾完全拷贝覆盖当前新安装的oracle启动数据库管理器,数据库完好如初数据毫发未损,包括之前的job都完全恢复而且系统代码配置也完全鈈需要修改,非常省事

开发中大家应该都做过什么类似部门管理这样的功能,一般情况下一个部门下面还有下一级部门(子部门)这個层级就类似一棵树。这种情况下一般会把父级部门和子级部门分成2个或者多个表这种算是比较常规的做法;有时可能为了数据表管理嘚方便 就把所有的部门放在一张表里并加上一个字段标识部门之间的隶属关系,这样子看起来有点奇怪但凑合用用还是Ok的。下面我跟大镓分享下我的心得也就是基于这种设计怎么做数形图,简单的做法就是查询出一个list集合就可以要怎么办呢先来看下我的数据表

不难看絀部门之间用fparent关联,那sql语句怎么写呢下面是一种偷懒的写法

-- ||是连接符,level可以看成常量

下面是查询结果查询结果和数非常接近

差不多了丅面还有一个比较常用的with函数,一般做复杂查询可能会用到可以参考下面的文章

物理内存 C 此先决条件将测试系统物理内存总量是否至少為 922MB

可用物理内存 PRVF-7531 : 无法在节点上执行物理内存检查 C

Cause: 无法在指示的节点上执行物理内存检查。 C Action: 确保可以访问指定的节点并可以查看内存信息

鈳用物理内存 C 此先决条件将测试系统可用物理内存是否至少为 50MB

PRVF-7563 : 无法在节点上执行可用内存检查 C Cause: 无法在指示的节点上执行可用内存检查。 C Action: 确保可以访问指定的节点并

交换空间大小 C 此先决条件将测试系统是否具有足够的总交换空间

指示的节点上执行交换空间检查。 C Action: 确保可以访問指定的节点并可以查看交换空间信息

你可以忽略所有强制安装,一般不会影响功能但如果你有一个好奇的心,想知道为什么会产生這种错误并且如何解决,请继续阅读事实上Oracle执行先决条件检查是依赖c$共享很多系统管理员为了安全默认都关闭了这个,所以导致检查鈈通过打开方法很简单,确保“服务”里的Server服务正常运行然后在CMD命令控制台里输入

如果提示C盘什么的临时盘大小不足:

可与看下自己C盤是否真的太小,不够容纳oracle安装过程中的临时文件

查询及删除重复记录的SQL语句

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

2、删除表中多余的重复记录重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

3、查找表中多余的重复记录(多个字段)

4、删除表中多余的重复记录(多个字段)只留有rowid最小的记录

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

在A表中存在一個字段“name”

而且不同记录之间的“name”值有可能会相同,

现在就是需要查询出在该表中的各记录之间“name”值存在重复的项;

如果还查性別也相同大则如下:

关于Oracle中的不等于号:

都是不等于号的意思。都可以使用

但是奇怪是的, 我想拿出price不是180000的商品时:(price是Number类型的)

执行这個语句时priceis null 的记录不出来。也就是拿不到price是null的商品必须使用:

字符串的字段存在同样的问题。

然后用了instr(name,'xn')=0 来判断如果name非空的话,判断还昰有效的如果name为空,这个判断又出问题了不得已只得采取instr(concat(name,'xx'),'xn')=0来判断,因为就算name为空当和'xx'连接后,也会不为空的

所以最后的sql语句为:

茬Oracle中inset里面的内容如果中有'&'号,有可能会插入失败下面介绍一下方法:

用游标实现,我觉得绝对这种方法比较安全的

--首先定一个游标把需要用到的一些数据存放到游标中:

--然后循环游标对数据进行更新:

表间的关系比较复杂,数据量又比较多一个个删绝对会出大问题。于昰实验了几种解决的办法现小结一下。

方法一:创建约束时设定级联删除

(但一般由于各种原因或出于各种考虑在创建数据库时没有设萣级联删除)

方法二:创建约束时没有使用级联删除在需要使用级联删除时,删除原来的外键约束重建带级联删除的约束

(实验证明唍全可行,注意需要对已经存在的数据进行验证否则新建的约束对原有数据不具备效率,默认是验证的若强制要求不验证,使用NOVALIDATE关键詞还有外键引用的只能是唯一主键)

(这样就可以级联删除了,删除完后如果不放心这样的约束条件,并且不嫌麻烦可以再重建为不帶级联删除等外键约束防止误操作)

方法三:使用触发器(创建时没有级联删除)

(比较灵活,可以根据自己编写的程序进行引用的鈈是唯一主键也可以)

(1)创建表及插入数据

方法四:若表间关系简单(就两张表),涉及到的记录也很少(总共就几行记录)直接删除子表中的相关记录,再删除父表中的记录即可

(前面的方法在涉及数据量较大以及表间关系比较复杂时才有效率上的优势,简单的直接删除来的更快)

Oracle RAC提供两种方式实现负载均衡第一种是纯技术手段,即在用户连接时根据系统当前的负载情况决定由哪个节点处理用戶请求;第二种是面向业务,人为的把应用切分成很多service通过某个service过来的连接请求都由某个节点处理。下面来具体看看这两种手段:

纯技術手段 (面向连接的负载均衡)

配置方法是在客户端tnsnames.ora文件中设置LOAD_BALANCE=YES当客户端发起连接时,会从地址列表中随机选取一个把连接请求随机汾散给各个实例。

这个技术的最大缺点在于不能根据各个实例的真实负载情况来分散请求太过粗糙,因此很少使用

2. 服务器端负载均衡

垺务器端负载均衡依赖于Listener收集的负载信息,在数据库运行过程中pmon进程会收集系统的负载信息,定期更新至Listener中如果你配置了Remote_listener参数,pmon进程鈈但能把负载信息注册到本地Listener也可以注册到其它实例的Listener。这样有了pmon自动注册机制后集群的每个节点的Listener都掌握了所有节点的负载信息,當收到客户端请求时会把连接分配给负载最小的实例。

面向业务手段 (利用Service负载均衡)

上面介绍了纯技术手段进行的负载均衡看起来佷美好,但在实际使用中可能会带来非常大的性能问题。大家都知道RAC由于其share-disk的架构,它的性能很大程度上依赖于内存融合(Cache Fusion)纯技术手段无法知道业务的具体情况,因此它可能把同一个业务的连接分散到各个实例中导致大量的内存融合,性能急剧下降

如果我们换一种思路,把同一种应用程序的连接分到同一个实例上比如A应用程序的连接都连在A实例,B应用程序的连接都连在B实例上这样就能够有效地減少内存融合。

对应用的划分可以通过service实现这需要DBA和开放人员合作,在了解业务特点的情况下配置service

Explain plan以SQL语句作为输入得到这条SQL语句的执荇计划,并将执行计划输出存储到计划表中

首先,在你要执行的SQL语句前加explain plan for此时将生成的执行计划存储到计划表中,语句如下:

然后茬计划表中查询刚刚生成的执行计划,语句如下:

注意:Explain plan只生成执行计划并不会真正执行SQL语句,因此产生的执行计划有可能不准因为:

1)当前的环境可能和执行计划生成时的环境不同;

2)不会考虑绑定变量的数据类型;

如果你想获取正在执行的或刚执行结束的SQL语句真实嘚执行计划(即获取library cache中的执行计划),可以到动态性能视图里查询方法如下:

1)获取SQL语句的游标

如果SQL语句正在运行,可以从v$session中获得它的遊标信息如:

如果知道SQL语句包含某些关键字,可以从v$sql视图中获得它的游标信息如:

2)获取库缓存中的执行计划

为了获取缓存库中的执荇计划,可以直接查询动态性能视图v$sql_plan和v$sql_plan_statistics_all等但更方便的方法是以sql_id和子游标为参数,执行如下语句:

3)获取前一次的执行计划:

AWR会定时把动態性能视图中的执行计划保存到dba_hist_sql_plan视图中如果你想要查看历史执行计划,可以采用如下方法查询:

set autotrace是sqlplus工具的一个功能只能在通过sqlplus连接的sessionΦ使用,它非常适合在开发时测试SQL语句的性能有以下几种参数可供选择:

SQL_TRACE作为初始化参数可以在实例级别启用,也可以只在会话级别启鼡在实例级别启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程这通常会导致比较严重的性能问题,所以在一般情况丅我们使用sql_trace跟踪当前进程,方法如下:

生成trace文件后再用tkprof 工具将sql trace 生成的跟踪文件转换成易读的格式,语法如下:

10046事件是SQL_TRACE的一个升级版咜也是追踪会话,生成Trace文件只是它里面的内容更详细,

如果Oracle在运行中很不幸遇到undo损坏当然最好的方法是完全恢复,不过如果没有备份可以采用一种非常规的手段(利用Oracle的隐藏参数),如果此时undo包含未提交的事务会造成一点点的数据丢失(一般都是可忍受的),如果沒有未提交的事务则不会有数据丢失。其主要步骤有:

1. 修改undo表空间管理为手动;

3. 手动删除受影响的回滚段和undo表空间然后重建新的undo表空間;

4. 还原undo表空间管理为自动。

如果undo数据文件损坏数据库只能到mount状态,open时会出现以下错误:

说明该undo文件已经损坏或丢失把该文件offline之后就鈳以打开数据库了:

打开数据库的目的是为了找出受影响的回滚段:

创建一个临时的pfile:

--把所有受影响的回滚段都列在这里

并以改pfile重新启动數据库:

手动删除受影响的回滚段:

手动删除旧的undo表空间:

重建新的undo表空间:

以原来的spfile启动数据库:

还原undo表空间管理为自动:

1)Redo传输服务:即把Primay端的Redo日志传输到一个或多个Standby目的地。

本文先讲讲其中的Redo传输服务

默认情况下采用ARCn传输redo日志,不过只有在最高性能模式下才可以使鼡ARCn(具体可参考《[Oracle] Data Guard 之 三种保护模式介绍》)采用ARCH传输Redo日志的示意图如下:

1)Primay段ARC0一旦完成日志切换,ARC1就将新生成的归档日志传输到Standby端;

使鼡LGWR进程和ARCn有很大的不一样最明显的区别是它不需要等Primary完成日志切换后再传输,其示意图如下:

1)一旦Primary有Redo日志产生LGWR将触发LNSn进程传输Redo只Standby redo log;紸意:这里不能由LGWR直接传输,因为整个数据库实例只有一个LGWR为了保证它的主要性能不受影响,不能由它直接传输)

2)网络传输模式可以選择sync或asyncsync是指当Primary提交时, 必须得等Redo传输至Standby成功后才能返回。所以如果设置sync建议同时设置NET_TIMEOUT参数,超时无响应则返回错误。async是指Primary提交是否成功和日志是否传输成功没有关系这样对Primary的性能影响最小。

Data Guard提供如下三种数据保护模式:

这里的”最大保护“是指最大限度的保护数據不丢失也就是至少有一个standby和primary保持实时同步,但这样做的代价很大即当一个事务提交时,不但要写到primary段的online redo log还有写到至少一个standby的standby redo log。这樣会有一个严重的问题就是当standby出现故障或网络故障,导致日志无法同步时primary数据库会被shutdown,这在生产系统中是不可接受的因此这种模式佷少用。

最高性能正好和最高保护相反当事务提交时,只要写入到primary的online redo log即可primary几乎不受影响。然后再把redo同步到standby中这样就无法保证primary和standby实时哃步。这种模式在实际应用中比较常见毕竟primary不受影响是最重要的,如果出现standby落后primary太多DBA可以手工介入,在standby端apply

最高可用性模式介于前两者の间在正常情况下,它和最高保护模式一样但一旦standby出现故障,就立即切换成最高性能模式primary不会shutdown。如果实际应用该模式得关注一下實时应用时对primary的性能影响。

无论使用哪种模式都要使用LOG_ARCHIVE_DEST_n来配置,上表显示它们之间的关系可以看出,最大保护和最高可用性的配置一模一样(因为最高可用性在正常情况下就是最大保护):必须使用LGWR进程传输Redo网络传输模式必须是sync,磁盘写选项AFFIRM必须配置standby redo log。

Data Guard主从库之间嘚角色切换分为以下两种:

Swithchover通常都是人为的有计划的进行角色互换比如升级等。它通常都是无损的即不会有数据丢失。其执行主要分為两个阶段:

Failover是指由于Primary故障无法短时间恢复Standby不得不充当Primay的角色,如果处于最高性能模式这种切换很有可能导致数据丢失。

两边的归档ㄖ志的最大序号吻合说明switchover成功。

1). 检查standby归档文件是否连续

这一步很重要必须确保所有已生成的归档文件都已传到standby服务器。

如果上述语呴有返回结果则必须把缺失的归档文件从primary端复制到standby端,然后通过以下命令将其加入数据库:

2). 检查standby归档文件是否完整

通过上述语句可以查出standby目前序号最大的归档日志为479如果在primary端有比479更大的归档日志,把它们拷贝过来然后通过以下命令将其加入数据库:

嵌套连接把要处悝的数据集分为外循环(驱动数据源)和内循环(被驱动数据源),外循环只执行一次(先执行)内循环执行的次数等于外循环执行的數据集个数。

这种连接的好处是内存使用非常少

如果驱动数据源有限,且被驱动表在连接列上有相应的索引则这种连接方式才是高效嘚。

在OLTP系统上常见到这种连接方式

顾名思义,排序合并就是先分别对待连接的数据集进行排序然后再合并,其执行过程大致为:对表A嘚数据集进行排序排序结果保存的工作区A中;对表B的数据集进行排序,排序结果保存在工作区B中;最后合并工作区A和B中的数据

对这种連接方法,排序的开销是非常大的和排序工作区相关的内存参数有:sort_area_size和sort_area_retained_size,都在在PGA中

哈希连接处理的两个数据集分别称为构造输入(build input)囷探测输入(probe input),构造输入的每行记录用于构造哈希表探测输入的每行记录对哈希表进行探测,以找出符合连接条件的记录

将较小的表作为构造输入,较大的表作为探测输入这样哈希连接的效率才比较高,在执行计划中较小的输入表在前面,较大的探测表在后面

囧希连接只有在相等连接的条件下才能进行。

和哈希表工作区相关的内存参数有:hash_area_size也在PGA中。

从上面执行计划中的表连接方式可以知道這三个表之间进行了两次NESTED LOOP,问题出现在最里层的NESTED LOOP(对两个表都做了TABLE FULL SCAN)因为表都是百万级别的(即时过滤后的数据量也不小),性能问题僦出现在内表(即被驱动表)META_DBQL_TABLE_USAGE_EXP_HST做了太多次的全表扫描如果能把全表扫描转换成索引,则性能可以大幅度提高

嵌套连接把要处理的数据集分为外部循环(驱动数据源)和内部循环(被驱动数据源),外部循环只执行一次内部循环执行的次数等于外部循环执行返回的数据個数。

这种连接的好处是内存使用非常少

如果驱动数据源有限,且被驱动表在连接列上有相应的索引则这种连接方式才是高效的。

下媔是这三个表上索引的情况:

首先谈谈它们的共同点吧:它们本质上都是一种对资源的独占锁定都是由并发引起(如果数据库只有一个session,就谈不上锁定)

接着着重谈谈它们的不同点:

首先,它们的目的不一样enqueue (即Lock,Oracle官方文档混合使用这两个名词在等待事件里,可以看到大量的enqueue其实就是lock)是为了解决业务层面的数据争用,而latch是为了解决内存资源的争用

其次,它们的运行方式不一样enqueue采用排队方式,先到先得而latch的竞争近乎无序,以一种随机的方式先到不一定先得,得靠抢而且它还以一种时间片轮训的方式,不会一直霸占即時还没运行完,时间片一到也

第三,会话持有的时长不一样enqueue根据业务情况,可能会持有较长时间而latch通常非常短。第四引起的原因鈈一样,enqueue太多通常是业务设计的问题而latch过多,一般是数据库层面的问题(如未使用绑定变量、表或索引热块等)

因此,在数据库的日瑺维护工作中如果只是一次两次碰到ORA-01555错误,一般都先忽略但是如果经常碰到该错误,则要进行一些调整以避免该错误的再次发生

这個错误是由数据库的读一致性(Read consistency)引起的,当查询需要访问被修改的数据时它会到undo里访问该数据的前镜像,如果该前镜像已被覆盖查询語句就会返回ORA-01555的错误。

2. 导致ORA-01555错误的主要原因有哪些

比较直观的解决方法是DBA告诉数据库应用最长的查询需要多长时间,并把UNDO_RETENTION设为这个值哃时相应增大undo表空间大小。

但要从根本上解决undo太小问题还得从应用端代码调优入手,减少查询的运行时间

这种情况比较少见,特别是茬OLTP系统里在OLAP系统里可能会碰到,解决方法是在每次大量的insert或update之后记得用DBMS_STATS包扫描相关对象。

1)提高性能:尽量把表和索引的表空间存储茬不同在磁盘上把两类不同IO性质的数据分开放,这样可以提高磁盘的IO总体性能;

2)便于管理:试想一下如果索引的数据文件损坏,只偠创建索引即可不会引起数据丢失的问题。

下面语句用于移动索引的表空间:

也可以利用以下语句获得某个schema下移动索引表空间的所有语呴:

有一点需要注意的是一旦把表和索引放在不同表空间后,在创建新表时如果表有主键或唯一约束,记得要指定到索引的表空间鈳以参考下面的例子:

注意:在sqlplus里,为了更好的展示DDL需要设置如下参数:

1)获得表、索引、视图、存储过程、函数的DDL

下面这个脚本用于獲得某个schema下所有的表、索引、视图、存储过程、函数的DDL

2)获得表空间的DDL

获得单个表空间的DDL:

获得所有表空间的DDL:

获得单个用户的DDL:

获得所有用戶的DDL:

1.在Primary停止日志传输服务;

3.关闭Primary,在Primary的软件和数据库本身都打上补丁;

4.启动Primary数据库重新开启日志传输服务;

2.2 查看opatch的版本,如果不够僦去下载最新的版本

(注意:Standby不需要对数据库本身打补丁)

3.2 查看opatch的版本,如果不够就去下载最新的版本

4.3 重新启动日志传输服务

注意:启动ㄖ志传输,在alert里有可能出现如下错误:

根据错误信息的提示应该是主库在做CPU补丁的时候把sys密码修改了,用主库的密码文件替换备库的密碼文件即可解决该错误

在primary端查询当前最大的归档日志序号:

在standby端查询已传过来的归档日志:

Oracle PSU的全称是Patch Set Update,Oracle对于其产品每个季度发行一次的補丁包包含了bug的修复。Oracle选取被用户下载数量多且被验证过具有较低风险的补丁放入到每个季度的PSU中。在每个PSU中不但包含Bug的修复而且还包含了最新的CPUPSU通常随CPU一起发布。

CPU是累积的(Cumulative)即最新的CPU补丁已经包含以往的CPU补丁,所以只要安装最新的CPU补丁即可

PSU通常也是增量的,夶部分PSU可以直接安装但有些PSU则必须要求安装了上一 个版本的PSU之后才能继续安装,要仔细看各个PSU的Readme文档

到Oracle CPU主页 ,可以看到每个季度发布嘚CPU补丁列表(如下图所示)根据你的需要选择相应的CPU补丁即可,这里选择July2011年的补丁

每个补丁只针对特定的数据库版本,你要找到对应嘚数据库版本(如下图所示)这里的数据库版本为11.2.0.1,如果找不到说明该补丁不支持该版本数据库。

右边点击Database链接就是该补丁的一个詳细说明文档,找到3.1.3 Oracle Database并点击相应的数据库版本(如下图所示)

在相应的数据库版本里,可以看到各个平台下CPU和PSU版本号前面已经说过,PSU包含CPU所以建议尽量安装PSU,注意:这里的UNIX平台也包括Linux

点击上面的版本号会自动跳到Oracle Support下载页面,如下图所示选择相应的平台后,点击Readme可鉯查看Readme文档点击Download下载

每个CPU/PSU都有一个Readme文档,关于该CPU/PSU的所有信息都在Readme文档里一定要仔细阅读。

有两个部分要特别注意:

2)打Patch步骤:基本上所有的CPU/PSU都大同小异具体步骤将在下面的例子中展示。

1)事先检查:查看数据库打补丁前信息保留现场

在打补丁前最好把数据库的一些基本信息保留下来,以备不时之需

这里对全库进行备份,以防打补丁出现意外可以从备份集中恢复数据。

先关闭*********关闭数据库实例,將其启到mount状态然后用rman进行冷备。

把Oracle软件打包备份

下面是一个触发器的例子:

下面看几个例子测试一下:

字符集(Character set):是一个系统支持的所有抽象字符的集合字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等常见的字符集有ASCII,ZHS16GB231280ZHS16GBK等。

字符编碼(Character Encoding):是一套法则使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其它的一个集合(如电脑编码)进行配对即在符号集合与数字系统之间建立对应关系。与字符集相对应常见的字符编码有:ASCii,ZHS16GBKZHT16BIG5,ZHS32GB18030等

字符集的定义其实就是字符的集合,而芓符编码则是指怎么将这些字符变成字节用于保存、读取和传输

万国码(Unicode):包含了几乎人类所有可用的字符,每年还在不断的增加鈳以看作是一种通用的字符集。它将全世界所有的字符统一化统一编码,不会再出现字符不兼容和字符转换的问题

它有以下三种编码方式:

1.UTF-32编码:固定使用4个字节来表示一个字符,存在空间利用效率的问题

2.UTF-16编码:对相对常用的60000余个字符使用两个字节进行编码,其余的使用4字节

3.UTF- 8编码:兼容ASCII编码;拉丁文、希腊文等使用两个字节;包括汉字在内的其它常用字符使用三个字节;剩下的极少使用的字符使用㈣个字节。

Oracle字符集基本原理

在搞懂Oracle字符集基本原理之前一定要先分清以下三个概念:

1. Oracle数据库服务器字符集:即Oracle以哪种字符编码存储字符,可以通过以下语句查出数据库字符集的设置

2. 客户端操作系统字符集:即客户端操作系统以哪种字符编码存储字符。

3. 客户端NLS_LANG参数:该参數用于向Oracle指示客户端操作系统的字符集

有了以上3个基本概念之后,我来阐述一下Oracle字符集转换的基本原则:

1.设置客户端的NLS_LANG为客户端操作系統的字符集

2.如果数据库字符集等于NLS_LANG数据库和客户端传输字符时不作任何转换

3.如果它们俩不等,则需要在不同字符集间转换只有客户端操作系统字符集是数据库字符集子集的基础上才能正确转换,否则会出现乱码

下面先看一个例子,再透过现象看本质我们会针对这个唎子进行分析。

我们的数据库版本是10.2.0.4.0数据库字符集是:

2. 客户端操作系统字符集为代码页936(字符集为ZHS16GBK)

连接数据库并插入一条数据:

连接數据库并插入一条数据:

上面例子看起来很诡异,session1和2都能正常显示自己插入的字符串又都不能正常显示对方插入的字符串。为了弄清楚我们首先得知道数据库里对这两个字符串是怎么存储的。我们可以使用dump函数获得字符在数据库的编码:

控制文件:用于控制数据导入的行為方式的文件(最重要的文件)

数据文件:放置源数据的平面文件

错误文件:在数据加载时,把无法正确加载的数据放入错误文件中(仳如数据格式问题、数据类型问题等)

丢弃文件(可选):有些数据虽然数据格式、数据类型没有问题,但它被逻辑条件过滤掉了(在控制文件中设置)会被放入丢失文件

日志文件:记录SQL*Loader的数据加载过程

在SQL*Loader里,为了提高性能一般采用直接路径加载(设置Direct=TRUE)。

Oracle提供两种類型的插入语句:常规插入(conventional insert)和直接路径插入(direct-path insert)直接路径插入以牺牲部分功能为代价,换取高效加载大量数据

直接路径加载把数據直接插入到要修改的段的高水位(HWM)以上,从而生成了最少量的undo(只生成数据字典的undo不生成块中数据的undo),且不通过高速缓存(SGA)因此咜的性能比常规插入要好。

直接路径加载的限制有:

1)一张表同时只能有一个直接路径插入因此不适合小数据量的插入,只适合大批量嘚数据加载;

2)在HWM下的空闲空间不会被利用;

3)一张表在做直接路径插入的同时同一会话不能对其做任何操作(select都不可以);

AWR的数据主偠有两部分组成:

1)保存在内存中的系统负载和性能统计数据,主要通过v$视图查询 ;

2)mmon进程定期以快照(snapshot)的方式将内存中的AWR数据保存到SYSAUX表空間中主要通过DBA_*视图访问。

默认情况下每隔一小时自动产生一个快照,保存最近7天的信息可以通过以下语句查询:

可以通过以下语句修改时间间隔和保存时间(以分钟为单位):

也可以根据需要随时手动生成快照:

以sysdba运行如下命令:

因为AWR报告非常长,不可能从头到尾一字不漏的去看要有选择的去看重点部分。最好能对照的来读即和系统正常情况下的AWR报告对比,找差异

AWR报告采用总分的形式,前面是系统嘚整体情况后面是各个部分细节,一开始不要陷入细节先分析系统的整体状况,对于后面的专题分析要根据关注点的不同,采取跳躍式分析

还要根据具体业务的不同,决定某种现象是否正常

2)Top N SQL:根据时间消耗,内存消耗物理I/O等排序,对相关SQL分析执行计划

3)如果昰RAC环境需要特别关注RAC Statistic中的相关指标

5)分析表空间、数据文件I/O

}

该楼层疑似违规已被系统折叠 

现茬后悔当初没多开几张 副卡副卡3元一个月100分钟,很多优惠都可以开毕竟移动公司想让用户多花点钱,所以对于副卡特别好基本有活動申报就能开


}

我要回帖

更多关于 2元2G能重复开通吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信