最近想使用ssh来连接aix系统,但是装好ssh后连接却发现了无法登陆的问题。

安装的ssh软件:SSHSecureShellClient-3.2.9.zip

aix版本:5.3

 

使用ssh登陆连接:

 

点击connect后提示如下:

 

经百度主要是两个原因:

 

第一,防火墙开启导致的(客户端或服务器上的防火墙);
第二,ssh服务没有开启(或者未成功安装ssh)。

 

 

根据以上原因,将防火墙关闭,且按照

同时将防火墙关闭,但是连接仍然是上面的错误提示。

 

在itpub上在大家的热心帮助下,原来还有一个重要原因导致ssh无法连接:root用户默认情况下是无法使用ssh连接的。必须将etc/ssh目录下的

sshd_config文件中的

PermitRootLogin 属性改为yes(默认为no),然后重启ssh服务。

修改好后,再次登录,又一次失望了,还是无法登录。在 “快乐的大个子”的提醒下(PS:预感这将是一个detail 上的忽略),想想再仔细看看

sshd_config文件的内容,发现其中 port 写的是9988,而非常规的22。问题就在这了,重新将端口改为9988,再次连接,连接成功啦!

 

 注:

http://www.itpub.net/thread-1570644-1-1.html


 

 

posted @ 2012-02-10 17:07 蓝紫 阅读(3) 评论(0) 编辑

今天用expdp来导数据,发现报ORA-01775的错误,如下所示:

 

 

这是在服务器 上导出报的错,然后又在自己本机试了下,发现可以成功导出。网上搜了搜,以为是因为

SYS_EXPORT_SCHEMA_01这个同义词的原因:expdp在导的过程中会自动生成该表,如果中间中断操作,那么该表就会存在,那么就会存在用户将该表手动删除而同义词仍保留着,那么就会导致这个错误了。但是我查找了下发现并不存在该表也不存在该同义词。因此不是这个原因。接着我删除了部分找不到表或视图的同义词,再次导数据发现提示表或视图找不到,我想估计是支持导图的一些表或视图没有了。因此与自己的数据库对比了,发现如下视图在自己本机数据库上是有的,而在有问题的服务器上却没有。

DATABASE_EXPORT_OBJECTS
DATAPUMP_OBJECT_CONNECT
DATAPUMP_PATHMAP
DATAPUMP_PATHS
DATAPUMP_REMAP_OBJECTS
DATAPUMP_TABLE_DATA
DBA_EXPORT_OBJECTS
P_UPDATE_RMEQP_THEMATIC
SCHEMA_EXPORT_OBJECTS
TABLESPACE_EXPORT_OBJECTS
TABLE_EXPORT_OBJECTS
TRANSPORTABLE_EXPORT_OBJECTS

找到问题,就好解决了:

将这些视图重新创建,然后再创建同义词。再次执行,OK。


posted @ 2012-02-10 15:21 蓝紫 阅读(2) 评论(0) 编辑

oracle分页显示方法

一、使用rownum分页显示方式

方式1:
SELECT *
  FROM (SELECT ROWNUM r, a.* FROM b$i_exch_info a WHERE ROWNUM <= 10)
 WHERE r >= 5;

方式2:
SELECT *
  FROM (SELECT ROWNUM r, a.* FROM b$i_exch_info a)
 WHERE r BETWEEN 5 AND 10;
 
方式3:
SELECT * FROM b$i_exch_info WHERE ROWNUM <= 10 MINUS
SELECT * FROM b$i_exch_info WHERE ROWNUM < 5;

二、使用分析函数row_number分页显示
SELECT *
  FROM (SELECT e.*, row_number() over(ORDER BY g3e_fid) r
          FROM b$i_exch_info e) a
 WHERE a.r >= 5
   AND a.r <= 10;
      

注意事项

1.

--10g及10g之后才可以使用rownum=1
SELECT * FROM user_objects
  WHERE /*object_id <100
  AND*/ ROWNUM = 1;

--之前的版本  
SELECT * FROM user_objects
  WHERE object_id <100
  AND ROWNUM <= 1;
 
2.
rownum采用大于号>时 其值必须小于1,否则查询无结果
SELECT * FROM user_objects
  WHERE ROWNUM >1;
 
>= 时其值必须小于或等于1,否则查询无结果
SELECT * FROM user_objects
  WHERE ROWNUM >=2;

= 时其只能等于1,否则查询无结果
SELECT * FROM user_objects
  WHERE ROWNUM =2;

3.ROWNUM 和Order BY
在使用ROWNUM 时,只有当Order By 的字段是主键时,查询结果才会先排序再计算ROWNUM:
g3e_ano是主键
SELECT g3e_ano,g3e_username FROM g3e_attribute WHERE ROWNUM <= 5 ORDER BY g3e_ano;
1        备注
1002    组件序号
1008    组件序号
1009    组件序号
1010    组件序号

--以下查询因为ORDER BY的g3e_username不是主键,所以执行时是先线取出该表的6条数据,再对g3e_username排序
SELECT g3e_ano,g3e_username FROM g3e_attribute WHERE ROWNUM <= 5 ORDER BY g3e_username;
111003    设施特征唯一号
113203    设施特征唯一号
50110      设施特征唯一号
1510103    设施特征唯一号
112003    设施特征唯一号

--如果需要对非主键字段先排序再去取前n 条数据,可以通过子查询的方式实现:
select g3e_ano, g3e_username
  from (select g3e_ano, g3e_username
          from g3e_attribute
         order by g3e_username)
 where rownum <= 5;


--每页按10条记录输出(如果被排序的字段有重复值,使用rownum会出现一个问题):
--观察下面两个语句的输出结果会发现其中55461451和55461209是在两个查询中都出现了。而fid在表中都是唯一记录的,
--说明这个输出结果是错误的
错误原因:SORT (ORDER BY STOPKEY)这种快速排序方法由于是根据数据分组来选择数据的,不是根据整个表的数据进行排序,所以N
值不同,数据的分组也不同,导致结果在数据的排序字段值都相等时,输出结果的顺序就会因为N 值不同而不同。

SELECT *
  FROM (SELECT ROWNUM r, a.*
          FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name) a
         WHERE ROWNUM <= 10)
 WHERE r >= 1;
1       王家宅    55461079
2       王家宅    55461206
3       王家宅    55461207
4       王家宅    55461253
5       王家宅    55461246
6       王家宅    55461209
7       王家宅    55461783
8       王家宅    55461646
9       王家宅    55461586
10     王家宅    55461451
SELECT *
  FROM (SELECT ROWNUM r, a.*
          FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name) a
         WHERE ROWNUM <= 20)
 WHERE r >= 11;
11       王家宅    56990485
12       王家宅    56990368
13       王家宅    56981862
14       王家宅    56981861
15       王家宅    56981807
16       王家宅    56981806
17       王家宅    56981801
18       王家宅    55461646
19       王家宅    55461451
20       王家宅    55461209

解决办法:
1、让查询计划避免“SORT (ORDER BY STOPKEY)”,采用“SORT (ORDER BY)”,使数
据排序不受ROWNUM 的影响。但这样会使所有数据都做排序:
SELECT *
  FROM (SELECT a.*, ROWNUM r
          FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name) a)
 WHERE r <= 10
   AND r >= 1;

SELECT *
  FROM (SELECT a.*, ROWNUM r
          FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name) a)
 WHERE r <= 20
   AND r >= 11;
2、在排序时,加上一个或多个字段(如主键字段、ROWID),使排序结果具有唯一性:
SELECT *
  FROM (SELECT ROWNUM r, a.*
          FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name,g3e_fid) a
         WHERE ROWNUM <= 10)
 WHERE r >= 1;
 
SELECT *
  FROM (SELECT ROWNUM r, a.*
          FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name,g3e_fid) a
         WHERE ROWNUM <= 20)
 WHERE r >= 11;
3、对排序字段建立索引,并强制使用索引。这样就能利用索引已经建立好的排序结果:
CREATE INDEX idx_b$l_interest_info_name ON b$l_interest_info(name);
ALTER INDEX idx_b$l_interest_info_name REBUILD;

SELECT *
  FROM (SELECT ROWNUM r, a.*
          FROM (SELECT /*+index(a idx_b$l_interest_info_name)*/
                 name, g3e_fid
                  FROM b$l_interest_info a
                 WHERE a.name IS NOT NULL
                 ORDER BY name) a
         WHERE ROWNUM <= 10)
 WHERE r >= 1;
 
SELECT *
  FROM (SELECT ROWNUM r, b.*
          FROM (SELECT /*+index(a idx_b$l_interest_info_name)*/
                 a.name, a.g3e_fid
                  FROM b$l_interest_info a
                 WHERE a.name IS NOT NULL
                 ORDER BY a.name) b
         WHERE ROWNUM <= 20)
 WHERE r >= 11;
posted @ 2012-02-08 22:32 蓝紫 阅读(7) 评论(0) 编辑

嵌套表使用multiset union,multiset except,multiset intersect等使用集合操作符,往往一般都只是对一列进行比较,但是多列实际上也是可以的:

以下介绍中,以multiset except操作符为例。


一、只有一列情况下使用集合操作符

由以下1,),2),3),4)说明只有一列的情况下使用集合操作符时既可以直接赋值也可以通过sql语句的形式赋值,但是 2)编译出错,原因是 必须将变量类型定义到schma级别,即要么像3)和4)那样直接在外部定义了一个变量,或者直接在包中的包头进行定义

1)执行成功

 

DECLARE
   TYPE typ_id_table1 IS TABLE OF NUMBER;
   tab_fids1 typ_id_table1 := typ_id_table1();
   tab_fids2 typ_id_table1 := typ_id_table1();
   v_result typ_id_table1;
BEGIN
   v_result := tab_fids1 MULTISET except tab_fids2;
END ;

 

2)执行提示:在SQL语句中不允许使用本地收集类型

DECLARE
   TYPE typ_id_table1 IS TABLE OF NUMBER;
   tab_fids1 typ_id_table1 := typ_id_table1();
   tab_fids2 typ_id_table1 := typ_id_table1();
   v_result typ_id_table1;
BEGIN
   SELECT  tab_fids1 MULTISET EXCEPT tab_fids2 INTO v_result FROM DUAL;
END ;

 

3)编译成功

CREATE OR REPLACE TYPE typ_id_table3 AS TABLE OF NUMBER(10); --在外部定义了变量
DECLARE
   tab_fids1 typ_id_table3 := typ_id_table3();
   tab_fids2 typ_id_table3 := typ_id_table3();
   v_result typ_id_table3;
BEGIN
   v_result := tab_fids1 MULTISET except tab_fids2;
END ;

 

4)编译成功

 

CREATE OR REPLACE TYPE typ_id_table3 AS TABLE OF NUMBER(10);--在外部定义变量
DECLARE
   tab_fids1 typ_id_table3 := typ_id_table3();
   tab_fids2 typ_id_table3 := typ_id_table3();
   v_result typ_id_table3;
BEGIN
   SELECT  tab_fids1 MULTISET EXCEPT tab_fids2 INTO v_result FROM DUAL;
END ;
 

 

二、多列情况下使用集合操作符

本以为多列的情况下无法使用集合操作符,再次要感谢itpub newkid版主的解答。

即在使用多列进行比较的时候不能直接比较,而必须改成sql语句的形式进行比较,如下:

 

CREATE OR REPLACE TYPE typ_id_object AS OBJECT (gid NUMBER(10),
                                     gno NUMBER(5),
                                     co NUMBER(5));

CREATE OR REPLACE TYPE typ_id_table AS TABLE OF typ_id_object;
 

 

1)编译成功

DECLARE
   v1 typ_id_table := typ_id_table();
   v2 typ_id_table := typ_id_table();
   v3 typ_id_table;
BEGIN
   SELECT  v1 MULTISET EXCEPT v2 INTO V3 FROM DUAL; --如果是多列的情况下就必须是这种sql语句的形式
END;
2)
DECLARE
   v1 typ_id_table := typ_id_table();
   v2 typ_id_table := typ_id_table();
   v3 typ_id_table;
BEGIN
   V3 := v1 MULTISET EXCEPT v2; --如果采用此种形式则会提示:PLS-00306:调用 'MULTISET_EXCEPT_ALL' 时参数个数或类型错误

END;


 

posted @ 2012-01-05 09:56 蓝紫 阅读(19) 评论(0) 编辑

一直以来,对这两种类型一直存有疑惑,现在将自己的一些想法实验记录下来,以便以后查看跟踪改进。

 PLSQL表变量类型

TYPE typ_id_record IS RECORD(
      gid NUMBER(10),
      gno NUMBER(5),
      co NUMBER(5));
TYPE typ_id_table1 IS TABLE OF typ_id_record;

 

 对象表变量类型

CREATE OR REPLACE TYPE typ_id_object AS OBJECT

                                    (gid NUMBER(10),
                                     gno NUMBER(5),
                                     co NUMBER(5));
CREATE OR REPLACE TYPE typ_id_table AS TABLE OF typ_id_object;

 

1.bulk collect的使用的区别

PLSQL变量可以直接接收bulk collect,但是对象表变量就必须先进行转换

如下过程 p_f2中定义了一个对象表变量 tab_ids,直接将查询结果集一次性bulk collect放置到该变量时,会提示:

ORA-00947: 没有足够的值.如果定义的object变量是单个字段的话,则编译时是提示:
ORA-00932: 数据类型不一致
CREATE OR REPLACE PROCEDURE p_f2 IS
   tab_ids typ_id_table;
BEGIN
   SELECT gp.gid, gp.gno, gp.co   BULK COLLECT
     INTO tab_ids
     FROM p_table_test gp;
END p_f2;

 

解决办法:将object变量进行转换,如下所示:

CREATE OR REPLACE PROCEDURE p_f2 IS
   tab_ids typ_id_table;
BEGIN
   SELECT typ_id_object(gp.gid, gp.gno, gp.co)   BULK COLLECT
     INTO tab_ids
     FROM p_table_test gp;
END p_f2;

 

 如果采用的是PLSQL表变量,则直接接受查询的结果集就可以了,如下所示:

 

CREATE OR REPLACE PROCEDURE p_f4 IS
   tab_ids typ_id_table1;
BEGIN
   SELECT gp.gid, gp.gno, gp.co BULK COLLECT
     INTO tab_ids
     FROM p_table_test gp;
END p_f4;
 
在此,要感谢itpub的windtalker_cs,是他的回答让我明白了一直困扰我的一个问题,之前一直以为如果采用object
对象表,就无法使用bulk collect批量获取结果集。

 

2. 是否可以使用table函数

函数返回的若是PLSQL类型变量则无法使用table函数,而object类型变量可以使用table函数直接获取函数返回的结果集

 

CREATE OR REPLACE FUNCTION p_f2 RETURN typ_id_table IS
   tab_fids typ_id_table := typ_id_table();--object对象表类型
BEGIN
   FOR i IN 1 .. 100 LOOP
      tab_fids.extend;
      tab_fids(tab_fids.count) := typ_id_object(i, i + 1, i + 2);
   END LOOP;
   RETURN tab_fids;
END p_f2;
SQL> SELECT * FROM TABLE(p_f2);
        FID    GNO     CO
----------- ------ ------
          1      2      3
          2      3      4
          3      4      5
          4      5      6
          5      6      7
          6      7      8
  ........................
 

 

 

如果函数返回的是record表类型,则无法使用table函数,如下所示:
CREATE OR REPLACE PACKAGE pkg_f2 IS
   TYPE typ_id_record IS RECORD(
      gid NUMBER(10),
      gno NUMBER(5),
      co  NUMBER(5));
   TYPE typ_id_table1 IS TABLE OF typ_id_record;  --在包头定义PLSQL表类型
   FUNCTION f_f2 RETURN typ_id_table1;
END pkg_f2;
CREATE OR REPLACE PACKAGE BODY pkg_f2 IS
   FUNCTION f_f2 RETURN typ_id_table1 IS
      tab_fids typ_id_table1;
   BEGIN
      SELECT rownum, rownum + 1, rownum + 2 BULK COLLECT
        INTO tab_fids
        FROM dual;
      RETURN tab_fids;
   END;
END pkg_f2;

SELECT * FROM TABLE(pkg_f2.f_f2);

提示:ORA-00902:无效数据类型

 

注:PLSQL表变量类型必须在schma级进行定义,即必须在包头定义该类型,否则会提示:
Error: PLS-00642: 在 SQL 语句中不允许使用本地收集类型

 

posted @ 2012-01-04 11:25 蓝紫 阅读(43) 评论(0) 编辑

今天一同事做提交数据库的时候提示内存不足了,再过一会发现监听自动停止了。打开预警日志发现如下错误:

Tue Dec 27 14:41:00 2011
Process startup failed, error stack:
Tue Dec 27 14:41:00 2011
Errors in file d:\oracle\product\10.2.0\admin\telemt\bdump\telemt_psp0_1860.trc:
ORA-27300: OS system dependent operation:spcdr:9261:4200 failed with status: 997
ORA-27301: OS failure message: 重叠 I/O 操作在进行中。
ORA-27302: failure occurred at: skgpspawn

Dump file d:\oracle\product\10.2.0\admin\telemt\bdump\telemt_psp0_1860.trc
Tue Dec 27 14:40:39 2011
ORACLE V10.2.0.1.0 - Production vsnsta=0
vsnsql=14 vsnxtr=3
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Windows Server 2003 Version V5.2 Service Pack 1
CPU                 : 2 - type 586, 1 Physical Cores
Process Affinity    : 0x00000000
Memory (Avail/Total): Ph:627M/2011M, Ph+PgF:3123M/4880M, VA:510M/2047M
Instance name: telemt

Redo thread mounted by this instance: 1

Oracle process number: 3

Windows thread id: 1860, image: ORACLE.EXE (PSP0)


*** SERVICE NAME:(SYS$BACKGROUND) 2011-12-27 14:40:39.406
*** SESSION ID:(169.1) 2011-12-27 14:40:39.406
*** 2011-12-27 14:40:39.406
Process startup failed, error stack:
ORA-27300: OS system dependent operation:spcdr:9261:4200 failed with status: 997
ORA-27301: OS failure message: 重叠 I/O 操作在进行中。
ORA-27302: failure occurred at: skgpspawn
*** 2011-12-27 14:41:00.406
Process startup failed, error stack:
ORA-27300: OS system dependent operation:spcdr:9261:4200 failed with status: 997
ORA-27301: OS failure message: 重叠 I/O 操作在进行中。
ORA-27302: failure occurred at: skgpspawn
 

在网上搜了下,看来还挺多人碰到这个错误的,目前我们的这个数据库是安装在windows系统32位的,而且oracle的版本是10.2.0.1,看来真是oracle的bug了。

解决方法:

1) Reduce the amount of SGA needed to be allocated for the database.
2) Limit the number of dedicated connections to the database and the amount of memory each user process will consume.
3) Change from dedicated connections to multi-threaded server (MTS) connections as MTS only uses a fraction of the amount of memory allocated to each user
process when initial connection to the database is established.
 直接重启数据库无法解决问题,因为这个是测试数据库,连接的人就2到3个,而目前在使用的不超过2个。因此选择第一种方法,将sga改小,再重启果然可以了。

 

posted @ 2011-12-27 15:14 蓝紫 阅读(41) 评论(0) 编辑
摘要: timed_statistics参数:用于决定是否收集相关的时间参数,true为收集。如果该参数设为false,则等待事件相关视图也就无法收集到数据。SQL> SHOW PARAMETER timed_statistics;NAME TYPE VALUE------------------------------------ ----------- ------------------------------timed_statistics boolean TRUE如果statistics_level设置为TYPICAL或ALL,那么timed_statistics该参数为true;如果阅读全文
posted @ 2011-12-15 22:09 蓝紫 阅读(77) 评论(0) 编辑
摘要: 2011-12-7 疑惑1:本来跑的好好的job竟然突然出现问题了,该job总是不停的循环执行,而且其中的某个过程总是没执行完整。这其中我唯一做过的修改就是增加了物化视图。 难不成是物化视图导致了job的异常?(可见itpub上当时的提问http://www.itpub.net/thread-1517207-1-1.html) 原因:在job中在对表进行了更新操作后,为了减少碎片等问题我执行了收缩操作(ALTER TABLE table_name SHRINK SPACE CASCADE),后来我对其中的几个表创建了物化视图是快速刷新方式的,必须包含该表的rowid,而如果某...阅读全文
posted @ 2011-12-07 10:41 蓝紫 阅读(20) 评论(0) 编辑
摘要: 下午准备测试下 关于dblink的物化视图创建,因此在在另一个数据库上建立一个连接本机的dblink,可是建好后,发现用下面的语句直接在plsql中执行 SELECT * FROM b@fgisdb;提示: ORA-12170: TNS: 连接超时本以为是数据库版本的问题(本机为11g,另一个为10g),在本机数据库建了连接10g的数据库的dblink,发现可以正常连接,接着又到10g数据库的机子上用命令窗口试下能不能登录本机数据库,发现一样的错误提示:SQL> conn fyzh_ora/FYZH_ORA@fgisdbERROR:ORA-12170: TNS: 连接超时网上搜说可能是防阅读全文
posted @ 2011-11-29 17:02 蓝紫 阅读(49) 评论(0) 编辑
摘要: 前两天刚在win7上装了个11g的oracle,想打开用用,发现打开tns始终是启动完了,又停止了。还以为是win7系统的问题,后来网上一搜,才让我想起我的电脑就在装完oracle后入了域,计算机名称改变了。因此此时的监听配置肯定不对了。解决办法:1.修改tnsnames.ora文件中的计算机名称,改成现在的计算机名。如果是监听配置写的是ip,ip改变也会出现类似问题,将ip改成正确的即可。2.修改listener.ora 文件 中的计算机名称,改成现在的计算机名。如果是监听配置写的是ip,ip改变也会出现类似问题,将ip改成正确的即可。阅读全文
posted @ 2011-11-15 22:41 蓝紫 阅读(31) 评论(0) 编辑