⑴ Oracle数据库无响应故障处理方式
Oracle数据库无响应故障处理方式
Oracle数据库无响应故障,简单地讲就是数据库实例不能响应客户端发起的请求,客户端提交一个sql后,就一直处于等待数据库实例返回结果的状态。更严重的现象是客户端根本不能连接到数据库,发起一个连接请求后,一直处于等待状态。Oracle数据库无响应故障怎么处理呢?下面跟我一起来学习Oracle数据库无响应故障的处理方法吧!
无响应的故障现象一般有以下几种:
1.Oracle的进程在等待某个资源或事件
这种现象一般可以从V$SESSION_WAT、V$LATCH、V$LATCHHOLDER等动态视图中检查进程正在等待的资源或事件,而被等待的资源或事件,一直都不能被获取,甚至是很长时间都不可获得。如果这个正在等待的进程持有了其他的资源,则会引起其他的进程等待,这样就很可能引起实例中大范围的会话发生等待。由于进程在等待资源或事件时,通常都处于SLEEP状态,消耗的CPU资源非常少(在等待latch时要稍微多消耗一些CPU资源),所以从OS来看,CPU的消耗并不高,甚至是非常低。
这种因为等待而引起的个别进程Hang,相对比较容易处理。
2. OracleProcess Spins
所谓Spin,就是指Oracle进程中的代码在执行某个过程时,陷入了循环。在V$SESSION视图中,往往可以看到Hang住的会话,一直处于“ACTIVE”状态。对于这样的会话,用“alter system kill session ‘sid,serial#’”命令也不能完全断开会话,会话只能被标记为“killed”,会话会继续消耗大量的CPU。进程Spins由于是在做循环,CPU的消耗非常大,从OS上明显可以看到这样的进程,通常会消耗整个CPU的资源。
而对于这样的Hang住的会话,处理起来相对比较复杂,并且为了从根本上解决问题,需要超过DBA日常维护所需要的技能。
从故障范围来看,无响应故障可以分为以下几种情况:
1. 单个或部分会话(进程)Hang住
这种情况属于小范围的故障,业务影响相对较小,一般来说只会影响业务系统的个别模块。在一个多应用系统的数据库上面,如果Hang住的会话比较多,则影响的可能是其中的一个应用系统。这里有一个例外,如果Hang住的进程是系统后台进程,如pmon、smon等,则影响的范围就非常大了,最终甚至会影响整个数据库及所有应用系统。还有值得注意的是,即使是少部分会话Hang住,也要及时处理,否则极有可能会扩散到整个系统。
2. 单个数据库实例Hang住
这种情况造成的影响非常大。在这个实例上的所有应用系统均受到严重影响,并且在找到根源并最终解决问题之前,数据库实例往往须要重启。
3. OPS或RAC中的多个实例或所有实例都Hang住
在这种情况下,即使是OPS或RAC,都已经没办法提供高可用特性了。使用这个数据库的所有应用系统将不能继续提供服务,这种情况往往须要重启。
无响应故障成因分析
Oracle数据库无响应,一般主要由以下几种原因引起:
1. 数据库主机负载过高,严重超过主机承受能力
比如应用设计不当,数据库性能低下,活动会话数的大量增加,导致数据库主机的负载迅速增加,数据库不能正常操作,并最终Hang住;主机物理内存严重不足,引起大量的换页,特别是在SGA中的内存被大量换出到虚拟内存时,数据库实例往往就会Hang住。
2. 日常维护不当、不正确的操作引起数据库Hang住
比如归档日志的存储空间满,导致数据库不能归档,引起数据库Hang住;在一个大并发的繁忙的系
统上,对DML操作比较多的大表进行move、增加外键约束等操作也可能使系统在短时间内负载大幅升高,并引起数据库系统Hang住;不正确的资源计划(Resource Plan)配置,使进程得不到足够的CPU等。
3. Oracle数据库的Bug
几乎每个版本都存在着会导致数据库系统Hang住的Bug,这些Bug会在一些特定的条件下触发,特别是在RAC数据库中,引起数据库Hang住的Bug比较多。
4. 其他方面的一些原因
比如在RAC数据库中,如果一个节点退出或加入到RAC的过程中,当进行Resource Reconfiguration时,会使系统冻结一段时间,也有可能使系统Hang住。
以上所描述的几种常见的会导致Oracle数据库实例Hang住的原因中,大部分的情况是可以避免的,只要维护得当,一般不会出现这种故障。对于Oracle数据库Bug所导致的数据库无响应故障,由于是在特定的情况下才会触发,所以如果能够尽量对数据库打上最新版本的补丁,并且熟悉当前版本中会导致系统Hang住的Bug以及触发条件,就能够最大限度地避免这种故障的发生,提高系统的可用性。
那么,在数据库Hang住的情况下,如何去分析并发现导致问题的根源?一方面,由于系统Hang住会导致业务系统不可用,为了能够尽快地恢复业务,须快速地判断问题所在,然后Kill掉引起故障的会话和进程,或者数据库实例不得不重启以迅速恢复业务;但另一方面,如果只是重启数据库或Kill会话和进程来解决问题,在很多情况下是治标不治本的办法,在以后故障随时可能会出现。如何在二者之间进行抉择呢?对于数据库Hang故障的处理,首先是尽可能地收集到系统Hang住时的状态数据,然后尽快地恢复业务,恢复业务后分析收集到的数据,找到数据库系统Hang住的真正原因,然后再进行相应的处理。下一节将详细描述数据库系统Hang住后的处理流程。
无响应故障处理流程
对于Oracle无响应故障的处理,我们可以按下图所示的流程进行。
值得注意的是,上图并不是一个完整的Oracle数据库故障处理流程图,只是处理Oralce数据库无响应这一类特定的故障的流程,只列出了针对这一特定类型故障处理时的关键处理点。不过既然是故障,所以这类故障的处理流程与其他故障的处理流程,有着非常相似的地方。
下面是整个流程的详细说明:
1. 在出现数据库无响应故障后,首先确认系统的影响范围,如上节所描述的',是部分业务系统或模块还是所有的业务系统都受影响,是不是整个实例或多个实例都无响应。同时应询问系统维护和开发人员,受影响的系统在出现故障前是否有过变动,包括主机硬件、操作系统、网络、数据库以及应用等。有时一个细小的变动就可能导致出现数据库Hang住这样严重的故障。曾经遇到一个库,应用只是修改了一个SELECT语句就导致了数据库Hang住。
2. 为了避免由于网络、数据库监听或客户端因素影响分析,建议都登录到主机上进行操作。
3. 如果主机不能登录(为了避免干扰流程主线,这里不讨论如网络问题这样也会导致不能连接的故障),尝试关闭出现问题的业务系统,甚至是所有的业务系统。如果关闭了所有的业务系统之后,仍然不能连接,则只有考虑重新启动数据库主机。在数据库主机重新启动后,使用操作系统工具或OSW等长期监控操作系统的资源使用,同时监控Oracle数据库的性能和等待等。
4. 登录上主机后,先用top、topas等命令简单观察一下系统。看看系统的CPU使用、物理内存和虚拟内存的使用、IO使用等情况。
5. 使用SQLPLUS连接数据库,如果不能连接,则只能从操作系统上观察系统中是否有异常的现象,比如占用CPU过高的进程。使用gdb、dbx等debugger工具对数据库进行system state mp;使用strace、truss等工具检查异常进程的系统调用;使用pstack、procstack等工具察看异常进程的call stack等。
6. 使用SQLPLUS连接上数据库后,进行hanganalyze、system state mp等操作;或检查等待事件、异常会话等正在执行的SQL等待。
7. 找到故障产生的原因,如果暂时找不到原因,尽量收集数据。
8.确良如果应用急须恢复,可通过Kill会话、重启数据库实例等方式,先恢复应用。
9. 根据最终诊断结果,对数据库升级打补丁,或者修改应用等方式从根本上解决问题。
怎样避免数据库出现无响应故障
作为Oracle数据库DBA,除了处理故障之外,更重要的是如何预防故障的发生。根据前面对数据库无响应故障的成因分析,在日常的维护工作中,须做到以下几点:
1. 进行正确的维护操作
很多的数据库无响应故障都是由于不正确的维护操作引起的。应避免在业务高峰期做大的维护操作,比如像move、加主外键约束等会长时间锁表的操作。如果的确需要,尽量使用正确的操作方法。比如用ONLINE方式重建索引;建主键、唯一键约束时先建索引,然后在建约束时指定新建的索引,等等。也就是保证系统的并发性、可伸缩性,避免系统串行操作的出现。
2. 优化应用设计,优化数据库性能
为避免性能问题导致在业务高峰期数据库不能及时有效处理来自业务的请求,甚至于完全Hang住。对于数据库中存在串行访问的部分进行优化,比如latch、enqueue,还包括不合理的sequence设计等。特别是在RAC数据库中,严重串行访问等待往往更容易引起严重的性能问题。优化应用设计,使数据库具有更好的可伸缩性和并行处理能力,能够有效地避免性能问题引起的数据库Hang住。
3. 利用监控系统随时监控系统负载
遇到系统负载过高,内存不足,OS中虚拟内存换页很频繁等情况时,及时采取措施;监控Oracle数据库的核心进程,如pmon、smon等,看是否有异常,如过高的CPU消耗。出现异常应立即处理;监控归档空间和日志切换;监控数据库中的等待事件,比如是否有大量的enqueue、log file switch (archiving needed)、resmgr:become active等待事件等。
4. 为数据库打上补丁
很多的无响应故障是由于Oracle的Bug引起的,数据库DBA应关注当前版本中有哪些Bug会导致数据库Hang住,尽量为数据库打上解决这些Bug的补丁。
;⑵ Oracle数据库问题
1.指定默认表空间是为了建立用户下的对象,临时表空间是存放临时数据,比如排序的数据,不指定默认表空间就会建到SYSTEM表空间里,这是不推荐的,业务数据最好跟系统数据分表空间存放
2.SYSTEM表空间是在建库的时候建立的
3.不推荐在SYSTEM表空间上存放业务数据
⑶ Oracle数据库频繁归档问题的解决办法
Oracle数据库频繁归档问题的解决办法
第一步 检查
top 输出 CPU 使用率很低
iostat 读 M/s 写 K/s iowait %
v$session 中的会话不多 且都没有大的事务操作
db_writer_processes=
log_archive_max_processes=
主日志组 个 每个组中 个 M大小的日志文件
备日志组 个 每个组中 个 M大小的日志文件
v$log 除了一个组为current 其它所有日志组状态均为active
重启数据库现象依旧
第二步 判断
根据以上检查结果 判断应该不是应用层的问题 初步判断是系统进程或硬件问题 因为是生产系统 不到万不得已不要轻易作硬件检测和更换 因为那样会需要大量停止服务时间 首先采取一般控制日志归档的方法
第三步 措施
增加主日志文件
alter database add logfile member /u /oradata/BOSS/redo log to group
alter database add logfile member /u /oradata/BOSS/redo log to group
alter database add logfile member /u /oradata/BOSS/redo log to group
alter database add logfile member /u /oradata/BOSS/redo log to group
第四步 增加归档进程数 由 改为
alter system set log_archive_max_processes= scope=both
lishixin/Article/program/Oracle/201311/17384
⑷ 关于Oracle数据库的几个问题,希望高人能帮忙解答。只有20分~~全给您了~谢谢~~急
1.
Create tablespace student datafile
'C:\data.dbf' size 50m autoextend on
next 5m maxsize 500m;
2.
Create Table student(stu_id number(8)
constraint student_stu_id_pk primary key,
stu_name varchar2(10) Not Null ,
stu_grade Number(2) Default 1 Not Null,
stu_phone varchar2(20)
constraint stu_phone_uk unique)
(说明,外键的设置应该有另外一张表的说明,此处未能创建外键。如果要创建,可参考以下语句:
constraint student_stu_name_fk
references table_name(col_name)
)
3.
Create Or Replace Trigger phonetrigger
Before Update On student
For Each Row
Declare
Ln_Stu_Id Number; --学生ID
Ls_Stu_Phone Varchar2(50); --学生电话
Begin
If :New.Stu_Phone <> :Old.Stu_Phone Then
Ls_Stu_Phone := :New.Stu_Phone;
Ln_Stu_Id := :New.Stu_Id;
Update Student_Phone
Set Stu_Phone = Ls_Stu_Phone
Where Stu_Id = Ln_Stu_Id;
End If;
End;
4.--这个问题返回值应该不止一个,所以得用表值函数,这个不是很清楚,只能列举一下大概的语法:
Create Or Replace Function Studentphone(In_Gread Number) Return < Student.Stu_Phone > %Type Is
Result < Student.Stu_Phone > %Type;
Begin
Select Stu_Phone Into Result From Student Where Stu_Gread > In_Gread;
Return(Result);
End Studentphone;
5---
Create Or Replace Procere Setgread(In_Gread Number) As
Begin
Update Student Set Stu_Grade = In_Gread;
End Setgread;
以上代码请测试,希望可以帮助到你。
⑸ Oracle数据库常见问题答疑二
问 利用QUERY选项输出数据 我知道在Oracle i中 可以使用QUERY有选择地输出表数据 我想用EXP命令来实现 但没有成功 下面是我所写的命令 以及得到的错误信息 exp ddd/ddd file=/dbf/u /customer dmptables=AASC AST_CUSTOMER_KEEPquery= where CUA_TRANS_DTS <add_months(sysdate ) table_export[ ]: CUA_TRANS_DTS: not found (没有找到)答 操作系统不同 用来指定QUERY=参数的方法也不同 WHERE 语句里面往往有很多特殊的字符 如= > <和空格等等 而UNIX和Windows操作系统中的外壳命令提示是不欢迎这些字符的 这些字符将被忽略 你应该根据不同的操作系统采用不用的方法 我一般使用带有QUERY选项的参数文件(PARFILE) 利用PARFILE 可以不考虑操作系统平台而使用完全相同的方法 下面给出一个例子 我用select * from all_objects建立了一个表T 我希望输出所有object_id 小于 的行 在Windows中 必须这样做 C:exp>exp userid=tkyte/tkyte tables=tquery= where object_id < 注意 在windows中 需要在WHERE语句的两端使用三个双引号 在UNIX中 必须这样做 $ exp userid=/ tables=t query= whereobject_id < exp userid=/ tables=t parfile=exp par如果使用包含query= where object_id < 的PARFILE文件 我可以在两个系统中使用相同的一个命令 exp userid=/ tables=t parfile=exp par在两种操作系统中 完全相同 这相对于在不同的平台中使用不同的QUERY字符串容易多了 问 DBMS_RANDOM 您能否告诉我写一个能产生大于 小于 的随机数的随机数产生器的最好方法?答 Oracle 版介绍了DBMS_RANDOM包 Oracle i 版介绍了DBMS_RANDOM包的新功能 但Oracle i 文档中没有详细全面介绍其功能 幸运的是 有一个新的DBMS_RANDOM包函数能够返回 之间的随机数 这个新函数是 FUNCTION value RETURN NUMBER;FUNCTION value (low IN NUMBER high INNUMBER) RETURN NUMBER;FUNCTION normal RETURN NUMBER;FUNCTION string (opt char len NUMBER)RETURN VARCHAR ;VALUE函数的第一种形式返回一个大于或等于 且小于 的随机数 第二种形式返回一个大于或等于LOW 小于HIGH的随机数 下面是其用法的一个示例 SQL> select dbms_random value dbms_random value( ) from al;VALUE DBMS_RANDOM VALUE( ) NORMAL函数返回服从正态分布的一组数 此正态分布标准偏差为 期望值为 这个函数返回的数值中有 %是介于 与+ 之间 %介于 与+ 之间 %介于 与+ 之间 事实上 这就是你在清单 中所看到的 最后 是STRING函数 它返回一个长度达 个字符的随机字符串 参数OPT可以是清单 显示的值中的任何一个单个字符 关于这些函数及DBMS_RANDOM包的文件都包含在SQLPlus中 select textfrom all_sourcewhere name = DBMS_RANDOM and type = PACKAGE order by line; 问 连接次序与谓词求值 在下面的查询中 WHERE 语句的哪一部分先执行?Select field names from emp deptwhere emp dept_num = dept num andemp name Like S% and dept name= IT ;答 执行次序随已有的索引 统计 和session/init ora参数的不同而变化 假定已有一个建立在DEPT(name)和EMP(dept_num)上的索引 假定优化器认为DEPT是唯一的 它可能按下面的顺序进行操作 利用建立在DEPT(name)上的索引查找dept列利用建立在EMP(dept_num)上的索引查找匹配的emp列(即连接emp dept_num = dept num)依据建立在emp ename like S% 进行过滤现在 我们假定没有建立在EMP(dept_num)上的索引 也没有建立在DEPT(name)上的索引 而存在建立在EMP(name)和DEPT(num)上的索引 优化器可能按下面的次序进行操作 利用建立在EMP(name)上的索引找到带有S的EMPS利用建立在DEPT(num)上的索引找到匹配项根据dept name = IT 过滤结果谓词求值的次序是不确定的 可以随时间的改变而改变 并由优化器决定 不要假定任何事情会按一定的次序发生 如果你那么做 随着时间的推移 你的应用程序可能会出现一些看起来非常奇怪的错误 看以下的例子 建立一个表 输入一些数据 当X= a 时 第二列的数据 Y 是一个数值 当X= b 时 Y 不是数字 SQL> create table t ( x varchar ( ) y varchar ( ) );Table created SQL> insert into t values ( a ); row created SQL> insert into t values ( b x ); row created 现在根据这个表运行一个查询 查找满足x= a y= 的行 SQL> select * from t where x = a andy = ;ERROR:ORA : invalid numberno rows selected(错误 无效的数字 没有选择任何行)呦 没有成功 在这种情况下 数据库首先执行Y= 当找到Y= X 的行后 很显然 它不能将 X 转换为一个数字 所以失败了 而下面的程序将给出不同的结果 SQL> *** yze table t pute statistics;Table *** yzed (表已经分析过)SQL> select * from t where x = a andy = ;X Y a 使用不同的优化器模式 成功了!为什么?优化器说 嘿 检查x= a 要比检查y= 来得快 因为在y= 中有一个将y从字符变为数字的转换 所以 我先检查x= a 然后再检查y= 这个例子说明谓词执行的次序可能是不确定的 你不能指望有一种特定的执行次序 也就是说 当你依靠一个隐含的转换时 必须非常谨慎 问 显示SGA fixed size(固定大小)与variable size(可变大小) 当在svrmgr提示符下运行 show SGA 时 fixed size和variable size是什么意思?答 fixed size就是SGA中固定组件(它在编译oracle 数据库本身时就固定于其中)的大小 它是固定大小的内存 用来指向SGA的其它部分 SGA这一部分的大小是不能改变的 variable size指分配的内存块大小可变 SGA的可变块 分为共享池 大池 JAVA池 游标区和其他结构 lishixin/Article/program/Oracle/201311/17509
⑹ ORACLE数据库常见问题诊断方法
ORACLE的这类错误在ORALCE的文档中有详细说明 但原因及措施说明不详细 本文当着重说明如何解决这类错误
ORA ORA ORA ORA
特征 客户端(代理或应用服务器)有时报这类断连错误
原因 如果偶尔出现一次 则可能为网络原因或用户异常中止 如果经常出现则为客户端与服务端的字符集不一致
措施 如果偶尔出现 可在服务端的协议配置文件PROTOCOL ORA中增加一行
TCP NODELAY=YES
如果经常出现 则为客户端与服务端字符集不一致或网络原因
客户端的字符集在注册表里定义
HKEY__LOCAL__MACHINE/SOFARE/ORACLE/NLS__LANG
在客户端注册表中的TCP参数项中设置
TCPMAXDATARETRANSMITIONS=
ORA
特征 达到会话允许的最大游标数
原因 达到会话允许的最大游标数
措施 有两种解决方法
( )
在初始化文件INIT<SID> ORA文件中增加OPEN_CURSORS的数量 一般要求大于
( )
在应用级 与开发工具有关 例如设置MAXOPEN_CURSORS等
ORA
特征 某个回滚段不可用
原因 ( )当使回滚段ONLINE时 但回滚段不可用 例如回滚段所在表空间OFFLINE;
( ) 当使回滚段ONLINE时 但回滚段已ONLINE 例如回滚段被使用两次 典型的案例如OPS方式时 回滚段不能公有;
( )删除回滚段时 回滚段中有活动的事务
措施 ( )确保回滚段可
( )从 初始化文件INIT<SID> ORA的参数ROLLBACK)SEGMENTS中删除指定的回滚段
( )
可以将回滚段所在表空间删除 取消UNDO事务
ORA x
特征 表空间没有足够的空间供分配
原因 表空间已满 存储参数不合理 NEXT太小 没有连续的区间
措施 如果表空间已满 则需为表空间增加文件 如果存储参数不合理 则需增加INITIAL和NEXT 如果没有连续的区间 需要合并空闲的表空间
查看空间碎片用DBA_FREE_SPACE
ORA
特征 当前会话无法读到以前版本的数据
原因 原因很多 主要原因有下列 回滚段太小 太少 回滚段冲突 交叉提交(FETCH_ACROSS)
措施 增加回滚段数量
ORA
特征 共享池内存区内存不够 或产生内存碎片
原因 当试图装载一个大包时或执行一个较大的存储过程时 而共享池没有连续的内存空间
措施 如果是内存不够 则增加SHARE)POOL_SIZE
如果是内存碎片 执行alter system flush share_pool
ORA
特征 触发器工作不正常
原因 一个行触发读取或修改变化的表(正在修改 插入)时 产生这种错误
措施 检查触发器脚本 保证引用完整性
ORA ORA
特征 介质故障导致数据库宕机
原因 介质故障
措施 检查硬件故障 修改dbshut脚本 将其中的STARTUP命令修改为
&nbs
p;
Startup open recover
lishixin/Article/program/Oracle/201311/17300
⑺ oracle数据库问题
一楼的不错
撤销操作是有DROP完成
SQL 约束
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
我们将主要探讨以下几种约束:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
注释:在下面的章节,我们会详细讲解每一种约束。
SQL NOT NULL 约束
NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新纪录或者更新记录。
下面的 SQL 语句强制 "Id_P" 列和 "LastName" 列不接受 NULL 值:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
SQL UNIQUE 约束UNIQUE 约束唯一标识数据库表中的每条记录。UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。PRIMARY KEY 拥有自动定义的 UNIQUE 约束。请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。SQL UNIQUE Constraint on CREATE TABLE下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 UNIQUE 约束:MySQL:CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
)
撤销 UNIQUE 约束
如需撤销 UNIQUE 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
SQL PRIMARY KEY 约束PRIMARY KEY 约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含 NULL 值。每个表应该都一个主键,并且每个表只能有一个主键。SQL PRIMARY KEY Constraint on CREATE TABLE下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束:MySQL:CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID PRIMARY KEY (Id_P,LastName)
)
SQL PRIMARY KEY Constraint on ALTER TABLE
如果在表已存在的情况下为 "Id_P" 列创建 PRIMARY KEY 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)
如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
注释:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
撤销 PRIMARY KEY 约束
如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons
DROP PRIMARY KEY
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
SQL FOREIGN KEY 约束一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。让我们通过一个例子来解释外键。请看下面两个表:"Persons" 表:Id_P LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing "Orders" 表:Id_O OrderNo Id_P 1 77895 3 2 44678 3 3 22456 1 4 24562 1 请注意,"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。FOREIGN KEY 约束用于预防破坏表之间连接的动作。FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。SQL FOREIGN KEY Constraint on CREATE TABLE下面的 SQL 在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY:MySQL:CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (O_Id),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
)
SQL FOREIGN KEY Constraint on ALTER TABLE
如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
撤销 FOREIGN KEY 约束
如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
SQL Server / Oracle / MS Access:
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
SQL CHECK 约束CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。SQL CHECK Constraint on CREATE TABLE下面的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。My SQL:CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)
SQL CHECK Constraint on ALTER TABLE
如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CHECK (Id_P>0)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
撤销 CHECK 约束
如需撤销 CHECK 约束,请使用下面的 SQL:
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
SQL DEFAULT 约束DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新纪录。SQL DEFAULT Constraint on CREATE TABLE下面的 SQL 在 "Persons" 表创建时为 "City" 列创建 DEFAULT 约束:My SQL / SQL Server / Oracle / MS Access:CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
SQL DEFAULT Constraint on ALTER TABLE
如果在表已存在的情况下为 "City" 列创建 DEFAULT 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
撤销 DEFAULT 约束
如需撤销 DEFAULT 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
SQL DROP INDEX 语句我们可以使用 DROP INDEX 命令删除表格中的索引。用于 Microsoft SQLJet (以及 Microsoft Access) 的语法:DROP INDEX index_name ON table_name
用于 MS SQL Server 的语法:
DROP INDEX table_name.index_name
用于 IBM DB2 和 Oracle 语法:
DROP INDEX index_name
用于 MySQL 的语法:
ALTER TABLE table_name DROP INDEX index_name
SQL DROP TABLE 语句
DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):
DROP TABLE 表名称
SQL DROP DATABASE 语句
DROP DATABASE 语句用于删除数据库:
DROP DATABASE 数据库名称
SQL TRUNCATE TABLE 语句
如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?
请使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据):
TRUNCATE TABLE 表名称
ALTER TABLE 语句ALTER TABLE 语句用于在已有的表中添加、修改或删除列。SQL ALTER TABLE 语法如需在表中添加列,请使用下列语法:ALTER TABLE table_name
ADD column_name datatype
要删除表中的列,请使用下列语法:
ALTER TABLE table_name
DROP COLUMN column_name
注释:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。
要改变表中列的数据类型,请使用下列语法:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
原始的表 (用在例子中的):
Persons 表:
Id LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing
SQL ALTER TABLE 实例
现在,我们希望在表 "Persons" 中添加一个名为 "Birthday" 的新列。
我们使用下列 SQL 语句:
ALTER TABLE Persons
ADD Birthday date
请注意,新列 "Birthday" 的类型是 date,可以存放日期。数据类型规定列中可以存放的数据的类型。
新的 "Persons" 表类似这样:
Id LastName FirstName Address City Birthday 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing
改变数据类型实例
现在我们希望改变 "Persons" 表中 "Birthday" 列的数据类型。
我们使用下列 SQL 语句:
ALTER TABLE Persons
ALTER COLUMN Birthday year
请注意,"Birthday" 列的数据类型是 year,可以存放 2 位或 4 位格式的年份。
DROP COLUMN 实例
接下来,我们删除 "Person" 表中的 "Birthday" 列:
ALTER TABLE Person
DROP COLUMN Birthday
Persons 表会成为这样:
Id LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing
⑻ oracle数据库问题
数据库 当打开一段时间时,没有被访问的时候会自动断掉,这是很正常, 我个人觉得是软件设计的问题,每次访问数据库时都要进行 ‘打开 访问 关闭’ ,不应该在软件刚打开初始化时去打开数据库,关软件时候去关闭数据库,不知道你明白没?
⑼ oracle数据库遇到的问题
第一个问题,你没写分号(sqlplus必须写分号)。没写分号,sqlplus认为sql语句没有写完,2表示第二行。
另外,根据你的数据库的版本不同,你可能还要授权dba权限(grant dba to XXXX)。有些oracle的版本,sysdba和dba是两个权限。