barriers / 阅读 / 详情

SQL语句执行流程与顺序原理解析

2023-08-20 18:48:30
共1条回复
陶小凡

SQL语句执行流程与顺序原理解析

Oracle语句执行流程

第一步:客户端把语句发给服务器端执行

当我们在客户端执行SQL语句时,客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句。也就是说,Oracle 客户端是不会做任何的操作,他的主要任务就是把客户端产生的一些SQL语句发送给服务器端。服务器进程从用户进程把信息接收到后, 在PGA 中就要此进程分配所需内存,存储相关的信息,如:在会话内存存储相关的登录信息等。

虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用是不相同的,服务器上的数据库进程才会对SQL 语句进行相关的处理。不过,有个问题需要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端连接上服务器后,在客户端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程,而服务器上的我们叫做服务器进程。

第二步:语句解析

当客户端把SQL语句传送到服务器后,服务器进程会对该语句进行解析。这个解析的工作是在服务器端所进行的,解析动作又可分为很多小动作。

1)查询高速缓存(library cache)

服务器进程在接到客户端传送过来的SQL语句时,不会直接去数据库查询。服务器进程把这个SQL语句的字符转化为ASCII等效数字码,接着这个ASCII码被传递给一个HASH函数,并返回一个hash值,然后服务器进程将到shared pool中的library cache(高速缓存)中去查找是否存在相同的hash值。如果存在,服务器进程将使用这条语句已高速缓存在SHARED POOL的library cache中的已分析过的版本来执行,省去后续的解析工作,这便是软解析。若调整缓存中不存在,则需要进行后面的步骤,这便是硬解析。硬解析通常是昂贵的操作,大约占整个SQL执行的70%左右的时间,硬解析会生成执行树,执行计划,等等。

所以,采用高速数据缓存的话,可以提高SQL 语句的查询效率。其原因有两方面:一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面也是因为避免语句解析而节省了时间。

不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓存是两码事。有些客户端软件为了提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事。

2)语句合法性检查(data dict cache)

当在高速缓存中找不到对应的SQL语句时,则服务器进程就会开始检查这条语句的合法性。这里主要是对SQL语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条SQL语句不符合语法规则的时候,就会把这个错误信息反馈给客户端。在这个语法检查的过程中,不会对SQL语句中所包含的表名、列名等等进行检查,只是检查语法。

3)语言含义检查(data dict cache)

若SQL 语句符合语法上的定义的话,则服务器进程接下去会对语句中涉及的表、索引、视图等对象进行解析,并对照数据字典检查这些对象的名称以及相关结构,看看这些字段、表、视图等是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。

所以,有时候我们写select语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后再提示说列名或表名错误。

4)获得对象解析锁(control structer)

当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发生改变。

5)数据访问权限的核对(data dict cache)

当语法、语义通过检查之后,客户端还不一定能够取得数据,服务器进程还会检查连接用户是否有这个数据访问的权限。若用户不具有数据访问权限的话,则客户端就不能够取得这些数据。要注意的是数据库服务器进程先检查语法与语义,然后才会检查访问权限。

6)确定最佳执行计划

当语法与语义都没有问题权限也匹配,服务器进程还是不会直接对数据库文件进行查询。服务器进程会根据一定的规则,对这条语句进行优化。在执行计划开发之前会有一步查询转换,如:视图合并、子查询解嵌套、谓语前推及物化视图重写查询等。为了确定采用哪个执行计划,Oracle还需要收集统计信息确定表的访问联结方法等,最终确定可能的最低成本的执行计划。

不过要注意,这个优化是有限的。一般在应用软件开发的过程中,需要对数据库的sql语句进行优化,这个优化的作用要大大地大于服务器进程的自我优化。

当服务器进程的优化器确定这条查询语句的最佳执行计划后, 就会将这条SQL语句与执行计划保存到数据高速缓存(library cache)。如此,等以后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,而直接执行SQL语句,提高SQL语句处理效率。

第三步:绑定变量赋值

如果SQL语句中使用了绑定变量,扫描绑定变量的声明,给绑定变量赋值,将变量值带入执行计划。若在解析的第一个步骤,SQL在高速缓冲中存在,则直接跳到该步骤。

第四步:语句执行

语句解析只是对SQL语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意思。等到语句解析完成之后,数据库服务器进程才会真正的执行这条SQL语句。

对于SELECT语句:

1)首先服务器进程要判断所需数据是否在db buffer存在,如果存在且可用,则直接获取该数据而不是从数据库文件中去查询数据,同时根据LRU 算法增加其访问计数;

2)若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中(buffer cache)。

其中,若数据存在于db buffer,其可用性检查方式为:查看db buffer块的头部是否有事务,如果有事务,则从回滚段中读取数据;如果没有事务,则比较select的scn和db buffer块头部的scn,如果前者小于后者,仍然要从回滚段中读取数据;如果前者大于后者,说明这是一非脏缓存,可以直接读取这个db buffer块的中内容。

对于DML语句(insert、delete、update):

1)检查所需的数据库是否已经被读取到缓冲区缓存中。如果已经存在缓冲区缓存,则直接执行步骤3;

2)若所需的数据库并不在缓冲区缓存中,则服务器将数据块从数据文件读取到缓冲区缓存中;

3)对想要修改的表取得的数据行锁定(Row Exclusive Lock),之后对所需要修改的数据行取得独占锁;

4)将数据的Redo记录复制到redo log buffer;

5)产生数据修改的undo数据;

6)修改db buffer;

7)dbwr将修改写入数据文件;

其中,第2步,服务器将数据从数据文件读取到db buffer经经历以下步骤:

1)首先服务器进程将在表头部请求TM锁(保证此事务执行过程其他用户不能修改表的结构),如果成功加TM锁,再请求一些行级锁(TX锁),如果TM、TX锁都成功加锁,那么才开始从数据文件读数据。

2)在读数据之前,要先为读取的文件准备好buffer空间。服务器进程需要扫描LRU list寻找free db buffer,扫描的过程中,服务器进程会把发现的所有已经被修改过的db buffer注册到dirty list中。如果free db buffer及非脏数据块缓冲区不足时,会触发dbwr将dirty buffer中指向的缓冲块写入数据文件,并且清洗掉这些缓冲区来腾出空间缓冲新读入的数据。

3)找到了足够的空闲buffer,服务器进程将从数据文件中读入这些行所在的每一个数据块(db block)(DB BLOCK是ORACLE的最小操作单元,即使你想要的数据只是DB BLOCK中很多行中的一行或几行,ORACLE也会把这个DB BLOCK中的所有行都读入Oracle DB BUFFER中)放入db buffer的空闲的区域或者覆盖已被挤出LRU list的非脏数据块缓冲区,并且排列在LRU列表的头部,也就是在数据块放入db buffer之前也是要先申请db buffer中的锁存器,成功加锁后,才能读数据到db buffer。

若数据块已经存在于db buffer cache(有时也称db buffer或db cache),即使在db buffer中找到一个没有事务,而且SCN比自己小的非脏缓存数据块,服务器进程仍然要到表的头部对这条记录申请加锁,加锁成功才能进行后续动作,如果不成功,则要等待前面的进程解锁后才能进行动作(这个时候阻塞是tx锁阻塞)。

在记redo日志时,其具体步骤如下:

1)数据被读入到db buffer后,服务器进程将该语句所影响的并被读入db buffer中的这些行数据的rowid及要更新的原值和新值及scn等信息从PGA逐条的写入redo log buffer中。在写入redo log buffer之前也要事先请求redo log buffer的锁存器,成功加锁后才开始写入。

2)当写入达到redo log buffer大小的三分之一或写入量达到1M或超过三秒后或发生检查点时或者dbwr之前发生,都会触发lgwr进程把redo log buffer的数据写入磁盘上的redo file文件中(这个时候会产生log file sync等待事件)。

3)已经被写入redo file的redo log buffer所持有的锁存器会被释放,并可被后来的写入信息覆盖,redo log buffer是循环使用的。Redo file也是循环使用的,当一个redo file写满后,lgwr进程会自动切换到下一redo file(这个时候可能出现log file switch(check point complete)等待事件)。如果是归档模式,归档进程还要将前一个写满的redo file文件的内容写到归档日志文件中(这个时候可能出现log file switch(archiving needed)。

在为事务建立undo信息时,其具体步骤如下:

1)在完成本事务所有相关的redo log buffer之后,服务器进程开始改写这个db buffer的块头部事务列表并写入scn(一开始scn是写在redo log buffer中的,并未写在db buffer)。

2)然后copy包含这个块的头部事务列表及scn信息的数据副本放入回滚段中,将这时回滚段中的信息称为数据块的“前映像”,这个“前映像”用于以后的回滚、恢复和一致性读。(回滚段可以存储在专门的回滚表空间中,这个表空间由一个或多个物理文件组成,并专用于回滚表空间,回滚段也可在其它表空间中的数据文件中开辟)。

在修改信息写入数据文件时,其具体步骤如下:

1)改写db buffer块的数据内容,并在块的头部写入回滚段的地址。

2)将db buffer指针放入dirty list。如果一个行数据多次update而未commit,则在回滚段中将会有多个“前映像”,除了第一个“前映像”含有scn信息外,其他每个"前映像"的头部都有scn信息和"前前映像"回滚段地址。一个update只对应一个scn,然后服务器进程将在dirty list中建立一条指向此db buffer块的指针(方便dbwr进程可以找到dirty list的db buffer数据块并写入数据文件中)。接着服务器进程会从数据文件中继续读入第二个数据块,重复前一数据块的动作,数据块的读入、记日志、建立回滚段、修改数据块、放入dirty list。

3)当dirty queue的长度达到阀值(一般是25%),服务器进程将通知dbwr把脏数据写出,就是释放db buffer上的锁存器,腾出更多的free db buffer。前面一直都是在说明oracle一次读一个数据块,其实oracle可以一次读入多个数据块(db_file_multiblock_read_count来设置一次读入块的个数)

当执行commit时,具体步骤如下:

1)commit触发lgwr进程,但不强制dbwr立即释放所有相应db buffer块的锁。也就是说有可能虽然已经commit了,但在随后的一段时间内dbwr还在写这条sql语句所涉及的数据块。表头部的行锁并不在commit之后立即释放,而是要等dbwr进程完成之后才释放,这就可能会出现一个用户请求另一用户已经commit的资源不成功的现象。

2)从Commit和dbwr进程结束之间的时间很短,如果恰巧在commit之后,dbwr未结束之前断电,因为commit之后的数据已经属于数据文件的内容,但这部分文件没有完全写入到数据文件中。所以需要前滚。由于commit已经触发lgwr,这些所有未来得及写入数据文件的更改会在实例重启后,由smon进程根据重做日志文件来前滚,完成之前commit未完成的工作(即把更改写入数据文件)。

3)如果未commit就断电了,因为数据已经在db buffer更改了,没有commit,说明这部分数据不属于数据文件。由于dbwr之前触发lgwr也就是只要数据更改,(肯定要先有log)所有dbwr在数据文件上的修改都会被先一步记入重做日志文件,实例重启后,SMON进程再根据重做日志文件来回滚。

其实smon的前滚回滚是根据检查点来完成的,当一个全部检查点发生的时候,首先让LGWR进程将redologbuffer中的所有缓冲(包含未提交的重做信息)写入重做日志文件,然后让dbwr进程将dbbuffer已提交的缓冲写入数据文件(不强制写未提交的)。然后更新控制文件和数据文件头部的SCN,表明当前数据库是一致的,在相邻的两个检查点之间有很多事务,有提交和未提交的。

当执行rollback时,具体步骤如下:

服务器进程会根据数据文件块和db buffer中块的头部的事务列表和SCN以及回滚段地址找到回滚段中相应的修改前的副本,并且用这些原值来还原当前数据文件中已修改但未提交的改变。如果有多个”前映像“,服务器进程会在一个“前映像”的头部找到“前前映像”的回滚段地址,一直找到同一事务下的最早的一个“前映像”为止。一旦发出了commit,用户就不能rollback,这使得commit后dbwr进程还没有全部完成的后续动作得到了保障。

第五步:提取数据

当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动作。

从这整个查询处理过程中,我们在数据库开发或者应用软件开发过程中,需要注意以下几点:

  一是要了解数据库缓存跟应用软件缓存是两码事情。数据库缓存只有在数据库服务器端才存在,在客户端是不存在的。只有如此,才能够保证数据库缓存中的内容跟数据库文件的内容一致。才能够根据相关的规则,防止数据脏读、错读的发生。而应用软件所涉及的数据缓存,由于跟数据库缓存不是一码事情,所以,应用软件的数据缓存虽然可以提高数据的查询效率,但是,却打破了数据一致性的要求,有时候会发生脏读、错读等情况的发生。所以,有时候,在应用软件上有专门一个功能,用来在必要的时候清除数据缓存。不过,这个数据缓存的清除,也只是清除本机上的数据缓存,或者说,只是清除这个应用程序的数据缓存,而不会清除数据库的数据缓存。

  二是绝大部分SQL语句都是按照这个处理过程处理的。我们DBA或者基于Oracle数据库的开发人员了解这些语句的处理过程,对于我们进行涉及到SQL语句的开发与调试,是非常有帮助的。有时候,掌握这些处理原则,可以减少我们排错的时间。特别要注意,数据库是把数据查询权限的审查放在语法语义的后面进行检查的。所以,有时会若光用数据库的权限控制原则,可能还不能满足应用软件权限控制的需要。此时,就需要应用软件的前台设置,实现权限管理的要求。而且,有时应用数据库的权限管理,也有点显得繁琐,会增加服务器处理的工作量。因此,对于记录、字段等的查询权限控制,大部分程序涉及人员喜欢在应用程序中实现,而不是在数据库上实现。

Oracle SQL语句执行顺序

(8)SELECT (9) DISTINCT (11) <select_list>

(1) FROM <left_table>

(3) <join_type> JOIN <right_table>

(2) ON <join_condition>

(4) WHERE <where_condition>

(5) GROUP BY <group_by_list>

(6) WITH {CUBE | ROLLUP}

(7) HAVING <having_condition>

(10) ORDER BY <order_by_list>

1)FROM:对FROM子句中的表执行笛卡尔积(交叉联接),生成虚拟表VT1。

2)ON:对VT1应用ON筛选器,只有那些使为真才被插入到TV2。

3)OUTER (JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保留表中未找到匹配的行将作为外部行添加到VT2,生成TV3。如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表位置。

4)WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。

5)GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5。

6)CUTE|ROLLUP:把超组插入VT5,生成VT6。

7)HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。

8)SELECT:处理SELECT列表,产生VT8。

9)DISTINCT:将重复的行从VT8中删除,产品VT9。

10)ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10),生成表TV11,并返回给调用者。

以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。

相关推荐

浙商银行吉祥物叫啥

浙商银行吉祥物叫**小红人RedO**。小红人是以红色能量棒为原型设计的人物形象,喜欢创新技术、乐于体验新兴生活,追求财务自由。
2023-08-11 21:30:272

redo日志的作用是什么?

在Oracle数据库中,有一种日志文件叫做重做日志文件,他就是大家俗称的:redolog。在redolog中又分为两种:在线重做日志与归档日志。ONLINE Redo log在线重做日志(online redo log )主要用于:Oracle数据库所在服务器突然掉电、突然重启或者执行shutdown abort等命令使得在服务器重新启动之后,Oracle数据库没有办法正常的启动实例。此时,在线重做日志就派上了用场,Oracle会使用在线重做日志,把数据库恢复到服务器掉电前的那一个时刻,从而使得数据库能正常的启动起来 。在Oracle数据库中,默认情况下,至少会有两个重做日志组,而且每个组里面至少包含了一个重做日志文件。日志组不会自动增加,在一个写满之后,会自动去写下一个。在下一个被写满之后会又从第一个开始写起。Archive redo log归档日志(archive log)主要用于硬件级别的错误:磁盘的坏道导致无法读写、写入的失败、磁盘受损导致数据库数据丢失。这就要使用归档日志文件,通过归档日志文件,把数据库恢复到归档日志所在的时间点上然后再通过在线重做日志文件把数据库恢复到当前的时间点上。对于归档日志文件,可以理解为在线重做日志文件的备份。即当一个重做日志文件被填满了之后,归档日志文件就会把其备份保留一份。(因为上面说了,在线重做日志文件会自动的覆盖)所以,归档日志文件就是旧的在线日志文件的备份。
2023-08-11 21:30:383

在CAD中REDO命令在功能上有什么不同

REDO命令实质为,恢复命令U和undo执行的放弃操作,那CTRL+Z同样是返回上一步,redo同样可以将其恢复。u和 undo的区别是,后退一步和多步。“雅铺尚品”为您解答,供参考,谢谢!
2023-08-11 21:30:541

触发redo写的几个条件

1.超时(timeout) 当LGWR处于空闲状态时,它依赖于rdbms ipc message等待,处于休眠状态,直到3秒超时时间到。 如果LGWR发现有redo需要写出,那么LGWR将执行写出操作,log file parallel write等待事件将会出现。 启用10046事件,从LGWR跟踪日志中可以清楚的观察到这些事件:2.阈值达到 只要一个进程在log buffer中分配空间,已经使用的Log buffer的数量将被计算。如果使用的块的 数量大于或等于_log_io_size参数设置,那么将会触发LGWR写操作。 如果此时LGWR未处于活动状态,那么LGWR将被通知去执行后台写操作。 缺省的_log_io_size等于1/3 log buffer大小,上限值为1M,此参数在X$KSPPSV中显示的0值,意为缺省值。 也就是,LGWR将在Min(1M,1/3 log buffer size)时触发。注意此处的log buffer size是以log block来衡量的。 此值通常为512 bytes.获得Oracle的隐含参数,参考 如何获取Oracle的隐含参数 3.提交 当一个事物提交时,在redo stream中将记录一个提交标志。 在这些redo被写到磁盘上之前,这个事物是不可恢复的。所以,在事务返回成功标志给用户前,必须等待LGWR写完成。进程通知LGWR写,并且以log file sync事件开始休眠,超时时间为1秒。 Oracle的隐含参数_wait_for_sync参数可以设置为false避免redo file sync的等待,但是就将无法保证事务的恢复性。注意,在递归调用(recursive calls)中的提交(比如过程中的提交)不需要同步redo直到需要返回响应给用户。因此递归调用仅需要同步返回给用户调用之前的最后一次Commit操作的RBA。 存在一个SGA变量用以记录redo线程需要同步的log block number。 如果多个提交在唤醒LGWR之前发生,此变量记录最高的log block number,在此之前的所有redo都将被写入磁盘。 这有时候被称为组提交(group commit). 4.在DBWR写之前 如果DBWR将要写出的数据的高RBA超过LGWR的on-Disk RBA,DBWR将post LGWR去执行写出。 在Oracle8i之前,此时DBWR将等待log file sync事件。 从Oracle8i开始,DBWR把这些Block放入一个defer队列,同时通知LGWR执行redo写出,DBWR可以继续执行无需等待的数据写出。
2023-08-11 21:31:431

redo日志的作用是什么?

redo日志的作用是叫做重做日志文件。ONLINE Redo log重做日志(online redo log )。Oracle数据库所在服务器执行shutdown abort等命令使得在服务器重新启动之后,Oracle数据库正常的启动实例。Oracle会使用重做日志,把数据库恢复到服务器掉电前的那一个时刻,从而使得数据库能正常的启动起来 。在Oracle数据库中,至少会有两个重做日志组,而且每个组里面至少包含了一个重做日志文件。日志组不会自动增加,在一个写满之后,会自动去写下一个。在下一个被写满之后会又从第一个开始写起。Archive redo log归档日志(archive log)主要用于硬件级别的错误。这就要使用归档日志文件,通过归档日志文件。把数据库恢复到归档日志所在的时间点上,然后再通过在线重做日志文件把数据库恢复到当前的时间点上。
2023-08-11 21:31:501

银行redo先生几岁了

根据公开资料,暂时无法获知银行redo先生的年龄。
2023-08-11 21:31:582

Oracle]Data Guard 之 Redo传输详解

   Data Guard主要提供两个服务 )Redo传输服务 即把Primay端的Redo日志传输到一个或多个Standby目的地 )Redo应用服务 即在Standby端应用从Primay端传输过来的Redo日志 本文先讲讲其中的Redo传输服务    使用ARCn传输Redo日志 默认情况下采用ARCn传输redo日志 不过只有在最高性能模式下才可以使用ARCn(具体可参考 《 Oracle] Data Guard 之 三种保护模式介绍 》) 采用ARCH传输Redo日志的示意图如下 其大致过程如下 )Primay段ARC 一旦完成日志切换 ARC 就将新生成的归档日志传输到Standby端 )Standby 端由RFS进程接受日志 如果配置了standby redo log 记录至standby redo log 等standby redo log做log switch形成归档日志 再应用归档日志做恢复 如果没有配置standby redo log RFS进程接收到日志后 放到standby端归档目录下 standby再应用归档日志做恢复    使用LGWR传输Redo日志 使用LGWR进程和ARCn有很大的不一样 最明显的区别是它不需要等Primary完成日志切换后再传输 其示意图如下       其过程大致如下    )一旦Primary有Redo日志产生 LGWR将触发LNSn进程传输Redo只Standby redo log 注意 这里不能由LGWR直接传输 因为整个数据库实例只有一个LGWR 为了保证它的主要性能不受影响 不能由它直接传输)    )网络传输模式可以选择sync或async sync是指当Primary提交时 必须得等Redo传输至Standby成功后 才能返回 所以如果设置sync 建议同时设置NET_TIMEOUT参数 超时无响应 则返回错误 async是指Primary提交是否成功和日志是否传输成功没有关系 这样对Primary的性能影响最小 lishixinzhi/Article/program/Oracle/201311/19052
2023-08-11 21:32:051

Oracle数据库Redo故障恢复

  一 丢失inactive日志文件组的恢复   由于inactive日志文件组表示已经完成了检查点(dirty数据已经被写入数据文件) 数据库本身不会发生数据库丢失 如果在这个时候相应的redo丢失/损坏 可以通过clear重建日志文件组恢复   通过命令:   alter database clear logfile group n   如果数据库模式是archived的 则需要强制清除   alter database clear unarchived logfile group n   二 丢失active或current日志文件组的恢复   丢失情况分两种:   一个是正常关闭数据库(如shutdown immediate)   另一个是异常关闭数据库(如shutdown abort)    在损失当前日志时 数据库是正常关闭状态   由于shutdown immediate会执行全面的checkpoint 所以当前日志在实例恢复时可以不需要redo   在Oracle i中我们完全可以通过alter database clear logfile group n来进行恢复   但是在Oracle i中 则可能无法对current的redo日志进行clear 需要通过recover database until cancel恢复后(必须要做的)   用resetlogs选项打开   比如   alter database clear logfile group n   recover database until cancel;   alter database open resetlogs;    在损失当前日志时 数据库是异常关闭的   这种情况下 由于没有在执行全面检查点时 数据库就已经关闭了 那么Oracle在进行实例恢复的时候必须要求当前的日志 否则Oracle数据库将无法open   这样的情况下 我们通常需要从备份中恢复数据文件 通过应用归档日志进行向前推演 直到最后一个完好的日志文件 然后可以通过resetlogs启动数据库完成恢复 那么丢失的数据则是被损坏的日志文件中的数据 lishixinzhi/Article/program/Oracle/201311/18418
2023-08-11 21:32:121

惠普1005一体机 显示redo怎么解决

从新开始的意思。关机在开机
2023-08-11 21:32:341

redo和undo的区别是什么

undo 是取消做,比如写错了,取消上一步redo是重做,取消了后重做,即取消取消.
2023-08-11 21:32:472

oracle redo 多大合适

一般redo日志有三个,可以多加,每个500M就行;
2023-08-11 21:32:584

ORACLE中,数据库的redo与undo分别是什么呀,两者是什么关系呢?

redo是重做的意思undo是撤销回滚
2023-08-11 21:33:082

redo音译歌词,要中文音译

仆が死のうと思ったのは作词 秋田ひろむ作曲 秋田ひろむ唱 中岛美嘉仆が死のうと思ったのはウミネコが桟桥で鸣いたからboku ga shino uto omotta noha umineko ga sanbashi de nai takara波の随意に浮かんで消える过去も啄ばんで飞んでいけnami no zui i ni uka nde kie ru kako mo taku bande ton deike仆が死のうと思ったのは诞生日に杏の花が咲いたからboku ga shino uto omotta noha tanjoubi ni anzu no hana ga sai takaraその木漏れ日でうたた寝したら虫の死骸と土になれるかなsono ki more nichi deutata neshi tara mushi no shigai to tsuchi ninarerukana薄荷饴渔港の灯台锖びたアーチ桥舍てた自転车hakka ame gyokou no tou 台 sabi ta a^chi hashi sha teta jitensha木造の駅のストーブの前でどこにも旅立てない心mokuzou no eki no suto^bu no mae dedokonimo tabidate nai kokoro今日はまるで昨日みたいだ明日を変えるなら今日を変えなきゃkonnichiha marude kinou mitaida ashita wo kae runara kyou wo kae nakya分かってる 分かってる けれどwaka tteru waka tteru keredo仆が死のうと思ったのは心が空っぽになったからboku ga shino uto omotta noha kokoro ga karappo ninattakara満たされないと泣いているのはきっと満たされたいと愿うからmita sarenaito nai teirunohakitto mita saretaito negau kara仆が死のうと思ったのは靴纽が解けたからboku ga shino uto omotta noha kutsuhimo ga toke takara结びなおすのは苦手なんだよ人との繋がりもまた然りmusubi naosunoha nigate nandayo nin tono tsunaga rimomata shikari仆が死のうと思ったのは少年が仆を见つめていたからboku ga shino uto omotta noha shounen ga boku wo mitsu meteitakaraベッドの上で土下座してるよあの日の仆にごめんなさいとbeddo no uede dogeza shiteruyoano nichi no boku nigomennasaitoパソコンの薄明かり上阶の部屋の生活音pasokon no haku akari joukai no heya no seikatsu otoインターフォンのチャイムの音耳を塞ぐ鸟かごの少年inta^fon no chaimu no oto mimi wo fusagu tori kagono shounen见えない敌と戦ってる六畳一间のドンキホーテmie nai teki to tatakatte ru roku tatami hitoma no donkiho^teゴールはどうせ丑いものさgo^ru hadouse minikui monosa仆が死のうと思ったのは冷たい人と言われたからboku ga shino uto omotta noha tsumeta i nin to iwa retakara爱されたいと泣いているのは人の温もりを知ってしまったからaisa retaito nai teirunoha nin no 温 moriwo shitte shimattakara仆が死のうと思ったのはあなたが绮丽に笑うからboku ga shino uto omotta nohaanataga kirei ni warau kara死ぬことばかり考えてしまうのはきっと生きる事に真面目すぎるからshinu kotobakari kangae teshimaunohakitto iki ru koto ni majime sugirukara仆が死のうと思ったのはまだあなたに出会ってなかったからboku ga shino uto omotta nohamadaanatani deatte nakattakaraあなたのような人が生まれた世界を少し好きになったよanatanoyouna nin ga umare ta sekai wo sukoshi suki ninattayoあなたのような人が生きてる世界に少し期待するよanatanoyouna nin ga iki teru sekai ni sukoshi kitaisu ruyo
2023-08-11 21:33:161

为什么系统故障恢复时先undo再redo操作,请举日志队列说明

<T1,start><T1,Update,A,600,60><T2,start><T2,Add,A,30><checkpoint L{T1,T2}><T2,COMMIT><break down>如果你先redo的话,A先变成90,然后再undo,A变回了600,但是实际上答案应该是630。
2023-08-11 21:33:262

数据库大神来看,事务回滚靠的是undo,还是redo?

redo
2023-08-11 21:33:402

Oracle的redo日志会自动清理吗

oracle的归档模式分为archivelog/noarchivelog如果是noarchivelog非归档模式,那么oracle会循环使用日志组,是以覆盖的方式向日志组里写日志的。如果是archivelog归档模式,当正在使用的redo日志组写满后,会关闭当前日志文件,arch进程把redo日志中的数据移到归档日志中。归档日志如果长时间不清理,可能会导致磁盘空间不足。可以写个操作系统脚本定时删除归档日志。也就是说,redo日志中的内容,要么覆盖,要么归档。不会出现满了不在记录的情况。
2023-08-11 21:33:481

redo的中文谐音歌词

看不懂``= =你是不是要罗马发音``春隣 歌手:熊木杏里 作词:熊木杏里 作曲:熊木杏里 会えなくて またひとつ さみしさからの风が吹いた 肩に手をのせるような 君のやさしさに似て 重なり合わないことが あたりまえならば もっとそばに歩みよっても 梦は终わらないでしょう 君とぼく ぼくと君 この地上で再び会えた ずっと前 ずっと前 君とぼくは春隣 冬を渡り 咲いてゆく いつか花となる ちがう道をゆくけれど 同じ気持ちだから ずっとそばに感じられると 君はいつか言ってたね ぼくの右 君の左 ふたりに帰れる日がくる 离れても 离れても 君とぼくは春隣 それぞれのままにいて ひとつ花になる いつまでも いつまでも 君にはぼくが春隣 流れてゆく月日さえ 爱しいと思える ずっと前 ずっと前 君とぼくは春隣 笑い泣いて共にゆく いつか花となる 罗马拼音 ae naku te mata hitotsu samishi sa kara no kaze ga fui ta kata ni te o noseru you na kimi no yasashi sa ni ni te kasanariawa nai koto ga atarimae nara ba motto soba ni ayumiyotte mo yume ha owara nai desho u kimi to boku boku to kimi kono chijou de futatabi ae ta zutto mae zutto mae kimi to boku ha haru tonari fuyu o watari sai te yuku itsuka hana to naru chigau michi o yuku keredo onaji kimochi da kara zutto soba ni kanji rareru to kimi ha itsuka itte ta ne boku no migi kun no hidari futari ni kaereru hi ga kuru hanare te mo hanare te mo kimi to boku ha haru tonari sorezore no mama ni i te hitotsu hana ni naru itsu made mo itsu made mo kimi ni ha boku ga haru tonari nagare te yuku tsukihi sae itoshii to omoeru zutto mae zutto mae kimi to boku ha haru tonari warai nai te tomoni yuku itsuka hana to naru
2023-08-11 21:33:561

编辑器的模式(1)—undo/redo

"我不能预见每个人的未来,我只能预见我自己的,而且只能预见两分钟"——尼古拉斯.凯奇《惊魂下一秒》2007 无论人写字,画画一样,我们常常有笔误不可避免, 回到过去的某个修改点,做出不同的修改,并继续, 在程序设计的概念里,这常常指版本管理,版本管理保存了每一次(所有)修改的历史,不同时间线,还有合并 而编辑器的,undo/redo, 则有几点简化, 这像是《惊魂下一秒》里的故事,修正有限历史,并让下一秒冲刷掉未来。 undo/redo模式,即为,维护一定长度的修改点队列,并在所有历史修改点里,进行版本切换. 以下我实现了一个简单的undo/redo,版本管理, 可以看到,这样简单的undo/redo已经足够工作。 实现更精巧的 redo/undo功能,你需要考虑以下问题: 而现实中,对于有些编辑器的实现来说,效率并不是一个严重的问题,简单则是更为重要的。
2023-08-11 21:34:141

oracle的dg为什么备库没有redo

  有时为了调优需要,我们需要增加onlline redo的组数,下面是操作流程一、查看主库online redo信息。  select a.members,a.status,a.bytes/1024/1024,b.type,b.member,b.group#from v$log a,v$logfile b  where a.group#=b.group#;  二、相看主库standby_log 信息  select a.member,a.status,b.bytes/1024/1024,b.group#,b.used/1024/1024,b.statusfrom v$logfile a,v$standby_log b  where a.group#=b.group#;  三、查看备库online redo信息  select a.members,a.status,b.type,b.member,b.group#from v$log a,v$logfile b  where a.group#=b.group#  四、查看备库standby_log 信息  select a.member,a.status,b.bytes/1024/1024,b.group#,b.used/1024/1024,b.statusfrom v$logfile a,v$standby_log b  where a.group#=b.group#;  以上信息无误后操作下面的步骤  五、在主库上增加online redo组。  alter database add logfile group 10 ("/u01/app/oradata/orcl/redo10a.log","/u01/app/oradata/orcl/redo10b.log") size 100m;六、在主库上增加standby log。  alter database add standby logfile group 15 ("/u01/app/oradata/orcl/stred15a.log ","/u01/app/oradata/orcl/stred15b.log ") size 100M;七,备库操作,增加onlie redo  7.1 alter database recover managed standby database cancel; ---取消主备传送7.2 alter system set standby_file_management=manual; ---改为备库文件改为手动模式7.3 增加备库onlie redo文件与主库一样在大小,位置一般是一样的,除非有主备环境不同alter database add logfile group 10 ("/u01/app/oradata/orcl/redo10a.log","/u01/app/oradata/orcl/redo10b.log") size 100m;八,备库操作,增加备库standby log  alter database add standby logfile group 15 ("/u01/app/oradata/orcl/stred15a.log ","/u01/app/oradata/orcl/stred15b.log ") size 100M;九, 备库操作,改写备库文件管理模式为自动,并启用实时应用alter system set standby_file_management=auto;alter database recover managed standby database using current logfile disconnect from session;十,观察同步是否时实。  我这里是ok的。
2023-08-11 21:34:231

如何把redo文件 从asm里复制出来

方法一: 如果是11g的ASM就简单了,asmcmd中有个命令cp,可以支持直接拷贝文件的操作系统中,具体操作如下: 首先进入asmcmd如要把redo01文件拷贝到系统中的/backup下面,操作如下: asmcmd>cp +DATA/orcl/redo01.log /backup/redo01.log方法很简单,但是前提必须是11g,但是我们现在使用得最多的是oracle10g,10g的asmcmd中暂时没有cp命令,所以就必须使用下面的方法拷贝。方法二:采用dbms_file_transfer包,从ASM中拷贝数据,方法是创建源和目标的directory,然后用dbms_file_transfer包,拷贝数据: create or replace directory ASM as "+DATA/orcl /";create or replace directory BACKUP as "/backup";BEGINdbms_file_transfer.copy_file(source_directory_object =>"ASM", source_file_name => "redo01.log",destination_directory_object => "BACKUP",destination_file_name => "redo01.log");END;
2023-08-11 21:34:311

Oracle里redo文件size小且数量少,切换频繁,会对数据库性能产生怎样影响?请讲的具体一些,谢谢你。

不那么明显的影响是, 由于频繁的io,会潜在的使数据库变慢。明显的影响是,比如说你只有2组redo。第一组写满了,写第二组。但这时第一组的状态仍然是active的,要等到第一组redo里面记录的操作全都提交了,才会变成inactive的。如果还有未提交的数据,那么第一组redo是不能被覆盖的。然后呢。。。 如果第二组日志这时也写满了,又不能去覆盖第一组,那么所有的数据库操作都会hang在那里。你的客户如果耐心不好,就要砸电脑了。夸张的影响是,如果你的数据库hang在那里的时候,发生了什么特殊的问题,导致系统进程出了故障,crash也不是不可能的。
2023-08-11 21:34:401

虚拟机目录下redo文件是怎么产生的文件很大

vmdk为虚拟硬盘文件,不能删除。vmem文件在虚拟机运行时产生,一般与虚拟机内存容量相等,关机后自动清除,如有残留试试手工删除。vmss是执行了挂起操作后产生的文件,容量一般不大。
2023-08-11 21:34:481

如何恢复redo01.log/redo02.log/redo03.log?

select*fromv$session_wait在结合如下语句,发现日志切换的频率非常之快select*fromv$log针对这个情况我就增加redo文件的大小的个数在线修改redo.log文件的大小1.查找日志文件的路径名和group#号sql>select*fromv$log;group#th...
2023-08-11 21:34:551

data guard怎样查看redo transport status

在OracleDataGuard中,RedoGap的产生是由于一些网络或者其他问题导致redo的传输中断。当故障消除后,这些没有传输过去的redo文件会由一些进程发现,并且将它们传输到备库。术语:ARC:归档进程MRP:MediaRecoveryProcess,在备库上负责应用redoRFS:RemoteFileServer,在备库上接收发送过来的redo文件FAL:FetchArchiveLog测试目的:由于网络问题发生了gap后,确定哪个进程负责处理gap。测试环境:Oracle11.2.0.2onLinux5.测试过程:1.确保当前主库和备库是同步的:Primary:MAX(SEQUENCE#)--------------86Standby:MAX(SEQUENCE#)--------------862.模拟网络中断,导致gap:在主库将网卡停掉:#ifconfigeth0down将主库执行数次switchlogfile:SQL>altersystemswitchlogfile;SQL>altersystemswitchlogfile;Primary:MAX(SEQUENCE#)--------------96这时主库alertlog报出了与备库连接不通的错误:TNS-00513:Destinationhostunreachablentsecondaryerrcode:101ntOSerrcode:0Error12543receivedloggingontothestandbyFAL[server,ARCp]:Error12543creatingremotearchivelogfile"STANDBY"FAL[server,ARCp]:FALarchivefailed,seetracefile.ARCH:FALarchivefailed.ArchivercontinuingORACLEInstanceorcl-ArchivalError.Archivercontinuing.3.将主库的这些归档临时换个目录,保证这些归档无法传到备库:mv*.arc../4.启动主库的网卡:#ifconfigeth0up5.这时,主库的ARC并没有把缺少的日志传到备库。最终备库的MRP发现了gap并把gapfetching.
2023-08-11 21:35:021

oracle 建表会不会在redo

会,虽然临时表是nologing类型的,但是还是会产生部分redo日志,只不过产生的比logging类型的表会少一下;
2023-08-11 21:35:101

如何调整Oracle Redo Logfile日志文件的大小

我认为只能先添加一个大的日志文件,然后删除小的日志文件。
2023-08-11 21:35:293

Altium designer 6.9 画PCB 的时候怎么没有 undo 和redo呢,别人电脑上却有,怎么回事呢,求帮忙...

你的电脑有问题
2023-08-11 21:35:373

如何诊断Oracle Redo Log引发的性能问题

  一、Rodo Log性能调整目标:  在能够影响Oracle性能的诸多因素中,Redo Log相关的因素从某种程度上可以说是最为重要同时也是最值得关注的。因为在一个OLTP系统中Oracle通过各种技术以及优良的设计,尽量做到将大部分操作在内存中完成,以便最大程度的提升性能。因此在Oracle的诸多后台进程以及用户进程的大部分操作都是内存操作,而且这些操作会通过延迟写入技术尽可能的将磁盘I/O操作滞后。但是在这些操作中却有某些例外,其中最明显的就是针对Redo Log的操作。  在Oracle中针对Redo Log的操作主要由LGWR进程完成,这个进程可以说是Oracle所有后台进程中最繁忙的进程,而且这个进程可能要频繁的进行I/O操作,这是因为Oracle出于数据安全的考虑必须保证联机在线重做日志可靠的写入日志文件,以便在发生崩溃时能够有效恢复数据,而真正的数据可能会等一些时间延迟写入数据文件。这种特点在Oracle的各个后台进程中显得有些独树一帜。另外LGWR全局唯一,即一个实例只能有一个活动的LGWR进程,由于要进行频繁的I/O操作可想而知是很容易造成LGWR进程竞争的。由于LGWR在Oracle实例结构设计中的特殊地位,一旦出现LGWR性能瓶颈,那么对整个系统的性能影响将会是极为严重的,同时对数据安全也是一个潜在的威胁。  因此作为Oracle日常的数据库管理,我们要给与这部分相当的关注,尽早发现问题,尽早作出调整。调整的目标就是要做到Log_Buffer大小适中(不要过大,也不能太小),要满足用户进程的使用需要,每当系统负载有一个明显的增加时,就应该考虑调整它的大小。比如因为业务拓展当前系统固定用户数量从1万人猛增到3万人,那么就应该对Log_Buffer大小给与关注。另外就是要做到日志文件的大小适中,日志组的日志文件数量合适,不能影响LGWR写日志文件的性能,不能造成日志文件间的写入竞争,不能在日志切换归档发生时引发磁盘竞争等等。  二、监控与问题排查:  在进行Redo Log问题监控时,主要关注两个方面:日志缓冲区空间使用的等待情况和日志缓冲区数据槽的分配情况。通过这两方面的监控并配合一些问题排查手段,通常可以发现大量问题。  (1)日志缓冲区空间使用的等待情况:  可以通过查询v$session_wait来监控日志缓冲区空间使用的等待情况,通过如下SQL语句进行查询:select sid,event,seconds_in_wait,statefrom v$session_waitwhere event="log buffer space%";   以上的查询中可以通过观察seconds_in_wait的数值来分析问题,这个数值可以显示如下问题:日志切换缓慢引发的等待、LGWR写入缓慢引发的等待、日志文件写入引起的磁盘竞争引发的等待。  这些等待的发生可能是由于如下问题引起的:  1、日志文件写入时存在磁盘竞争:  这种情况多见于日志切换发生时,由于日志文件组的规划不当,或者存放日志文件的磁盘写入速度缓慢,或者是因为磁盘RADI类型不当都会引发这个问题,如果怀疑村在这些情况,可以通过如下语句进行监控:select event,total_waits,time_waited,average_waitfrom v$system_eventwhere event like "log file switch completion%";   可以通过观察total_waits,time_waited,average_wait数值来分析问题,如果这些值过高(注意何谓“过高”,不同系统考量标准不一样,要具体分析),那么说明存在以上问题。此时可以通过如下措施解决:  ● 将同一日志文件组的各个成员分配到不同的磁盘上,进而减少日志写入以及日志切换和日志归档时引发的竞争;  ● 将日志文件尽可能存放在快速的磁盘上;  ● 要合理选择RADI类型对磁盘进行条带化,通常不要选择RADI5来作为日志文件磁盘的RADI类型,通常推荐使用RADI10;  ● 可以增加REDO LOG文件大小,来延缓日志切换,下面是一个增加日志文件大小的方法;  假如原来有3个小的redo log file,下面是UNIX环境下的一个例子:  第一步:往数据库添加三个大的redo logfileSVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 4("/opt/oradata/app/redo04.log","/ora_bak/oradata2/redolog/redo04.log") size 16M reuse;SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 5("/opt/oradata/app/redo05.log","/ora_bak/oradata2/redolog/redo05.log") size 16M reuse;SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 6("/opt/oradata/app/redo06.log","/ora_bak/oradata2/redolog/redo06.log") size 16M reuse;  第二步: 手工地做log switch,使新建的redo logfile起作用SVRMGRL>alter system switch logfile;   此操作可以执行一到几次,使旧的redo logfile成invalid状态。
2023-08-11 21:35:461

Oracle里redo文件size小且数量少,切换频繁,会对数据库性能产生怎样影响?请讲的具体一些,谢谢你。

会造成等待,1 如果事务要使用空闲的redo 文件,发现会没有被释放会写日志的操作会hang住,导致事务也停止2 切换过于频繁,log file sync ,log file parallel write 等待。
2023-08-11 21:35:531

oracle redo日志切换时间怎么看

第步查看前志select a.group#,a.bytes/1024/1024||"M" log_size,a.status,b.member from v$log aleft join v$logfile b on A.GROUP#=b.group#第二步删除原志注意事项:a. 志前状态必须inactive才删除active状态说明志记录没同步数据文件需要等待定间才变inactive状态;current状态前写志能删除b. 志组数量能低于2组删除志命令:前group 2inactive所能删除group 2使用删除命令:alter database drop logfile group 2剩两组志志组能低于2组所能再删除能添加志组再删除c. 执行删除该志物理文件存删除作危险需要删除再行创建志文件原志文件名称相同增加志组(或者志组员)命令添加reuse选项第三步添加新志使用批量命令:alterdatabaseaddlogfile group4"/data/log/REDO_LOG04.log"size 500M,group5"/data/log/REDO_LOG05.log"size 500M,group6"/data/log/REDO_LOG06.log"size 500M;志状态active候我要改变删除我需要使用命令:altersystemswitchlogfile;改变current log改变currentlog变第2组志第1组志状态active再等待定间其状态变inactive候删除志组1状态间改变执行手检查点命令:altersystemcheckpoint
2023-08-11 21:36:011

oracle rac使用存储,存储上面有部分固态盘怎么分配最合理 例如 undo文件 redo文件 temp文件 数据文件

redo temp 放到固态盘,仅供参考。因为redo操作频繁,temp在查询和排序时用的多。归档、数据文件等其它文件放到别的盘。另外固态盘最好设置成系统内存,这样对sga的读取会快,这个还是最关键的。
2023-08-11 21:36:251

C#怎样实现撤销操作重复操作?可以是undo、redo或其他方式,怎样可以实现啊?谢谢,悬赏80分

一般控件才提供撤销操作,而自己写的方法或事件,一般需要自己写撤销操作。比如,你单击某按扭进行的操作,是不能撤销的,除非自己再写一个可以撤销的方法对事件就行可逆操作。但文本等控件是自带撤销和重复操作的,如:richTextBox1.Undo();richTextBox1.Redo();
2023-08-11 21:36:321

oracle的日志组为什么最少是两个或者是建议多个

首先我们来说一下Oracle redo的作用:Oracle通过Redo来保证数据库的事务可以被重演,从而使得在故障之后,数据可以被恢复。Redo对于Oracle数据库来说至关重要!至关重要!至关重要!(重要的事情说三遍!!!)问题一:为什么最少是两个。为了保障redo log 的冗余性,那么一个redo log group内,至少有两个成员文件,且这两个成员文件最好存放在不同的物理盘上。那么在oracle 日志条目过来的时候,会分别同时向两个文件写入。如果其中一个文件发生损坏,那么不必着急,咱们还有另一个一模一样的文件。这样就可以很好的保护redo log了。例如:主机上有两块硬盘/disk1 , /disk2 ,成员文件最好分别落在这两个盘上。问题二:或者是建议多个.这是一个平衡的问题,如果一个redo group存在多个成员文件,那么oracle 日志条目过来的时候,会分别同时向n个文件进行写入,这样固然更加的安全,但如果成员文件过多会导致磁盘I/O的压力,对数据库性能带来瓶颈。所以日志组内配置多少个冗余余文件需要权衡哦。但至少是两个,两个也基本是大多数数据库的配置方式了。
2023-08-11 21:36:401

在数据库中,REDO操作和UNDO操纵个表示什么含义?

redo是恢复操作,undo是撤销操作
2023-08-11 21:36:592

redo日志的作用是什么oracle

redo日志的作用是叫做重做日志文件。ONLINE Redo log重做日志(online redo log )。Oracle数据库所在服务器执行shutdown abort等命令使得在服务器重新启动之后,Oracle数据库正常的启动实例。Oracle会使用重做日志,把数据库恢复到服务器掉电前的那一个时刻,从而使得数据库能正常的启动起来 。在Oracle数据库中,至少会有两个重做日志组,而且每个组里面至少包含了一个重做日志文件。日志组不会自动增加,在一个写满之后,会自动去写下一个。在下一个被写满之后会又从第一个开始写起。Archive redo log归档日志(archive log)主要用于硬件级别的错误。这就要使用归档日志文件,通过归档日志文件。把数据库恢复到归档日志所在的时间点上,然后再通过在线重做日志文件把数据库恢复到当前的时间点上。
2023-08-11 21:37:062

insert 语句后是先UNDO,还是REDO

redo 是记录日志用的。 undo是记录数据的备份用的。 简单举个例子说明(实际过程比这要复杂的多): 1、当你发出一条update语句后,oracle先将更改前后信息写进redo(当满足一定条件后由日志写进程写入日志文件)
2023-08-11 21:37:291

oracle 如何增加redo

alter database add logfile group X ("/dev/***") size **M;
2023-08-11 21:37:372

#求助,MAC 下Redo和Undo的快捷键是啥

mac下的快捷键大致和windows相同,不过是把ctrl换为command也就是command+z
2023-08-11 21:37:461

查看Oracle的redo日志切换频率

  两个sql 原理是一样的 第二个用到了统计函数   时间单位 分钟   select * from v$log   where a THREAD# =   select b SEQUENCE# b FIRST_TIME   a SEQUENCE# a FIRST_TIME   round(((a FIRST_TIME b FIRST_TIME)* )* )   from v$log_history a v$log_history b   where a SEQUENCE# = b SEQUENCE#+   and b THREAD#=   order by a SEQUENCE# desc   select sequence# first_time nexttime round(((first_time nexttime)* )* ) diff   from (   select sequence# first_time lag(first_time) over(order by sequence#) nexttime   from v$log_history   where thread#= lishixinzhi/Article/program/Oracle/201311/18503
2023-08-11 21:37:531

为什么系统故障恢复时先undo再redo操作

淡淡的行啊的
2023-08-11 21:38:032

REDO大小通过ORACLE怎么查出来

select a.GROUP#,a.THREAD#,a.BYTES/1024/1024 M from v$log a
2023-08-11 21:38:101

oracle中误删除了redo文件怎么办

可以尝试使用PRM-DUL恢复无法打开的oracle数据库,也可以尝试如下手法来解决问题: 【Oracle数据恢复】Redo Log重做日志文件坏块Corruption的解决 ORA-16038 ORA-00354 ORA-00353 ORA-00367 ORA-01624 ORA-16038 log %s sequence# %s cannot be
2023-08-11 21:38:181

华硕笔记本REDOL14EA有多重?

华硕笔记本REDOL14EA整机重量约1.4kg。
2023-08-11 21:38:361

如何诊断Oracle Redo Log引发的性能问题

  在能够影响Oracle性能的诸多因素中,Redo Log相关的因素从某种程度上可以说是最为重要同时也是最值得关注的。因为在一个OLTP系统中Oracle通过各种技术以及优良的设计,尽量做到将大部分操作在内存中完成,以便最大程度的提升性能。因此在Oracle的诸多后台进程以及用户进程的大部分操作都是内存操作,而且这些操作会通过延迟写入技术尽可能的将磁盘I/O操作滞后。但是在这些操作中却有某些例外,其中最明显的就是针对Redo Log的操作。  在Oracle中针对Redo Log的操作主要由LGWR进程完成,这个进程可以说是Oracle所有后台进程中最繁忙的进程,而且这个进程可能要频繁的进行I/O操作,这是因为Oracle出于数据安全的考虑必须保证联机在线重做日志可靠的写入日志文件,以便在发生崩溃时能够有效恢复数据,而真正的数据可能会等一些时间延迟写入数据文件。这种特点在Oracle的各个后台进程中显得有些独树一帜。另外LGWR全局唯一,即一个实例只能有一个活动的LGWR进程,由于要进行频繁的I/O操作可想而知是很容易造成LGWR进程竞争的。由于LGWR在Oracle实例结构设计中的特殊地位,一旦出现LGWR性能瓶颈,那么对整个系统的性能影响将会是极为严重的,同时对数据安全也是一个潜在的威胁。  因此作为Oracle日常的数据库管理,我们要给与这部分相当的关注,尽早发现问题,尽早作出调整。调整的目标就是要做到Log_Buffer大小适中(不要过大,也不能太小),要满足用户进程的使用需要,每当系统负载有一个明显的增加时,就应该考虑调整它的大小。比如因为业务拓展当前系统固定用户数量从1万人猛增到3万人,那么就应该对Log_Buffer大小给与关注。另外就是要做到日志文件的大小适中,日志组的日志文件数量合适,不能影响LGWR写日志文件的性能,不能造成日志文件间的写入竞争,不能在日志切换归档发生时引发磁盘竞争等等。  二、监控与问题排查:  在进行Redo Log问题监控时,主要关注两个方面:日志缓冲区空间使用的等待情况和日志缓冲区数据槽的分配情况。通过这两方面的监控并配合一些问题排查手段,通常可以发现大量问题。  (1)日志缓冲区空间使用的等待情况:  可以通过查询v$session_wait来监控日志缓冲区空间使用的等待情况,通过如下SQL语句进行查询:  select sid,event,seconds_in_wait,state  from v$session_wait  where event="log buffer space%";  以上的查询中可以通过观察seconds_in_wait的数值来分析问题,这个数值可以显示如下问题:日志切换缓慢引发的等待、LGWR写入缓慢引发的等待、日志文件写入引起的磁盘竞争引发的等待。  这些等待的发生可能是由于如下问题引起的:  1、日志文件写入时存在磁盘竞争:  这种情况多见于日志切换发生时,由于日志文件组的规划不当,或者存放日志文件的磁盘写入速度缓慢,或者是因为磁盘RADI类型不当都会引发这个问题,如果怀疑村在这些情况,可以通过如下语句进行监控:  select event,total_waits,time_waited,average_wait  from v$system_event  where event like "log file switch completion%";  可以通过观察total_waits,time_waited,average_wait数值来分析问题,如果这些值过高(注意何谓“过高”,不同系统考量标准不一样,要具体分析),那么说明存在以上问题。此时可以通过如下措施解决:  ● 将同一日志文件组的各个成员分配到不同的磁盘上,进而减少日志写入以及日志切换和日志归档时引发的竞争;  ● 将日志文件尽可能存放在快速的磁盘上;  ● 要合理选择RADI类型对磁盘进行条带化,通常不要选择RADI5来作为日志文件磁盘的RADI类型,通常推荐使用RADI10;  ● 可以增加REDO LOG文件大小,来延缓日志切换,下面是一个增加日志文件大小的方法;  假如原来有3个小的redo log file,下面是UNIX环境下的一个例子:  第一步:往数据库添加三个大的redo logfile  SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 4  ("/opt/oradata/app/redo04.log",  "/ora_bak/oradata2/redolog/redo04.log") size 16M reuse;  SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 5  ("/opt/oradata/app/redo05.log",  "/ora_bak/oradata2/redolog/redo05.log") size 16M reuse;  SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 6  ("/opt/oradata/app/redo06.log",  "/ora_bak/oradata2/redolog/redo06.log") size 16M reuse;  第二步: 手工地做log switch,使新建的redo logfile起作用  SVRMGRL>alter system switch logfile;  此操作可以执行一到几次,使旧的redo logfile成invalid状态。
2023-08-11 21:38:441

online redo log 和undo各有什么作用

REDO记录transaction logs,分为online和archived。以恢复为目的。 比如,机器停电,那么在重起之后需要online redo logs去恢复系统到失败点。 比如,磁盘坏了,需要用archived redo logs和online redo logs区恢复数据。 比如,truncate一个表或其他的操作,想恢复到之前的状态,同样也需要。 REDO是为了重新实现你的操作,而UNDO相反,是为了撤销你做的操作,比如你得一个TRANSACTION执行失败了或你自己后悔了,则需要用ROLLBACK命令回退到操作之前。回滚是在逻辑层面实现而不是物理层面,因为在一个多用户系统中,数据结构,blocks等都在时时变化,比如我们INSERT一个数据,表的空间不够,扩展了一个新的EXTENT,我们的数据保存在这新的EXTENT里,其它用户随后也在这EXTENT里插入了数据,而此时我想ROLLBACK,那么显然物理上讲这EXTENT撤销是不可能的,因为这么做会影响其他用户的操作。所以,ROLLBACK是逻辑上回滚,比如对INSERT来说,那么ROLLBACK就是DELETE了。闪回恢复区是一个默认放置所有和备份恢复操作相关文件的地方。Oracle DBA可以使用Automatic Disk-Based Backup and Recovery,让数据库来管理备份存储的区域。
2023-08-11 21:38:512

物理DataGuard中哪个进程处理RedoGAP

物理Data Guard中哪个进程处理Redo GAP,在Oracle Data Guard中,Redo Gap的产生是由于一些网络或者其他问题导致redo的传输中断。在Oracle Data Guard中,Redo Gap的产生是由于一些网络或者其他问题导致redo的传输中断。当故障消除后,这些没有传输过去的redo文件会由一些进程发现,并且将它们传输到备库。术语:ARC:归档进程MRP:Media Recovery Process,,在备库上负责应用redoRFS:Remote File Server ,在备库上接收发送过来的redo文件FAL:Fetch Archive Log测试目的:由于网络问题发生了gap后,确定哪个进程负责处理gap。测试环境:Oracle 11.2.0.2 on Linux 5.测试过程:1.确保当前主库和备库是同步的:Primary:MAX(SEQUENCE#)-------------- 86Standby:MAX(SEQUENCE#)-------------- 862. 模拟网络中断,导致gap:在主库将网卡停掉: #ifconfig eth0 down将主库执行数次switch logfile:SQL>alter system switch logfile;SQL>alter system switch logfile;...Primary:MAX(SEQUENCE#)-------------- 96这时主库alert log报出了与备库连接不通的错误:TNS-00513: Destination host unreachable nt secondary err code: 101 nt OS err code: 0Error 12543 received logging on to the standbyFAL[server, ARCp]: Error 12543 creating remote archivelog file "STANDBY"FAL[server, ARCp]: FAL archive failed, see trace file.ARCH: FAL archive failed. Archiver continuingORACLE Instance orcl - Archival Error. Archiver continuing.3.将主库的这些归档临时换个目录,保证这些归档无法传到备库:mv *.arc ../4. 启动主库的网卡:#ifconfig eth0 up5.这时,主库的ARC并没有把缺少的日志传到备库。最终备库的MRP发现了gap并把gap fetching.备库alert log:Thu Mar 29 19:58:49 2012Media Recovery Waiting for thread 1 sequence 87 (in transit)
2023-08-11 21:38:591

如何调整Oracle Redo Logfile日志文件的大小

1.查看当前日志组成员SQL> select member from v$logfile; MEMBER--------------------------------------------------------------------------------/u01/oracle/oradata/orcl/redo03.log/u01/oracle/oradata/orcl/redo02.log/u01/oracle/oradata/orcl/redo01.log2. 查看当前日志组状态:SQL> select group#,members,bytes/1024/1024,status from v$log; GROUP# MEMBERS BYTES/1024/1024 STATUS---------- ---------- --------------- ---------------- 1 1 50 ACTIVE 2 1 50 CURRENT 3 1 50 INACTIVE现在有三个日志成员,大小为50M,欲更改为100M增加日志组SQL>alter database add logfile group 4 ("/u01/oracle/oradata/orcl/redo04.log") size 100M;SQL>alter database add logfile group 5 ("/u01/oracle/oradata/orcl/redo05.log") size 100M;SQL>alter database add logfile group 6 ("/u01/oracle/oradata/orcl/redo06.log") size 100M;3.切换到新增的日志组上SQL> alter system switch logfile;System altered.SQL> alter system switch logfile;System altered.SQL> select group#,members,bytes/1024/1024,status from v$log GROUP# MEMBERS BYTES/1024/1024 STATUS---------- ---------- --------------- ---------------- 1 1 50 INACTIVE 2 1 50 INACTIVE 3 1 50 ACTIVE 4 1 100 CURRENT 5 1 100 UNUSED 6 1 100 UNUSEDa. CURRENT指当前的日志文件,在进行实例恢复时是必须的;b. ACTIVE是指活动的非当前日志,在进行实例恢复时会被用到。Active状态意味着,Checkpoint尚未完成,因此该日志文件不能被覆盖。c. INACTIVE是非活动日志,在实例恢复时不再需要,但在介质恢复时可能需要。d. UNUSED表示该日志从未被写入,可能是刚添加的,或RESETLOGS后被重置。4.删除旧的日志组SQL> alter database drop logfile group 1; Database altered.SQL> alter database drop logfile group 2 2 /Database altered.SQL> alter database drop logfile group 3;alter database drop logfile group 3*ERROR at line 1:ORA-01624: log 3 needed for crash recovery of instance dbserver (thread 1)ORA-00312: online log 3 thread 1: "/u01/oracle/oradata/orcl/redo03.log"由于log 3 日志成员还出去active 状态,所以不能drop掉的,再次执行 alter system switch logfile; SQL> select group#,members,bytes/1024/1024,status from v$log;GROUP# MEMBERS BYTES/1024/1024 STATUS---------- ---------- --------------- ---------------- 3 1 50 INACTIVE 4 1 100 ACTIVE 5 1 100 CURRENT 6 1 100 UNUSEDSQL> alter database drop logfile group 3;Database altered.SQL> select group#,members,bytes/1024/1024,status from v$log;GROUP# MEMBERS BYTES/1024/1024 STATUS---------- ---------- --------------- ---------------- 4 1 100 ACTIVE 5 1 100 ACTIVE 6 1 100 CURRENT在操作系统下删除掉redolog 日志文件mv /u01/oracle/oradata/orcl/redo0[1-3].log /tmp
2023-08-11 21:39:072

oracle redo undo 什么时候生成

在sql解析完毕生成执行计划之后,并且在buffer cache实际修改buffer之前生成undo和redo。
2023-08-11 21:39:141

mysql如何保证redolog和binlog的一致性,安全性,效率。

* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!mysql如何保证redolog和binlog的一致性,安全性,效率。和数据安转相关的参数sync_binlog:控制binlog的刷新方式(写入到磁盘)innodb_flush_log_at_trx_commit:在innodb下控制着redo的写入方式innodb_support_xa:外部事务,用来保证binlog和redo一致性的,俗称两段式提交binlog_order_commits:按照binlog的写入顺序提交事务,保证redo和binlog的已执行binlog_max_flush_queue_time: leader线程搜集binlog的超时时间2pc提交(官方支持)(redo日志在prepare阶段就已经sync),绝大部分都比较支持这种说法http://dev.m***.com/doc/refman/5.6/en/binary-log.htmlhttp://blog.i***.net/15480802/viewspace-1411356http://www.l******.com/Linux/2015-11/124942.htmhttp://www.2**.com/database/201306/221413.html2pc流程:(sync_binlog = 1,innodb_flush_log_at_trx_commit = 1 )1.prepare阶段:sync redo 日志(未sync的redo存放于innodb_log_buffer_size中),系统自动完成获取prepare_commit_mutex(一个全局锁,一次只能被一个事务获取)2.生成binlog,将binlog写入文件系统(未提交之前binlog存放在binlog_cache_size中),sync binlog,这一步受sync_binlog控制3.提交commit 将commit标志sync ,释放prepare_commit_mutex(这一步应该受innodb_flush_log_at_trx_commit的控制)违背了这个参数的定义:innodb_flush_log_at_trx_commit观点二:redo日志在最后的commit的时候才synchttp://blog.i***.net/28218939/viewspace-19758092pc流程:(官方没有明显的支持这种说法)1.prepare阶段:获取prepare_commit_mutex2.生成binlog,将binlog写入文件系统(未提交之前binlog存放在binlog_cache_size中),sync binlog3.提交commit 将redo log sync ,释放prepare_commit_mutex这种方式会造成binlog的日志记录多余redo日志记录,在恢复的时候是如何恢复? 难道是以binlog为准,不管这个事务的redo有没有提交 ,只要写binlog就认为该事务以提交(现阶段还没有找到有关该说法).innodb数据恢复流程1.查找未提交的redo日志(找xid)2.用xid去binlog查找对应的日志记录3.如果有就认为这个事务是提交的,并补充commit。如果没有就认为是没有提交的,在恢复的时候就rollback事务###################################################################################################以上2pc日志写入方式是在 mysql5.6之前的方式,当sync_binlog=1的时候 系统的性能非常糟糕。从5.6 之后就开始采用BLGC方式写2pc日志,来提升性能BLGC具体流程如下:(每一个阶段只有一个活跃的线程)flush stage:搜集多个线程产生的binlog,依次放入flush队列的末尾,sync stage:flush队列超时(binlog_max_flush_queue_time)或者没有线程产生binlog了 ,flush队列开始sync队列,将binlog写入磁盘(合并io) commit stage:队列进入提交阶段(这里只做提交操作,redo日志的写入已经在prepare写入)个人理解:flush stage:队列中的第一个线程为leader线程,后面的线程为follower线程,leader线程主要负责收集待提交binlog的线程,并且放入flush 队列的末尾,直到没有找到需要提交binog的线程,或者超时(binlog_max_flush_queue_time),才进入sync stagesync stage:如果flush stage队列为空,则之前leader线程依然为leader线程,负责binlog的sync,否则变成follower线程(合并执行sync)commit stage:sync完binlog的线程被放入commit队列的末尾,等待提交5.7 的组提交:Step1. InnoDB Prepare,记录当前的LSN到thd中。Step2. 进入 Group Commit 的flush stage;Leader搜集队列,同时算出队列中最大的LSN。Step3. 将InnoDB的redo log write/fsync到指定的LSN Step4. 写Binlog并进行随后的工作(sync Binlog, InnoDB commit也就是将 redo log的write/sync延迟到了 binlog group commit的 flush stage 之后,sync binlog之前。通过延迟写redo log的方式,显式的为redo log做了一次组写入(redo log group write),并减少了(redo log) log_sys->mutex的竞争。组提交http://www.t*****.com/articles/rEZr2qhttp://m********.com/?p=581http://www.c**.net/article/2015-01-16/2823591(淘宝内部mysql交流)innodb数据丢失的问题:http://www.3****.com/content/14/1019/00/12904276_418041635.shtml组提交的理解:http://www.b****.com/pdb/mysql/201407/226226.html本文出自 “SQLServer MySQL” 博客,请务必保留此出处http://dwchaoyue.blog.5***.com/2826417/1784509mysql如何保证redolog和binlog的一致性,安全性,效率。标签:mysql 原理
2023-08-11 21:39:211

华硕笔记本REDOL14EA屏幕是多大的?

华硕笔记本REDOL14EA屏幕是14英寸的。
2023-08-11 21:39:281