4.读书笔记收获不止Oracle之 体系结构原理
数据库更新分为插入、修改、删除三类,都属于数据库操作中最常见的操作。
更新一个操作
Update t set object_id=92 whereobject_id=29;
前面步骤和select应该是一致的。差异在如何更新。
在数据缓冲区内修改完数据后,会启用DBWR进程,完成更新的数据从内存中刷入到磁盘,将磁盘中的object_id=29的值更新为92。磁盘是真正存储数据的地方。
最终执行完毕需要执行用户提交commit或回滚rollback进行确认,前者表示用户确认无误,确实需要更新。后者表示用户后悔了,赶紧撤销刚才的动作。
Commit无法左右数据何时从数据缓存区刷入数据区,ORACLE根据一定的规则来促成这个动作,就是缓存区的数据积累到一定的程度,再批量刷入到磁盘中。
COMMIT是,日志缓冲区肯定会把操作的动作写到磁盘的日志文件里。就算断电,也可以通过日志文件进行恢复的。
在数据库运行过程中,批量刷出的数据占数据缓存区的比例越大,效率一般来说是越高,而不用担心断电后的恢复问题。
CKPT 动作是出发DBWR写出。
可以通过参数调整来控制CKPT的出发时间,万一出现数据库崩溃,数据库最多用多长时间来做Instancerecovery,该参数就是FAST START MTTR TARGET 。这个参数太小,会导致ORACLE性能降低。
1. 最繁忙的进程
1.1 PMON
Oracle主要的几个进程是PMON、SMON、LCKn、RECO、CKPT、DBWR、LGWR、ARCH。
PMON (ProcessMonitor),进程监视器。在执行某些更新语句时候,未提交就崩溃,PMON会自动回滚该操作,无需手动执行ROLLBACK命令。
此外,如果RECO异常失败了,会重启RECO进程。
如果遇到LGWR进程失败,会中止实例,防止数据错乱。
1.2 SMON
SystemMonitor ,系统监控器,与PMON不同的是,SMON关注的是系统级的操作而非单个进程,重点是instancerecovery,还有清理临时表空间、清理回滚段表空间、合并空闲空间等。
1.3 LCKn
仅用于RAC数据库,可以有多个,用户实例间的封锁。
1.4 RECO
用于分布式数据库的恢复,全程是Distributed Database Recovery,适用于两阶段提交的应用场景。
1.5 CKPT
CKPT进程,用于出发DBWR从数据缓冲区中写出数据到磁盘。
1.6 DBWR
最核心的进程之一,负责把数据从数据缓冲区写到磁盘里,该进程和CKPT相辅相成,DBWR会通知LGWR先完成日志缓冲区写到磁盘的动作。
1.7 LGWR
核心的数据库进程。
记录所欲的在数据库中曾经发生的事情。
因为多进程难以保证顺序,因此LGWR只能采用单进程。
为了保证速度,LGWR有几条规则
l 每隔三秒
l 任何COMMIT触发
l DBWR要把数据从缓存写到磁盘,触发
l 日志缓存区满三分之一或记录满1MB
l 联机文件切换触发
1.8 ARCH
LGWR写日志需要覆盖重写的时候,触发ARCH进程去转移日志文件,进行归档,防止日志丢失。
2. 关于回滚
ORACLE数据只要启动,就会触发各种操作,即使用户不主动读写,系统进程也要操作,联机日志文件中就会不断记录内容。
更新语句,会在回滚表空间的相应回滚段事物表上分配事务槽,从而在回滚表空间分配到空间。需要记录日志写进日志缓存区。
在数据缓存区中创建前镜像,前镜像数据会写进磁盘的数据文件(回滚表空间的数据文件),然后将旧记录修改为新记录,并记录进入日志缓存区中。
如果用户提交COMMIT,日志缓存区立即刷到磁盘,然后把回滚段事物标记为非激活表示可以覆盖。
如果执行了回滚,从回滚段中将旧记录读出来,修改数据缓存区,完成回滚。这个过程也要产生日志,写到数据日志缓存区。
回滚段参数,UNDO_MANAGEMENT为AUTO表示自动回滚段管理,不够可以自动扩展。UNDO_RETENTION 为900表示,DML语句需要记录前镜像,当COMMIT后,表示回滚段保留的前镜像被打上了可以覆盖重新使用的标记,但是要在900秒后方可允许。
DML一般分为三类:插入、修改、删除。
DELETE>UPDATE>INSERT 修改UNDO表空间。
INSERT>UPDATE>DELETE 修改REDO 表空间。
由于UNDO也需要保护,会专门产生保护UNDO操作的REDO。
3. 一致的查询
Oracle查询的结果由查询的那个时刻决定,数据新的变化不予理睬。
这个通过回滚段来实现保证。回滚段,不仅保证了数据回退,还保证数据库的一致读。
SCN,全程是System Change Number,是一个只会增加不会减少的递增数字,存在于ORACLE的最小单位块里,当某块改变时SCN就会递增。
数据库的回滚段记录事务槽(事务槽是用来分配回滚空间的),如果你更新了某块,事务就被写进事务槽里。如果未提交或回滚,该块就存在活动事务,数据库读到此块可以识别到这种情况的存在。
如果前镜像被人不断重写,这个数据从回滚段里找不回来了,那ORACLE这个查询就会以ORA-01555报错而中止退出,查询失败,不可以查询出一个错误的记过来。
早起的数据库版本,在读数据时表就被锁住,这样并发非常糟糕。回滚段,解决了一致性问题,又避免了锁,大大增强了数据库并发操作的能力。
4. 查看内存参数等
查看SGA
SQL>show parameter sga;
NAME TYPE VALUE
----------------------------------------------- ------------------
lock_sga boolean FALSE
pre_page_sga boolean TRUE
sga_max_size big integer 1216M
sga_target big integer 1216M
unified_audit_sga_queue_size integer 1048576
SQL>show parameter pga;
NAME TYPE VALUE
----------------------------------------------- ---------------
pga_aggregate_limit big integer 2G
pga_aggregate_target big integer 402M
SQL>show parametershared_pool_size;
NAME TYPE VALUE
----------------------------------------------- ---------------------
shared_pool_size big integer 0
SQL>show parameterdb_cache_size;
NAME TYPE VALUE
----------------------------------------------- --------
db_cache_size big integer 0
shared_pool_size为0 表示由SGA自动管理。
一般使用SGA内存大小自动分配的原则,如果需要手动分配,把SGA_TARGET设置为0,SHARED_POOL_SIZE和DB_CACHE_SIZE设置为非0.
设置MEMORY_TARGET参数后,链PGA都需要设置了。会自动分配内存给SGA和PGA。
4.1 查看数据库共享内存
[oracle@OELroot]$ ipcs
------Message Queues --------
key msqid owner perms used-bytes messages
------Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000105381888 grid 640 4096 0
0x00000000105414657 grid 640 4096 0
0x21420060105447426 grid 640 24576 23
0x00000000118128643 oracle 640 2924544 88
0x00000000118161412 oracle 640 1124073472 44
0x00000000118194181 oracle 640 13852672 44
0x6bfaac98118226950 oracle 640 8192 44
------Semaphore Arrays --------
key semid owner perms nsems
0x454221c8163840 grid 640 124
0x9d294fb8294913 oracle 640 152
0x9d294fb9327682 oracle 640 152
0x9d294fba360451 oracle 640 152
4.2 查看ORACLE实例名
SQL>show parameterinstance_name;
NAME TYPE VALUE
----------------------------------------------- ------------------------------
instance_name string orcl
4.3 查看数据库是否开启归档
SQL>show parameter instance_name;
NAME TYPE VALUE
----------------------------------------------- ------------------------------
instance_name string orcl
SQL>archive log list;
Databaselog mode Archive Mode
Automaticarchival Enabled
Archivedestination USE_DB_RECOVERY_FILE_DEST
Oldestonline log sequence 7
Nextlog sequence to archive 9
Currentlog sequence 9
更改数据库归档比较麻烦,重启数据库,将数据库置于mount状态后,输入alter database archivelog.
5. 修改系统参数
SQL>alter system set<parameter_name>=<value> scope=memory|spfile|both[sid=<sid_name>]
Scope默认是both.
6. 进程
Oracle数据库是由实例和一组数据库文件组成的,实例则是由ORACLE开辟的内存区和一组后台进程组成的。
如果进程LGWR和DBWR进程被杀了,数据库立即就崩溃了。操作要小心。
7. 数据库启动的几个阶段
7.1 nomount阶段
oracle必须读取到数据库的参数文件(PFILE或者SPFILE),如果读不到参数文件,就无法nomount。如果有参数文件,就分配相应的内存区域,启动相应的后台进程,创建了实例。
通过命令获取spfile
SQL>show parameter spfile;
NAME TYPE VALUE
----------------------------------------------- ------------------------------
spfile string +DATA/ORCL/PARAMETERFILE/spfil
e.271.889645077
9i以后先找SPFILE文件,再找init.ora文件,在找不到就报错,nomount失败。
7.2 mount阶段
根据参数文件描述的控制文件的名称及位置,去查找控制文件。一旦找到就锁定该控制文件。控制文件里面记录了数据库的数据文件、日志文件、检查点信息等信息。锁定控制文件成功就表示数据库mount成功。
7.3 open阶段
根据控制文件记录的信息,定位到数据库文件、日志文件等,从而正式开通了实例和数据库之间的桥梁。
7.4 文件位置查看
没有参数文件,实例无法创建,数据库无法NOMOUNT成功;没有控制文件,数据库无法MOUNT;没有数据文件,数据库无法打开使用。
查看控制文件:
Show parametercontrol
查看参数文件
Show parameter spfile
查看数据文件
Select file_name fromdba_data_files;
查看日志文件
Select group#,memberfrom v$logfile;
归档文件位置
Show parameterrecovery
告警日志文件
Show parameter dump
8. 关于监听
查看监听状态命令
#lsnrctl status
关闭监听
#lsnrctl stop
启动监听
#lsnrctl start