dbdao吧 关注:1,183贴子:4,074
  • 13回复贴,共1

【dbDao.com Oracle基础学习】Oracle 10g 入门宝典

只看楼主收藏回复

【dbDao.com Oracle基础学习】Oracle 10g 入门宝典
本帖的是dbdao.com 老郭的入门学习笔记,是个人心得欢迎大家讨论,定期更新 大家可以关注dbdaolaoguo的楼层。
本帖为长期更新帖子,欢迎定期上来看看。、


1楼2015-10-31 19:45回复



    3楼2015-10-31 20:55
    回复
      2025-12-27 02:32:20
      广告
      不感兴趣
      开通SVIP免广告
      好顶


      来自Android客户端4楼2015-11-01 09:27
      回复
        Oracle 10g 宝典第二章:主要讲述了oracle 在windos下的安装流程(利用的java GUI):首先进行安装前的检查:用户权限,防火墙和杀毒软件。检查硬件空间需求(tmp空间,内存等)确定计算机名的正确,有效。安装过程:一般选择默认的企业版.定制允许自行选择安装的组件。全局数据库名=数据库名.数据库域=DB_NAME+DB_DOMAIN,主要用于分布式系统中区分不同的数据库。SID用与区分同一台机器上同一个数据库中的不同历程。安装完成:Oracle 采用OFA--oracle软件和数据库文件以及目录的命名约定和存储位置 规则。树状的结构,重要的目录有 oracle_home下的 database(参数文件和口令文件),NETWORK、admin(网络连接和监听的配置文件) oradata(数据库物理文件)一般冷备份就是备份上述的文件。安装完成后,oracle 自动在注册表中写入了键值,添加了环境变量(linux 中要自己设置)。增加了一些相关的服务。


        IP属地:湖北5楼2015-11-01 11:44
        回复
          第三章主要讲解了OEM的功能
          是一个基于JAVA的WEB图形化的管理程序,使用OEM可以很方便的对oracle数据库进行一些操作和查询。
          管理属性页下:在例程中记录了所有参数文件中的相关参数,可以在此处查询或者进行修改(内存参数,undo等)存储中记录了数据文件,表空间等信息。安全性中记录了角色和权限的信息在方案中可以查询具体的对象(表,索引,触发器等),比直接查询数据字典表更方便直观。
          在性能属性中 可以查看到主机cpu 的情况(分页速率和运行队列长度)。还可以查看到会话的等待情况。 在维护中,可以对数据库进行导入导出,调度计划任务进行备份等操作。
          在日常操作中需要慢慢熟悉这个工具,灵活使用工具可以使得工作更加简洁,有效。熟悉工具需要有相应的环境,和实践


          IP属地:湖北6楼2015-11-02 09:37
          回复
            第5章主要讲解SQL语言
            SQL语言可以分为:
            1,DDL-- 数据定义语言 :create,alter ,rename ,truncate,grant,revoke,audit,noaduit,comment语句。
            2,DML-- 数据操纵语言:insert,update,delete,merge,explain paln,lock table的语句。
            3,TC -- 事务控制语言: commit,rollback,savepoint ,set transaction语句。
            在select 关键字后面指定 distinct 便可消除重复数据。
            Where 字句中使用数字值时,可以用单引号,也可不用。但是使用字符值,日期的是后必须使用单引号。因为区分大小写,和日期格式。
            字符串常量的两边只能用单引号。
            默认的日期格式是DD-MON-YY,由参数NLS_DATE_FORMAT设置,可以用alter session 进行设置。
            Like 通配符进行模糊查询:其中”%”表示0个或多个字符。”_”表示一个字符。
            如果实际的值有% 和_ ,一般使用\作为转义字符。
            可以在查询的列中使用(+ - * /)算术运算,|| 连接字符串,系统函数等。
            在select 语句中同时有多个字句(where,group by,having by)时,order by 必须放在最后。
            这个和union 后,order by 必须在整个结果集的最后类似。
            使用了distinct 关键字后,用于排序的列必须是查询的列。不然会报错。
            常用的分组函数
            MIN,avg,sum,count,variance,stddev。
            除了count(*) 之外,其他的分组函数,包括count(column_name)都会忽略null值。
            例如count(text) 得出的数值是不包含空值的,要处理空值,必须先用nvl 函数进行转换后在用count函数统计。
            查询的列 和表达式都必须出现在group by 中(除了组函数 不用,其他的都必须group by)
            分组函数也能用distinct 消除重复 ,例如 AVG (distinct sal)
            Rollup 用于生成横向的统计结果,cube 用于生成横,纵向结果。
            Group by 语句可以单独使用,但having by 只能与 group by 一起使用。
            Where 在进行组合处理之前过滤数据行,而having则 是在组合处理之后过滤数据组。
            应该尽量避免出现笛卡尔积的情况,也就是 from中有n个表时,where 字句中至少要有n-1个连接条件。
            集合运算:
            Union all 返回两个结果集的所有行,即并。--除了这个,都会进行默认的升序排序(默认加order by 1)
            Union 并,并且去掉重复行。
            Minus 返回第一个结果集中有第二个结果集中没有的行 即差(去重)
            Intersect 返回2结果集中都有的行--交
            当在相同查询中出现多个集合运算时,他们会从上到下,左到右运算。不会受到括号而影响优先级。
            列的个数和数据类型要匹配。最后结果集的列名采用第一个结果集中的列名。
            Order by 只能有一个,而且只能出现在最后面,并且只能使用第一个select语句中查询的列的列名或别名(如果与第二个查询中的语句列重复。就只能使用别名)。
            子查询最多嵌套255层。
            子查询分相关子查询 和不相关子查询。
            内外不相关的子查询:由里向外逐层处理。
            相关的子查询:首先取外层查询中表的一个记录,根据与内层查询相关的列值进行内查询的处理。处理为真,则记录结果。重复这个过程,知道外层查询中表的记录全部处理完。
            例如:
            Select deptno,
            (select max(sal) from emp b where b.deptno = a.deptno ) maxsal
            From emp a
            Order by deptno;
            多行子查询 使用成对的比较 或者in 关键字来处理。
            使用exists 运算符产生是否存在的逻辑值 true 或 false,使得子查询可以用一个列没有实际意义而被忽略==序列名“x”,“*”:
            Select ename,deptno,sal,job from emp
            Where exists
            (select ‘x’ from dept
            Where dept.deptno = emp.deptno and dept.loc = ‘new york’
            );
            在 create table 中使用子查询。可以创建新表并复制数据:
            Create table dept 1(a,b,c)as select a,b,c dept,创建所有列 可以用* 简化
            此种方法只能复制数据,不能传递依赖,约束,索引。
            物化视图创建方法与这类似。
            具体介绍了单行函数的用法:
            单行数字函数
            abs(x),返回x的绝对值:
            round(x,[,y]):四舍五入计算。如果省略y,则四舍五入到整数位;y是负数,则 到小数点前y位;y是正数,则到小数点后y位
            trunc(x,[y]) 执行截取数字。如果省略y是负数,则截取到小数点前Y位;如果y是正数,则截取到小数点后y位。
            单行字符函数:
            ASCII(<c1>):c1是字符串,返回c1第一个字母的ASCII码,逆函数式CHR(i)。其中i是数字chr(39),就是' 符号,在一些场合可以直接 使用chr(39) 连接使用。
            CONCAT(1,2)将1连接到2后面。如果2个值都为空,就返回空值。其中任意一个是空,就返回另一个值。
            nvl(x,value):如果x为空,则返回valuenvl2(x,value1,value2):如果x为空就返货v1,否则返回v2--这2个是常用的空值处理函数。用于处理某个字段为空的情况replace(c1,c2 [,c3]):把c1中出现的c2都替换成c3,然后返回剩余的字符串。c3默认是null,如果c2为null,则返回c1,如果c1为null,则返回null。
            在oracle中,时间和日期是一起存储的,数据类型是date或者 timestamp(或timestamp with local time zone).timestamp 类型比date类型 好在可以存储带有小数位的秒,和时区。
            常用的日期时间转换函数:
            to_cahr(x [,fmt]) :将x 按fmt格式转换成字符串。x是日期或数字,fmt是一种格式字符串
            to_date(c [,fmt]):
            将符合fmt指定的特定日期格式的字符串c转换成date类型的数据
            日期时间运算函数:
            add_months(d,n) :返回日期时间d加n月后所对应的日期时间
            n为负数就是之前的月,n为小数会自动忽略小数部分。
            current_date:返回当前会话时区所对应的日期
            current_timestamp([p]):
            返回当前会话时区所对应的日期时间。p为精度,默认是6(可以是0-9)
            localtimestamp([p]):和current_timestamp一样,但是再返回值得数据类型上有区别:
            dbtimezone:返回数据库所在的时区
            extract(c,from d):
            返回日期时间d中指定的部分c。c的取值为year,month,day,min,second,timezone_hour,
            timezone__minute,timezone_region,timezone_abbr.c必须在d中存在。
            last_dya(d):返回日期d所在月份的最后一天
            months_between(d1,d2):
            返回日期d1和d2之间相差的月数。如果d1小于d2,返回负数。如果d1等于d2,或者都是月底,返回整数。否则以每月31天来计算小数部分。
            next_day(d,c) :
            返回日期d后的下一个c。c是一个字符串(星期名称)
            --注意此处c可以是数字,1代表周日,7是周六(最后一天)。和linux 系统中0表示周日区分开。
            其实都是表示第一天
            round(d [,fmt]):
            返回日期时间d的四舍五入结果。如果fmt是year,则以7月1日为分界。month 以16日为分界。day以中午12:00为分界。
            sessiontimezone : 返回当前session时区偏(alter session的偏移量),有可能与dbtimezone相同
            ---并未用alter session修改时区。
            sys_extract_utc(ts):
            返回时间标记ts所对应的GMT时间。其中ts是一个timestamp with time zone类型的日期时间。
            systimestamp 返回当前数据库的一个timestamp with time zone类型的日期时间
            trunc(d [,fmt]):--截断的精度要注意
            返回fmt指定精度截断后的日期d。如果fmt是year,则为本年的1月1日。如果fmt是month,则为本月的1日。如果fmt是day,则天的个位被置为0(只有个位时不变) 也就是说截断DD的话
            TZ_OFFSET(tz):返回时区名tz指定的时区与UTC相比的时区偏差
            单行转换函数:
            任何number 或date的数据都可以转换为char,varchar2的数据
            仅包含数字,小数点,左边负号的情况下,char,varchar2的数据可以转换为number
            char,varchar2 的数据符合日期时间的默认格式时,可以转换为date数据。
            bin_to_num(n1,n2,n3...):将每位由n1,n2,n3组成的二进制转换为十进制
            cast(c as t):将表达式c转换成数据类型t。t可以是内建数据类型,也可以使是程序员自定义的数据类型。
            numtodsinterval(n,c):把数字n换成c指定的interval day to second 类型的数据。c的取值为day,hour,minute,second。c的大小写无关。
            to_dsinterval(c):将符合特定格式的字符串c换成interval day to second 类型的数据
            numtoyminterval: 把数字n换成c指定的interval year to month 类型的数据。c的取值为day,hour,minute,second。c的大小写无关。
            to_yminterval(c):将符合特定格式的字符串C 换成 interval year to month类型的数据。
            to_number(c [,fmt]):
            将符合fmt指定的数字格式的字符串c转换成数字类型。
            select to_number('$1234.56','L9999D99'),
            to_number('1234.56') + 56 from dual;
            to_timestamp(c):将字符串c转为timestamp数据类型
            to_timestamp_tz(c [,fmt]):将符合fmt指定的特定日期格式的字符串c转换为timestamp with time zone 类型。
            select to_timestamp_tz('2003-04-05','YYYY-MM-DD'),
            to_timestamp('2003-04-05','YYYY-MM-DD') from dual;
            unistr(c): 返回字符串c对应的unicode字符
            select unistr('\00D6'),unistr('ca\00D6on') from dual;
            greatest(e1,e2,e3....):找出其中最大的数返回,比较是按e1的数据类型为准。
            least(e1,e2,e3....):找出其中最小的数返回,比较是按e1的数据类型为准。
            字符串是按每个字符的ASCII码大小排序比较的
            select greatest(10,'101',9),least(10,'101',9) from dual;
            oracle 其中函数还有很多很多,这里只是介绍了常用的一小部分,例如case语句,decode等。这些函数都需要在工作的使用环境中多多运用才能更加的熟悉。


            IP属地:湖北8楼2015-11-04 14:11
            回复
              第7章主要讲述管理控制文件的相关内容
              控制文件主要包含下列内容:
              1、数据库创建时间。
              2、数据库的名称,一个控制文件只能管理一个数据库。
              3、表空间名称。
              4、相关的数据文件、重做日志文件的名称、位置、联机/脱机状态信息。
              5、重做日志存档信息。
              6、当前的重做日志的序号
              7、当前的重做日志的序号。--日志文件切换时被递增和记录的唯一标识。
              8、当前的检查点信息。
              9、撤销段的开始于结束信息。
              10、RMAN的备份信息。
              在创建数据库之前,可以再初始化参数文件中指定:
              如果没有指定control_files参数和OMF特性(初始化参数 DB_CREATE_FILE_DEST或DB_CREATE_ONLINE_LOG_DEST_n),会在默认的位置创建一个默认名称的控制文件(之后必须加入control_files参数中)
              --数据库默认会创建1-3个控制文件副本。(最多可以由8个控制文件复用)
              OMF,全称是Oracle_Managed Files,即Oracle文件管理,使用OMF可以简化管理员的管理工作,不用指定文件的名字、大小、路径,其名字,大小,路径由oracle 自动分配。在删除不再使用的日志、数据、控制文件时,OMF也可以自动删除其对应的OS文件
              OMF管理文件的方法
              1.使用ALTER SYSTEM SET db_create_file_dest = '<path>'设置路径
              2.查看刚刚的设置SHOW PARAMETER db_create_file_dest;
              3.创建表空间及数据文件CREATE TABLESPACE tablespace_name
              4.单独创建表空间CREATE TABLESPACE <> DATAFILE '<path>' SIZE <>;
              5.也可以创建undo和temporary tablespace 。CREATE UNDO TABLESPACE tablespace_name ;CREATE TEMPORARY TABLESPACE tablespace_name;
              6.删除表空间DROP TABLESPACE tablespace_name ;OMF情况下则删除物理文件,等效于未使用OMF创建,使用INCLUDING CONTENTS AND DATAFILES 删除方式
              可以在参数文件中将控制文件副本的位置定义到不同的磁盘(一般放在有重做日志文件组成员的独立磁盘上--把多个日志组,相同成员在一个磁盘)
              --建议使用多路复用。
              定期备份数据文件--改变了数据库物理结构之后:
              添加、取消或重命名数据库文件。
              添加或删除表空间,或者更改表空间的读写状态。
              添加或删除重做日志文件或重做日志。
              将控制文件备份为二进制文件:
              alter database backup controlfile to '/home/control.bkp';
              --实际上是在数据库运行期间复制当前的控制文件。
              将控制文件备份为文本文件(跟踪备份):
              alter database backup controlfile to trace;
              --存放在USER_DUMP_DEST指定的目录中,名称格式是SID_ora_pid.trc,这个其实是一个sql脚本,需要大量的编辑工作(给出create controlfile 语句格式和创建的基本步骤)
              可以用 dump file ... 输出跟踪备份的内容。
              创建新控制文件的情况:
              1、所有控制文件都受到永久性损坏,且没有备份过数据库。
              2、希望改变某个数据库参数的永久性设置,这些参数最初是在create database 语句中指定的。(MAXDATAFILES,MAXINSTANCES ,MAXLOGFILES)
              3、希望改变数据库名称。(分布式的数据库环境,高级复制)
              --使用create controlfile 语句作为数据库创建一个新的控制文件
              注意,这条语句中不能省略文件名,使用的时候要小心,不能少了某个文件,不然可能无法访问数据库,或丢失数据文件。
              ----------
              在DBCA创建Instance的时候,我们可以指定该参数。 如下图:--默认是100
              如果说是已经建好了,就只能重建控制文件来修改该参数值。先将控制文件dump 出来,然后修改改制,在重建控制文件
              show parameter db_files;
              实际控制datafile数量的是db_files参数,但是由于maxdatafiles会影响控制文件(会自动调整)
              ------------------------------------
              创建步骤:
              1、select memeber from v$logfile;
              select name from v$database;
              select name from v$controlfile;
              2、关闭数据库(immediate)。
              3、备份数据库。
              4、启动一个新的实例,但是不要装载或打开数据库(startup nomount)。
              5、使用create controlfile创建新的控制文件。
              例如:
              create controlfile reuse database "sybbjs" noresetlogs noarchivelog
              maxlogfiles 16
              maxlogmembers 10
              maxdatafiles 100
              maxinstances 8
              maxloghistory 454
              LOGFILE
              group 1 '/u01/..../redo01.log' size 50M,
              group 2 '/u01/..../redo02.log' size 50M,
              group 3 '/u01/..../redo03.log' size 50M
              --standby log file
              datafile
              '/u01/..../system01.dbf',
              '/u01/..../undotbs01.dbf',
              '/u01/..../sysaux01.dbf',
              '/u01/..../users01.dbf',
              '/u01/..../example01.dbf'
              character set zhs16gbk;
              6、在离线存储设备上跟新控制文件的备份。
              7、编辑control_files 初始化参数,如果重命名数据库,可以编辑DB_NAME参数
              8(可选)、可以用来恢复数据库(完整,封闭式数据库恢复过程)。如果控制文件时使用resetlogs选项创建的,就必须指定USING BACKUP CONTROL FILE(用来恢复联机或则存档的重做日志或数据文件)。
              9、alter database open;
              如果创建控制文件指定了resetlogs ,就可以用下列方式打开数据库:
              alter database open resetlogs
              ---------
              如果所有的控制文件均损坏,可以使用操作系统命令打开 strings 获取相关 数据文件,日志文件的信息。
              获取到位置和文件名之后,再按照固定格式重建控制文件。
              如果操作系统不能读取控制文件,那么只能人为的将所有的数据文件和在线日志文件找出来,进行重建。
              -重建必须按照noresetlogs选项来重建,否则打开数据库之后可能丢失业务数据。
              重建后,记录在控制文件中的相关数据库特性将丢失,例如数据库级别的 force logging
              --数据库控制文件重建后,其SCN取自数据文件 头SCN(resetlogs 重置日志模式)。还一种说法是nosetlogs 重建控制文件,控制文件中datafile checkpoint SCN来自online logs 中的current log头部
              (未验证)
              在线日志的大小决定了数据库的打开时间。
              删除控制文件:
              在nomount或者open 状态,用alter system set control_file=.. scope=spfile 删除不需要的控制文件。
              然后关闭数据库,在系统上删除掉物理文件即可。
              移动控制文件:
              和删除类似。必须要关闭或停止数据库(移动数据文件或日志文件并不需要)
              用alter system set control_file=.. scope=spfile 修改参数,关闭数据库,再在物理层面上移动文件即可。
              查询相关视图:
              v$controlfile
              v$controlfile_record_section 控制文件记录文档端的信息。
              例如:
              select type,record_size,record_total,records_used from v$controlfile_record_section;
              记录文档端类型,占的字节数,最大记录条数,已占用的记录条数
              v$parameter --control_file的信息。
              在OEM中管理控制文件:
              管理--存储--控制文件页面
              可以查看一般信息,高级,记录文档等内容。
              在一般信息中,可以点击备份到跟踪文件


              IP属地:湖北16楼2015-11-12 12:34
              回复
                12-13章讲述数据库创建和管理。
                数据库创建前首先要进行规划:
                1、可能包含的表,对象等大小,估计所需空间。
                2,对系统文件进行布局,均衡磁盘I/O。
                3、选择全局数据库名称--DB_NAME和DB_DOMAIN(demo.shanghai.com).demo是db_name,shanghai.com是db_domain。还要确定系统标识符SID(不能超过8位)。
                4、选择数据的字符集--选择客户访问数据库字符集的超集。
                5、选择标准的数据库尺寸(db_block_size)--一般默认是8kb,数据库创建后,不能更改。
                6、开发一套备份和恢复策略。
                7、最好先对存在的数据库进行备份。以防导致其他数据库被破坏。
                使用dbca图形化创建数据库:
                注意 全局数据库名格式
                <database_name>.<database_domain>
                注意设置数据库使用的字符集
                1、数据库字符集:在计算机屏幕上显示字符时所使用的编码方案。
                2、国家字符集:利用此字符集可以在没有unicode数据字符集的数据库中存储unicode字符。不会影响数据库字符集
                3、默认语言:确定数据库如何支持与区域设置相关的信息。
                4、默认日期格式:选择符合本国习惯的方式。
                select * from nls_database_parameters
                NLS_CHARACTERSET ---数据库字符集
                NLS_NCHAR_CHARACTERSET --国家字符集
                下一步,在数据库存储页面,可以对控制文件,日志文件进行调整。
                最后就可以创建数据库,也可以另存为模板。
                windos 下oracle 是自动随系统启动的,linux 下还要手动做一些配置。
                show parameters spfile 可以显示当前使用的服务器参数文件名称,一般命名的规范是spfile%ORACLE_SID%.ora
                下面列举一些常见的初始化参数:
                db_name:数据库名称,只能包含字符,数字,#,$,_,最多8字符。
                可以使用bbed直观的观察“
                set filename '../system.dbf'
                set blocksize 8192
                set block 2 --10g 的是 block 1
                p kcvfh --此时就可以看到kccfhdbn 就是db_name 的保留空间,共保留了8位--所以db_name不能超过8个字符。
                可以使用nid(oracle 自带的工具)来更换DB_NAME nid -help
                例如:
                必须在mount 状态
                nid target=sys/s1rq1qm0x2p_h7l4 dbname=sybbjs
                其实也是dded 修改控制文件,数据文件中的块记录。修改后所有的归档,备份失效。必须关闭(此时数据库已经关闭了,还需要把参数文件的db_name对应也修改),然后mount 以resetlogs打开数据库 alter database open RESETLOGS;
                --同一时间一个实例只能打开一个db_name的数据库(非RAC环境)
                db_domain:在分布式网络环境中的数据库域
                instance_name:实例唯一的名称。主要用于在RAC环境中表示一个数据库的不同实例。在单例环境下与db_name相同。
                service_names :服务名称(一个或多个)。客户程序使用服务名称连接到实例。默认是db_name.db_domain(全局数据库名)。
                control_files:控制文件名称,之间用逗号隔开(多路复用)。最多可以指定8个。
                db_block_size:标准oracle 块大小。可以是2048,4096,8192,16384,32768.在创建数据库时指定,之后不能更改。
                db_cache_size:数据高速缓存的大小(buff cache)。在标准块上的读写操作会使用标准高速缓存。
                最小值为一个粒度(granule)。
                粒度(granule):粒度是连续虚拟内存分配的单位,粒度是9i新引入的参数,其大小取决于SGA_MAX_SIZE参数所定义的SGA总的大小--如果是自动管理SGA,手动设置这个参数的值只会当成最小值,实际值会自动调整。
                db_nk_cache_size:非标准数据高速缓存大小。包括db_2k(4k,8k,16k,32k)_cache_size.
                注意-如果是默认的8k块,那么将无法定义db_8K_cache_size参数,其粒度由db_cache_size指定。
                shared_pool_size:共享池大小
                java_pool_size:java池大小。
                large_pool_size:大缓冲池的大小。
                pga_aggregate_target:实例所有服务器进程占用的总计PGA区的大小。(配置PGA的参数)
                sga_target:实例所有服务器进程占用的总计SGA区的大小。(配置SGA的参数)
                db_recovery_file_dest:恢复文件的文件夹位置--flash recover 特性。如果归档路径为设置,也会存放在此文件夹中。可以指定多个位置,用逗号分隔。
                db_recovery_file_dest_size:大小,默认是2G,如果归档存放到此处,可能会把空间耗尽,届时数据库会挂起等待空间足够。
                remote_login_passwordfile:特权用户的验证方式(NONE,SHARED,EXCLUSIVE)。NONE-使用操作系统验证,shared 表示多个数据库可以共用一个口令文件(同一主机上的多个数据库,当然也可以使用符号链接的方式)
                --此参数默认是exclusive 而且是静态参数。其实如果没有其他的用户有sysdba身份的话,EXCLUSIVE也是可以被其他实例使用的。因为这个只在启动的时候才读取该文件,运行过程中并不锁定。
                exclusive 表示口令只能用于单个数据库。
                --一般设置成NONE,这样SYS用户只能本地登陆。把相关dict赋予其他用户登陆,这个是安全方案中去掉最大权限用户的方法。
                v$pwfile_users,show parameter password
                undo_management:撤销管理的模式--建议是auto(默认值,使用undo表空间来管理撤销数据),manual 表示使用回退段(事务产生的时候分配回退段)来管理撤销数据(手动管理)。
                undo_tablespace:启动实例时使用的undo表空间。
                audit_file_dest:审计文件所在的文件夹
                diagnostic_dest:诊断,跟踪文件所在的文件夹。dump文件夹
                processes:连接到oracle 的并发进程的最大个数。
                open_cursors:单个会话可以同时打开的最大游标个数。
                更改初始化参数:
                alter session| system ,当前会话或者系统级别修改。scope = spfile| memory | both
                spfile 选项 只改动文件里的参数,更改效果在重启后生效并保留。--静态参数的修改方法
                memory 只更改内存中的参数,对于动态是立即生效的,但是重启后不保留。静态参数不能这样修改。
                both 都更改,动态参数立即生效并保留(不声明scope 的默认值)
                对于动态参数,可以在语句最后指定deferred 关键字,更改只影响将来的会话。
                comment 子句允许为参数更新添加注释的字符串(方便以后查询)
                例如:
                alter system set job_quene_processes=50
                comment='temporary change on 2014-06-06'
                scope=memory;
                --某些参数不能这样更改,就只能手动去更改参数文件,例如db_name,手动更改完后,还要重新创建控制文件。
                启动数据库的各个选项:
                启动的状态可以用alter database 升到高一级状态,但是不能返回低一级状态(nomout-mount-open)
                nomunt 只创建实例,但不装载数据库。读取参数文件,创建内存结构和后台进程(未使用控制文件)。
                可以访问那些与SGA有关的视图
                --运行创建新数据库的脚本 和重建控制文件 必须在此状态。
                mount 不仅创建实例,还装载数据库(从控制文件中获取数据库物理结构信息),但不打开数据库。
                此时还可以访问与控制文件相关的视图。
                重名名,增加,删除数据、重做日志文件。执行数据库的完全恢复。改变归档模式都在此状态下进行。
                open 创建实例,装载数据库,开打数据库。默认startup 不指定选项时 使用open。
                force 使用此选项可以在任何模式下直接重新启动数据库(先异常关闭,再重启),不需要先shutdown。
                此选项很少使用,如果突然断电,数据库可能遗留在一个只能用force启动的状态。。
                restrict 只让拥有restricted session权限的用户能访问数据库。--也可以与其他选择组合,默认是open
                一般用户维护任务防止一般用户使用数据(数据库的导入和导出,数据装载-sql*loader,数据库移植和升级)
                alter system disable restricted session --禁用restricted session权限,其他用户可以连接并使用数据库。
                pfile 选项 在启动的时候可以手动指定使用的参数文件--一般用于spfie丢失,手动创建pfile时(效果个create spfile from pfile 相同)
                关闭数据库的各个选项:
                normal:阻止新的用户连接,等到当前所有用户断开连接(可以不断的进行新的事务工作)后才关闭、卸载数据库,终止实例、
                --要找出连接的用户,通知他们尽快断开连接。下次启动时不需要任何恢复。
                transactional:阻止新用户连接,同时也阻止新的事务,一旦当前未提交的事务提交完毕,立即断开用户连接。所有用户全部断开后,关闭数据库。
                --下次启动时不需要实例恢复。
                immediate :
                即将发生电力中断,启动自动数据库备份操作,或者本身某个数据库应用程序异常,无法断开操作的时候。
                阻止新连接和开启新的事务,任何未提交的事务均回滚。然后关闭数据库
                --如果存在很多未提交的事务,也会耗时很多。下次启动时不需要恢复操作。
                abort:
                数据库本身异常,其他选项不能关闭数据库。紧急情况,例如1分钟内断电等。在启动数据库实例时发生错误的时候使用。
                阻止新用户和新事务,终端当前执行的sql。不会回退事务而直接断开所有用户连接 关闭数据库
                --由于未完成的事务没回滚,所以可能丢失一部分数据。在下一次启动时需要进行恢复。
                在windos 下oracle 的服务是自动启动的:
                在管理工具中 服务选择下
                oracle<ORACLE_HOME_NAME>TNS istener 数据库监听程序
                oracleService<ORACLE_SID> 数据库实例
                oracleDBConsole<ORACLE_SID> OEM
                注意设置成手动类型,以免开机启动占用较多的资源。


                IP属地:湖北20楼2015-11-16 14:48
                回复
                  2025-12-27 02:26:20
                  广告
                  不感兴趣
                  开通SVIP免广告
                  第13章主要讲述oracle网络特色和配置工具。
                  目前使用的网络驱动是 oracle net
                  具有跨平台,支持异构和分布式,多协议等特色
                  oracle 的链接管理器提供了防火墙机制
                  支持ODBC、JDBC标准网络接口
                  oralce网络中的基本概念:
                  一个数据库是用一个“服务名”来标识的,是数据库的逻辑表示。全局数据库名是数据库默认的服务名,在listener.ora中由SERVER_NAME来表示。
                  用户一般不希望输入一大串连接标识符(描述使用什么协议,哪个端口,连接到哪个主机,数据库等信息)来连接数据库,可以用一个网络服务名(net服务名),来帮助客户机端应用程序准确的连接到指定的数据库服务。
                  网络服务名被存储在 tnsname.ora中--大小写不限
                  网络会话时通过监听程序建立的(一个单独服务端进程,监听连接请求,管理客户机与服务器间的网络通信量)
                  存储在服务器端listenner.ora文件中。
                  一台数据库服务器可以运行多个监听程序,一个监听程序可以监听多个协议地址(ADDRESS部分)
                  专用服务器模式:
                  服务器端进程不在客户端共享,由监听为每一个客户机端启动一个专用的服务器进程。
                  server = dedicated
                  共享服务器进程:
                  server = shared,多个客户机端的连接由一个调度进程来安排一个共享服务器进程来维护。
                  这样使得多个用户进程可以共用很少的服务器进程,可以减少服务器的数量。
                  网络配置:
                  在服务器端,一般是不需要配置tnsnames.ora(本地命名法)。但是要与其他服务器连接(分布式网络环境),就需要配置。每个listenner.ora和tnsnames.ora的内容可能不同。
                  配置文件listenner.ora
                  SID_LIST_LISTENER =
                  (SID_LIST =
                  (SID_DESC =
                  (GLOBAL_DBNAME = syb2)
                  (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
                  (SID_NAME = sybbjs)
                  )
                  )
                  --静态注册
                  SID_LIST_LISTENER =
                  (SID_LIST =
                  (SID_DESC =
                  (SID_NAME = PLSExtProc)
                  (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
                  (PROGRAM = extproc)
                  )
                  )
                  --第一行 是监听程序的名称,可以任意取其他名称。
                  DESCRIPTION_LIST:开始列举某个监听程序监听的网络协议地址
                  description : 开始描述监听的网络协议地址
                  address_list : 开始列举监听的网络协议地址。ADDRESS 为监听的某个协议地址,PROTOCOL为监听的网络协议,host 为主机名称,post 为监听的端口号。
                  IPC 是来自本机及调度程序的内部进程调用请求,key = 服务名(本地)或sid(远程)。--如果没配置这个,默认本地也会走TCP 1521端口。
                  sid_list_listener:定义配置监听程序所针对的oracle数据库服务的列表。多个数据库运行使用同一个监听程序。SID_LIST就是其多个数据库的列表。SID_DESC就是每个数据库的描述。ORACLE_HOME是oracle可执行的位置。
                  SID_NAME:监听服务的实例名。
                  GLOBAL_DBNAME:指的是监听服务的服务名。默认是与SID一致 可以与SID_NAME不同。可以省略。
                  (如果设置了这个参数,RAC环境下 TAF和 connect-time failover特性将失效)
                  --特别注意,任何错误乃至空格都可能使配置失败。而且是大小写敏感
                  --静态注册下 即使数据库实例关闭,具有sysdba权限的业务用户仍然可以通过监听连接到数据库进行维护操作。
                  tnsnames.ora中的 service_name的值必须和listener.ora的关键字GLOBAL_DBNAME或 ORACLE数据库中参数 SERVER_NAME(DB_NAME.DB_DOMAIN)相同。如果 是使用SID的话,tnsnames.ora中的SID必须 和listenter.ora中的SID_NAME相同
                  动态注册:
                  LISTENER =
                  (DESCRIPTION_LIST =
                  (DESCRIPTION =
                  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)
                  (PORT = 1521))
                  (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) --本地的
                  )
                  )
                  --一般采用的是动态注册(在没有listener.ora 配置文件的情况下,如果启动监听,则监听为动态注册。用图形工具netca创建的监听,默认也是动态注册)
                  也就是说,没有listener.ora文件,也可以使用lsnrctl start开启监听。
                  首先要在参数文件中设置,service_name ,instance_name.
                  service_name可以用逗号配置多个值--只能1521,TCP
                  可以手动来手动切换监听--配置多个端口的。(当某个监听出故障时)
                  --要实现动态注册,数据库至少是在nomount状态。
                  动态注册的 3种状态 (lsnrctl status)
                  ready:表示数据库实例处于mount或open状态,可以接受客户端的连接。
                  blocked:表示数据库实例还处于nomout状态,或者该实例类型为ASM实例。不接受客户端的连接。
                  restricted:表示数据库处于resrrict模式。不接受普通权限的远程客户端连接。
                  --动态注册监听最好是在数据库之前启动,减少业务影响时间。
                  =================
                  ----lsnrctl service reload [listener_name] 默认监听可以不输入name
                  重载监听配置(修改了listener.ora之后)
                  使用别名:
                  ALIAS=
                  (DESCRIPTION=
                  ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.100)(PORT=1521))))
                  SID_LIST_ALIAS=
                  (SID_LIST =
                  (SID_DESC =
                  (GLOBAL_DBNAME = syb2)
                  (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
                  (SID_NAME = sybbjs)
                  )
                  )
                  --这样所有的命令就需要输入alias name来操作了
                  在配置HOST的时候 在HA 等模式下,最后使用HOST主机名,这样可以同时监听多网卡(/etc/hosts 下要配置好)。
                  就是设置了 主机别名 也是一样的
                  例如:
                  /etc/hosts下
                  192.168.0.100 test test1
                  设置监听的HOST是test1 监听启动后会自动解析到test
                  /etc/hosts下 要配置
                  192.168.0.100 test
                  192.168.0.101 test1
                  也就是说 同一主机下的不同ip可以使用同一个端口:
                  LISTENER =
                  (DESCRIPTION_LIST =
                  (DESCRIPTION =
                  (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.0.100)(PORT = 1521))
                  (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.0.101)(PORT = 1521))
                  )
                  )
                  如果使用主机名和别名则不能这样,必须加上IP=FIRST
                  例:
                  (ADDRESS = (PROTOCOL = TCP) (HOST = TEST) (PORT = 1521) (IP = FIRST))
                  (ADDRESS = (PROTOCOL = TCP) (HOST = TEST1) (PORT = 1521) (IP = FIRST))
                  --同一主机下的同一IP可以使用不同端口,同一主机下的不同ip也当然可以使用不同的端口。
                  LISTENER2 =
                  (DESCRIPTION_LIST =
                  (DESCRIPTION =
                  (ADDRESS = (PROTOCOL = TCP)(HOST = test-db.shengkangda.com)(PORT = 8082))
                  )
                  )
                  SID_LIST_LISTENER2 =
                  (SID_LIST =
                  (SID_DESC =
                  (ORACLE_HOME = /oracle/product/11.2.0)
                  (SID_NAME = bate)
                  )
                  )
                  例如再创建一个监听器监听到不同的端口,此时必须用静态监听。
                  lsnrctl status LISTENER2
                  lsnrctl start LISTENER2
                  --动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP),因为pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,如果需要向非默认监听注册,则需要配置local_listener参数
                  动态注册:多个端口
                  listener =
                  (DESCRIPTION =
                  (ADDRESS_LIST =
                  (ADDRESS = (PROTOCOL = TCP)(HOST = LUJUN)(PORT = 1521))
                  (ADDRESS = (PROTOCOL = TCP)(HOST = LUJUN)(PORT = 1621))
                  )
                  (CONNECT_DATA =
                  (SERVICE_NAME = orcl)
                  )
                  )
                  动态注册:多个监听
                  LISTENER2 =
                  (DESCRIPTION_LIST =
                  (DESCRIPTION =
                  (ADDRESS = (PROTOCOL = TCP)(HOST = LUJUN)(PORT = 1523))
                  )
                  )
                  如果同一主机存在不同版本的数据库,最好是单独使用各自的监听 启动到不同的端口来处理客户端会话。
                  但是一定要使用同一端口 可以使用下面的方法:(存在bug)
                  SID_LIST_LISTENER=
                  (SID_LIST =
                  (SID_DESC =
                  (GLOBAL_DBNAME = syb1)
                  (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
                  (SID_NAME = sybbjs)
                  )
                  (SID_LIST =
                  (SID_DESC =
                  (GLOBAL_DBNAME = syb2)
                  (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
                  (SID_NAME = sybbjs)
                  )
                  )
                  tnsping 只单纯的检查监听服务是否正确启动,并不检查服务句柄。例如客户端的server_name和监听服务中的名字不匹配,在客户端使用tnsping 是正常的。
                  在某些平台 tnsping存在内存泄露,可能导致tnsping服务器由于内存耗尽而hang机
                  在sqlnet.ora配置下面内容,可以对tnsping进程活动进行跟踪:
                  TNSPING.TRACE_LEVEL = [OFF|USER|ADMIN|SUPPORT]
                  TNSPING.TRACE_DIRECTOYR = <path where tnsping.trc will go>
                  sqlnet.ora 配置文件可以配置限制ip访问:
                  TCP.VALIDNODE_CHECKING作为限制IP访问的开关项目。如果设置为yes,就表示启用限制功能。TCP.INVITED_NODES是一个列表参数,用于列出允许连入的IP地址列表
                  例如:最好把本地 127.0.0.1加上,免得出现其他的问题。
                  cat sqlnet.ora
                  TCP.VALIDNODE_CHECKING=yes
                  TCP.INVITED_NODES=(172.17.22.51,127.0.0.1)


                  IP属地:湖北21楼2015-11-17 10:43
                  回复
                    第15章对方案对象-表的管理进行介绍
                    方案是一系列逻辑数据结构或对象的集合,其名称与用户的名称相同。即orale用方案的方法将数据库按用户划分。
                    包含定义和数据的对象:表、索引
                    只包含定义的对象:视图、同义词、序列、过程、函数、触发器
                    表按列进行定义,存储若干行数据。表中至少uoi一列.(每个列都有列名、列数据类型、列长度,可能有约束,默认值等)
                    创建表时,表名和列名有以下要求(建议统一命名规范):
                    1、长度在1-30个字节之间。
                    2、必须以一个字母开头。
                    3、能够包含字母、数字、下划线、# 和$,但是不鼓励使用#和$。
                    4、不能使用保留字,如number或index。
                    5、如果名称被围在双引号中,唯一要求是长度限制,且不饿能够再嵌套双引号。
                    6、每个列名在一个表内必须是唯一的。
                    7、表名在在对象名称空间内必须是唯一的。(表,视图,序列,专用同义词 公有一个名称空间)。
                    --注意表名和列名是不区分大小写的,除非用“”括住。oracle 自动转换成大写存储在数据字典中。
                    建议不要用“”进行命名,这样会导致混合命名的存在。
                    不要是使用中文拼音简写来作为表名,列名,容易引起歧义。
                    字符类型:
                    char[(<size>)[byte|char]]:定长字符串。默认是byte选项,最大长度是2000字节。如果列值比定义的长度短,会在尾部添加空格。
                    nchar[(<size>)]:类似char,用于存储unicode字符集数据。默认长度是1字符。
                    varchar2(<size>[byte|char]):存储可变长的字符数据。必须使用size定义最大长度,默认是byte。允许最大的长度是4000字节。不会自动添加空格。
                    nvarvhar2(<size>):类似的存储可变长度的unicode字符集的字符数据
                    大对象数据类型:
                    CLOB:可变长的字符数据。一个CLOB列中可以存储的最大数据是4GB。
                    NCLOB:可变长度的unicode,与clob类似。
                    BLOB:用来存储变长的二进制数据。在客户机与服务器进程之间不经历字符集转换。
                    bfile:在数据库外面存储可变长二进制格式的数据文件--4GB,列中存储的是指针。
                    --大对象类型不能出现在where、group by或order by 子句中,也不能再sqlplus等环境中查询。不能通过insert语句插入。
                    二进制数据类型:
                    rowid:存储一行的物理地址。由18个字符组成,可以利用rowid进行查询,更新,删除操作。
                    urowid:存储索引组织的表或非oracle 数据库表的逻辑rowid。根据索引组织表的主键生成逻辑urowid。
                    oracle 提供的约束条件:
                    一个无任何约束的表时无意义的。也不能创建一个不带表的约束。
                    约束:not null,unique ,check,primary key,foreigen key
                    其中,not null 是列级约束,只能在列级别定义。
                    会自动在unique 约束上创建唯一索引,如果已经有索引了,会使用已有索引。也可以指定索引存储位置和参数。
                    check 约束中必须引用表中的一个列或多个列,并且结果是一个布尔值。不能包含子查询,不能使用sysdate。UID.USER.USERENV等内置的SQL函数和ROWID.ROWNUM等伪列。
                    primary key:等价于一个unique和not null ,一个表只能有一个primary key(可以列组合)
                    foreigen key:引用的列可以是本身表中的列(自引用),必须参照一个主键或者unique约束,同样可以列组合。
                    约束在定义的时候可以指定4中状态:
                    enable--检查新数据(默认)
                    disable--约束不起作用,不检查新数据(导入,导出表,sql*LOADER或insert从外部数据源提取大量数据到表,对表进行大量操作的批处理。)
                    可以用execptions into 获取那些禁用约束时,违反约束的记录。
                    validate:检查所有记录是否满足约束(默认)
                    novaildate:不检查已有记录。
                    两两组合就有4种不同的方式--再配合延迟约束使用,可以在不同场合满足不同的业务需求
                    约束在定义和修改:
                    多列的复合约束只能在表级定义,但是not null 只能在列级。
                    不能在clob,nclob,blob,bfile,long,longraw ,timestamp with timezone 数据类型的列上定义约束。
                    增加和修改约束和列类似,使用alter table 字句,但是注意not null 必须用modify 来增加(因为它是列级的约束)
                    例如:alter table table_name modify aaa not null
                    在定义和添加foreigen key 的时候可以指定在级联删除时的行为 delete cascade(默认),还是 delete set null 或者不做任何操作delete no action
                    删除约束
                    alter table table_name drop constraint fk_name | unique(id);
                    同理删除not null 必须用modify
                    例如:
                    alter table table_name modify aaa null;
                    修改约束名和状态:
                    名称使用rename 关键字进行修改--alter table a ranme b_fk to b_fk_1;
                    约束的延时检查:
                    默认情况是not deferrable--每一条DML后立即检查约束。约束一旦创建就不能改变延迟性,只能删除重建。
                    创建时指定 deferred 来改变检查时机--事务结束时检查。可以另外指定 initially immedate 或者 initally deferred,可延时约束立即检查(和默认情况一样)或者初始状态就是延迟检查 。可以使用alter table 改变检查时机(利用 initially immedate 和 initally deferred,改善了约束不能变化延时性的问题)


                    IP属地:湖北22楼2015-11-18 10:45
                    回复
                      例如:
                      alter table new_statudent
                      modify constraint kf_new initally deferred; kf_new --开始就是可延时的
                      set constraints all deferred
                      set constraints all immdiate --整库改变
                      创建表应遵守的策略:
                      1、对象的命令规范
                      2,、使用comment 命令描述表、列的作用--表结构的整理。
                      3、使用3范式来规划每个表。
                      4、确定表所需的完整性约束。
                      5、在定义表的列时,可以将允许为空的列值放在后面
                      6、在合适的情况下,使用簇表来节省存储空间并提高特定类型的sql语句性能。
                      --类似关联指针,使得簇表行数据可以存放到同一块中。(共享数据块)
                      表的类型:
                      标准表--默认情况下创建的基础堆表。
                      索引表--索引叶子节点同时包含键列数据和其他列的数据。
                      外部表--数据存储在数据库之外的操作系统文件中。
                      分区表--数据划分为更小的分区,每个分区可以独立管理和操作。(可以放在不同的表空间,使用不同位置的数据文件。)
                      --不要将表随意分散地创建到不同的表空间中,这会使执行某些数据库管理和维护花费更多的时间。
                      在创建大表的时候(同时有数据插入),可以指定nolooging 加快创建速度、使用sql*loader或大量insert语句进行直接装载时 nologging也能加快速度。
                      将大表的索引和数据分开存放,并且注意保证临时表空间中有较大的临时段(创建临时表空间storage子句中参数设置,并不是自动增长就能分配的。),来给应用程序访问大表排序时使用。
                      不管创建表之前是否估计过大小,都可以在创建表时明确地设置存储参数,没有明确设置任何存储参数都会自动使用该表所在表空间的存储参数。
                      创建临时表:
                      关键字temporary或global temporary(所有用户均可看到)。
                      事务临时表--通过指定 on commit delete rows关键字,数据只在当前事务内有效。
                      只在当前事务内可以查看,事务结束后,临时数据自动清除。
                      会话临时表--on commit preserve rows 数据只在当前会话内有效。不管事务是否结束,关闭当前会话(或进行新的连接),数据会被全部删除。
                      删除--drop table temp1 cascade constraints
                      创建索引表:IOT index table
                      一种特殊的表,将表的数据和索引数据存储在一起,以B树索引的方式来存储数据。
                      索引表中的rowid 是逻辑的rowid,实际存放的是主键的列值。(必须指定主键)
                      与标准表只是在内部存储结构上有区别,如果经常利用主键列来查询整条记录或者查询大多数是主键列,并同时查询个别非主键列,可以创建索引表来提高查询速度。(没有普通表,索引的回表操作)
                      可以考虑设置溢出存储区--将那些不查询的列存放到溢出存储区中(标准表),索引表的条目中保存这些溢出表的rowid(此时查询溢出存储区的列将慢很多)
                      --但是在维护上开销较大,有新数据时,可能要移动行,腾出空间使插入的数据符合组织。
                      表中数据变化频繁,或者必须对表中的非主键列建立索引的,不适合使用索引表。
                      例如:
                      create table IOT1
                      (
                      id number(6),
                      name varchar2(9),
                      constraint pk_id primary key(id) validate
                      )
                      organizaton index --表示创建时一个索引表,还可以用tablespace子句指定表空间。
                      pctthreshold 40
                      including address
                      overflow tablespace myts;
                      pctthreshold --定义在索引数据块中为索引表保留的空间的百分比,头段满足阀值存储在索引叶子数据块。尾端按一列或多列存储在溢出数据段中。
                      including --在子句中指定的列和之前的非键列只要不 超过阀值,都会存储在索引叶子块中。
                      overflow tablespace (可选)--用于指定溢出存储区域的表空间。
                      通过查询创建另一表 (CTAS):
                      不能指定表空间选项。
                      可以更改列的名称,但是数据类型和长度与原表是一致的。
                      约束条件以及列的默认值定义等都不会被复制。
                      在大表中可以使用nologging 获得较大的性能提升。
                      例如:
                      crrate table new_emp2
                      as select empno,ename empname,mgr manager from emp
                      nologging;
                      添加列:
                      alter table table_name add (字段名 字段);
                      新添加的列总是位于表的末尾。
                      修改列:
                      alter table table_name modify
                      (old_column new_column, .... , ...)
                      一般情况对列不做修改
                      --可以增大字符型列的长度和数值列的精度。
                      如果相关列的所有数据都符合新的长度,可以减小varchar2的长度。
                      如果初始化参数blank_trimming为true,可以降低一个非空char列的长度。
                      如果不减少长度,varchar2和char 的数据类型可以互换。
                      ---在增加和修改的时候都可以添加默认值。
                      注意,如果增加列使用default 值(not null)的话,
                      alter table t add MrDai number ;
                      alter table t modify MrDai number default 10000; 再进行手动批量update MrDai=default
                      重名列:
                      ALTER TABLE text RENAME COLUMN old to new;
                      删除列:
                      alter table table_name drop (colum_1,column_2) [cascade constraints];
                      如果列上有多列约束(例如外键,其他列的check)就要指定级联选项。
                      在数据库高峰期一般不直接删除,可以暂时是用alter table set unused,将列置为unused状态,等空闲期再删除数据。--空间没有被释放
                      使用 alter table table_name drop unused columns--删除表上的unused列。
                      例如:alter table FLOW_CUST_REPORT_IMAGE set unused COLUMN EXAM_ITEM_ID;
                      查询使用user_unused_col_tabs、ALL_UNUSED_COL_TABS和DBA_UNUSED_COL_TABS
                      --对列的操作都不会锁表(修改,增加列 名 大小,删除列--待测试)删除过后具体列名就查不到了,对象名已经改变,只能查到表上共有几列被置为unused。
                      unused 的列其实是对象数据字典删除,但是数据还在,出来使用备份恢复的方式外,可以参考下面的例子进行恢复:
                      --刚才有个人问我如何修复被设置为UNUSED的字段,我考虑了一下,以下的方法可以恢复(以下步骤执行前要做好备份),没有经验的DBA不要轻易尝试。
                      1、创建实验表TTTA
                      SQL> CREATE TABLE TTTA ( A INTEGER,B INTEGER,C VARCHAR2(10),D INTEGER);
                      表已创建。
                      SQL> INSERT INTO TTTA VALUES (1,2,'3',4);
                      已创建 1行。
                      SQL> INSERT INTO TTTA VALUES (2,3,'4',5);
                      已创建 1行。
                      SQL> COMMIT;
                      提交完成。
                      ALTER TABLE TTTA SET UNUSED COLUMN C;
                      2、以下进行恢复
                      SQL> SELECT OBJ# FROM OBJ$ WHERE NAME='TTTA';
                      OBJ#
                      ----------
                      32067
                      SELECT COL#,INTCOL#,NAME FROM COL$ WHERE OBJ#=32067;
                      COL# INTCOL# NAME
                      ---------- ---------- ------------------------------
                      1 1 A
                      2 2 B
                      0 3 SYS_C00003_08031720:09:55$ 被UNUSED的字段
                      3 4 D
                      SQL> SELECT COLS FROM TAB$ WHERE OBJ#=32067;
                      COLS
                      ----------
                      3 ------字段数变为3了
                      SQL> UPDATE COL$ SET COL#=INTCOL# WHERE OBJ#=32067;
                      已更新4行。
                      SQL> UPDATE TAB$ SET COLS=COLS+1 WHERE OBJ#=32067;
                      已更新 1行。
                      UPDATE COL$ SET NAME='C' WHERE OBJ#=32067 AND COL#=3;
                      UPDATE COL$ SET PROPERTY=0 WHERE OBJ#=32067;
                      SQL> COMMIT;
                      3、重启数据库
                      SQL> SELECT * FROM SCOTT.TTTA;
                      A B C D
                      ---------- ---------- ---------- ----------
                      1 2 3 4
                      2 3 4 5
                      恢复完成
                      --------------------------------------
                      增加注释:
                      comment on table table_name IS '***'
                      comment on column table_name.colmn is '**'
                      查询dba,all,user_col_comments
                      --其实注释一般是在设计表,规划表结构的时候一起写入开发文档中的。
                      select * from user_tab_comments --用来看表注释
                      重命名:
                      rename old_tablename to new_tablename;
                      --这种改表名的方法只能在当前用户中使用,不能指定方案。
                      alter table old_tablename rename to new_tablename;
                      --可以指定方案,但是要有alter any table 权限。
                      注意:rname 表,其实只是在数据字典中吧相关对象-表名更换(定义可能改变),但是储存数据不变。如果将不同类型的表的表名呼唤,使用的数据还是本身原来的数据(普通表和分区表交换的简单方法)
                      表名 b-> a a->c(空对象)->b
                      | | | |
                      数据 b b a a
                      --这样访问a表其实就是原b表(数据及结构),访问b表就是访问的原a表(数据及结构)
                      如果2个表的列名,结构都不同,那么原查询字段sql将不可用。
                      --不知道这个方法能否转移使用的表空间(待测试)
                      如果法相一个表的数据段有不合理的区分配方式,或者有空间碎片和行迁移,就可以考虑重新组织表。
                      alter table table_name MOVE; --重建表,相当于进行出导入操作,用来取消行链接和迁移
                      --也可以指定tablespace ,指定移动到某个表空间中,从而使用其他表空间椎间盘某个,来符合存储参数的存储需求。
                      注意move时 要保证表空间足够,直到移动完成,才会删除原来的数据。并且表上的索引会全部失效,要rebuild。默认是不移动LOB数据和LOB索引段的要显示指定。
                      删除表:
                      delete,删除行数据
                      truncate(不会触发表中所定义的触发器),成为一个空表,释放HWM。
                      drop,从数据字典中删除定义,清除数据。
                      drop table 时不会删除该表的同义词,但是使用时会出错。索引,触发器,权限全部删除,视图失效。
                      查看表、列和约束的信息:
                      相关视图
                      dba_tables --描述数据库中的所有表,某些列包含DBMS_STATS包或ANALYZE语句产生的统计数据。
                      dba_table_columns--描述数据库中的表、视图和簇的列。某些列包含DBMS_STATS包或ANALYZE语句产生的统计数据。
                      dba_all_tables---标书数据库中所有关系表和对象表
                      --查询对象表:
                      select * from dba_all_tables a
                      where a.table_name not in (select table_name from dba_tables)
                      dba_tab_comments--显示表和视图的注释。注释是用comment语句
                      dba_col_comments-显示表的列和视图的列的注释
                      dba_extrnal_tables--列出数据库中的外报表的特殊属性
                      dba_tab_external_locations --列出数据库中外部表的数据源
                      dba_tab_histograms--描述表格视图上的直方图
                      dba_tab_col_statistics--提供从相关的TAB_COLUMNS视图中提取出来的列的统计数据和直方图信息。
                      dba_tab_modofications--描述上次对其收集统计数据之后已经被更改过的表。仅填充具有MONITORING属性的表。(在时间间隔,通常是3小时之后)
                      dba_unused_col_tabs--具有未使用列的表(set unused标记)
                      dba_partial_drop_tabs--列出部分完成drop column操作的表。可能是由于用户终止了操作或系统崩溃未完成。
                      dba_constraints--包含了约束的基本描述信息--名称、类型、状态、延时性等信息。
                      dba_cons_columns--包含定义约束的字段信息,可以查看约束被定义在哪些字段上。


                      IP属地:湖北23楼2015-11-19 10:34
                      回复
                        创建索引语法:注意要有相关权限,和空间配额。
                        create [unique] [bitmap] index index_name on table_name(column[ASC|DESC],...,[EXPRESS]) [TABLESPACE tablespace_name]
                        [pctree n1]
                        [storage(initial n2)]
                        [compress n3]|[nocompress]
                        [logging]|[nologging]
                        [online]
                        [compute statistics]
                        [reverse]|[nosort];
                        创建索引时,可使用的选项:
                        pctree --指定为将来insert 操作所预留空间的百分比。
                        tablespace-- 选择用于指定索引段所在的表空间。
                        bitmap--不指定默认是B树索引。
                        unique--默认不使用,因为在加主键或unique约束时,会自动为该列创建唯一索引。
                        parallel--默认不使用并发参数,使用多个服务进程来并行创建(多CPU种可以使用,但是会耗CPU性能)。
                        nologging--默认不使用,但是可以恢复
                        online--默认不使用(即索引创建时锁定该表),可以在创建期间执行对表执行DML,但是执行DML时,索引不会创建。
                        compute statistics--使用这个选项后,会在创建时直接生成索引的统计信息(给CBO使用),避免之后在进行分析,默认是不使用。
                        reverse:创建反向索引,一般是在RAC环境避免热快时候可以考虑使用。默认不使用
                        nosort:默认不使用(默认会对表中记录排序),如果表的记录中已经是按索引顺序排列的、或按表中相同顺序排列,接可以使用来加快速度。否则就会报错。
                        --选择了online 或者revese 就不能nosort,反之亦然。
                        更改索引:
                        alter index myindex rename to idx_name_sal; --重命名
                        alter index idx_name coalesce;--合并相邻叶子节点的存储碎片(同一子树),不会改变物理结构。
                        alter index idx_name rebuild [tablespace user] --重建索引,也可以利用nologging,stirage
                        --重建和合并都能清除索引数据块中的碎片,但是重建可能会降低树的高度,合并只在同一子树。重建需要额外的存储空间,可以指定一些其他选项。
                        在装载数据时,索引段会动态拓展,导致速度下降。
                        在执行装载前分配足够空间
                        alter index idx_name allocate extent(size 100k);
                        当索引段占用过多空间,实际所需较小时,释放多余空间。
                        alter index idx_name deallocate unused;
                        监视索引使用情况:
                        v$object_usage
                        select * from v$object_usage;--在此视图查询使用情况(看其是否被使用到过)
                        首先要将索引置于监控状态
                        alter index idx_sal monitoring usage;
                        监控也是有开销的,一般不需要对所有的索引进行监控--查询user_indexes可以得到当前用户的所有索引
                        alter index idx_t_id nomonitoring usage;--关闭索引监控状态
                        每当开始监控时,会自动重置相关索引的记录,也就是上一次的结果不会影响当前结果。
                        删除索引:
                        通过一段时间的监视,发现只有极小查询会使用时,应删除该索引,释放空间。
                        索引坏块,或者有过多的碎片时,首先删除该索引,然后再重建。
                        在给一个表转载数据时。应该在装载之前先删除索引,然后再重建。
                        drop index indx_name;
                        如果索引是约束由oracle自动建立的,可以通过禁用约束或删除约束来删除对应的索引。
                        查看索引信息:
                        dba_indexes: 描述数据库所有表上的索引。
                        dba_ind_columns:描述数据库所有表上的索引列。
                        dba_ind_expressions:描述数据库中所有表上的函数索引或表达式。
                        index_stats:存储最后一条 analyze index ....validate structure语句产生的信息
                        v$object_usage 包含监控索引语句产生使用索引的信息。
                        例如:
                        查询当前方案中表上所有索引
                        select index_name,index_type,tablespace_name,uniqueness,logging
                        from user_indexes
                        where table_name='EMP';
                        --其中index_type是索引类型,normal是B树索引,bitmap是位图索引,function-based nomal表示基于函数的B树索引。uniqueness列表示索引的唯一性。logging表示是否将索引的变化记录到redo中。
                        查询当前方案中某个索引的索引列:
                        select index_name,column_name,column_position,column_length
                        from user_ind_columns
                        where index_name = 'FUNIDX_SALCOMM'
                        OR index_name = 'MYINDEX';
                        select index_name,column_name,column_position,column_length
                        from user_ind_columns
                        where index_name in(
                        select index_name from user_indexes where table_name='FLOW_REGISTER'
                        union all
                        select index_name from user_indexes where table_name='FLOW_CUST_INFO'
                        )
                        --column_name表示索引列的名称(函数所以的名称、数值列的名称都是系统生成),column_postition列表示该索引列在索引中的前后次序。column_length列表示索引列的长度。
                        查询某个函数索引的函数或表达式:
                        select index_name,table_name,column_expression,column_position
                        from user_ind_expressions
                        where index_name = 'FUNIDX_SALCOMM'
                        OR index_name = 'MYINDEX';
                        --column_expression表示该列函数索引的函数或表达式,column_position 表示该索引列在该函数索引中的前后次序。
                        select index_name,column_name,column_position,column_length
                        from dba_ind_columns
                        where index_name = 'IDX_DT_LOGIN__PLAYER'
                        OR index_name = 'IDX_DT_LOGIN__DEVICE';
                        查询某个表上的索引和字段 :
                        select table_name,index_name,column_name,column_position
                        from dba_ind_columns
                        where table_name = 'USER_LOGIN_LOG'
                        and table_OWNER='CITY7ELEVEN'
                        order by index_name,column_position
                        --column_position 是多列索引的列顺序标识
                        =========================
                        11g 可以创建不可视索引关键字 invisible
                        create index ..on ..tablespace ..storge().... invisible
                        查询可见性:user_indexes 的 visibility字段
                        在删除之前可以使之不可视,这样优化器会忽略索引,但是会继续维护。
                        alter index index_name invisible | visible
                        OEM图形化操作在此不多做赘述。


                        IP属地:湖北25楼2015-11-21 16:34
                        回复
                          17章详细讲述了视图的管理
                          视图--虚表,是select 子查询语句定义的逻辑表,只有定义而无数据。定义的信息保存在数据字典中。
                          简单视图是指基于单个表建立的不包含任何函数、表达式和分组数据的视图。
                          复杂视图是指select中包含函数,表达式或分组数据的视图。主要是简化查询操作,并不是用于执行DML。
                          两者区别如下:
                          1.简单视图只从单表里获取数据,复杂视图从多表获取数据;
                          2.简单视图不包含函数和数据组,复杂视图包含;
                          3.简单视图可以实现DML操作,复杂视图不可以
                          视图上的DML 操作:
                          DML操作应遵循的原则:
                          1.简单视图可以执行DML操作;
                          2.在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行;
                          3.在视图不出现下列情况时可通过视图修改基表数据或插入数据:
                          a.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字;
                          b.使用表达式定义的列;
                          c.ROWNUM伪列。
                          d.基表中未在视图中选择的其他列定义为非空且无默认值。
                          WITH CHECK OPTION 子句 (用于限制通过视图更改基表的条件,禁止更改不包含在子查询条件里的行)
                          通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行, 因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。 (也就是说在执行INSERTS、UPDATES时,WHERE条件中除需要INSERT、UPDATE本身的限制条件之外,还需要加上视图创建时的WHERE条件。)
                          视图的一些特色:
                          1、在select语句中可以指定别名来作为视图的列名,提供多种命名方法。
                          2、允许在视图上定义(声明性,不是强制)约束(如主键、唯一、外键约束),语法和表相同。
                          with check option 给视图定义check约束,只能查询,操作满足check约束的记录行。
                          with read only将书体创建为只读视图。
                          3、当基础表改变(列的长度,名称等结构变化)时,视图会invalid。通过 create force view 和view with errors创建的视图也是无效的。需要重新编译。
                          4、视图相关的依赖性由oracle 负责自行维护。
                          5、提供一种控制方式,让不同的用户看见不同的列。
                          6、隐藏数据的逻辑复杂性并简化查询语句。
                          7、有些情况必须借助视图--查询需要连接一个分组统计后的表和另一个表。
                          8、简化用户权限管理。把视图权限给用户,而不必将基础表的列权限给用户。
                          9、对重构数据库提供了一定的逻辑独立性。利用将一个表,分解成2个关系表。如果创建一个视图,那么某些应该程序就不需要修改了。
                          创建视图:
                          必须要有相关权限。如果视图拥有者仅仅只有基表的insert 权限,那么视图就不能用于select、delete等
                          和子查询一样,定义视图的查询不能包含for undate子句。并且相关的列不能引用序列的currval或nextval。
                          语法格式:
                          create [or replace] [force] VIEW view_name
                          [(column1,column2,....)]
                          AS SELECT ....FORM WHERE....
                          [WITH CHECK OPTION] [constratint constraint_name]
                          [with read only];
                          --
                          force 强制创建,不考虑基础表是否存在,也不考虑是否具有使用基表的权限。--使得视图的创建和表的创建修改没有必然的依赖性。oracle会自动维护(当表被创建时,视图状态自己变成有效)。
                          column 视图的列名。个数必须和select子查询的列数相同。不提供默认使用子查询的列名或者别名。如果有表达式则必须对其定义列名。
                          with check option 使用视图时,检查涉及的数据是否通过where条件,否则不允许操作。
                          constratint 为上面check option 指定约束名称,不指定使用系统的命名。
                          with read only 只能用于查询数据,该子句不能与order by 子句同时存在。
                          例如:
                          利用复杂视图,获得每个岗位的平均工资、工资总和、最高工资和最低工资。
                          ceate view v_emp_job_sal (job,avagsal,sumsal,maxsal,minsal)
                          AS
                          select job,avg(sal),sum(sal),max(sal),min(sal)
                          from emp
                          group by job;


                          IP属地:湖北26楼2015-11-22 18:49
                          回复
                            更改视图:
                            使用create or replace view语句,先删除,后创建的方法修改视图的定义。
                            那些失效的视图,会在受到访问时自动重新编译,可以使用alter view明确地重新编译这些视图、
                            alter view v_test_tab complie --用于在视图运行前发现编译的错误。
                            删除语句:drop view v_test_tab,对基础表或基础视图无影响,只是清除的相关的定义,
                            视图上的DML操作:
                            对视图进行DML操作时,oracle 将视图定义与使用视图的sql 合并成一条sql,然后解析执行。
                            可更新连接视图:
                            1、不包含集合运算符(union、union all、等)
                            2、不包含distinct关键字
                            3、不包含group by、order by、connect by 或start with子句。
                            4、不包含子查询。
                            5、不包含分组函数。
                            6、需要跟新的列不是由表达式定义的。
                            7、表中的所有not null 列均属于该视图。
                            --只能对“键值保存表”进行更新。注意, 连接视图肯定是多表(复杂视图),简单视图(单表)的话就只需满足上面的要求即可。
                            如果连接视图中的一个基础表的键(主键、唯一键)在它的视图中任然存在(任然是主键)。这个基础表为键值保存表。
                            一般由父子关系的两个表组成的连接视图,字表就是键值保存,父表不是。
                            例如:2个表department 和 student ,主键分别是deptid和stuld列
                            创建的关联视图如下
                            create or repalce view v_stu_dept
                            as
                            select a.stuid,a.name,a.sex,a.deptid,
                            b.deptno d_deptno,b.name d_name,b.address d_address
                            from student a, department b
                            where a.deptid = b.deptid;
                            select * from v_stu_dept 可以发现stuid列在student是主键,在视图中仍然可以作为主键,但是deptid就不行。所以对于视图而言,student表时键值保存表。
                            更新准则:
                            1、在连接视图上任何insert、update、delete一次只能对视图中的一个键值保存表进行更新(字段个数的限制,只能是一个表中的),
                            而且只能使用连接视图中定义过的列。
                            2、insert语句中不能引用到任何非键值保存表中的列。而且要包含键值保存表中所有设置约束的列,未使用with check option选项。(当然如果有外键约束,违反的话也是不能插入的。)
                            3、映射到键值保存表的列是可以跟新的,但是如果使用可with check option,那么连接视图的所有连接列和基础表中共有的同名列不可跟新
                            4、如果连接视图的一条记录恰好是一个键值保存表表中的一条记录,那么这条记录可以删除。with check option并不影响。
                            --注意自连接,那么所有列都是可更新的。2个表就是键值保存表(自身)
                            例如:
                            insert into v_stu_dept(stuid,name,sex,deptid);--插入的3个字段都是同一个键值保存表的字段,所以可以进行插入。当然此处非键值保存表deptno的相关字段是无法插入的。
                            delete from v_stu_dept where stuid=4;--可以执行,这条语句能够成功转换为针对student表的一条delete语句。此时键值保存表student 上的 一行数据被删除。
                            查询视图可更新的列:
                            DBA_UPDATABLE_COLUMNS --显示表中及视图中所有可修改的列。
                            例如
                            select table_name,column_name,insertable,updatable,deletable
                            from user_updatable_columns
                            where table_name = 'V_STU_DEPT';
                            查看视图信息:
                            DBA_VIEWS--描述数据库中所有的视图
                            DBA_TAB_COLUMNS--描述数据库中的表、视图、和簇的列。这些视图中的某些列包含有DBMS_STATS包或者ANALYZE语句产生的统计数据。
                            例如:
                            查看方案中的视图信息
                            set long 400
                            select view_name,test
                            from user_views;
                            查看视图中列的信息
                            select column_name,nullable,date_type,data_length,data_precision,
                            data_scale
                            from user_tab_columns
                            where table_name = 'V_STU_DEPT'
                            --select table_name,column_name,data_type,data_length,data_precision,data_scale from user_tab_columns
                            可以查看到字段的长度。
                            OEM图形化工具使用不在过多赘述。


                            IP属地:湖北27楼2015-11-23 10:26
                            回复