| « | 一月 2012 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 | |||||
最近公司数据库出现了这样一个现象:
TX enqueue等待队列很长,而持有锁的会话所执行UPDATE语句的执行计划没有任何问题,执行效率应该很高,但是语句持有锁的时间却很长,这些会话的等待事件是transaction,从v$active_session_history中查看持有锁会话的相关信息,发现这些会话一直处于等待状态,等待事件一直是transaction。
关于transaction等待事件:等待其它事务rollback,这些事务可能是异常中断或者手工rollback,因为一些锁没有释放,阻塞了其它会话
查看全文
这里举个例子:
1、在D:oracleproduct10.2.0db_1NETWORKADMIN 中(任何目录都可以)创建密钥文件:
mkstore -wrl D:oracleproduct10.2.0db_1NETWORKADMIN -create
2、建立信任关系
mkstore -wrl D:oracleproduct10.2.0db_1NETWORKADMIN -createCredential tns username password
3、在客户端sqlnet.ora中增加下面的行
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = D:oracleproduct10.2.0db_1NETWORKADMIN)))
SQLNET.WALLET_OVERRIDE = TRUE
4、登陆时不用提供用户名和密码
sqlplus /@tns
SQL> CREATE DATABASE oam
2 USER SYS IDENTIFIED BY ORACLE
3 USER SYSTEM IDENTIFIED BY oracle
4 CONTROLFILE REUSE
5 logfile group 1 ('/ocs/oracle/ocs/oracle/oradata/oam/redo1.log') size 200M,
6 group 2 ('/ocs/oracle/ocs/oracle/oradata/oam/redo2.log') size 200M,
7 group 3 ('/ocs/oracle/ocs/oracle/oradata/oam/redo3.log') size 200M
8 MAXLOGFILES 5
9 MAXLOGMEMBERS 5
10 MAXLOGHISTORY 1
11 MAXDATAFILES 100
12 MAXINSTANCES 1
13 CHARACTER SET ZHS16GBK
14 NATIONAL CHARACTER SET AL16UTF16
15 datafile '/ocs/oracle/ocs/oracle/oradata/oam/system.dbf'
16 size 2048M autoextend on extent management local
17 sysaux datafile '/ocs/oracle/ocs/oracle/oradata/oam/sysaux.dbf'
18 size 2048M autoextend on
19 undo tablespace undotbs1
20 datafile '/ocs/oracle/ocs/oracle/oradata/oam/undo.dbf' size 2048M
21 default temporary tablespace temp
22 tempfile '/ocs/oracle/ocs/oracle/oradata/oam/temp.dbf' size 2048M;
NATIONAL CHARACTER SET AL16UTF16
*
ERROR at line 14:
ORA-12701: CREATE DATABASE character set is not known
检查发现是环境变量ORA_NLS10设置错误导致:
查看全文
显然主要是针对美对台军售,因为可以迫使美国进行对话进而对军售施加影响
其次也针对印度的战争叫嚣和周边一些敌对国家比如越南
仅此留存,让我们拭目以待
最近有个数据库不能open:
Errors in file /oracle/admin/zsjy/udump/zsjy_ora_18129.trc:
ORA-00980: synonym translation is no longer valid
Error 980 happened during db open, shutting down database
USER: terminating instance due to error 980
Instance terminated by USER, pid = 18129
ORA-1092 signalled during: alter database open...
alter session set events='err_num trace name ERRORSTACK level 10';
alter session set events 'err_num trace name errorstack off';
# getconf LONG_BIT
需要通过v$open_cursor视图找到语句:
select w.holding_session, s1.username holding_user, q1.sql_text holding_sql
from dba_waiters w,
v$session s1,
v$open_cursor q1,
v$locked_object l1,
dba_objects o1
where w.holding_session = s1.sid
and s1.sid = q1.sid(+)
and l1.session_id = s1.sid
and l1.object_id = o1.object_id
and (upper(q1.sql_text) like '%DELETE%' or
upper(q1.sql_text) like '%UPDATE%')
and upper(q1.sql_text) like '%' || o1.object_name || '%';
这一查询结果可能会存在多条记录,需要结合等待会话的语句,从逻辑上分析是哪一条语句产生的锁。
可以通过下面的语句找到发生等待的具体数据记录(假定等待锁的会话ID为13):
select s.sid,
o.object_name wait_object,
s.row_wait_obj#,
s.row_wait_file#,
s.row_wait_block#,
s.row_wait_row#,
dbms_rowid.rowid_create(1,
s.row_wait_obj#,
s.row_wait_file#,
s.row_wait_block#,
s.row_wait_row#) l_rowid
from v$session s, v$enqueue_lock l, dba_objects o
where s.sid = l.sid
and s.row_wait_obj# = o.object_id(+)
and s.sid = 13;
然后通过查询到的对象和ROWID找到相关数据(假定被锁住的对象是TEST,rowid是AAAHbvAAJAAAA/YAAA):
select * from test where rowid = chartorowid('AAAHbvAAJAAAA/YAAA');
投入、沉着、严谨
1、在RAC环境下,如果logon较多的话,需要加大sys.audseq$的cache
2、对于enqueue,TX锁等待的LMODE是4,则是典型的ITL等待或者是等待索引页节点分裂
3、10G中的正则表达式函数使用举例:
SQL> Select username, phonenumber from t_userinfo
2 where REGEXP_LIKE(phonenumber, '13[5-8][0-9][0-9][0-9][0-9]8{4}');
1、增加表分区
alter table t_partition_range add partition t_range_p4 values less than(40);
如果在执行该语句时未指定update indexes子句:
对range/list分区,其local索引和global索引不会受影响,
对hash分区,新加分区及有数据移动的分区的local索引和glocal索引会被置为unuseable
2、收缩表分区
alter table t_partition_hash coalesce partition;
如果在执行该语句时没有指定update indexes子句,收缩过程中有数据改动的分区其local索引和glocal索引都会失效
3、删除表分区
删除分区:alter table [tbname] drop partition [ptname];
删除子分区:alter table [tbname] drop subpartition [ptname];
4、交换分区
Exchange partition提供了一种方式,让你在表与表或分区与分区之间迁移数据,注意不是将表转换成分区或非分区的形式,而仅只是迁移表中数据(互相迁移),由于其号称是采用了更改数据字典的方式,因此效率最高(几乎不涉及io操作)。Exchange partition适用于所有分区格式,你可以将数据从分区表迁移到非分区表,也可以从非分区表迁移至分区表,或者从hash partition迁移到range partition诸如此类。
语法为:alter table tbname1 exchange partition/subpartition ptname with table tbname2;
在RAC中,我们可以通过设置跨节点并行,将并行操作分布到RAC中的不同节点同时进行,以便发挥整个RAC环境的最大运算能力。在RAC中设置跨节点并行主要是通过设置parallel_instance_group和instance_groups这两个参数进行的。 查看全文