PRM-DUL成功案例:为某电信运营商恢复了误truncate的一百多张表

PRM-DUL成功案例:为某电信运营商恢复了误删truncate的一百多张表。东南某电信运营商生产系统数据库部分数据表被误删除的问题,现场工作内容:采用PRM-DUL工具将所需要的共121张表恢复出来。

整个数据库大小在25T左右,由于还原的新环境存储空间有限,还原整个数据库不够现实。初步决定还原方案为先还原SYSTEM和data表空间,然后使用PRM-DUL直接读取数据文件,将数据导出。

实际这个case用户在带库里是由完整备份和归档的,但是实际情况所制约没有那么多空间和时间去从备份里恢复数据了,如果真的那么做,可能至少需要几天时间,而实际恢复业务要求在1天内。所幸的是业务对这些表的完整性要求不高,而且从后期来看在truncate后插入数据的量很少,所以这个case在协商后使用了PRM-DUL成功scan database字典模式下恢复truncate功能来恢复了。

 

最新版PRM-DUL下载地址: http://parnassusdata.com/sites/default/files/ParnassusData_PRMForOracle_3206.zip

免费的PRM-DUL License :http://www.parnassusdata.com/zh-hans/node/122 

PRM-DUL成功案例:恢复了700GB损坏严重的Oracle数据库

PRM-DUL成功案例:恢复了700GB损坏严重的Oracle数据库。 某中原企业存储断电重启后发现其700GB大小的数据库,存在十几万个坏块,数据库无法正常打开使用。

 

用户自行尝试采用ORACLE DUL做恢复,但是由于ORACLE DUL对于该超过500万个col$记录的数据字典出现DC_COLUMNS过大导致的coredump segmentfault,导致ORACLE DUL无法正常使用。

 

该场景中数据块的损坏模式主要是fracture断裂。诗檀软件工程师Biot.wang 通过修改checksum+ tailchk , tailchk=低2位的bas_kcbh+type_kcbh+seq_kcbh,伪装了大部分数据块为可用。此场景中之后exp可以导出大部分数据,但是由于数据字典严重损毁,所以可能出现表上字段混乱或者缺失数据等问题, 大部分情况可以用PRM-DUL的非字典模式(NON-DICT)来解决。

 

在这个案例中由于用户的表和索引过多,导致数据字典异常庞大,ORACLE原厂的DUL在加载数据字典时由于其内存分配方式直接导致出现了coredump segmentfault,而COL$.DAT又过大了,很难处理分片。

 

在这个问题上PRM-DUL由于采用了内置一个derby数据库,所以即便数据字典再大也不会有问题,而且内置数据库中的数据也做了索引,这保证了PRM-DUL能迅速处理字典操作。 另由于此例子中需要恢复的数据表实在太多,达到了几十万张,所以充分利用了PRM-DUL的schema-level Databridge功能。 仅仅花了2天时间就基本处理完这个case了。

 

最新版PRM-DUL下载地址: http://parnassusdata.com/sites/default/files/ParnassusData_PRMForOracle_3206.zip

免费的PRM-DUL License :http://www.parnassusdata.com/zh-hans/node/122 

诗檀软件成功为某西南大型企业从不完整的备份中恢复了数据

诗檀软件成功为某西南大型国企从不完整的备份中恢复了数据; 某西南大型企业数据库的ASM因为加盘意外损坏,用户自行重建ASM DISKGROUP并restore了热备份,由于丢失了归档,数据库无法打开。

诗檀软件工程师biot.wang 通过特殊恢复方案打开了该并不一致的数据库备份,大致经过为:手动修改bootstrap对象 ,commit事务;修改datafile header绕过已经不存在的archivelog,之后打开数据库exp导出数据并重建数据库。但是由于丢失部分redo,导致部分表exp时出现了ORA-600错误,这部分表通过PRM-DUL工具的DataBridge特性来特殊恢复了。

 

最新版PRM-DUL下载地址: http://parnassusdata.com/sites/default/files/ParnassusData_PRMForOracle_3206.zip

免费的PRM-DUL License :http://www.parnassusdata.com/zh-hans/node/122 

诗檀软件成功为某电力企业恢复大量坏块的核心数据库

诗檀软件成功为某电力企业恢复大量坏块的核心数据库,某东北电力企业的核心数据库在存储意外断电后出现大量FRACTURED块断裂损坏,且数据库无任何形式备份。

 

SQL> select * from v$database_block_corruption;

     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO                   
---------- ---------- ---------- ------------------ ---------                   
         1       3119          1                  0 FRACTURED                   
         1     142239          1                  0 FRACTURED                   
         1      11567          1                  0 FRACTURED                   
         1      79919          1                  0 FRACTURED                   
         1      87535          1                  0 FRACTURED                   
         1      88447          1                  0 FRACTURED                   
         1      89871          1                  0 FRACTURED                   
         1      89999          1                  0 FRACTURED                   
         1      91295          1                  0 FRACTURED                   
         1      93631          1                  0 FRACTURED                   
         1      94383          1                  0 FRACTURED                   

     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO                   
---------- ---------- ---------- ------------------ ---------                   
         1      94639          1                  0 FRACTURED                   
         1      96799          1                  0 FRACTURED                   
         1      96895          1                  0 FRACTURED                   
         1      97647          1                  0 FRACTURED                   
         1     108671          1                  0 FRACTURED                   
         1     108863          1                  0 FRACTURED                   
         1     110927          1                  0 FRACTURED                   
         1     128095          1                  0 FRACTURED                   
         1     134751          1                  0 FRACTURED                   
         1     139423          1                  0 FRACTURED                   
         1     139471          1                  0 FRACTURED 

FRACTURED断裂的损坏块数量大约有2万个,且FILE# 即system.dbf上也存在上百个坏块。
诗檀软件工程师Biot.Wang通过Patch数据字典的方式打开了数据库并,恢复了绝大多数数据。 由存储断电或其他异常引起的数据库损坏在过去几年中为此类故障的主要诱发原因,即便在条件限制的情况下仍应当考虑至少采取一些周期较长的备份行为,例如逻辑备份,或者针对特定重要的表进行备份。 这个例子中由于成功打开数据库,并exp了大部分数据,所以没有使用到PRM-DUL恢复工具。

 

最新版PRM-DUL下载地址: http://parnassusdata.com/sites/default/files/ParnassusData_PRMForOracle_3206.zip

免费的PRM-DUL License :http://www.parnassusdata.com/zh-hans/node/122 

 

 

How to recover data from truncated oracle tables without backup?

Just Try PRM for Oracle

https://www.askmac.cn/wp-content/uploads/2014/09/howtorecoverfromtruncateusingprmparnassusdatarecoverymanager-140617102539-phpapp01.pdf

Oracle中的PR Enqueue Lock 队列锁

Oracle中的PR Enqueue 队列锁

PR即process creation队列锁enqueue lock ,该 PR队列锁在当启动/创建Oracle后台进程,MTS进程(dispatchers),或parallel slave进程时被排他持有exclusive mode。

为了创建上述这些进程时会需要对SGA内存内数据结构的更新,这些进程启动后又会去读取SGA以便了解其自身具体的职责。 由于需要对SGA的更新,则需要将该操作与enqueue 队列相同步。

如何调优PR enqueue lock队列锁

一般而言该enqueue lock不应当存在争用。 若确实出现了争用则一般说明是MTS 或parallel slave进程生成的速度有些太快了(并不正常)。在此种情况下调整应用或实例参数来保证不要那么快的产生上述进程,一个数据库实例正常情况下用不着频繁的关闭和打开这些进程。

 

ID1/ ID2的含义

一般情况下这里的id1 和 id2 总是0 。

相关BUG

Bugs 1. Bug 1889323 documents a possible problem with this enqueue when running under RAC

PRM- A FULL GUI DUL data unloader For Oracle Database

TRY PRM-DUL Data Unloader For Oracle Database

 

FULL GUI supported, easy to use, written in Java cross platform . PRM can help user recover data from truncated table or corrupted database!

 

PRM-DUL Data Unloader – For Oracle Database, from ParnassusData Software System Inc., which can save your ORACLE database

 

PRM – a public DUL with GUI , is free to download trial version.

 
PRM is designed for Enterprise Database Recovery, which includes all Oracle DUL data recovery functionalities, and also easy-to-use GUI. Users can purchase PRM for its rich GUI on your recovery. Or, you can contact ParnassusData for professional service that is either onsite or remote for your request. Rich GUI wizard can guide your recovery process. PRM can recovery your data direct from your database file system (dirty read). If your data has not been covered, PRM can guarantee your 99.9% data back.

 

[Read more…]

Oracle ASM保护工具ADHU

在11g中asm会在Disk Header的AU 1的最后第二个block中备份asm disk header。虽然在10.2中没有这个自动备份disk header的特性,但使用ADHU工具后该工具会以同样备份目的使用该block(ADHU补全了10.2.0.5之前没有disk header自动备份的功能)。ADHU工具同样可以将disk header的备份存放到本地文件系统中。已备份的Block可以通过adhu 工具的-repair选项来恢复出来。 以文件系统备份的block可以通过kfed工具来查看,也可以通过dd命令来恢复到磁盘上。

换句话说,对于10.2.0.5之前的asm 磁盘头常见的损坏/丢失情况,ADHU工具恰恰是一个有效的保护盾。

而对于10.2.0.5和11.1.0.7以后的asm,使用adhu也是一个不错的选择。

 

使用方法:

 

adhu [-dir dirname ] [-repair] [-quiet] [-readonly] [-syslog mask ] devname

 

默认情况下adhu将disk header备份为当前目录下的备份文件。 使用-dir选项可以指定存放的目录。

当需要使用adhu去修复一个损坏的asm disk header时使用-repair 选项。

-quiet 选项将过滤所有正常的输出信息,若执行成功则不打印任何输出。

-readonly选项 以只读方式来打开disk device,这样备份block将不被写入,而备份文件将在可能的情况下写入。

-syslog选项控制是否写出结果到系统日志和标准输出。

devname代表为asm disk的设备文件,asm头的备份文件将以该device name为基础,并存放在当前目录或者-dir指定的目录。

 

ADHU is  a utility to examine ASM disk headers, report status, create backups, and optionally restore them when the header is corrupt.

 

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

 

诗檀软件专业数据库修复团队

 

服务热线 : 13764045638   QQ号:47079569    邮箱:service@parnassusdata.com

 

 

Oracle Lock 监视和检测锁争用

Oracle  锁定机制

  • 自动管理
  • 高水平的数据并发性
    • 用于 DML 事务处理的行级锁
    • 查询不需要锁
  • 改变中的数据一致性级别
  • 专用锁模式和共享锁模式
  • 锁要一直保持到提交或回退发生之前

 

Oracle 服务器自动管理锁定 Oracle 服务器的缺省锁定机制以最低的限制级别
锁定数据 以便在允许最大程度的数据并发性时 保证数据的一致性

 

数据并发性

根据设计 锁定允许高级别的数据并发性 也就是说 多个用户可以同时安全地访问相同的数据 数据并发性涉及两个级别的锁定 行级或不锁定

• 数据操纵语言 (DML) 锁定是行级锁定

示例

事务处理 1
SQL> update scott.s_emp
2 set salary=salary*1.1
3 where id= 24877;
1 row updated.

事务处理 2

SQL> update scott.s_emp
2 set salary=salary*1.1
3 where id= 24878;
1 row updated.

 

除非用户指定 否则查询不持有锁

 

示例

事务处理 1
SQL> UPDATE s_emp
2 SET salary = salary*1.1;
13120 rows updated.
事务处理 2
SQL> select salary
2 from s_emp
3 where id= 10;
SALARY
———
1000

 

数据一致性

Oracle 服务器也提供不同级别的数据一致性 也就是说 即使其他用户正在更改数据 用户仍会看到数据的静态图

 

持续时间

一直持有锁 直到发生 COMMIT 或 ROLLBACK 或者一个事务处理终止为止 如果一个事务处理异常终止 则 PMON 清除锁

 

锁定模式

排它锁模式 防止相关的资源被其它事务处理共享 直到排它锁被释放为止示例 对于 DML 事务处理 排它锁被设置为行级

事务处理 1

SQL> update scott.s_emp
2 set salary=salary*1.1
3 where id= 24877;
1 row updated.

 

事务处理 2

SQL> update scott.s_emp
2 set salary=salary*1.1
3 where id= 24877;
Transaction 2 waits.

 

在共享锁模式 下 几个事务处理可以在同一资源上获取共享锁

示例 对于 DML 事务处理 共享锁被设置为表级

 

事务处理 1

SQL> update scott.s_emp
2 set salary=salary*1.1
3 where id= 24877;
1 row updated.

 

事务处理 2

SQL> update scott.s_emp
2 set salary=salary*1.1
3 where id= 24878;
1 row updated.

 

两个事务处理更新同一个表中的行

 

锁的持续时间

事务处理一直持有锁 直到它们提交或回退为止

示例

事务处理 1

 

SQL> update scott.s_emp
2 set salary=salary*1.1
3 where id= 24877;
1 row updated.
SQL> commit;
Commit complete.

 

事务处理 2

SQL> update scott.s_emp
2 set salary=salary*1.1
3 where id= 24877;
Transaction 2 waits.
1 row updated.

 

事务处理 1 一提交 事务处理 2 就可以更新行 因为事务处理获取了所请求的锁。

 

锁的类型

DML

多个用户并发地访问数据时 可以使用 DML 锁以保证数据的完整性 锁防止由同时的 冲突的 DML 和 DDL 操作引起的破坏性干扰 DML 锁提供两个级别的锁

表级锁 TM 类型 为任何修改表的 DML 事务处理设置 INSERT UPDATE DELETE SELECT…FOR UPDATE 或 LOCK TABLE 表锁防止 与该事务处理冲突的 DDL 操作

 

示例

事务处理 1

SQL> UPDATE s_emp
2 SET salary=salary*1.1;
13120 rows updated.

 

事务处理 2

SQL> DROP TABLE s_emp;
ERROR at line 1:
ORA-00054:resource busy and
acquire with NOWAIT specified

 

为 INSERT UPDATE DELETE 或 SELECT…FOR UPDATE 更改的每个行 自动地获得行级 锁 TX 类型 行级锁定确保没有其他用户可以同时更改相同的行 因此 不存在用户修改这样的行的危险 其他用户正在修改
该行且仍未提交

示例

事务处理 1

SQL> update scott.s_emp
2 set salary=salary*1.1
3 where id= 24877;
1 row updated.

 

事务处理 2

SQL> update scott.s_emp
2 set salary=salary*1.1
3 where id= 24877;
Transaction 2 waits.

 

DDL

在一个正在进行的 DDL 操作执行或引用方案对象的同时, DDL 锁保护该方案对象的定义。 Oracle 服务器自动地获取 DDL 锁,以防止任何对其它 DDL 操作的破坏性干涉,这些操作可能修改或引用同一方案对象。

 

DML

  • 一个 DML 事务处理至少需要两个锁:
    • 一个共享的表锁定
    • 一个专用的行锁
  • 这种入队机制保持跟踪:
    • 等待锁的用户
    • 所请求的锁模式
    • 用户请求此锁的顺序

DML 事务处理至少获取两个锁

有两种锁结构用于 DML 语句 INSERT UPDATE DELETE SELECT…FOR UPDATE
事务处理获取在表上的共享锁 无论是什么类型的共享锁模式 ,都称为TM 锁。

事务处理在其正在更改的行上获取一个排它锁, 称为 TX 锁 。每个行会使该行标题中的一个锁字节开启 该标题指向由事务处理使用的, 感兴趣的事务处理列表 (ITL) 插槽。 行级锁定模式只能是排它的

 

入队机制

Oracle 服务器将所有的锁作为入队 来维护 入队机制可以跟踪

• 等待由其他用户持有的锁的用户
• 这些用户需要的锁定模式
• 用户请求锁的顺序

如果三个用户同时希望更新同一个行 他们都会获得共享表锁 但是只有一个
用户,即第一个用户,可以获得行锁 .表锁定机制会跟踪谁持有行锁,以及谁在等待行锁。
通过增加参数 DML_LOCKS 和 ENQUEUE_RESOURCES,可增加可用于例程的总锁数。 这在并行服务器配置时是必要的

表锁定模式

自动获取:

• 行专用 (RX): INSERT, UPDATE, DELETE
• 行共享 (RS): SELECT…FOR UPDATE

 

自动表锁定模式自动表锁定模式通常看到由 DML 事务处理持有的两个 TM 表锁定模式, RX 和 RS 。这些是由Oracle 服务器自动分配给 DML 事务处理的表锁定模式。

表锁定模式的限制, 决定了在同一表中获得和持有其它表锁的模式。

 

专用行 (RX)

  • 允许其它事务处理并发地查询、插入、 更新、 删除或锁定在相同表中的其他行。
  • 阻止其它事务处理手动地锁定表 以便进行独占式读写。

示例

事务处理 1 持有 RX 表锁
SQL> update s_emp
2 set salary=salary*1.1
3 where id= 24877;
1 row updated.

 

事务处理 2 持有 RX 表锁

SQL> update s_emp
2 set salary=salary*1.1
3 where id= 24878;
1 row updated

 

Row Share (RS)
可以使用 SELECT…FOR UPDATE 语句 在查询期间选择锁定行 这阻止其它 事务处理手动地锁定表 以便进行独占式写入访问

示例

Transaction 1 (RS table lock held)

SQL> select id,salary
2 from s_emp
3 where id=24877
4 for update;
ID SALARY
——— ———
24877 1100
SQL> commit;
Commit complete.

 

Transaction 2 (X table lock requested)

SQL> lock table s_emp
2 in exclusive mode;
Transaction 2 waits.
Table(s) Locked.

手动锁定模式

通过显式 LOCK TABLE 命令 手动地分配三个其它表锁定模式

SQL> LOCK TABLE s_emp IN exclusive MODE;
Table(s) Locked.

使用显式锁定往往有较好的应用理由 但如果遇到锁争用 则可能需要与开发人员联系
后台开发人员 (而非 Oracle 开发人员),有时使用的锁定级别过高 这是不必要的。

 

共享 (S)

• 仅允许其它事务处理查询表 (SELECT …FOR UPDATE)
• 防止对表的任何修改

隐式获得 共享 锁的 SQL 语句受到引用完整性约束条件的限制 在子表中
如果没有对外键列的索引 那么

• 父级上的任何 DELETE 都持有子级上的 共享 锁
• 父级引用列上的任何 UPDATE 都持有子级的 共享 锁

 

该行为的原因是,当子行持有在任何相关的表中时,其父行决不能被删除 (也决不能更新父行的主键 )锁定子表是为了防止破坏该规则的更新和插入。

示例

事务处理 1 在 (s_dept 上持有的 RX 表锁 在 s_emp 上持有的 S 表锁)

SQL> delete from s_dept
2 where id=60;
1 row deleted.
SQL> commit;
Commit complete.

 

事务处理 2 (请求 RX 表锁)

SQL> update s_emp
2 set salary=salary*1.1
3 where id=24877;
Transaction 2 waits.
1 row updated.

 

为了避免该行为 ,请在引用 (子) 表中设置外键列索引。

如果在子表中索引外键, 则通过锁定索引中被更改的值 ,Oracle 服务器可以防止对子行的更改

示例

事务处理 1 (持有 RX 表锁)

SQL> delete from s_dept
2 where id=60;
1 row deleted.

 

事务处理 2 (持有 RX 表锁)

SQL> create index i on s_emp
2 (dept_id);
Index created.

 

SQL> update s_emp
2 set salary=salary*1.1
3 where id=24877;
1 row updated.

 

表锁定模式

 

  • 在 LOCK 语句中手动获取:
  • 共享行专用 (SRX)
    • 不允许 DML 或共享模式
    • 隐式地用于引用完整性
  • 专用 (X)

 

共享行排它 (SRX)
这种锁定模式防止其它语句获取 DML 或手动共享锁。
再次隐式地获得 共享行排它 锁的 SQL 语句涉及引用完整性 。在下述情况下,当在父表中执行 DELETE 时 需要子级的 共享行排它 锁定

  • 外键约束条件包含 ON DELETE CASCADE
  • 在子表中 没有对外键列的索引

示例

事务处理 1 (持有 s_dept 上的 RX 表锁 持有 s_emp 上的 SRX 表锁)

SQL> delete from s_dept
2 where id=60;
1 row deleted.
SQL> commit;
Commit complete.

 

事务处理 2 (请求 RX 表锁)

SQL> update s_emp
2 set salary=salary*1.1
3 where id=24877;
Transaction 2 waits.
1 row updated.

 

同样 该解决方案用于在子表中索引外键列。

 

排它 (X)

这是表锁的最高级别 因此是限制最多的模式 排它锁:

  • 只允许其它事务处理查询表
  • 防止任何类型的 DML 语句和任何手动锁定模式

示例

事务处理 1 (持有 X 表锁)

SQL> lock table s_dept in exclusive
mode;
Table(s) Locked.

 

事务处理 2 (请求 RS 表锁)

SQL> select * from s_dept
2 for update;
Transaction 2 waits.

 

块中的行级锁定

事务处理提交时 ,不清除块中的行级锁定的锁定信息 ,而是在下一个查询读取块时清除 。这称为延迟的块清除。

执行清除的查询 ,必须检查事务处理的状态 ,以及事务处理表中的系统更改序号 (SCN) 事务处理表持有在回退段标题中。

在块中 Oracle ,服务器在块标题中为每个活动的事务处理持有标识符 。在行级 锁字节为包含事务处理的插槽存储一个标识符。

DDL

  • 专用 DDL 锁:
    • DROP TABLE 语句
    • ALTER TABLE 语句
  • 共享 DDL 锁:
    • CREATE PROCEDURE 语句
    • AUDIT 语句
  • 可分开的分析锁: 使共享 SQL 区域无效

 

DDL

不大可能看到 DDL 锁的争用,因为它们仅短暂地被持有,并且应在 NOWAIT模式中请求这种锁。共有三种类型的 DDL 锁。

排它 DDL

一些 DDL 语句 ,如 CREATE、 ALTER 及 DROP ,必须在它们正在工作的对象上获取一个排它锁。

一些 DDL 语句 如 CREATE ALTER 及 DROP 必须在它们正在工作的对象上获取一个排它锁, 用户就无法在该表上获取排它锁,所以, 如果有用户在表上有未提交的事务处理, ALTER TABLE 语句就会
失败。
示例

事务处理 1

SQL> UPDATE s_emp
2 SET salary=salary*1.1;
3120 rows updated.

 

事务处理 2

SQL> ALTER TABLE s_emp
2 DISABLE primary key;
ORA-00054:resource busy and
acquire with NOWAIT specified

 

注 :使用本地管理的表空间而不是字典管理表空间 , 可以消除对 ST 空间事务处理 锁的争用, 因为在请求空间配置时, 本地管理的表空间不更新数据字典中的表。

共享 DDL

共享 DDL 锁 不阻止类似的 DDL 语句或任何 DML 但阻止其他用户改变或删除引用的对象。

一些语句 如 GRANT 和 CREATE PACKAGE 需要在它们引用的对象上有共享 DDL 锁。

易碎的分析锁

易碎的分析锁 用于检查对象更改时语句是否应失效。

在库高速缓存中的一个语句或 PL/SQL 对象, 在库高速缓存中的一个语句或 PL/SQL 对象, 直到语句从共享池中超龄释放为止。

可以把该锁看作一个指针 。 可以把该锁看作一个指针 。

 

锁争用

Oracle 服务器锁花费不多但效率高 , 多数站点没有锁定的问题。  如果锁导致争用, 经常是因为:

  • 开发人员用不必要的高锁定级别编写代码
  • 开发人员不必要的长的事务处理编写代码
  • 用户在应提交更改时未提交
  • 应用程序联合使用 Oracle 服务器和其它使用较高锁定级别的产品

V$LOCK 视图

V$LOCK 视图提供有关例程中当前持有的锁的信息

锁类型 ID1
TX 回退段编号和插槽编号
TM 正在被修改的表的 ID

 

示例 若要查找 V$LOCK 视图的某个特定 资源 ID 1 相应的表名称:

SQL> SELECT owner, object_id, object_name, object_type,
2 v$lock.type
3 FROM dba_objects, v$lock
4 WHERE object_id = v$lock.id1 and object_name = table_name;

 

阻塞其它进程的任何进程,很可能正持有用户应用程序获得的锁。用户应用程序获取的锁为

  • 表锁 (TM)
  • 行级锁 (TX)

这里未列出的其它锁为系统锁 它们仅被短暂地持有。

V$LOCKED_OBJECT 视图

锁类型 ID1
XIDUSN 回退段编号
OBJECT_ID 正被修改的对象的 ID
SESSION_ID 锁定对象的会话的 ID
ORACLE_USERNAME
LOCKED_MODE

 

示例 若要查找与 V$LOCKED_OBJECT 视图的某个特定 OBJECT_ID 相应的表名称:

SQL> select xidusn, object_id, session_id, locked_mode
2 from v$locked_object;
XIDUSN OBJECT_ID SESSION_ID LOCKED_MODE
——— ——— ———- ———–
3 2711 9 3
0 2711 7 3
SQL> select object_name
2 from dba_objects
3 where object_id = 2711;
OBJECT_NAME
————-
S_EMP

 

如果 XIDUSN 的值为 0,相应的 SESSION_ID 正在请求和等待 SESSION_ID 持有的锁, 对于 SESSION_ID XIDUSN 有非 0 的值。

 

锁管理的原则解决争用

终止会话

如果一个用户持有由另一个用户所请求的锁 则可以:

  • 与持有者联系并要求该用户提交或回退事务处理
  • 作为最后的手段 终止该 Oracle 用户会话 这样将回退事务处理并释放锁

上述的任何监视方法都将给出用户的会话标识符。

可以使用以下语句终止用户会话:

The ALTER SYSTEM KILL SESSION SQL command :

SQL> select sid,serial#,username
2 from v$session
3 where type=’USER’;
SID SERIAL# USERNAME
——— ——— ——————————
8 122 SYSTEM
10 23 SCOTT
SQL> alter system kill session ‘10,23’;
System altered.

解决死锁

当两个或更多用户等待彼此锁定的数据时 会出现死锁。

Oracle 服务器会自动检测死锁 并通过回退检测到有死锁的语句来解决死锁。

假设 事务处理 1 的第二个更新检测到死锁 , Oracle 服务器回退该语句并返回消息 。 尽管导致死锁的语句回退, 但事务处理并不回退 , 您将收到 ORA-00060 错误 。 下一个操作应为回退剩余的事务处理。

技术注释

在事务处理明显地覆盖 Oracle 服务器的缺省锁定时, 会频繁导致死锁 。 一旦检测到 , 一旦检
测到 。

跟踪文件

死锁情况记录在 USER_DUMP_DEST 目录下的一个跟踪文件中 。 为了确定应用
程序是否存在问题, 为了确定应用程序是否存在问题。 为了确定应用程序是否存在问题。

 

 

Oracle CKPT checkpoint 检查点知识汇总

CKPT Checkpoint Process
Signals DBWn at checkpoints and updates all the data files and control files of the database to indicate the most recent checkpoint.
At specific times CKPT starts a checkpoint request by messaging DBWn to begin writing dirty buffers. On completion of individual checkpoint requests, CKPT updates data file headers and control files to record most recent checkpoint.
See Also: Oracle Database Concepts
CKPT performs tasks such as recording and starting checkpoints, generating heartbeat redo,and completing outstanding object drop/truncate cross-instance calls.

 

Oracle CKPT checkpoint 检查点知识汇总

CKPT 检查点进程:检查点(CKPT): 在检查点传送信号给DBWn, 并且更新数据库的所有数据文件及控制文件,以指示最近的检查点。当出现检查点时,所有确认的交易所造成的变更,都会被写入磁盘中数据文件。

 

检查点

LGWR 后台进程在一个周期中依次写入重做日志组
当一个组写满时 Oracle 服务器必须执行检查点 这意味着

DBWn 将全部或部分的坏块写入到数据文件 正在进行检查的日志会记录这些坏块
CKPT 更新数据文件标题和控制文件

虽然检查点产生许多磁盘写入 但检查点通常允许其它工作同时继续执行 如果 DBWn 进程没有完成对文件的检查 并且 LGWR 还需要该文件 则 LGWR
必须等待频繁的检查点意味着例程恢复时间更短 但也意味着 DBWn 写入 到数据文件 和 CKPT 写入 到数据文件标题 会增多 您的选择取决于恢复时间和运行时性能的优先级

 

后台进程和恢复:检查点 (CKPT)

CKPT 负责:

  • 在检查点向 DBWn 发出信号
  • 使用检查点信息更新数据文件头
  • 使用检查点信息更新控制文件

要了解实例恢复,需要了解特定后台进程的功能。
每隔三秒(或频率更高),CKPT 进程就在控制文件中存储一次数据,以记录 DBWn 从SGA 写入到磁盘的已修改数据块。这就称为“检查点”。检查点的用途是标识联机重做日志文件开始进行实例恢复的位置(这个位置称为“检查点位置”)。
如果使用日志切换,CKPT 进程还会将这个检查点信息写入到数据文件头。使用检查点的原因如下:

  • 确保定期将内存中的已修改数据块写入磁盘,以便在系统或数据库出现故障的情况下不会丢失数据
  • 减少实例恢复所需的时间。在进行恢复时只需处理跟在最后一个检查点后面的联机重做日志文件
  • 确保在关闭过程中所有已提交数据都写入到数据文件中

由 CKPT 进程写入的检查点信息包括检查点位置、系统更改号、联机重做日志文件中开始恢复的位置、关于日志的信息等等。

注:CKPT 进程并不将数据块写入到磁盘,也不将重做块写入到联机重做日志文件。

检查点优化原则

 

• 确定联机重做日志文件的大小以削减检查点数
• 添加联机重做日志组以延长 LGWR 开始重写之前的时间
• 用初始化参数控制检查点:
FAST_START_IO_TARGET
LOG_CHECKPOINT_INTERVAL
LOG_CHECKPOINT_TIMEOUT
DB_BLOCK_MAX_DIRTY_TARGET

 

监视检查点的频率

可以检查 alert.log 文件中日志切换的次数

同样 检查该文件是否有 Checkpoint not complete; unable to allocate file. 的错误消息 这些消息表示 LGWR 等待检查点的完成
如果系统统计 已启动的后台检查点 和 已完成的后台检查点 的值相差超过 1 则日志切换之间的检查点没有完成 您需要更大的日志文件
可以设置 LOG_CHECKPOINTS_TO_ALERT 参数 以便将检查点的开始和结束时间都记录在 alert.log 文件中
在 report.txt 中 DBWn 检查点写入请求 统计表明检查点发送到 DBWn的次数 如果每个事务都有大量检查点 则表明产生了过多的检查点

 

调整检查点

DBWn 必须总是在每个重做日志组的结尾执行检查点 也可以用初始化参数设置检查点
注 有关检查点和快速启动检查点的完整解释 以及这些概念所涉及的所有数的全部说明 。

如果有效的性能是您需要优先考虑的因素 则应选择重做日志文件的大小 以便检查点的发生频率尚不足以导致明显的响应延迟 但又不过于频繁

对许多站点 该频率一般为每 30 分钟一次 但是根据业务需要 数据库的检查点频率可以是 2 秒到 8 小时的任何值

您可以实验不同的检查点频率 例如 如果 SGA 非常大并且检查点很少发生则 OLTP 系统可能在检查点期间发生磁盘争用 在这种情况下 较频繁的检查点会使坏块更少

注 优化 DBWn I/O 一节中将解释 DB_BLOCK_MAX_DIRTY_TARGET参数

 

 

下面的alert.log例子是: 由于轮换重做日志文件太快而导致未完成检查点
Thread 1 advanced to log sequence 1597
Current log# 2 seq# 1597 mem# 0:/users/cours/tun8_08/DATA/DISK3/
log2a.rdo
Thread 1 cannot allocate new log, sequence 1598
Checkpoint not complete

 

下面的例子是: 示例 1 数据库写入器检查点
Statistic Total Per Trans Per Logon
————————— ——- ———– ———
DBWR checkpoint buffers written 1 1 1
DBWR free buffers found 11 11 11
DBWR 检查点 表明发送给数据库写入器的检查点消息数
检查点期间数据 I/O 的增长可导致系统性能下降
您可以通过增大 init.ora 参数 LOG_CHECKPOINT_INTERVAL 和
LOG_CHECKPOINT_TIMEOUT 来减少检查点的数目和频率 然而要注意 检
查点频率低会增加数据库的恢复时间

 

 

checkpoint 分成很多种  full 、file、thread、parallel query、 object 、incremental 、logfile switch

每一种checkpoint 都有其自身的特性,例如Incremental Checkpoint会要求ckpt 每3s 更新一次controlfile 但是不更新datafile header, 而FULL CHECKPOINT要求立即完成(同步的) 且会同时更新 controlfile 和 datafile header。

各种checkpoint 的特点见下表:

Full Checkpoint

Writes block images to the database for all dirty buffers from all instances

Statistics updated:
DBWR checkpoints
DBWR checkpoint buffers written
DBWR thread checkpoint buffers written

Caused by:
Alter system checkpoint [global]
Alter database begin backup
Alter database close
Shutdown

Controlfile and datafile headers are updated
CHECKPOINT_CHANGE#

Thread Checkpoint

Writes block images to the database for all dirty buffers from one instance

Statistics updated:
DBWR checkpoints
DBWR checkpoint buffers written
DBWR thread checkpoint buffers written

Caused by:
Alter system checkpoint local

Controlfile and datafile headers are updated
CHECKPOINT_CHANGE#

File Checkpoint

Writes block images to the database for all dirty buffers for all files of a tablespace from all instances
Statistics updated:

DBWR tablespace checkpoint buffers written
DBWR checkpoint buffers written
DBWR checkpoints

Caused by:

Alter tablespace XXX offline
Alter tablespace XXX begin backup
Alter tablespace XXX read only

Controlfile and datafile headers are updated
CHECKPOINT_CHANGE#

Parallel Query Checkpoint

Writes block images to the database for all dirty buffers belonging to objects accessed by the query from all instances

Statistics updated:
DBWR checkpoint buffers written
DBWR checkpoints

Caused by:
Parallel Query
Parallel Query component of PDML or PDDL
Mandatory for consistency

Object “Checkpoint”

Writes block images to the database for all dirty buffers belonging to an object from all instances

Statistics updated:

DBWR object drop buffers written
DBWR checkpoints

Caused by:
Drop table XXX
Drop table XXX purge
Truncate table XXX
Mandatory for media recovery purposes

Incremental Checkpoint

Writes the contents of “some” dirty buffers to the database from CKPT-Q
Block images written in SCN order
Checkpoint RBA updated in SGA

Statistics updated:
DBWR checkpoint buffers written

Controlfile is updated every 3 seconds by CKPT
Checkpoint progress record

Log Switch Checkpoint(8i 以前 LOG switch checkpoint是FULL CHECKPOINT)

Writes the contents of “some” dirty buffers to the database

Statistics updated:

DBWR checkpoints
DBWR checkpoint buffers written
background checkpoints started
background checkpoints completed

Controlfile and datafile headers are updated
CHECKPOINT_CHANGE#

 

 

无论是什么类型的checkpoint 检查点 ,所有的本地检查点(CKPT)已类似的本地化方法处理。 每一个实例中所有本地的活跃检查点请求(active local checkpoint request)都保存在一个队列(queue)中,这个队列叫做 Active Checkpoint Queue。 在这个队列(queue)中的每一条记录代表一个本地检查点(local checkpoint request)。 当某一个进程( 可能是前台进程 foreground process –例如前台进程执行“alter tablespace users begin/end backup”, 也可能是CKPT 或者其他后台进程) , 这个进程都会将新的 request 记录放到这个Active Checkpoint Queue中。 典型的一个checkpoint request 由 检查点类型checkpoint request type,优先级priority , 以及与该checkpoint request 关联的checkpoint structure, 等待进程 waiter process,  还有其余一些相关的属性如 FILE Checkpoint 的tablespace id、FILE NUMBER、 Object checkpoint的object id 等。

DBWR进程会不断地扫描这个Active Checkpoint Queue, 并服务于这个Queue上的checkpoint request 检查点请求。 一旦某个request 被完成了,DBWR 将这个request标记为completed 。 CKPT 进程也会不断监控这个  Active Checkpoint Queue 查看是否所有request都被完成了。 当CKPT发觉一个checkpoint request完成了, CKPT会将这个request从 Active Checkpoint Queue中移除。  取决于不同的检查点种类和目的, 当一个本地检查点(local checkpoint)完成,这意味着 某些特定的磁盘上的数据结构被更新,以反映这个检查点完成的物理表现。 这个操作 或者由 直接CKPT完成, 或者由提交checkpoint request的 等待进程直接完成, 或者由CKPT唤醒这个提交checkpoint request的等待进程间接地完成,以上具体由谁来完成操作 取决于检查点种类和目的。

 

图解Low RBA, Thread Checkpoint Queue, File Checkpoint Queue

checkpoint_file_queue.png

 

ODM FINDING:
Understand SCN movement during online user managed backup;
Before online backup, check current scn, system and datafile scn in controlfile and scn in datafile header.

As expected checkpoint scn are same in controlfile and datafile headers, and it is behind current scn.

SQL> select current_scn, checkpoint_change# from v$database;

CURRENT_SCN CHECKPOINT_CHANGE#
———– ——————
325011036          325009912

SQL> select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/system.270.675355175              325009912
+DBA_DATA/dbaprd/datafile/sysaux.269.675355177              325009912
+DBA_DATA/dbaprd/datafile/undotbs1.266.675355179            325009912
+DBA_DATA/dbaprd/datafile/undotbs2.264.675355187            325009912
+DBA_DATA/dbaprd/datafile/users.263.675355189               325009912
+DBA_DATA/dbaprd/datafile/xml_data.262.675355189            325009912

SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/users.263.675355189               325009912

Start online tablespace backup

Oracle did a checkpoint on USERS tablespace and datafile only, and freeze the checkpoint scn on datafile header.

SQL> alter tablespace users begin backup;

Tablespace altered.

SQL> select current_scn, checkpoint_change# from v$database;

CURRENT_SCN CHECKPOINT_CHANGE#
———– ——————
325011196          325009912

SQL>  select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/system.270.675355175              325009912
+DBA_DATA/dbaprd/datafile/sysaux.269.675355177              325009912
+DBA_DATA/dbaprd/datafile/undotbs1.266.675355179            325009912
+DBA_DATA/dbaprd/datafile/undotbs2.264.675355187            325009912
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011168
+DBA_DATA/dbaprd/datafile/xml_data.262.675355189            325009912

SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011168

during the online backup checkpoint scn is freeze on datafile belongs to USERS tablespace

SQL> alter system checkpoint;

System altered.

SQL> select current_scn, checkpoint_change# from v$database;

CURRENT_SCN CHECKPOINT_CHANGE#
———– ——————
325011272          325011243

SQL>  select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/system.270.675355175              325011243
+DBA_DATA/dbaprd/datafile/sysaux.269.675355177              325011243
+DBA_DATA/dbaprd/datafile/undotbs1.266.675355179            325011243
+DBA_DATA/dbaprd/datafile/undotbs2.264.675355187            325011243
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011168
+DBA_DATA/dbaprd/datafile/xml_data.262.675355189            325011243

SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011168

END online tablespace backup;

Oracle advanced checkpoint scn on USERS tablespace and datafile only to be same as system checkpoint scn

SQL> alter tablespace users end backup;

Tablespace altered.

SQL> select current_scn, checkpoint_change# from v$database;

CURRENT_SCN CHECKPOINT_CHANGE#
———– ——————
325011488          325011243

SQL> select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/system.270.675355175              325011243
+DBA_DATA/dbaprd/datafile/sysaux.269.675355177              325011243
+DBA_DATA/dbaprd/datafile/undotbs1.266.675355179            325011243
+DBA_DATA/dbaprd/datafile/undotbs2.264.675355187            325011243
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011243
+DBA_DATA/dbaprd/datafile/xml_data.262.675355189            325011243

9 rows selected.

SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011243

沪ICP备14014813号-2

沪公网安备 31010802001379号