第三章的内容憋了半天终于有时间录制了,做个简单的介绍给大家尝尝鲜
3.1 登录和工具
本章主要介绍了sqlplus登录的两个命令和plsql developer工具在64位系统下的使用方法。
- 登录Oracle前的准备
- TNS
- 可用的账号和密码
- sqlplus
- SQLPLUS [ [Options] [Logon|/NOLOG] [Start] ]
- CONN[ECT] [{logon | /| proxy} [AS {SYSOPER | SYSDBA | SYSASM}] [edition=value]]
- plsql developer
- 64位下下载需要的basic包 http://www.oracle.com/technetwork/topics/winsoft-085727.html
3.2 体系结构
简单的介绍了文件、内存和进程之间的关系
文件:
数据/临时文件:
*.DBF
select * from dba_data_files
数据文件:文件中主要存储数据库中永久的对象,数据等。
临时数据文件:存储一个session中的临时对象,给临时表空间提供存储,在用到哈希计算、排序计算、聚合计算等的时候就会使用到临时表空间。
- 数据文件可以通过SQL语句
ALTER
DATABASE
进行在线的新增、删除和修改(大小)。 - 每个数据文件最多只能包含2^22-1个数据块,所以一个数据文件的大小和我们的数据块大小(db_block_size)和OS块大小(block_size)有关,而不是网络上所流传的32G。(我们所实验的11g版本,还有个大文件表空间的特性,可以使表空间更大)
参数文件:
*.init
数据库要启动一个实例,必然需要读取一个参数文件(spfile/pfile),参数文件可以单独存在,即便我们还没有创建一个数据库。
sqlplus环境下查看参数文件路径:
show parameter pfile
我们可以通过修改参数文件中的内容,来起到修改oracle系统参数的目的。
除此之外部分参数还可以动态修改参数值:
alter system set X = Y scope = [spfile][memory][both]
scope = spfile的含义就是把改动写入到spfile中,当前实例不生效,数据库重启后生效。
scope = memory的含义就是当前实例立即生效,数据库重启后丢失修改。
scope = both的含义就是当前生效,重启不丢失,但不适用某些只能静态修改的参数。(默认值为both)
参数文件分为pfile和spfile,两者之间的关系如下:
pfile(Parameter File):文本文件
spfile(Server Parameter File):二进制文件
两者之间任何一个丢失或损坏都可以通过另一个创建,sqlplus环境下:
create pfile from spfile
create spfile from pfile
控制文件:
*.CTL
select * from v$controlfile
控制文件是个二进制文件(linux下可用file命令查看二进制文件),记录了数据的一些信息,如数据库的物理结构、名字、日志文件、数据库的创建时间、当前的日志序号、检查点信息等等
控制文件允许多路复用,oracle建议能有多个控制文件以复用,并将copy的文件存储在不同的磁盘上,并会进行同步。
一旦控制文件损坏,数据库就无法启动,所以oracle允许我们用这种方式进行数据文件的备份,以应对紧急情况,一旦其中一个损坏,oracle就会选择读其他未损坏的copy的控制文件,如果全部损坏,那么实例就无法正常启动。
日志文件:
*.LOG
select * from v$logfile
内存:
进程:
附上一张官方的体系结构图:
虽然看起来很复杂(实际真的很复杂),但是我们先简单了解下面几个比较重要的进程:
Smon:系统监控进程(system monitor process)
http://docs.oracle.com/cd/E11882_01/server.112/e40540/process.htm#CNCPT9840
Pmon:进程监控进程(Process Monitor Process)
PMON的责任是监听实例,清理缓冲区的缓存,清理被释放的进程资源等。
当调度进程异常终止时,PMON还会监控其他后台进程并进行进程恢复。如释放锁等。
PMON也负责实例的监听,当一个实例启动后,PMON则会定期的启动去concat这个实例,来监听实例是否在运行。
CKPT:检查点
DBWR:数据库写进程
LGWR:写日志进程
3.3 锁
锁的意义:
当多个进程申请访问同一资源时,为保证事务一致性而存在的一种机制。
锁的类型:DML和DDL
手动上锁:
lock table in [row share][rowexclusive][share][share row exclusive][exclusive] mode;
解锁:
通过v$sql查到对应sql_id:
select * from v$sql;
通过v$session查到对应sid和serial#
select t.SID,t.SERIAL#,t.* from v$session t
where t.SQL_ID = '';
然后执行
alter system kill session 'sid,serial#';
视频地址:https://edu.hellobi.com/course/58