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.1PMONOracle主要的几个进程是PMON、SMON、LCKn、RECO、CKPT、DBWR、LGWR、ARCH。 PMON (ProcessMonitor),进程监视器。在执行某些更新语句时候,未提交就崩溃,PMON会自动回滚该操作,无需手动执行ROLLBACK命令。 此外,如果RECO异常失败了,会重启RECO进程。 如果遇到LGWR进程失败,会中止实例,防止数据错乱。 1.2SMONSystemMonitor ,系统监控器,与PMON不同的是,SMON关注的是系统级的操作而非单个进程,重点是instancerecovery,还有清理临时表空间、清理回滚段表空间、合并空闲空间等。 1.3LCKn仅用于RAC数据库,可以有多个,用户实例间的封锁。 1.4RECO用于分布式数据库的恢复,全程是Distributed Database Recovery,适用于两阶段提交的应用场景。 1.5CKPTCKPT进程,用于出发DBWR从数据缓冲区中写出数据到磁盘。 1.6DBWR最核心的进程之一,负责把数据从数据缓冲区写到磁盘里,该进程和CKPT相辅相成,DBWR会通知LGWR先完成日志缓冲区写到磁盘的动作。 1.7LGWR核心的数据库进程。 记录所欲的在数据库中曾经发生的事情。 因为多进程难以保证顺序,因此LGWR只能采用单进程。 为了保证速度,LGWR有几条规则 l 每隔三秒 l 任何COMMIT触发 l DBWR要把数据从缓存写到磁盘,触发 l 日志缓存区满三分之一或记录满1MB l 联机文件切换触发 1.8ARCHLGWR写日志需要覆盖重写的时候,触发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 ownerperms used-bytes messages ------Shared Memory Segments -------- key shmid ownerperms bytes nattchstatus 0x00000000105381888 grid 640 4096 0 0x00000000105414657 grid 640 4096 0 0x21420060105447426 grid 640 24576 23 0x00000000118128643 oracle 6402924544 88 0x00000000118161412 oracle 6401124073472 44 0x00000000118194181 oracle 64013852672 44 0x6bfaac98118226950 oracle 6408192 44 ------Semaphore Arrays -------- key semid ownerperms nsems 0x454221c8163840 grid 640 124 0x9d294fb8294913 oracle 640152 0x9d294fb9327682 oracle 640152 0x9d294fba360451 oracle 640152 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.1nomount阶段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.2mount阶段根据参数文件描述的控制文件的名称及位置,去查找控制文件。一旦找到就锁定该控制文件。控制文件里面记录了数据库的数据文件、日志文件、检查点信息等信息。锁定控制文件成功就表示数据库mount成功。 7.3open阶段根据控制文件记录的信息,定位到数据库文件、日志文件等,从而正式开通了实例和数据库之间的桥梁。 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |