4.读书笔记收获不止Oracle之 体系结构原理

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值