[20181011]ORA-44777 – Pluggable database service cannot be started.txt

[20181011]ORA-44777 – Pluggable database service cannot be started.txt

--//链接:https://blog.dbi-services.com/oracle-12cr2-ora-44777-pluggable-database-service-cannot-be-started/
--//该链接演示了如果删除删除pdb里面的服务,会导致pdb 数据库无法连接的情况.

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0

SYS@test> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 TEST01P                        READ WRITE NO
         4 TEST02P                        READ WRITE NO

SYS@test> select con_id, name from v$services where con_id = 4;
    CON_ID NAME
---------- --------------------
         4 test02p        

2.删除服务:

SYS@test> alter session set container=test02p;
Session altered.

SYS@test> show con_name
CON_NAME
------------------------------
TEST02P

SYS@test> exec dbms_service.STOP_SERVICE(SERVICE_NAME=>'test02p');
PL/SQL procedure successfully completed.

SYS@test> exec dbms_service.DELETE_SERVICE(SERVICE_NAME=>'test02p');
PL/SQL procedure successfully completed.

SYS@test> select con_id, name from v$services where con_id = 4;
    CON_ID NAME
---------- --------------------
         4 test02p

--//服务test02p还在.实际上查底层访问的是X$表.
 
3.问题再现:
SYS@test> alter pluggable database test02p close;
Pluggable database altered.

SYS@test> alter pluggable database test02p open;
alter pluggable database test02p open
*
ERROR at line 1:
ORA-44304: service  does not exist
ORA-44777: Pluggable database service cannot be started.

4.问题分析:
SYS@test> select con_id, name from v$services where con_id = 4;
no rows selected

SYS@test> select name, open_mode from v$pdbs where name = 'TEST02P';
NAME                 OPEN_MODE
-------------------- ----------
TEST02P              READ WRITE

--//https://blog.dbi-services.com/oracle-12cr2-ora-44777-pluggable-database-service-cannot-be-started/
What is strange, is that the pdb was opened read-write, however, I am not able to connect to it in any way. Of course,
not with sqlplus via service, but also not via the alter session set container command. Oracle immediately kicks me out
with the famous ORA-03113 error.

--//test02p已经打开,但是服务test02p不存在,无法连接pdb=test02p数据库.
--//另外我的测试执行如下,整个数据库会崩溃..做了2次...
alter session set container=test02p;

5.问题解决:

SQL> alter pluggable database test02p close;
Pluggable database altered.

SYS@test> alter pluggable database test02p unplug into 'd:/app/oracle/pdb_xml/test02p.xml';
Pluggable database altered.

SYS@test> select name, open_mode from v$pdbs where name = 'TEST02P';
NAME                 OPEN_MODE
-------------------- ----------
TEST02P              MOUNTED

SYS@test> drop pluggable database TEST02P;
Pluggable database dropped.

SYS@test> select name, open_mode from v$pdbs where name = 'TEST02P';
no rows selected

SYS@test> CREATE pluggable DATABASE test02p USING 'd:/app/oracle/pdb_xml/test02p.xml' NOCOPY;
Pluggable database created.

SYS@test> alter pluggable database TEST02P open;
Pluggable database altered.
--//从这里看出第一次open时候,要修改信息.

SYS@test> select name, open_mode from v$pdbs where name = 'TEST02P';
NAME                 OPEN_MODE
-------------------- ----------
TEST02P              READ WRITE

SYS@test> select con_id, name from v$services ;
    CON_ID NAME
---------- --------------------
         5 test02p
         1 testXDB
         1 SYS$BACKGROUND
         1 SYS$USERS
         1 test
         3 test01p
6 rows selected.

SYS@test> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 TEST01P                        MOUNTED
         5 TEST02P                        READ WRITE NO
--//CON_ID变成了5.

--//https://blog.dbi-services.com/oracle-12cr2-ora-44777-pluggable-database-service-cannot-be-started/
Conclusion

Applications should not work with the default PDB service which comes out of the box with any PDB. This service is for
internal use only. And dropping the default service of the pluggable database is also not a good idea, even it works.
-) From my point of view, Oracle should not allow a DBA to do that.

6.实际上这个服务定义在各个pdb下SYS.SERVICE$表中,如果能恢复原来的样子估计也是ok的.:
SCOTT@test02p> select rowid,service_id,name,name_hash,network_name,creation_date,deletion_date from SYS.SERVICE$;
ROWID              SERVICE_ID NAME                  NAME_HASH NETWORK_NA CREATION_DATE       DELETION_DATE
------------------ ---------- -------------------- ---------- ---------- ------------------- -------------------
AAAAHBAABAAAFMhAAA          9 test02p              2419093932 test02p    2018-10-12 21:46:06 2018-10-12 22:06:08
AAAAHBAABAAAFMhAAB          1 test02p              2419093932 test02p    2018-10-12 22:37:43

--//登录test01p看看.
SCOTT@test01p> select rowid,service_id,name,name_hash,network_name,creation_date,deletion_date from SYS.SERVICE$;
ROWID              SERVICE_ID NAME                  NAME_HASH NETWORK_NA CREATION_DATE       DELETION_DATE
------------------ ---------- -------------------- ---------- ---------- ------------------- -------------------
AAAAHBAABAAAFMhAAA          7 test01p              2872249700 test01p    2018-10-06 23:27:57
--//注意test02p从test01p克隆过来的,两者rowid一样.不过要使用bbed修改还不是很好操作.我估计DELETION_DATE设置为Null 就ok了.

SCOTT@test01p> @ rowid AAAAHBAABAAAFMhAAA
    OBJECT       FILE      BLOCK        ROW ROWID_DBA            DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
       449          1      21281          0   0x405321           1,21281              alter system dump datafile 1 block 21281

--//通过bbed观察:
BBED> set dba 28,21282
        DBA             0x07005322 (117461794 28,21282)
--//注:windows下bbed访问数据块存在1个偏差,必须加+1. 文件号是28,上面看到实际上是相对文件号.
--//select file#||' '||name c70 from v$dbfile order by file#;
1 D:\APP\ORACLE\ORADATA\TEST\SYSTEM01.DBF
2 D:\APP\ORACLE\ORADATA\TEST\PDBSEED\SYSTEM01.DBF
3 D:\APP\ORACLE\ORADATA\TEST\SYSAUX01.DBF
4 D:\APP\ORACLE\ORADATA\TEST\PDBSEED\SYSAUX01.DBF
5 D:\APP\ORACLE\ORADATA\TEST\UNDOTBS01.DBF
6 D:\APP\ORACLE\ORADATA\TEST\PDBSEED\UNDOTBS01.DBF
7 D:\APP\ORACLE\ORADATA\TEST\USERS01.DBF
8 D:\APP\ORACLE\ORADATA\TEST\TEST01P\SYSTEM01.DBF
9 D:\APP\ORACLE\ORADATA\TEST\TEST01P\SYSAUX01.DBF
10 D:\APP\ORACLE\ORADATA\TEST\TEST01P\UNDOTBS01.DBF
11 D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF
28 D:\APP\ORACLE\ORADATA\TEST\TEST02P\SYSTEM01.DBF
29 D:\APP\ORACLE\ORADATA\TEST\TEST02P\SYSAUX01.DBF
30 D:\APP\ORACLE\ORADATA\TEST\TEST02P\UNDOTBS01.DBF
31 D:\APP\ORACLE\ORADATA\TEST\TEST02P\USERS01.DBF

SCOTT@test02p> SELECT DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO ( 'AAAAHBAABAAAFMhAAA' ,'SYS' ,'SERVICE$') N10 FROM DUAL;
 N10
----
  28
--//要确定绝对文件号,需要schema,object_name参数.

BBED> p kdbr
sb2 kdbr[0]                                 @110      7654
sb2 kdbr[1]                                 @112      7530

7530+92 = 7622

SCOTT@test02p> @ bbedcol12.sql SYS SERVICE$;
DISPLAY BBED EXAMINE(X) FORMAT
C80
---------------------------
ncnctntccnnnnnnccnncccncnnn

BBED> x /rncnctntccnnnnnnccnncccncnnn * kdbr[0]
rowdata[124]                                @7746
------------
flag@7746: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@7747: 0x02
cols@7748:   17

col    0[2] @7749: 9
col    1[7] @7752: test02p
col    2[6] @7760: 2419093932
col    3[7] @7767: test02p
col    4[7] @7775: 2018-10-12 21:46:06
col    5[6] @7783: 3424783539
col    6[7] @7790: 2018-10-12 22:06:08
~~~~~~~~~->对应DELETION_DATE字段信息.
col    7[0] @7798: *NULL*
col    8[0] @7799: *NULL*
col    9[0] @7800: *NULL*
col   10[0] @7801: *NULL*
col   11[0] @7802: *NULL*
col   12[0] @7803: *NULL*
col   13[0] @7804: *NULL*
col   14[3] @7805: 136
col   15[0] @7809: *NULL*
col   16[7] @7810: TEST02P

--//这条记录是修改后的,实际上修改前的偏移 7810+7+1=7818处.(注:数据从数据块底部开始插入的).

BBED> x /rncnctntccnnnnnnccnncccncnnn offset 7818
rowdata[196]                                @7818
------------
flag@7818: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@7819: 0x00
cols@7820:   17

col    0[2] @7821: 9
col    1[7] @7824: test02p
col    2[6] @7832: 2419093932
col    3[7] @7839: test02p
col    4[7] @7847: 2018-10-12 21:46:06
col    5[6] @7855: 3424783539
col    6[0] @7862: *NULL*
col    7[0] @7863: *NULL*
col    8[0] @7864: *NULL*
col    9[0] @7865: *NULL*
col   10[0] @7866: *NULL*
col   11[0] @7867: *NULL*
col   12[0] @7868: *NULL*
col   13[0] @7869: *NULL*
col   14[3] @7870: 136
col   15[0] @7874: *NULL*
col   16[7] @7875: TEST02P

--//上下比较就知道偏移offset=7818对应修改前的记录,注意这里是绝对偏移,写入kdbr[0]是相对偏移.
--//7746-7654 = 92,相差92.
--//使用map /v观察: struct kdbh, 14 bytes  @92 ,通过kdbh的位置也可以确定偏移量.
--//7818-92 = 7726,也就是修改:

BBED> assign kdbr[0]=7726
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
sb2 kdbr[0]                                 @110      7726

BBED> x /rncnctntccnnnnnnccnncccncnnn * kdbr[0]
rowdata[196]                                @7818
------------
flag@7818: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@7819: 0x00
cols@7820:   17

col    0[2] @7821: 9
col    1[7] @7824: test02p
col    2[6] @7832: 2419093932
col    3[7] @7839: test02p
col    4[7] @7847: 2018-10-12 21:46:06
col    5[6] @7855: 3424783539
col    6[0] @7862: *NULL*
col    7[0] @7863: *NULL*
col    8[0] @7864: *NULL*
col    9[0] @7865: *NULL*
col   10[0] @7866: *NULL*
col   11[0] @7867: *NULL*
col   12[0] @7868: *NULL*
col   13[0] @7869: *NULL*
col   14[3] @7870: 136
col   15[0] @7874: *NULL*
col   16[7] @7875: TEST02P
--//这样再修正一些检查和以及相关信息就ok了.
--//取消修复操作.还原:
BBED> undo
BBED> p kdbr
sb2 kdbr[0]                                 @110      7654
sb2 kdbr[1]                                 @112      7530

BBED> verify
DBVERIFY - Verification starting
FILE = D:\APP\ORACLE\ORADATA\TEST\TEST02P\SYSTEM01.DBF
BLOCK = 21281
DBVERIFY - Verification complete
Total Blocks Examined         : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing   (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing   (Index): 0
Total Blocks Empty            : 0
Total Blocks Marked Corrupt   : 0
Total Blocks Influx           : 0

7.看看是否修改参数实现:
SELECT name
      ,display_value
      ,isdefault
      ,isses_modifiable
      ,issys_modifiable
      ,ispdb_modifiable
  FROM v$parameter
 WHERE LOWER (name) LIKE '%service%';

NAME                 DISPLAY_VALUE                  ISDEFAULT ISSES ISSYS_MOD ISPDB
-------------------- ------------------------------ --------- ----- --------- -----
service_names        test                           TRUE      FALSE IMMEDIATE FALSE

--//ispdb_modifiable=FALSE.视乎这个参数不能在pdb下修改的.也就是解决这个问题只能按照作者的建议实现.
--//参考连接:http://blog.itpub.net/267265/viewspace-1072674/=>[20140118]oracle参数在PluggableDatabases
--//保存在cdb的sys.pdb_spfile$表中.

SCOTT@test02p> alter system set service_names=test,test02p ;
alter system set service_names=test,test02p
*
ERROR at line 1:
ORA-65040: operation not allowed from within a pluggable database

--//在插件数据库不允许修改.如果在cdb下修改会出现什么情况呢?

8.继续测试再cdb下修改参数如何:
--//重复前面的破坏,在cdb下,执行:
SYS@test> alter session set container=test02p;
Session altered.

SYS@test> show con_name
CON_NAME
------------------------------
TEST02P

SYS@test> exec dbms_service.STOP_SERVICE(SERVICE_NAME=>'test02p');
PL/SQL procedure successfully completed.

SYS@test> exec dbms_service.DELETE_SERVICE(SERVICE_NAME=>'test02p');
PL/SQL procedure successfully completed.

--//问题再现:
SYS@test> alter pluggable database test02p close;
Pluggable database altered.

SYS@test> alter pluggable database test02p open;
alter pluggable database test02p open
*
ERROR at line 1:
ORA-44304: service  does not exist
ORA-44777: Pluggable database service cannot be started.

--//退出在登录:
SYS@test> alter system set service_names=test,test02p scope=memory ;
System altered.

SYS@test> alter pluggable database test02p open;
alter pluggable database test02p open
*
ERROR at line 1:
ORA-65019: pluggable database TEST02P already open

SYS@test> alter pluggable database test02p close;
Pluggable database altered.

SYS@test> alter pluggable database test02p open;
alter pluggable database test02p open
*
ERROR at line 1:
ORA-44304: service  does not exist
ORA-44777: Pluggable database service cannot be started.

--//不行!!

9.突然想起可以修改listener.ora参数,支持sid模式登陆:

--//通过在监听配置文件listener.ora中加入如下:USE_SID_AS_SERVICE_listener=on
--//链接: =>[20170527]12c connect Pluggable database using SID.txt

lsnrctl stop
lsnrctl start

--//感觉应该不行,服务没有起来,这个参数作用应该是把服务当作sid.

SYS@test> connect scott/btbtms@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) (CONNECT_DATA =(SERVER = DEDICATED)(SID = test02p)))
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

SYS@test> connect sys/btbtms@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) (CONNECT_DATA =(SERVER = DEDICATED)(SID = test01p))) as sysdba
Connected.

--//连接pdb=test01p,ok!!
--//还原与修复:

SYS@test01p> connect sys as sysdba
Enter password: a
Connected.

SYS@test> alter pluggable database test02p close;
Pluggable database altered.

SYS@test> alter pluggable database test02p unplug into 'd:/app/oracle/pdb_xml/test02p.xml';
Pluggable database altered.

SYS@test> drop pluggable database TEST02P;
Pluggable database dropped.

SYS@test> CREATE pluggable DATABASE test02p USING 'd:/app/oracle/pdb_xml/test02p.xml' NOCOPY;
Pluggable database created.

SYS@test> alter pluggable database TEST02P open;
alter pluggable database TEST02P open
*
ERROR at line 1:
ORA-44303: service name exists
ORA-44775: Pluggable database service cannot be created.
--//这回是服务存在,实际上是冲突了,可能和前面执行alter system set service_names=test,test02p scope=memory ;有关.
--//重启数据库与监听ok.

10.总结:
--//不知不觉写的太长,也太乱.

--//附上bbedcol12.sql
prompt
PROMPT DISPLAY BBED EXAMINE(X) FORMAT
prompt

SELECT REPLACE (LISTAGG (c1, ',') WITHIN GROUP (ORDER BY column_id), ',') c80
  FROM (  SELECT data_type
                ,column_id
                ,column_name
                ,DECODE
                 (
                    data_type
                   ,'NUMBER', 'n'
                   ,'CHAR', 'c'
                   ,'VARCHAR', 'c'
                   ,'VARCHAR2', 'c'
                   ,'DATE', 't'
                   ,' '
                 )
                    c1
            FROM dba_tab_cols
           WHERE     owner = UPPER (NVL ('&1', USER))
                 AND TABLE_NAME = UPPER ('&2')
                 AND hidden_column = 'NO'
        ORDER BY column_id);

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2216310/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/267265/viewspace-2216310/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值