标签云
asm恢复 bbed bootstrap$ dul In Memory kcbzib_kcrsds_1 kccpb_sanity_check_2 MySQL恢复 ORA-00312 ORA-00607 ORA-00704 ORA-00742 ORA-01110 ORA-01555 ORA-01578 ORA-01595 ORA-08103 ORA-600 2131 ORA-600 2662 ORA-600 3020 ORA-600 4000 ORA-600 4137 ORA-600 4193 ORA-600 4194 ORA-600 16703 ORA-600 kcbzib_kcrsds_1 ORA-600 KCLCHKBLK_4 ORA-15042 ORA-15196 ORACLE 12C oracle dul ORACLE PATCH Oracle Recovery Tools oracle加密恢复 oracle勒索 oracle勒索恢复 oracle异常恢复 Oracle 恢复 ORACLE恢复 ORACLE数据库恢复 oracle 比特币 OSD-04016 YOUR FILES ARE ENCRYPTED 勒索恢复 比特币加密文章分类
- Others (2)
- 中间件 (2)
- WebLogic (2)
- 操作系统 (103)
- 数据库 (1,769)
- DB2 (22)
- MySQL (77)
- Oracle (1,610)
- Data Guard (52)
- EXADATA (8)
- GoldenGate (24)
- ORA-xxxxx (166)
- ORACLE 12C (72)
- ORACLE 18C (6)
- ORACLE 19C (15)
- ORACLE 21C (3)
- Oracle 23ai (8)
- Oracle ASM (69)
- Oracle Bug (8)
- Oracle RAC (54)
- Oracle 安全 (6)
- Oracle 开发 (28)
- Oracle 监听 (29)
- Oracle备份恢复 (592)
- Oracle安装升级 (97)
- Oracle性能优化 (62)
- 专题索引 (5)
- 勒索恢复 (86)
- PostgreSQL (30)
- pdu工具 (6)
- PostgreSQL恢复 (9)
- SQL Server (32)
- SQL Server恢复 (13)
- TimesTen (7)
- 达梦数据库 (3)
- 达梦恢复 (1)
- 生活娱乐 (2)
- 至理名言 (11)
- 虚拟化 (2)
- VMware (2)
- 软件开发 (39)
- Asp.Net (9)
- JavaScript (12)
- PHP (2)
- 小工具 (22)
-
最近发表
- 2025年的Oracle 8.0.5数据库恢复
- ORA-600 kokiasg1故障分析(obj$中核心字典序列全部被恶意删除)
- ORA-00756 ORA-10567故障数据0丢失恢复
- 数据库文件变成32k故障恢复
- tcp连接过多导致监听TNS-12532 TNS-12560 TNS-00502错误
- 文件系统格式化MySQL数据库恢复
- .sstop勒索加密数据库恢复
- 解决一次硬件恢复之后数据文件0kb的故障恢复case
- Error in invoking target ‘libasmclntsh19.ohso libasmperl19.ohso client_sharedlib’问题处理
- ORA-01171: datafile N going offline due to error advancing checkpoint
- linux环境oracle数据库被文件系统勒索加密为.babyk扩展名溯源
- ORA-600 ksvworkmsgalloc: bad reaper
- ORA-600 krccfl_chunk故障处理
- Oracle Recovery Tools恢复案例总结—202505
- ORA-600 kddummy_blkchk 数据库循环重启
- 记录一次asm disk加入到vg通过恢复直接open库的案例
- CHECKDB 发现了 N 个分配错误和 M 个一致性错误
- 达梦数据库dm.ctl文件异常恢复
- Oracle Recovery Tools修复ORA-00742、ORA-600 ktbair2: illegal inheritance故障
- 可能是 tempdb 空间用尽或某个系统表不一致故障处理
分类目录归档:Oracle
Oracle 11g增加列,并带默认值的新特性
在11g以前,如果要在一个大表中增加一列,并设置默认值,那将是一个非常悲剧的事情.有些时候不得不选择在线重定义功能来实现该需求.而在11g中增加新列并设置默认值,只是简单的修改数据字典来实现该功能,大大提供效率
10g加列(默认值)
SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for Linux: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production SQL> create table t_xifenfei 2 as select object_id,object_name from dba_objects; Table created. SQL> select count(*) from t_xifenfei; COUNT(*) ---------- 49827 SQL> desc t_xifenfei Name Null? Type ----------------------------------------- -------- ---------------------------- OBJECT_ID NUMBER OBJECT_NAME VARCHAR2(128) SQL> set timing on SQL> alter table t_xifenfei add c_xff varchar2(100) default 'www.xifenfei.com' not null; Table altered. Elapsed: 00:00:06.13 --使用了6秒钟 SQL> select rowid, 2 dbms_rowid.rowid_relative_fno(rowid)rel_fno, 3 dbms_rowid.rowid_block_number(rowid)blockno, 4 dbms_rowid.rowid_row_number(rowid) rowno 5 from t_xifenfei where object_name='OBJ$'; ROWID REL_FNO BLOCKNO ROWNO ------------------ ---------- ---------- ---------- AAAMwJAAEAAAAB8AAr 4 124 43 SQL> alter system dump datafile 4 block 124; System altered. Elapsed: 00:00:00.08
11g增加列(默认值)
SQL> select * from v$version; BANNER ----------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production PL/SQL Release 11.2.0.3.0 - Production CORE 11.2.0.3.0 Production TNS for Linux: Version 11.2.0.3.0 - Production NLSRTL Version 11.2.0.3.0 - Production SQL> create table t_xifenfei 2 as select object_id,object_name from dba_objects; Table created. SQL> select count(*) from t_xifenfei; COUNT(*) ---------- 74605 SQL> select rowid, 2 dbms_rowid.rowid_relative_fno(rowid)rel_fno, 3 dbms_rowid.rowid_block_number(rowid)blockno, 4 dbms_rowid.rowid_row_number(rowid) rowno 5 from t_xifenfei where object_name='OBJ$'; ROWID REL_FNO BLOCKNO ROWNO ------------------ ---------- ---------- ---------- AAASpRAAEAAAACrAAu 4 171 46 SQL> alter system dump datafile 4 block 171; System altered. SQL> set timing on SQL> alter table t_xifenfei add c_xff varchar2(100) default 'www.xifenfei.com' not null; Table altered. Elapsed: 00:00:00.19 --只是使用了0.19秒 SQL> select rowid, 2 dbms_rowid.rowid_relative_fno(rowid)rel_fno, 3 dbms_rowid.rowid_block_number(rowid)blockno, 4 dbms_rowid.rowid_row_number(rowid) rowno 5 from t_xifenfei where object_name='OBJ$'; ROWID REL_FNO BLOCKNO ROWNO ------------------ ---------- ---------- ---------- AAASpRAAEAAAACrAAu 4 171 46 Elapsed: 00:00:00.04 SQL> alter system dump datafile 4 block 171; System altered.
通过10g和11g的增加相同列和默认值的对比可以发现,11g的速度要比10g快很多很多,下面我们通过上面dump出来相关的数据块来分析原因
dump分析
11g增加列之前dump
tab 0, row 0, @0x1f74 tl: 12 fb: --H-FL-- lb: 0x0 cc: 2 col 0: [ 2] c1 15 col 1: [ 5] 49 43 4f 4c 24 tab 0, row 1, @0x1f66 tl: 14 fb: --H-FL-- lb: 0x0 cc: 2 col 0: [ 2] c1 2f col 1: [ 7] 49 5f 55 53 45 52 31 tab 0, row 2, @0x1f5b tl: 11 fb: --H-FL-- lb: 0x0 cc: 2 col 0: [ 2] c1 1d col 1: [ 4] 43 4f 4e 24
11g增加列之后dump
tab 0, row 0, @0x1f74 tl: 12 fb: --H-FL-- lb: 0x0 cc: 2 col 0: [ 2] c1 15 col 1: [ 5] 49 43 4f 4c 24 tab 0, row 1, @0x1f66 tl: 14 fb: --H-FL-- lb: 0x0 cc: 2 col 0: [ 2] c1 2f col 1: [ 7] 49 5f 55 53 45 52 31 tab 0, row 2, @0x1f5b tl: 11 fb: --H-FL-- lb: 0x0 cc: 2 col 0: [ 2] c1 1d col 1: [ 4] 43 4f 4e 24 tab 0, row 3, @0x1f4f tl: 12 fb: --H-FL-- lb: 0x0 cc: 2 col 0: [ 2] c1 10 col 1: [ 5] 55 4e 44 4f 24
10g增加列之后dump
因为10g在没有增加列之前的dump和11g未增加列之前类似,所以未dump出来
tab 0, row 0, @0x1f63 tl: 29 fb: --H-FL-- lb: 0x2 cc: 3 col 0: [ 2] c1 15 col 1: [ 5] 49 43 4f 4c 24 col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6d tab 0, row 1, @0x1f44 tl: 31 fb: --H-FL-- lb: 0x2 cc: 3 col 0: [ 2] c1 2d col 1: [ 7] 49 5f 55 53 45 52 31 col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6d tab 0, row 2, @0x1f28 tl: 28 fb: --H-FL-- lb: 0x2 cc: 3 col 0: [ 2] c1 1d col 1: [ 4] 43 4f 4e 24 col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6d tab 0, row 3, @0x1f0b tl: 29 fb: --H-FL-- lb: 0x2 cc: 3 col 0: [ 2] c1 10 col 1: [ 5] 55 4e 44 4f 24 col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6d
对比发现11g在增加列之后,以前的数据dump出来的内容未有任何改变.也就是说:在10g中,我们增加一个列和默认值,会自动的增加到真实的数据中,而在11g中增加列和默认值并未真的加到11g的表中已经存在的数据中.
11g中插入新数据dump测试
SQL> insert into chf.t_xifenfei(object_id,object_name) 2 select object_id,object_name FROM DBA_OBJECTS; 74605 rows created. SQL> commit; Commit complete. SQL> ALTER SYSTEM FLUSH BUFFER_CACHE; System altered. SQL> / System altered. --建议刷新 SQL> SQL> SQL> select rowid, 2 dbms_rowid.rowid_relative_fno(rowid)rel_fno, 3 dbms_rowid.rowid_block_number(rowid)blockno, 4 dbms_rowid.rowid_row_number(rowid) rowno 5 from chf.t_xifenfei where object_name='OBJ$'; ROWID REL_FNO BLOCKNO ROWNO ------------------ ---------- ---------- ---------- AAASpRAAEAAAACrAAu 4 171 46 AAASpRAAEAAAB5TAAu 4 7763 46 SQL> ALTER SYSTEM DUMP DATAFILE 4 BLOCK 7763; System altered. --dump内容 tab 0, row 0, @0x4e3 tl: 29 fb: --H-FL-- lb: 0x1 cc: 3 col 0: [ 2] c1 15 col 1: [ 5] 49 43 4f 4c 24 col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6d tab 0, row 1, @0x500 tl: 31 fb: --H-FL-- lb: 0x1 cc: 3 col 0: [ 2] c1 2f col 1: [ 7] 49 5f 55 53 45 52 31 col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6d tab 0, row 2, @0x51f tl: 28 fb: --H-FL-- lb: 0x1 cc: 3 col 0: [ 2] c1 1d col 1: [ 4] 43 4f 4e 24 col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6d tab 0, row 3, @0x53b tl: 29 fb: --H-FL-- lb: 0x1 cc: 3 col 0: [ 2] c1 10 col 1: [ 5] 55 4e 44 4f 24 col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6d
通过这里看看出:在11g中后续插入的数据,默认值也插入到数据文件中
Oracle 11G的DDL_LOCK_TIMEOUT参数
今天kaums给客户做培训11g新特性,发现还真的有不少挺好的新东西,但是以前没有怎么去关注的他们,在后续的几篇中,陆续整理处理.
DDL_LOCK_TIMEOUT specifies a time limit for how long DDL statements will wait in a DML lock queue. The default value of zero indicates a status of NOWAIT. The maximum value of 1,000,000 seconds will result in the DDL statement waiting forever to acquire a DML lock.
If a lock is not acquired before the timeout period expires, then an error is returned.
数据库ddl_lock_timeout参数
SQL> select * from v$version; BANNER --------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production PL/SQL Release 11.2.0.3.0 - Production CORE 11.2.0.3.0 Production TNS for Linux: Version 11.2.0.3.0 - Production NLSRTL Version 11.2.0.3.0 - Production SQL> show parameter ddl_lock_timeout; NAME TYPE VALUE ------------------------------------ ---------- -------------- ddl_lock_timeout integer 0
ddl_lock_timeout默认值测试(同以前版本)
--会话1 SQL> set time on 10:27:57 SQL> create table t_xifenfei as 10:28:05 2 select * from dba_users; Table created. Elapsed: 00:00:00.08 10:28:17 SQL> delete from t_xifenfei where username='CHF'; 1 row deleted. --会话2 SQL> set timing on SQL> ALTER TABLE T_XIFENFEI DROP COLUMN AUTHENTICATION_TYPE; ALTER TABLE T_XIFENFEI DROP COLUMN AUTHENTICATION_TYPE * ERROR at line 1: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired Elapsed: 00:00:00.01
设置ddl_lock_timeout超时测试
--会话1 10:28:17 SQL> delete from t_xifenfei where username='CHF'; 1 row deleted. --会话2 SQL> ALTER SESSION SET ddl_lock_timeout=10; Session altered. Elapsed: 00:00:00.00 SQL> ALTER TABLE T_XIFENFEI DROP COLUMN AUTHENTICATION_TYPE; ALTER TABLE T_XIFENFEI DROP COLUMN AUTHENTICATION_TYPE * ERROR at line 1: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired Elapsed: 00:00:10.01
设置ddl_lock_timeout未超时测试
--会话2 SQL> ALTER SESSION SET ddl_lock_timeout=30; Session altered. Elapsed: 00:00:00.00 --会话1 10:30:00 SQL> COMMIT; Commit complete. Elapsed: 00:00:00.00 --会话2 SQL> ALTER TABLE T_XIFENFEI DROP COLUMN AUTHENTICATION_TYPE; Table altered. Elapsed: 00:00:07.91
在以前的版本中ddl操作是nowait等待,通过实验可以发现ddl_lock_timeout可以在一定程度上解决因为我们不清楚这个表是否有dml操作而导致ddl操作不能进行的情况,从一定程度上减少了自己去尝试ddl操作,或者查询相关视图然后找出相关会话,然后kill掉对应数据的情况,可以说是在修改表结构的时候一个很不错的新特性.
使用flashback query恢复被删除plsql
今天一个朋友在11g中误删除生产中的一个过程,让他通过对dba_source视图的flashback query找回该过程.
从10g及其以后的版本中,如果被删除的plsql被及时发现(undo 未被覆盖掉)可以使用flashback query功能实现恢复.
创建plsql并删除
SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for Linux: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production SQL> create or replace PROCEDURE p_test_del(in_put varchar2) as 2 begin 3 dbms_output.put_line(in_put); 4 end; 5 / Procedure created. SQL> set serveroutput on SQL> exec p_test_del('www.xifenfei.com'); www.xifenfei.com PL/SQL procedure successfully completed. SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY ------------------- 2012-07-02 08:34:45 SQL> drop PROCEDURE p_test_del; Procedure dropped.
恢复plsql
SQL> set pagesize 0 SQL> column text format a4000 SQL> spool /tmp/get_delete_proc.xff SQL> SELECT text 2 FROM DBA_source AS OF TIMESTAMP TO_TIMESTAMP('2012-07-02 08:34:45', 'YYYY-MM-DD HH24:MI:SS') 3 WHERE OWNER = 'CHF' AND NAME = 'P_TEST_DEL' ORDER BY LINE; PROCEDURE p_test_del(in_put varchar2) as begin dbms_output.put_line(in_put); end; SQL> spool off; SQL> !more /tmp/get_delete_proc.xff SQL> SELECT text 2 FROM DBA_source AS OF TIMESTAMP TO_TIMESTAMP('2012-07-02 08:34:45', 'YYYY-MM-DD HH24:MI:SS') 3 WHERE OWNER = 'CHF' AND NAME = 'P_TEST_DEL' ORDER BY LINE; create PROCEDURE p_test_del(in_put varchar2) as begin dbms_output.put_line(in_put); end; SQL> spool off;
重建plsql
SQL> create PROCEDURE p_test_del(in_put varchar2) as 2 begin 3 dbms_output.put_line(in_put); 4 end; 5 / Procedure created. SQL> set serveroutput on SQL> exec p_test_del('惜分飞'); 惜分飞 PL/SQL procedure successfully completed.
发表在 Oracle备份恢复
3 条评论