Oracle 数据库基础.doc
Oracle 数据库基础数据库是我们安装完产品后建立的,可以在同一台主机上存在8i,9i,10g,11g等多个数据库产品,一套产品可以建立多个数据库,每个数据库是独立的。每个数据库都有自己的全套相关文件,有各自的控制文件、数据文件、重做日志文件、参数文件、归档文件、口令文件等等。其中控制文件、数据文件、重做日志文件、跟踪文件及警告日志(trace files,alert files)属于数据库文件;参数文件(parameter file)口令文件(password file)是非数据库文件我们的表存储在数据库中数据库不能直接读取我们通过实例(instance)来访问数据库数据库实例实例由内存和后台进程组成实例是访问数据库的方法初始化参数控制实例的行为一个实例只能连接一个数据库启动实例不需要数据库产品安装好有初始化参数文件就可以启动实例与是否存在数据库无关实例内存分为SGA 和PGASGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,它是在Oracle 服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA正相反,PGA 是只被一个进程使用的区域,PGA 在创建进程时分配,在终止进程时回收.后台进程是实例和数据库的联系纽带分为核心进程和非核心进程当前后台进程的查看SQL> select name,description from v$bgprocess where paddr<>'00'NAME DESCRIPTION- -PMON process cleanupDIAG diagnosibility processPSP0 process spawner 0LMON global enqueue service monitorLMD0 global enqueue service daemon 0LMS0 global cache service process 0LMS1 global cache service process 1MMAN Memory ManagerDBW0 db writer process 0ARC0 Archival Process 0ARC1 Archival Process 1NAME DESCRIPTION- -LGWR Redo etc.LCK0 Lock Process 0CKPT checkpointSMON System Monitor ProcessRECO distributed recoveryCJQ0 Job Queue CoordinatorQMNC AQ CoordinatorMMON Manageability Monitor ProcessMMNL Manageability Monitor Process 220 rows selected.也可以在操作系统下查看oracledb-rac1 db01$ ps -ef|grep ora_oracle 8588 1 0 07:53 ? 00:00:00 ora_j001_gfdb1oracle 10816 1 0 04:58 ? 00:00:08 ora_j000_gfdb1oracle 16998 1 0 Apr18 ? 00:00:00 ora_pmon_gfdb1oracle 17017 1 0 Apr18 ? 00:00:00 ora_diag_gfdb1oracle 17030 1 0 Apr18 ? 00:00:00 ora_psp0_gfdb1oracle 17042 1 0 Apr18 ? 00:00:00 ora_lmon_gfdb1oracle 17057 1 0 Apr18 ? 00:00:00 ora_lmd0_gfdb1oracle 17067 1 0 Apr18 ? 00:00:00 ora_lms0_gfdb1oracle 17077 1 0 Apr18 ? 00:00:00 ora_lms1_gfdb1oracle 17081 1 0 Apr18 ? 00:00:00 ora_mman_gfdb1oracle 17083 1 0 Apr18 ? 00:00:00 ora_dbw0_gfdb1oracle 17085 1 0 Apr18 ? 00:00:00 ora_lgwr_gfdb1oracle 17087 1 0 Apr18 ? 00:00:00 ora_ckpt_gfdb1oracle 17089 1 0 Apr18 ? 00:00:03 ora_smon_gfdb1oracle 17091 1 0 Apr18 ? 00:00:00 ora_reco_gfdb1oracle 17093 1 0 Apr18 ? 00:00:06 ora_cjq0_gfdb1oracle 17095 1 0 Apr18 ? 00:00:02 ora_mmon_gfdb1oracle 17097 1 0 Apr18 ? 00:00:00 ora_mmnl_gfdb1oracle 17099 1 0 Apr18 ? 00:00:00 ora_d000_gfdb1oracle 17101 1 0 Apr18 ? 00:00:00 ora_s000_gfdb1oracle 17142 1 0 Apr18 ? 00:00:01 ora_lck0_gfdb1oracle 17517 7593 0 07:55 pts/2 00:00:00 grep ora_oracle 26182 1 0 Apr18 ? 00:00:00 ora_arc0_gfdb1oracle 26184 1 0 Apr18 ? 00:00:00 ora_arc1_gfdb1oracle 26523 1 0 Apr18 ? 00:00:00 ora_qmnc_gfdb1oracle 27156 1 0 Apr18 ? 00:00:00 ora_q000_gfdb1oracle 27172 1 0 Apr18 ? 00:00:00 ora_q001_gfdb1oracle 29308 1 0 05:53 ? 00:00:00 ora_q002_gfdb1oracle 30878 1 0 07:42 ? 00:00:00 ora_q004_gfdb1oracle 31882 1 0 07:26 ? 00:00:00 ora_q003_gfdb1核心进程,必须存在,有一个终止,所有数据库进程全部终止非核心进程完成数据库的额外功能归档调度作业Database writer (DBWn)数据库写进程将数据库的变化写入到文件最多20个DBW0-DBW9 DBWa-DBWj应该和cpu的个数对应由参数DB_WRITER_PROCESSES描述因为dbwr是哪里来的数据写回到哪里,所以可以多个进程一起工作。Log writer (LGWR)日志写进程将日志缓冲写入到磁盘的日志文件只有一个,因为日志写是顺序写,所以一个就可以了,因为是顺序写所以也不能为多个。Checkpoint (CKPT)检查点进程存盘点触发dbwn,写脏数据块更新数据文件头,更新控制文件System monitor (SMON)系统监测进程实例崩溃时进行自动恢复清除作废的排序临时段Process monitor (PMON)进程监测进程清除死进程重新启动部分进程监听的自动注册我们连接到数据库其实是连接到实例这个过程叫建立一个会话实验1:数据库的最高帐号sys的操作系统认证模式该实验的目的是进入数据库的最高帐号sys.掌握操作系统认证的两个条件.操作系统认证,因为数据库是在OS上的软件能进入ORACLE帐号,就可以进入到数据库的最高帐号。Conn / as sysdbaShow user无论数据库处于何种状态,sys用户总可以进入到数据库因为sys是外部操作系统认证的操作系统认证的两条件。一、操作系统的用户要属于dba组;二、和数据库间的连接是安全的。实验2:数据库的最高帐号sys的密码文件认证模式该实验的目的是使用密码文件的认证方式进入到最高sys帐号,如何建立和维护密码文件.在远程,或者操作系统认证不可以使用的情况下,请使用密码文件来认证sys用户在unix下密码文件路径/oracle_home/dbs密码文件名称orapw+sidsid为实例名称,查看实例名称select instance_name from v$instance;select 'orapw'|instance_name from v$instance;密码文件必须存在,即使你以操作系统认证,因为参数remote_login_passwordfile默认的值是要使用密码文件的,除非你将remote_login_passwordfile的值改为none,这样就禁止了密码文件的使用,你想进入到sys用户必须使用操作系统认证模式。密码文件丢失必须重新建立Orapwd为oracle的命令,用于建立密码文件,命令的格式如下Orapwd file=. Password=.密码文件中含有sys用户的密码建立密码文件的步骤1.确定实例的名称2.确定密码文件的路径和名称3.停止数据库,删除老的密码文件4.在操作系统下运行orapwd file=/dbocfs/gfdb/orapwgfdb1 password=manager1其中gfdb1为实例的名称,manager1为密码,是sys用户的密码5.连接的sysConn sys/maanger1 as sysdba显示为连接的空闲实例,因为数据库还没有启动。但这并没有证明你使用了密码文件.SQL> conn sys/addas as sysdbaConnected.SQL> conn asfdsf/adaf as sysdbaConnected.SQL> conn / as sysdbaConnected.SQL> conn sys/manager1 as sysoperConnected.SQL> conn sys/adsssd as sysoperERROR:ORA-01031: 权限不足原因很简单,因为操作系统认证的优先级高于密码文件.所以你只要写as sysdba就可以进入,但sysoper不能使用操作系统来认证,它只能使用密码文件认证,上面的实验证明manager1是正确的密码.6.启动数据库startup建立密码文件要重新启动数据库,因为内存中保留有原来的密码.初始化参数remote_login_passwordfile =none则数据库设置为禁止使用密码文件,只能使用操作系统认证登录到最高的老大用户.即使你以密码认证连接到数据库,也不能启动和停止数据库,报权限不足.实验3:数据库的两种初始化参数文件该实验的目的是认识参数文件,两类参数文件的相互转换.如何修改参数.初始化参数文件是描述实例的行为的文件,文件大小很小.初始化参数文件在unix操作系统中存在于oracle_home/dbs目录下.纯文本参数文件,修改参数的时候直接编辑文件,再保存就可以了.Initsid.ora二进制参数文件,必须存在于服务器端.使用命令来修改.spfilesid.oraserver parameter file纯文本参数文件和二进制参数文件的差别1。修改参数的方式不同2。优先级不同3。是否动态存储修改的参数4。存在的位置不同 纯文本可以存在于客户端 二进制文件一定存在于server端5.rman可以备份二进制参数文件,不能备份纯文本参数文件.验证现在数据库使用的参数文件类型,我们一定要知道我们使用的是什么类型的参数文件,涉及到我们如何修改参数的手段.select distinct ISSPECIFIED from v$spparameter;如果含有true就是使用二进制参数文件如果只有false就是使用的纯文本参数文件SQL> select distinct isspecified from v$spparameter;ISSPECIFIED-TRUEFALSE因为上面的选择有true,所以这个数据库使用的是二进制参数文件.我们修改参数要使用命令而不是编辑文件,千万不要编辑二进制参数文件,你编辑以后会报ora-00600的错误.SQL> select isspecified ,count(*) from v$spparameter group by isspecified;ISSPEC COUNT(*)- -TRUE 31FALSE 232上面的查询表示有31个参数存在于二进制参数文件,213个参数为默认值.两类参数文件的相互转换Create pfile from spfile;Create spfile from pfile;上面的命令在连接的sys就可以使用,而不必启动数据库.当我们转换不了的时候,请将数据库停止,再转换,再重新启动数据库,再验证.参数文件的优先级Spfilesid.oraSpfile.oraInitsid.oraSQL> col value for a40SQL> select name,value from v$spparameter where isspecified ='TRUE'NAME VALUE- -processes 400sessions 445sga_target control_files /dbocfs/gfdb/control01.ctlcontrol_files /dbocfs/gfdb/control02.ctlcontrol_files /dbocfs/gfdb/control03.ctldb_block_size 8192compatible 10.2.0.3.0log_archive_dest_1 LOCATION=/dbocfs/archivedb_file_multiblock_read_count 16cluster_database trueNAME VALUE- -cluster_database_instances 2thread 2thread 1instance_number 1instance_number 2undo_management AUTOundo_tablespace UNDOTBS2undo_tablespace UNDOTBS1remote_login_passwordfile exclusivedb_domaindispatchers (PROTOCOL=TCP) (SERVICE=gfdbXDB)NAME VALUE- -remote_listener LISTENERS_GFDBjob_queue_processes 10background_dump_dest /home/oracle/app/oracle/admin/gfdb/bdumpuser_dump_dest /home/oracle/app/oracle/admin/gfdb/udumpcore_dump_dest /home/oracle/app/oracle/admin/gfdb/cdumpaudit_file_dest /home/oracle/app/oracle/admin/gfdb/adumpdb_name gfdbopen_cursors 300pga_aggregate_target 31 rows selected.我们修改参数有三个选项SQL> show parameter pga_aggregate_targetNAME TYPE VALUE- - -pga_aggregate_target big integer 915M SQL> alter system set pga_aggregate_target=950m scope=memory;只修改内存的值,不改变参数文件的设置,下回再次启动数据库时值还是老的,能修改的前提是该参数可以动态修改,如果是静态参数只能使用下面的方法.System altered.SQL> alter system set pga_aggregate_target=950m scope=spfile;只修改二进制文件,而不修改内存,静态参数只能先改文件再重新启动数据库.System altered.SQL> alter system set pga_aggregate_target=950m scope=both;同时修改二进制文件和内存,该参数必须是可以动态修改的.System altered.SQL> alter system set pga_aggregate_target=950m;如果没有指明修改哪里,默认为参数文件和内存同时修改,默认就是both.System altered.我们可以从参数文件中删除一个参数,当然你也可以先转化为纯文本再转化为二进制参数文件.alter system reset trace_enabled scope=spfile sid='*'select name,value from v$spparameter where ISSPECIFIED='TRUE' order by 1;验证一下,果然少了一行,下回启动后该参数就按默认值来处理.二进制参数文件在修改的时候有的时候会报错误,我们可以先该文本文件后再建立二进制参数文件.我估计是bug,我们原谅它了,但确实对我们的学习造成一定的困惑.如果你认为参数配置的没有问题,但就是不让修改,那就先改纯文本,再变为二进制.总的来说二进制的参数文件好于纯文本,你到底选择哪种类型的参数文件都没有关系.实验4:启动数据库的三个台阶nomount,mount,open该实验的目的是细化启动数据库的三个步骤,彻底的明白还要等到学习完冷备份之后.启动数据库到nomount状态的条件如下.有环境变量.存在正确的密码文件和参数文件有足够的内存参数文件中描述的路径必须存在数据库产品软件安装正确conn sys/sys as sysdbaShutdown abort;Startup nomount;select instance_name,status from v$instance;启动数据库到第一个台阶nomount状态做了如下的工作.1.读参数文件2.分配内存3.启动后台进程4.初始化部分v$视图将数据库带到mount状态select value from v$spparameter where name='control_files'Alter database mount;Mount数据库的过程是读参数文件中描述的控制文件,校验控制文件的正确性,将控制文件的内容读入到内存,mount是挂接的意思,是操作系统中的概念.一旦mount之后,就是将一个没有意义的实例和一个数据库发生了联系.因为实例是空壳.没有任何数据库和该实例发生关系,我们可以理解为实例是水泵,放到哪个水塘里就会抽取哪里的数据,实例是通用的.mount的意思是将一个通用的水泵放入到指定的水塘.mount是读控制文件,控制文件中有数据文件和日志文件的信息.select instance_name,status from v$instance;打开数据库Alter database open;读控制文件中描述的数据文件验证数据文件的一致性,如果不一致,使用日志文件将数据库文件恢复到一致的状态.数据库open后,普通用户才可以访问数据库用户的表才为可见只读方式open数据库Alter database open read only;select OPEN_MODE from v$database;默认的open方式为read write想改read only为read write 必须重新启动数据库我们现在回想一下数据库启动的三个台阶,我们先读的是参数文件,参数文件可以有我们来编写.读完参数文件后又读了控制文件,控制文件描述了数据文件和日志文件的信息,如果控制文件丢失可以重新建立,最后是读数据文件.数据文件里才存放了我们的数据.数据库将启动分为三个台阶,目的是我们可以准确的知道哪里有问题,迅速的排除.有点象老鼠拖木钎,大头在后面.由最开始的一个1k的参数文件,最后到几个t的大型数据库.当我们只打startup而不加任何参数的时候.默认是到open,等于startup open;SQL> startupORACLE instance started.Total System Global Area bytesFixed Size bytesVariable Size bytesDatabase Buffers bytesRedo Buffers bytesDatabase mounted.Database opened.我们从屏幕显示的结果可以清楚的看出,有三个台阶.还有一个命令是startup force强制启动数据库,等于强制停止数据库再启动数据库.实验5:停止数据库的四种模式该实验的目的是区分不同的停止数据库的方式.四种停止数据库的方式各不相同,用于不同的情况,一般我们采用shutdown immediate方式停止数据库,下面是每种停止数据库方式的差别.Shutdown NORMALShutdown TRANSACTIONALShutdown IMMEDIATEShutdown abortShutdown NORMAL新的会话不接受等待非活动的会话结束等待事务结束产生检查点停止数据库Shutdown TRANSACTIONAL新的会话不接受不等待非活动的会话结束等待事务结束产生检查点停止数据库Shutdown immediate新的会话不接受不等待非活动的会话结束不等事务物结束产生检查点停止数据库Shutdown abort新的会话不接受不等待非活动的会话结束不等待事务结束不产生检查点停止数据库一致性shutdown,产生检测点Shutdown NORMALShutdown TRANSACTIONALShutdown IMMEDIATE数据库再次启动的时候不要恢复不一致性shutdown,不产生检测点Shutdown abortStartup forceInstance崩溃(停电)数据库再次启动的时候需要恢复,自动的,透明的。实验6:查找你想要的数据字典该实验的目的是了解什么是数据字典,字典的来源和如何查找到我们关心的数据字典.数据字典是oracle的核心分为两大类存在于system表空间$结尾的基本表Dba_.,all_.,user_视图存在于内存中X$.的虚表V$的动态性能视图数据字典是哪里来的呢?是我们建立数据库的时候运行脚本建立的.%oracle_home%rdbmsadmincatalog.sql;脚本当中含有建立数据字典的语句.而v$的字典是数据库在启动实例的时候初始化的.数据字典的使用数据库自己使用字典获取信息数据库自动维护我们查看字典来获得数据库的有关信息基本表,是字典得基本表,在建立system表空间的时候建立的.select table_name,owner from dba_tables where table_name like '%$' and owner='SYS'视图,是在建立数据库以后运行catalog.sql;脚本建立的.查看哪些字典中含有TABLE关键字,一定要大写.select table_name from dict where table_name like '%TABLE%'查看哪些字典中含有VIEW关键字,一定要大写.select table_name from dict where table_name like '%VIEW%'查看哪些字典中的一列含有FILE#这一列,一定要大写.select table_name from dict_COLUMNS WHERE COLUMN_NAME='FILE#'查看所有的x$和v$的表的信息SELECT * FROM V$FIXED_TABLE;三大类视图,*代表可以替换为某个单词.Dba_*All_*User_*我们拿tables说明上面得含义.其中user_tables是查看当前用户所拥有的表. all_tables是查看当前用户可以访问的表. dba_tables是查看当前整个数据库拥有的表,但是你得有权限,如果没有权限会报没有这个表.控制文件控制文件是二进制文件(不会超过100m,一般是几m大小)控制文件记录了数据库的结构和行为在mount时候读在数据库open时一直使用丢失需要恢复相关字典SQL> Select * from v$controlfile;STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS- - - - - /dbocfs/gfdb/control01.ctl NO 16384 932 /dbocfs/gfdb/control02.ctl NO 16384 932 /dbocfs/gfdb/control03.ctl NO 16384 932select CONTROLFILE_SEQUENCE# from v$database;select TYPE,RECORD_SIZE,RECORDS_TOTAL,RECORDS_USED from V$CONTROLFILE_RECORD_SECTION; select value from V$spparameter where name='control_files'控制文件的位置在参数文件中描述control_files=file1,file2多个控制文件是镜像的关系最多八个,最少一个实验7:减少控制文件的个数该实验的目的是初步认识如何修改参数文件,如何减少控制文件.减少控制文件,实验的目的,有一个控制文件损坏,我们要将损坏的控制文件剔除。1.修改参数文件,并验证2.停止数据库3.启动数据库4.验证,查看v$controlfileSQL> select * from v$controlfile;验证现在内存中的控制文件个数STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS- - - - - /dbocfs/gfdb/control01.ctl NO 16384 932 /dbocfs/gfdb/control02.ctl NO 16384 932 /dbocfs/gfdb/control03.ctl NO 16384 932SQL> alter system set control_files='/dbocfs/gfdb/control01.ctl', '/dbocfs/gfdb/control02.ctl' scope=spfile;System altered.验证参数文件已经被修改SQL> select value from v$spparameter where name='control_files'VALUE-/dbocfs/gfdb/control01.ctl/dbocfs/gfdb/control02.ctl 验证内存中的值没有被修改,因为control_files是静态参数,想要改变必须重新启动数据库。SQL> select * from v$controlfile;STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS- - - - - /dbocfs/gfdb/co