وبلاگ مسعود حاجی حسن پور

راهکار های عملی اوراکل

راهکار های عملی اوراکل

این وبلاگ جهت به اشتراک گذاری تجربیات و راهکار های عملی در زمینه پایگاه داده اوراکل می باشد.

دستاوردها
طبقه بندی موضوعی

unplug نمودن، بازیابی description xml file و plug نمودن pdb به cdb دیگر

با سلام خدمت دوستان عزیز
در Multitenant container database یکی از قابلیت های خیلی خوب، قابلیت unplug و plug نمودن pdb در یک cdb دیگر هست. برای این منظور لازم هست اول مقداری راجب به unplug نمودن pdb توضیح دهم. در زمانی که pdb را unplug میکنیم یک فایل xml  تولید میگردد که option های آن pdb را توصیف میکند. سپس با استفاده از همان description xml file آن pdb را به cdb دیگر متصل (plug) میکنیم. فرض کنید پس از unplug نمودن pdb فایل xml ما یا معیوب شده است یا از دست رفته است. پس با من همراه باشید که طی یک سناریو مطالب زیر را دنبال کنیم:

  1. چگونه pdb را unplug کنیم ؟
  2. چگونه description xml file را بازیابی کنیم ؟
  3. چگونه pdb  را با استفاده از description xml file به cdb دیگر plug کنیم ؟
اول وضعیت cdb مبدا و pdb ها ای که به آن متصل شده است را بررسی میکنیم:
[oracle@oel7 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Wed Jan 31 14:57:34 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> select name, cdb from v$database;

NAME      CDB
--------- ---
DB12C     YES

SQL> col name for a20;
SQL> select con_id, name, open_mode, restricted from v$pdbs;

    CON_ID NAME                 OPEN_MODE  RES
---------- -------------------- ---------- ---
         2 PDB$SEED             READ ONLY  NO
         3 MYPDB                READ WRITE NO
         4 MAS12C               READ WRITE NO

طی دستور های زیر mypdb  را از پایگاه داده مبدا unplug و سپس حذف میکنیم.

SQL> alter pluggable database mypdb close;
2018-01-31T15:10:55.443763+03:30
MYPDB(3):JIT: pid 40960 requesting stop
Pluggable database MYPDB closed
Completed: alter pluggable database mypdb close

Pluggable database altered.

SQL> alter pluggable database mypdb unplug into '/u01/mypdbfile.xml';
2018-01-31T15:11:04.127823+03:30
alter pluggable database mypdb unplug into '/u01/mypdbfile.xml'
MYPDB(3):Autotune of undo retention is turned on.
2018-01-31T15:11:04.248476+03:30
MYPDB(3):Endian type of dictionary set to little
MYPDB(3):[40960] Successfully onlined Undo Tablespace 2.
MYPDB(3):Undo initialization finished serial:0 start:95543809 end:95543858 diff:49 ms (0.0 seconds)
MYPDB(3):Database Characterset for MYPDB is AL32UTF8
2018-01-31T15:11:06.044436+03:30
MYPDB(3):Opatch XML is skipped for PDB MYPDB (conid=3)
MYPDB(3): AUDSYS.AUD$UNIFIED (SQL_TEXT) - CLOB populated
MYPDB(3):JIT: pid 40960 requesting stop
MYPDB(3):Autotune of undo retention is turned on.
MYPDB(3):Endian type of dictionary set to little
MYPDB(3):Undo initialization finished serial:0 start:95546119 end:95546119 diff:0 ms (0.0 seconds)
MYPDB(3):Database Characterset for MYPDB is AL32UTF8
MYPDB(3):Opatch XML is skipped for PDB MYPDB (conid=3)
2018-01-31T15:11:07.053863+03:30
MYPDB(3): AUDSYS.AUD$UNIFIED (SQL_TEXT) - CLOB populated
MYPDB(3):JIT: pid 40960 requesting stop
Completed: alter pluggable database mypdb unplug into '/u01/mypdbfile.xml'

Pluggable database altered.

SQL> drop pluggable database mypdb;
2018-01-31T15:15:43.286392+03:30
drop pluggable database mypdb
Completed: drop pluggable database mypdb

Pluggable database dropped.

SQL> select con_id, name, open_mode, restricted from v$pdbs;

    CON_ID NAME                 OPEN_MODE  RES
---------- -------------------- ---------- ---
         2 PDB$SEED             READ ONLY  NO
         4 MAS12C               READ WRITE NO

 همانگونه که گفتیم فرض مسئله معیوب بودن یا از دست رفتن description xml file هست پس این کار را انجام میدهیم:

[oracle@oel7 ~]$ mv /u01/mypdbfile.xml /u01/mypdbfile.xml.old
[oracle@oel7 ~]$ ll /u01/
total 8
drwxrwxr-x. 4 oracle oinstall   38 Jan 13 11:58 app
-rw-r--r--. 1 oracle oinstall 6957 Jan 31 15:11 mypdbfile.xml.old

در بالا دیدیم که چگونه pdb را unplug کنیم. حالا میخواهیم description xml file را بازیابی کنیم و سپس pdb را به cdb  دیگر متصل (plug) نماییم. در ادامه بر روی cdb مقصد کار خواهیم کرد، پس وضعیت cdb مذکور را بررسی میکنیم:

[oracle@oel7 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Wed Jan 31 16:04:15 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> select name, cdb from v$database;

NAME      CDB
--------- ---
MYCDB     YES

SQL> col name for a20;
SQL> select con_id, name, open_mode, restricted from v$pdbs;

    CON_ID NAME                 OPEN_MODE  RES
---------- -------------------- ---------- ---
         2 PDB$SEED             READ ONLY  NO
         3 NIMA                 READ WRITE NO

برای plug نمودن pdb که unplug  شده است، شما نیاز به description xml file  دارید. با یک dbms package با خواندن دوباره دیتا فایل ها میتوانید آن را بسازید. شکل package و argument  های آن به حالت زیر می باشد:

DBMS_PDB.RECOVER (
   pdb_descr_file    IN   VARCHAR2, 
   pdb_name          IN   VARCHAR2,
   filenames         IN   VARCHAR2);

pdb_descr_file:
Path of the XML file that contains description of a pluggable database

pdb_name:
Name of a pluggable database

filenames:
Comma-separated list of datafile paths and/or directories containing datafiles for the pluggable database

برای اطلاعات بیشتر در مورد dbms package  فوق به آدرس زیر مراجعه بفرمایید:

DBMS_PDB

حالا description xml file  را بازیابی میکنیم:

[oracle@oel7 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Wed Jan 31 16:20:54 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> 
1 begin
2    dbms_pdb.recover(
3    pdb_descr_file => '/home/oracle/mypdb.xml',
4    pdb_name => 'mypdb',
5    filenames => '/u01/app/oracle/oradata/db12c/mypdb'
6  );
7 end;
8 /

PL/SQL procedure successfully completed.

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
[oracle@oel7 ~]$ ls -l mypdb.xml
-rw-r--r--. 1 oracle oinstall 4184 Jan 31 16:20 mypdb.xml

همانگونه که مشاهده نمودید description xml file بازیابی شد. حالا وقت این هست که pdb را به cdb مقصد متصل (plug) نماییم. پیش از این، یک مرحله optional را پیش میبریم تا ببینیم pdb ما با cdb  جدید سازگار میباشد یا خیر. برای این کار از dbms_pdb.check_plug_compatibility استفاده میکنیم:

[oracle@oel7 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Wed Jan 31 16:20:54 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> set serverout on;
SQL>
1 DECLARE
2   theResult BOOLEAN;
3 BEGIN
4   l_result := DBMS_PDB.check_plug_compatibility(
5                 pdb_descr_file => '/home/oracle/mypdb.xml',
6                 pdb_name       => 'mypdb');
7 
8   IF theResult THEN
9     DBMS_OUTPUT.PUT_LINE('pdb is compatible');
10   ELSE
11     DBMS_OUTPUT.PUT_LINE('dpb is not incompatible');
12   END IF;
13 END;
14 /
pdb is compatible

PL/SQL procedure successfully completed.

در procedure  بالا مشخص شد که pdb ما با cdb مقصد سازگار میباشد. در مرحله آخر pdb  را به cdb متصل (plug) میکنیم.
SQL> create pluggable database mypdb using '/home/oracle/mypdb.xml'
  2  file_name_convert=('/u01/app/oracle/oradata/db12c/mypdb','/u01/app/oracle/oradata/mycdb/mypdb')
  3  tempfile reuse;

Pluggable database created.

SQL> alter pluggable database mypdb open;

Pluggable database altered.

SQL> col name for a20;
SQL> select con_id, name, open_mode, restricted from v$pdbs;

    CON_ID NAME                 OPEN_MODE  RES
---------- -------------------- ---------- ---
         2 PDB$SEED             READ ONLY  NO
         3 NIMA                 READ WRITE NO
         4 MYPDB                READ WRITE NO

SQL> select name from v$datafile where con_id=4;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/mycdb/mypdb/undotbs01.dbf
/u01/app/oracle/oradata/mycdb/mypdb/system01.dbf
/u01/app/oracle/oradata/mycdb/mypdb/sysaux01.dbf
/u01/app/oracle/oradata/mycdb/mypdb/users01.dbf

در بالا مشاهده نمودید که pdb  به درستی به cdb مقصد متصل (plug) شد.


دوستان عزیز امیدوارم مطلب کاربردی بوده باشد.

شاد و پیروز باشید.

آسان ترین راه برای مهاجرت از 11g به 12c Multitenant mode

سلام خدمت دوستان عزیز امروز میخواهم در مورد ساده ترین راه ( استفاده از دستورات پرکاربرد و آشنا برای شما نه لزوما بهترین و کم هزینه ترین روش ) مهاجرت از 11g به 12c pdb بگویم پس با من همراه باشید تا با یک سناریو این کار را انجام دهیم:

  • وضعیت جاری:
Oracle 11g:

Hostname: RestoreDB
SID: RCIS
Schema:mas11g


Oracle 12c:

Hostname: oel7
SID:  DB12C
pdb: mas12c

  • در پایگاه داده و ماشین مبدا (11g)
در این جا فرض میکنیم که در سایت عملیاتی schema اصلی ما mas11g هست و نیاز هست پایگاه داده جدید این schema را دارا باشد. پس در اولین قدم برای شروع سناریو یک schema را می سازیم:
[oracle@RestoreDB ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Tue Jan 16 10:11:25 2018

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

SYS@RCIS> def;
DEFINE _DATE           = "16-JAN-18" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "RCIS" (CHAR)
DEFINE _USER           = "SYS" (CHAR)
DEFINE _PRIVILEGE      = "AS SYSDBA" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1102000400" (CHAR)
DEFINE _EDITOR         = "ed" (CHAR)
DEFINE _O_VERSION      = "Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options" (CHAR)
DEFINE _O_RELEASE      = "1102000400" (CHAR)

SYS@RCIS> create tablespace mas11g;

Tablespace created.

SYS@RCIS> select ts#, name from v$tablespace where name='MAS11G';

       TS# NAME
---------- ------------------------------
         9 MAS11G

1 rows selected.

SYS@RCIS> select name from v$datafile where ts#=9;

NAME
--------------------------------------------------------------------------------
+DATA/rcis/datafile/mas11g.422.965556953

SYS@RCIS> create user mas11g account unlock identified by mas default tablespace mas11g temporary tablespace temp quota unlimited on mas11g;

User created.

SYS@RCIS> grant create session, create table, connect, create sequence to mas11g;

Grant succeeded.

SYS@RCIS> disc;

@> conn mas11g/mas
Connected.
MAS11G@RCIS> create table masoud (c1 number primary key, c2 date);

Table created.

MAS11G@RCIS> insert into masoud values (1, sysdate);

1 row created.

MAS11G@RCIS> insert into masoud values (2, sysdate);

1 row created.

MAS11G@RCIS> commit;

Commit complete.

MAS11G@RCIS> create sequence mas_seq start with 3;

Sequence created.

بسیار خوب حالا یک dump از پایگاه داده 11g از schema مورد نظر میگیریم:

[oracle@RestoreDB ~]$ expdp schemas=mas11g dumpfile=mas11g.dmp logfile=mas11g.log

Export: Release 11.2.0.4.0 - Production on Tue Jan 16 10:50:04 2018

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Username: / as sysdba

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
Starting "SYS"."SYS_EXPORT_SCHEMA_01":  /******** AS SYSDBA schemas=mas11g dumpfile=mas11g.dmp logfile=mas11g.log
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 64 KB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
. . exported "MAS11G"."MASOUD"                           5.437 KB       3 rows
Master table "SYS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYS.SYS_EXPORT_SCHEMA_01 is:
  /u01/app/oracle/admin/RCIS/dpdump/mas11g.dmp
Job "SYS"."SYS_EXPORT_SCHEMA_01" successfully completed at Tue Jan 16 10:50:25 2018 elapsed 0 00:00:15

دقت کنید در دستور schema آورده ایم یعنی تمام object ها ای که در این schema وجود دارد. سپس فایل dump را به ماشین مقصد oel7 منتقل میکنیم:

scp /u01/app/oracle/admin/RCIS/dpdump/mas11g.dmp oracle@oel7:/tmp


  • درپایگاه داده و ماشین مقصد (12c):
اول وضعیت پایگاه داده مقصد را بررسی میکنیم:
[oracle@oel7 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Tue Jan 16 12:31:52 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> def;
DEFINE _DATE           = "16-JAN-18" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "db12c" (CHAR)
DEFINE _USER           = "SYS" (CHAR)
DEFINE _PRIVILEGE      = "AS SYSDBA" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1202000100" (CHAR)
DEFINE _EDITOR         = "vi" (CHAR)
DEFINE _O_VERSION      = "Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production" (CHAR)
DEFINE _O_RELEASE      = "1202000100" (CHAR)
SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 MYPDB                          READ WRITE NO
SQL>

همانگونه که میبینید پایگاه داده ما تنها یک pdb قابل استفاده دارد به نام mypdb که برای یکی دیگر از بیزینس های ما در حال استفاده است. حالا برای پایگاه داده جدید یک pdb میسازیم و در نظر داریم که OMF نباشد:

SQL> select name from v$datafile where con_id=2;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/db12c/pdbseed/system01.dbf
/u01/app/oracle/oradata/db12c/pdbseed/sysaux01.dbf
/u01/app/oracle/oradata/db12c/pdbseed/undotbs01.dbf

SQL> create pluggable database mas12c admin user pdb_mas identified by mas
  2  file_name_convert=('/u01/app/oracle/oradata/db12c/pdbseed/','/u01/app/oracle/oradata/db12c/mas12c/');

Pluggable database created.

SQL> select name from v$datafile where con_id=4;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/db12c/mas12c/system01.dbf
/u01/app/oracle/oradata/db12c/mas12c/sysaux01.dbf
/u01/app/oracle/oradata/db12c/mas12c/undotbs01.dbf

SQL> alter pluggable database mas12c open;

Pluggable database altered.

SQL> sho pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 MYPDB                          READ WRITE NO
         4 MAS12C                         READ WRITE NO

SQL> select name from v$active_services;

NAME
----------------------------------------------------------------
mas12c
db12c
SYS$BACKGROUND
SYS$USERS
db12cXDB
mypdb

6 rows selected.

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
[oracle@oel7 ~]$ lsnrctl  status

LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 16-JAN-2018 12:50:04

Copyright (c) 1991, 2016, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oel7)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date                13-JAN-2018 12:29:24
Uptime                    3 days 0 hr. 20 min. 40 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/12.2/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/oel7/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oel7)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=oel7)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/admin/db12c/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "62a5b72ff0115788e05380efa8c0a311" has 1 instance(s).
  Instance "db12c", status READY, has 1 handler(s) for this service...
Service "62e227d3146a2b60e05380efa8c0bc3a" has 1 instance(s).
  Instance "db12c", status READY, has 1 handler(s) for this service...
Service "db12c" has 1 instance(s).
  Instance "db12c", status READY, has 1 handler(s) for this service...
Service "db12cXDB" has 1 instance(s).
  Instance "db12c", status READY, has 1 handler(s) for this service...
Service "mas12c" has 1 instance(s).
  Instance "db12c", status READY, has 1 handler(s) for this service...
Service "mypdb" has 1 instance(s).
  Instance "db12c", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@oel7 ~]$

همانگون که مشاهده نمودید pdb mas12c ایجاد شده و سرویس آن نیز قابل استفاده می باشد:


به نظر من بهترین راه وصل شدن به pdb ها استفاده از tns میباشد پس برای mas12c نیز یک tns میسازیم و به آن متصل میشویم:

vi $ORACLE_HOME/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.2/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_DB12C =
  (ADDRESS = (PROTOCOL = TCP)(HOST = oel7)(PORT = 1521))


DB12C =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oel7)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db12c)
    )
  )

MYPDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oel7)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mypdb)
    )
  )

# new masoud's pdb
MAS12C =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oel7)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mas12c)
    )
  )
[oracle@oel7 ~]$ tnsping mas12c 3

TNS Ping Utility for Linux: Version 12.2.0.1.0 - Production on 16-JAN-2018 12:58:38

Copyright (c) 1997, 2016, Oracle.  All rights reserved.

Used parameter files:
/u01/app/oracle/product/12.2/db_1/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oel7)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = mas12c)))
OK (0 msec)
OK (0 msec)
OK (0 msec)
[oracle@oel7 ~]$ sqlplus sys@mas12c as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Tue Jan 16 12:59:27 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>
SQL>
SQL> def;
DEFINE _DATE           = "16-JAN-18" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "mas12c" (CHAR)
DEFINE _USER           = "SYS" (CHAR)
DEFINE _PRIVILEGE      = "AS SYSDBA" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1202000100" (CHAR)
DEFINE _EDITOR         = "vi" (CHAR)
DEFINE _O_VERSION      = "Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production" (CHAR)
DEFINE _O_RELEASE      = "1202000100" (CHAR)
SQL>

بسیار خوب الان آماده هستیم که dump  را بر روی pdb جدید یعنی mas12c برگردانیم. پس شروع میکنیم:


اول یک directory برای import یا انتخاب میکنیم یا میسازیم. لازم به ذکر است در pdb ها از چیزی به نام GUID برای unique ساختن pdb ها استفاده میشود که در نام مسیر OMF فایل ها و همچنین directory پیشفرض استفاده میشود:

 SQL> select GUID from v$containers where name='MAS12C';

GUID
--------------------------------
62E227D3146A2B60E05380EFA8C0BC3A

SQL> select DIRECTORY_PATH from dba_directories where DIRECTORY_NAME='DATA_PUMP_DIR';

DIRECTORY_PATH
--------------------------------------------------------------------------------
/u01/app/oracle/admin/db12c/dpdump/62E227D3146A2B60E05380EFA8C0BC3A

ما میخواهیم از directory پیشفرض استفاده کنیم پس فقط اطمینان حاصل میکینم که مسیر وجود داشته باشد:

SQL> ! mkdir -p /u01/app/oracle/admin/db12c/dpdump/62E227D3146A2B60E05380EFA8C0BC3A

SQL> ! ls -ltr /u01/app/oracle/admin/db12c/dpdump/
total 4
-rw-r-----. 1 oracle oinstall 116 Jan 13 12:34 dp.log
drwxr-x---. 2 oracle oinstall   6 Jan 14 09:33 62A5B72FF0115788E05380EFA8C0A311
drwxr-x---. 2 oracle oinstall   6 Jan 16 13:18 62E227D3146A2B60E05380EFA8C0BC3A

الان import میکنیم:

[oracle@oel7 tmp]$ cp mas11g.dmp $ORACLE_BASE/admin/db12c/dpdump/62E227D3146A2B60E05380EFA8C0BC3A/

[oracle@oel7 tmp]$ sqlplus sys@mas12c as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Tue Jan 16 13:34:42 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> create tablespace mas12c datafile '/u01/app/oracle/oradata/db12c/mas12c/mas12c01.dbf' size 100m autoextend on;

Tablespace created.

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
[oracle@oel7 tmp]$ impdp schemas=mas11g dumpfile=mas11g.dmp remap_tablespace=MAS11G:mas12c;

Import: Release 12.2.0.1.0 - Production on Tue Jan 16 13:33:18 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

Username: sys@mas12c as sysdba
Password:

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Master table "SYS"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "SYS"."SYS_IMPORT_SCHEMA_01":  sys/********@mas12c AS SYSDBA schemas=mas11g dumpfile=mas11g.dmp remap_tablespace=MAS11G:mas12c
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "MAS11G"."MASOUD"                           5.437 KB       3 rows
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Job "SYS"."SYS_IMPORT_SCHEMA_01" successfully completed at Tue Jan 16 13:33:36 2018 elapsed 0 00:00:08

به نظر میاد که همه چی به درستی انجام شده، الان وقت آن هست که بررسی کنیم:

Alert log:
#########
create pluggable database mas12c admin user pdb_mas identified by *
file_name_convert=('/u01/app/oracle/oradata/db12c/pdbseed/','/u01/app/oracle/oradata/db12c/mas12c/')
2018-01-16T12:44:26.729345+03:30
PDB$SEED(2): AUDSYS.AUD$UNIFIED (SQL_TEXT) - CLOB populated
2018-01-16T12:44:35.081448+03:30
Warning: VKTM detected a forward time drift.
Please see the VKTM trace file for more details:
/u01/app/oracle/diag/rdbms/db12c/db12c/trace/db12c_vktm_23694.trc
2018-01-16T12:44:48.237126+03:30
MAS12C(4):Endian type of dictionary set to little
****************************************************************
Pluggable Database MAS12C with pdb id - 4 is created as UNUSABLE.
If any errors are encountered before the pdb is marked as NEW,
then the pdb must be dropped
local undo-1, localundoscn-0x00000000000000e1
****************************************************************
2018-01-16T12:44:51.934213+03:30
MAS12C(4):Autotune of undo retention is turned on.
2018-01-16T12:44:58.236021+03:30
MAS12C(4):[76640] Successfully onlined Undo Tablespace 2.
MAS12C(4):Undo initialization finished serial:0 start:264185920 end:264186491 diff:571 ms (0.6 seconds)
MAS12C(4):Database Characterset for MAS12C is AL32UTF8
MAS12C(4):JIT: pid 76640 requesting stop
2018-01-16T12:45:02.884741+03:30
Completed: create pluggable database mas12c admin user pdb_mas identified by *
file_name_convert=('/u01/app/oracle/oradata/db12c/pdbseed/','/u01/app/oracle/oradata/db12c/mas12c/')
2018-01-16T12:47:40.722781+03:30
alter pluggable database mas12c open
MAS12C(4):Autotune of undo retention is turned on.
2018-01-16T12:47:40.858347+03:30
MAS12C(4):Endian type of dictionary set to little
2018-01-16T12:47:44.292991+03:30
MAS12C(4):[76640] Successfully onlined Undo Tablespace 2.
MAS12C(4):Undo initialization finished serial:0 start:264350366 end:264352556 diff:2190 ms (2.2 seconds)
MAS12C(4):Deleting old file#5 from file$
MAS12C(4):Deleting old file#6 from file$
MAS12C(4):Deleting old file#8 from file$
MAS12C(4):Adding new file#13 to file$(old file#5)
MAS12C(4):Adding new file#14 to file$(old file#6)
MAS12C(4):Adding new file#15 to file$(old file#8)
2018-01-16T12:47:45.465437+03:30
MAS12C(4):Successfully created internal service mas12c at open
****************************************************************
Post plug operations are now complete.
Pluggable database MAS12C with pdb id - 4 is now marked as NEW.
****************************************************************
MAS12C(4):Database Characterset for MAS12C is AL32UTF8
2018-01-16T12:47:47.163318+03:30
MAS12C(4):Opatch validation is skipped for PDB MAS12C (con_id=0)
2018-01-16T12:48:14.999355+03:30
MAS12C(4):Opening pdb with no Resource Manager plan active
2018-01-16T12:48:18.120379+03:30
Pluggable database MAS12C opened read write
Completed: alter pluggable database mas12c open
2018-01-16T13:08:26.870085+03:30
MAS12C(4):Resize operation completed for file# 14, old size 337920K, new size 358400K
2018-01-16T13:27:02.656796+03:30

Schema Objets:
#########
[oracle@oel7 ~]$ sqlplus mas11g@mas12c

SQL*Plus: Release 12.2.0.1.0 Production on Tue Jan 16 13:51:55 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter password:
Last Successful login time: Tue Jan 16 2018 13:51:49 +03:30

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> def;
DEFINE _DATE           = "16-JAN-18" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "mas12c" (CHAR)
DEFINE _USER           = "MAS11G" (CHAR)
DEFINE _PRIVILEGE      = "" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1202000100" (CHAR)
DEFINE _EDITOR         = "vi" (CHAR)
DEFINE _O_VERSION      = "Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production" (CHAR)
DEFINE _O_RELEASE      = "1202000100" (CHAR)
SQL> select object_name, object_type from user_objects order by object_type;

OBJECT_NAME                              OBJECT_TYPE
---------------------------------------- --------------------------------------------------
SYS_C007400                              INDEX
MAS_SEQ                                  SEQUENCE
MASOUD                                   TABLE

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME                             SEGMENT_TYPE                             TABLESPACE_NAME
---------------------------------------- ---------------------------------------- ------------------------------
MASOUD                                   TABLE                                    MAS12C
SYS_C007400                              INDEX                                    MAS12C

SQL> select * from masoud;

        C1 C2
---------- ---------
         1 16-JAN-18
         2 16-JAN-18
         4 16-JAN-18

همانگونه که مشاهده نمودید به درستی و کامل از 11g به 12c مهاجرت کردیم.


دوستان عزیز امیدوارم مطلب کاربردی بوده باشد.


شاد و پیروز باشید.

ORA-20001 AND ORA-06512

12c


سلام خدمت دوستان عزیزم

احتمالا تا الان همگی نسخه Oracle 12c را به صورت Container DB نصب کردید. اگر به alert log نگاه انداخته باشید error های زیر را خواهید دید:

Errors in file /u01/app/oracle/diag/rdbms/db12c/db12c/trace/db12c_j000_38330.trc:
ORA-12012: error on auto execute of job "SYS"."ORA$AT_OS_OPT_SY_43"
ORA-20001: Statistics Advisor: Invalid task name for the current user
ORA-06512: at "SYS.DBMS_STATS", line 47207
ORA-06512: at "SYS.DBMS_STATS_ADVISOR", line 882
ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 20059
ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 22201
ORA-06512: at "SYS.DBMS_STATS", line 47197
2018-01-14T08:13:48.135989+03:30
Errors in file /u01/app/oracle/diag/rdbms/db12c/db12c/trace/db12c_j000_38436.trc:
ORA-12012: error on auto execute of job "SYS"."ORA$AT_OS_OPT_SY_45"
ORA-20001: Statistics Advisor: Invalid task name for the current user
ORA-06512: at "SYS.DBMS_STATS", line 47207
ORA-06512: at "SYS.DBMS_STATS_ADVISOR", line 882
ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 20059
ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 22201
ORA-06512: at "SYS.DBMS_STATS", line 47197
2018-01-14T08:33:49.941839+03:30
با من همراه باشید تا دلیل و چگونگی حل مشکل را دریابیم.

  • علت وجود مشکل:
وقتی دیتابیس را با template های General_Purpose.dbc, Data_Warehouse.dbc میسازیم (دقت شود که اگر در زمان نصب نیز از پایگاه داده بخواهید که یک PDB بسازد باز هم از dbca استفاده خواهد کرد) یا یک pdb را از روی یک seed database بسازید در پلتفرمهای Linux, Solaris مشکل را مشاهده خواهید نمود.

دلیل مشکل در حقیقت عدم وجود Stats Advisor Tasks می باشد:
SQL> select name, ctime, how_created
from sys.wri$_adv_tasks
where owner_name = 'SYS'
and name in ('AUTO_STATS_ADVISOR_TASK','INDIVIDUAL_STATS_ADVISOR_TASK');  2    3    4

no rows selected


  • چرا مشکل باید حل گردد:
شاید بعضی از دوستان بگویند که "این alert برای ما مشکلی ایجاد نمیکند" ولی باید دقت شود با افزایش داده ها در جداول، در صورت عدم gather stats این مورد بر روی performance پایگاه داده و ساخت sql execution plan تاثیر مخربی خواهد داشت.

  • حل مشکل:
بسیار خوب با sysdba به root container متصل شوید و Task ها را با دستور زیر بسازید:
[oracle@oel7 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 14 10:29:08 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> EXEC dbms_stats.init_package();

PL/SQL procedure successfully completed.
حالا دوباره query  را اجرا میکنیم تا ببینیم Task ها ساخته شده اند یا نه:
SQL> select name, ctime, how_created from sys.wri$_adv_tasks where owner_name
= 'SYS' and name in
('AUTO_STATS_ADVISOR_TASK','INDIVIDUAL_STATS_ADVISOR_TASK');  2    3

NAME
--------------------------------------------------------------------------------
CTIME     HOW_CREATED
--------- ------------------------------
AUTO_STATS_ADVISOR_TASK
14-JAN-18 CMD

INDIVIDUAL_STATS_ADVISOR_TASK
14-JAN-18 CMD
دوستان عزیز امیدوارم مطلب کاربردی بوده باشد.

شاد و پیروز باشید.

RMAN-08137

rmanOgg
سلام خدمت دوستان عزیز

امروز تماس تلفنی داشتم از یکی دوستانم که پایگاه داده آنها به مشکل مواجه شده بود. در نگاه اول و بررسی  مشخص شد که fra آنها پر شده است. سپس مشخص شد که مقدار زیادی از فضا را آرشیو لاگ ها پر کرده و با اجرای دستور حذف آرشیو لاگ ها خطای زیر را برمیگرداند:

RMAN-08137: warning: archived log not deleted, needed for standby or upstream capture process
archived log file name=/u01/app/oracle/fra/DB12C/archivelog/2017_11_29/o1_mf_1_259_f1xllbxo_.arc thread=1 sequence=259
.
.
.

با بررسی بیشتر به نظر میرسید خطا از این میباشد که انگار دیتا گاردی وجود دارد که هنوز آرشیو لاگ ها بر روی آن apply  نشده است.


[oracle@shopdb ~]$ oerr rman 08137
8137, 3, "warning: archived log not deleted, needed for standby or upstream capture process"
// *Cause: An archived log that should have been deleted was not as it was
//         required by upstream capture process or Data Guard.
//         The next message identifies the archived log.
// *Action: This is an informational message. The archived log can be
//          deleted after it is no longer needed.  See the
//          documentation for Data Guard to alter the set of active
//          Data Guard destinations.  See the documentation for
//          Streams to alter the set of active streams.

اما اصلا آنها دیتاگارد استفاده نمیکردند. پس دنبال چیز دیگری میگشتم که مشکل ساز شده بود. توی لاگ ها چیزی نظر من را جلب کرد:

LOGMINER: session#=4 (OGG$CAP_ERANGEB), reader MS09 pid=105 OS id=14650 sid=156 started


فکرم به سمت چیزی مثل Oracle Stream یا Oracle Golden Gate رفت، که پس از پرسوجو مشخص شد که آنها از Oracle Golden Gate  استفاده میکنند پس لاگین کردم و وضعیت آن را بررسی کردم:


GGSCI> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING
EXTRACT     RUNNING     M1          00:00:08      21:04:52
EXTRACT     RUNNING     PUMPM1      00:00:00      21:03:05

اما یه چیزی اینجا عجیب بود!!! اینکه اسم process توی لیست extract های جاری نبود ! بعد از بررسی لاگ های OGG مشخص شد که این process حذف شده ( به وسیله ggsci به درستی).

اما هنوز توی پایگاه داده process attach میبود:
OGG Capture client successfully attached to GoldenGate Capture OGG$CAP_ERANGEB to receive uncommitted changes with pid=101 OS id=14642.


پس مشخص شد که ما process extract به نام ERANGEB داشتیم که در OGG حذف کردیم، اما هنوز پایگاه داده متوجه حذف آن و در نتیجه عدم نیاز به Archivelog های آن نشده است. چرا ؟


دلیل آن استفاده از Integrated extract می باشد. از آنجایی که Oracle Golden Gate  در حالت Integrated از یک API برای بالا بردن سرعت برای extract کردن استفاده میکند، نیاز هست که به پایگاه داده اعلام شود که API آن را نیز در زمان حذف process حذف کند.


از دستور زیر برای حذف API استفاده میکنیم:

 GGSCI> unregister extract erangeb database

2017-12-05 08:57:30  INFO    OGG-01750  Successfully unregistered EXTRACT ERANGEB from database.
GoldenGate Apply: OGG$ERANGEB APPLY Dropped
2017-12-05T08:57:09.466195+03:30
APPLY OGG$ERANGEB: Apply User: C##OGG
2017-12-05T08:57:09.466269+03:30
APPLY OGG$ERANGEB: Apply Tag: 00
2017-12-05T08:57:09.564715+03:30
Streams Capture: OGG$CAP_ERANGEB CAPTURE Dropped

خوب خدا رو شکر، سپس اقدام به حذف Archivelog  ها کردم و همه چی درست شد.


نتیجه: اگر از OGG استفاده میکنید نیاز هست که هنگام حذف process extract بجز حذف آن در OGG آن هم در پایگاه داده Unregister بفرمایید. در غیر این صورت اجازه حذف آرشیو لاگ ها به پایگاه داده نخواهد شد.


دوستان عزیز امیدوارم مطلب کاربردی بوده باشد.

شاد و پیروز باشید.

جابجایی ASM Spfile به diskgroup دیگر

حالتی ممکن است به وجود بیاید که شما نیاز دارید دیتا های خود را از یک diskgroup به diskgroup دیگر جابجا کنید. فرض کنید شما diskgroup دارید در حالت normal redundancy و میخواهید آن را به حالت external redundancy در بیاورید، چون عملیات mirroring درحال حاضر در لایه سخت افزار انجام شده و نیاز به mirroring در asm diskgroup نمی باشد. ( best practice ).

در مرحله اول باید ببنید که asm spfile شما کجاست ؟

خیلی خوب بیایید فرض کنیم مشکلی در asm ما نیست و asm نیز بالاست. با دستورات زیر میتوانیم ببینیم asm spfile کجاست:

from ASMCMD:

[grid@racp1vm1 ~]$ asmcmd spget
+DATA/mas/ASMPARAMETERFILE/registry.253.905527691
from SQLPLUS:
[grid@racp1vm1 ~]$ sqlplus -s / as sysasm
show parameter spfile
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      +DATA/mas/ASMPARAMETERFILE/reg
                                                 istry.253.905527691
from ASMCMD all spfiles:
[grid@racp1vm1 ~]$ asmcmd find --type PARAMETERFILE '*' '*'
+DATA/mas/ASMPARAMETERFILE/registry.253.905527691
+DATA/RACDB/PARAMETERFILE/spfile.269.906247759
+DATA/RACDB/spfileRACDB.ora

و همچنین فرض بعدی این هست که asm مشکل دارد و بالا نیست ( به هر دلیلی asm spfile مشکل دار شده است) توجه توجه خیلی راحت چنین مشکلی ممکن هست ایجاد شود. مثلا اگر یک پارامتری که deprecated هست در spfile نویشته شود asm spfile مشکل دار میشود.


from gpnptoll:
[grid@racp1vm1 ~]$ gpnptool get -o- | xmllint --format - | grep SPFile
Success.
  <orcl:ASM-Profile id="asm" DiscoveryString="" SPFile="+DATA/mas/ASMPARAMETERFILE/registry.253.905527691" Mode="remote"/>

هر نود در OCW به gpnp نیازمند است و در اینجا آدرس vote disks و asm spfile را میخواند اگر این آدرس ها درست نباشند OCW بالا نمیاید. در اینجا فرض بر این هست که در gpnp به asm spfile درست اشاره میشود.


روش دیگر استفاده از kfed میباشد. در این حالت شما باید ببنید asm spfile در کدام دیسک هست و با offset اشاره شده از شروع block دیسک آن را بخوانید:


ls /dev/oracleasm/disks/*
/dev/oracleasm/disks/DATA1
/dev/oracleasm/disks/DATA2

#  $GRID_HOME/bin/kfed read /dev/oracleasm/disks/DATA1  | egrep 'spf|ausize'
kfdhdb.ausize:                  1048576 ; 0x0bc: 0x00100000
kfdhdb.spfile:                        0 ; 0x0f4: 0x00000000
kfdhdb.spfflg:                        0 ; 0x0f8: 0x00000000
spfflg=0 --> No spfile

#  $GRID_HOME/bin/kfed read /dev/oracleasm/disks/DATA2  | egrep 'spf|ausize'
kfdhdb.ausize:                  1048576 ; 0x0bc: 0x00100000
kfdhdb.spfile:                       59 ; 0x0f4: 0x0000003b
kfdhdb.spfflg:                        1 ; 0x0f8: 0x00000001
spfflg=1 --> SPfile at offset 59

#  dd if=/dev/oracleasm/disks/DATA2  of=SPFile_ASM.dat bs=1M count=1 skip=59 
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00882297 s, 119 MB/s

# strings SPFile_ASM.dat
+ASM1.asm_diskgroups='OCR','ACFS'#Manual Mount
+ASM2.asm_diskgroups='ACFS'#Manual Mount
*.asm_diskstring='/dev/oracleasm/disks/*'
*.asm_power_limit=1
*.diagnostic_dest='/u01/app/grid'
*.instance_type='asm'
*.large_pool_size=12M
*.remote_login_passwordfile='EXCLUSIVE'

البته که بهتره همیشه یه بکاپی از asm spfile  داشته باشیم:


from ASMCMD:
[grid@racp1vm1 ~]$ asmcmd spbackup +DATA/mas/ASMPARAMETERFILE/registry.253.905527691 /tmp/asmspfile.bak
from SQLPLUS:
[grid@racp1vm1 ~]$ sqlplus / as sysasm
crate pfile='/tmp/asmspfile.bak' from spfile;

File created.

حالا برویم سر اصل قضیه، جابجایی asm spfile به diskgroup دیگر:

راستش برای این کار هم چند راه کار هست که یکی از ساده ترین ها را خواهم گفت که تمام OCW را متاثر میکند ( مثلا gpnp را نیز آپدیت میکند و ...):

ساده ترین کار ساخت pfile از spfile و دباره ساخت spfile از pfile هست.


from SQLPLUS:
[grid@racp1vm1 ~]$ sqlplus / as sysasm
crate spfie='+DATA2' from pfile='/tmp/asmspfile.bak';

File created.

این دستور هم خیلی عالی هست به کلید -u توجه کنید معنی آن این هست که در OCW کانفیگ جدید را broadcast کن.

[grid@racp1vm1 ~]$ asmcmd spcopy -u +DATA/mas/ASMPARAMETERFILE/registry.253.905527691 '+DATA2'

حالا چک میکنیم ببنیم واقعا فایل جابجا شده است ؟ و همچنین pgnp فایل و OCR فایل هم بروز شده است یا خیر ؟!


from gpnptoll:
[grid@racp1vm1 ~]$ gpnptool get -o- | xmllint --format - | grep SPFile
Success.
  <orcl:ASM-Profile id="asm" DiscoveryString="" SPFile="+DATA2/mas/ASMPARAMETERFILE/registry.259.905527691" Mode="remote"/>
[grid@racp1vm1 ~]$ asmcmd spget
+DATA2/mas/ASMPARAMETERFILE/registry.259.905527691

 در نهایت باید یک بار Cluster را پایین و بالا کنید که از روی spfile جدید کار را دنبال کند.


دوستان عزیز امیدوارم مطلب کاربردی بوده باشد.

شاد و پیروز باشید.

Oracle ACFS

ACFS

با سلام خدمت دوستان عزیز،
امروز قصد دارم کمی در مورد ASM Cluster File System, ACFS بنویسم.


ASM Volume چیست ؟
ASM Volume یک فایل است مانند دیگر فایل ها در ASM که از redundancy ASM پیروی میکند و extent های آن مانند فایل های دیگر بین disk ها برای IO بهتر توزیع میگردد. باید دقت گردد که یک Volume با استفاده از ASM Dynamic Volume Manager, ADVM به OS ارایه میگردد. با استفاده از ADVM مانند دیگر فایل سیستم ها، کاربران در سیستم عامل میتوانند به Volume درخواست IO داشته باشند. یک volume به عنوان یک block device به OS ارایه میگردد پس با دستور ها ای مانند mkfs میتواند آن را فرمت نمود. فایل سیستم ها ای مانند ext4, fat32, ntfs, xfs, acfs, ...


 ACFS چیست ؟
ACFS یک کلاستر فایل سیستم چند منظوره هست که شما در آن میتوانید انواع فایل ها از قبیل متن، عکس، موسیقی، ORACLE_HOME پایگاه داده و... را در آن ذخیره کنید که قسمتی از ASM می باشد. باید دقت داشت که در ACFS تقریبا همه چیز را میتوان ذخیره کرد به جز CRS_HOME, boot_device. یعنی باینری فایل های ASM در درون ACFS نمیتواند قرار گیرد چون برای load کردن ACFS نیاز به دسترسی به CRS_HOME میباشد که درصورتی که CRS_HOME درون ACFS باشد این مهم امکان پذیر نمیباشد. به درستی ACFS چون یک کلاستر فایل سیستم می باشد Managing Concurrency را انجام میدهد.

بیایید با یکدیگر یک سناریو ساخت ASCF را دنبال کنیم. شما به چند طریق میتوانید یک ACFS فایل سیستم ایجاد کنید :
  1. sqlplus
  2. asmcmd
  3. asmca
  4. enterprise manager
ما در اینجا از command line استفاده خواهیم گرد:

۱- در این مرحله اول یک volume در ASM diskgroup ایجدا میکنیم:

SQLPLUS Example:
[grid@rac1 ~]$ sqlplus / as sysasm
SQL> ALTER DISKGROUP DATA ADD VOLUME ACFSVOL3 SIZE 10G;

Diskgroup altered.

SELECT volume_name, volume_device FROM V$ASM_VOLUME 
     WHERE volume_name ='ACFSVOL3';
VOLUME_NAME VOLUME_DEVICE ----------------- -------------------------------------- ACFSVOL3 /dev/asm/acfsvol3-123 ASMCMD Example: [grid@rac1 ~]$ asmcmd volcreate -G data -s 10G ACFSVOL3 [grid@rac1 ~]$ asmcmd volinfo -G data ACFSVOL3 Diskgroup Name: DATA Volume Name: ACFSVOL3 Volume Device: /dev/asm/acfsvol3-123
State: ENABLED ...


۲- خوب تا الان یک volume در ASM diskgroup +DATA به حجم 10G ایجاد کردیم. حالا وقت این است که یک فایل سیستم برروی volume ایجاد کنیم که در اینجا ما یک ACFS برروی volume ایجاد خواهیم کرد. دقت کنید که از این پس volume با استفاده از ADVM به صورت یک block device به OS با آدرس /dev/asm/acfsvol3-123 ارایه شده است.


[grid@rac1 ~]$ /sbin/mkfs -t acfs /dev/asm/volume1-123

mkfs.acfs: version                   = 11.2.0.4.0.0
mkfs.acfs: on-disk version           = 39.0
mkfs.acfs: volume                    = /dev/asm/volume1-123
mkfs.acfs: volume size               = 10737418240
mkfs.acfs: Format complete.


۳- در مرحله فوق اگر دقت کرده باشبد ما با کاربر grid  فایل سیستم ابجاد کردیم. دقت کنید که بعد از ساخت block device مالک آن چه کسی هست ؟! در اینحا مالک asmadmin میباشد پس مالک یا کاربر root میتواند filesystem  ایجاد کند که با با استفاده از مالک چنین کاری انجام دادیم. حالا وقت آن است که یک mount point  ایجاد کرده و block device فرمت شده را بر روی یک مسیر mount کنیم.


[root@rac1 ~]$ /bin/mount -t acfs /dev/asm/volume1-123 /u01/app/acfsmounts/myacfs


۴- در مرحله فوق ما عملیات mount را انجام دادیم. دقت کنید تنها با کاربر root این امکان وجود دارد که عملیات mount  را انجام بدید. این مرحله را روی تمام node های کلاستر باید تک تک انجام بدید. ولی یک کار ساده تر وجود دارد که خود clusterware شروع میکند به mount کردن block device برروی mount point ها بر روی تمام نود ها. دقت کنید که این مرحله یک مرحله optional هست. اسم این مرحله acfs registery می باشد.


[grid@rac1 ~]$ /sbin/acfsutil registry -a /dev/asm/volume1-123 /u01/app/acfsmounts/myacfs

acfsutil registry: mount point /u01/app/acfsmounts/myacfs successfully added 
  to Oracle Registry


دقت کنید در مرحله فوق oracle clusterware عملیات mounting و مانیتور کردن آن را به صورت automatic انجام میدهد. چگونگی کار به این صورت است که clusterware آن را به صورت یک resource در OCR ثبت میکند، پس به صورت خودکار در هنگام بالا آمدن شروع به mount کردن block device ها در mount point ها میکند، و در هنگام پایین آمدن کلاستر، clusterware با رعایت ترتیب وابستگی ها شروع به dismount کردن block device ها میکند. پس این گونه هست که از ACFS میتوان به عنوان shared oracle db home استفاده کرد. لازم به ذکر است، در حالت نصب standalone, چنین چیزی بی معنی است چون OCR وجود ندارد و حتما block device ها باید به صورت دستی mount گردد.


[root@rac1 ~]$ /u01/app/11.2.0.4/grid/bin/crsctl stat res ora.registry.acfs
NAME=ora.registry.acfs
TYPE=ora.registry.acfs.type
TARGET=ONLINE        , ONLINE        , ONLINE
STATE=ONLINE on rac1, ONLINE on rac2, ONLINE on rac3


اگر مسیر تمام mount point ها و block device  ها را ندانیم مشکلی نیست با دستور زیر با کاریر root میتوانی تمام آنها را mount کنیم:

[root@rac1 ~]$ /bin/umount -t acfs -a
[root@rac1 ~]$ /sbin/mount.acfs -o all

دوستان عزیز امیدوارم مطلب کاربردی بوده باشد.

شاد و پیروز باشید.

Sync Password file between primary and data guard in Oracle 12cR2

passwordfile

سلام دوستان عزیز امیدوارم حالتان خوب باشد.

یکی از قابلیت های جدید که در پایگاه داده Oracle 12cR2 معرفی شده، همسان شدن password file بین primary و dataguard می باشد.

 به مثال زیر توجه بقرمایید:

[oracle@myos ~]$ dgmgrl sys/123@cdbp
DGMGRL for Linux: Release 12.2.0.1.0 - Production on Tue Oct 07 07:38:15 2017

Copyright (c) 1982, 2016, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "cdbp"
Connected as SYSDBA.
DGMGRL> show configuration;

Configuration - dg

  Protection Mode: MaxPerformance
  Members:
  cdbp   - Primary database
    cdbpst - Physical standby database 

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS   (status updated 46 seconds ago)

DGMGRL> exit
[oracle@myos ~]$ sqlplus sys/123@cdbp as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Tue Oct 07 07:42:19 2017

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> alter user sys identified by masoud;

User altered.

SQL> connect sys/masoud@cdbp as sysdba
Connected.
SQL> connect sys/masoud@cdbpst as sysdba
Connected.

تنها کاری که انجام دادم تغییر در password file توی پایگاه داده primary بود و این تغییر به صورت خودکار نیز بر روی پایگاه داده guard اعمال شد. در صورتی که این کار را در ورژن های قبل باید به صورت دستی انجام میدادیم.


دوستان عزیز امیدوارم مطلب کاربردی بوده باشد.

شاد و پیروز باشید.

Exporting views

با شروع Oracle 12.1 این قابلیت وجود دارد که شما یک view را به عنوان table خروجی (export) بگیرید. این به این معنی است که export شامل DDL ساخت table و همچنین دیتای آن می باشد. در صورتی که object اصلی یک view است.
به عنوان مثال اگر شما از دستور زیر استفاده کنید:
expdp masoud/masoud dumpfile=myView.dmp include=view query=\"where c1=1\";

دستور بالا view را به عنوان view خروجی میگیرد (export شامل create view می باشد).

حالا از دستور VIEWS_AS_TABLES استفاده میکنیم:

expdp masoud/masoud dumpfile=myTable.dmp query=\"where c1=1\" views_as_tables=myTable;

دستور بالا query را اجرا میکند و DDL ساخت table میسازد. درحقیقت زمان import شما جدولی به نام myTable خواهید داشت که شامل data آن view می باشد.


دوستان عزیز امیدوارم مطلب کاربردی بوده باشد.

شاد و پیروز باشید.

پیدا کردن کارکتر غیر عددی در یک ستون

data type


سلام دوستان امروز با یک مشکل جالب مواجه شدم که در این جا میخواهم با شما به اشتراک بگذارم. مشکل از این جا شروع شد که یکی از دوستان تماس گرفتند و گفتند که یک سری گزارش ها تولید نشده اند. پس از بررسی مشخص شد که یکی از procedure ها با مشکل رو به رو شده و error زیر را برمیگرداند.

ERROR at line 1:
ORA-01722: invalid number

بعد از بررسی مشخص شد که در column  مقادیر عددی ذخیره شده است، که data type آن از نوع varchar می باشد. اما در جدول حدود ۳۰۰۰۰۰۰۰۰ رکورد اطلاعات وجود داشت که واقعا پیدا کردن داده مشکل دار را سحت مینمود.

حالا با من همراه باشید که با یک شبیه سازی نشان دهم چگونه چنین مشکلی به وجود میاید و چگونه اطلاعات مشکل دار را پیدا کنیم.


خوب اول یک جدول ایجاد میکنیم و مقداری داده در آن قرار میدهیم:

create table mytest (c1 number primary key, c2 varchar (20));

Table created.

insert into mytest values (1, '20000000');

1 row created.

insert into mytest values (1, '300000000');
insert into mytest values (1, '300000000')
*
ERROR at line 1:
ORA-00001: unique constraint (HR.SYS_C0016539) violated

insert into mytest values (2, '300000000');

1 row created.

insert into mytest values (3, '300000000+');

1 row created.

select * from mytest;

        C1 C2
---------- --------------------
         1 20000000
         2 300000000
         3 300000000+

خوب حالا یک عملیات ریاضی مثل جمع انجام میدهیم و تا مقدار کل را به دست آوریم:

select sum(c2) from mytest;
select sum(c2) from mytest
           *
ERROR at line 1:
ORA-01722: invalid number

همانگونه که مشاهده نمودید به درستی با مشکل مواجه شدیم چون مقدار غیر عددی در column وجود داد. پس باید داده خراب را پیدا کرد و آن را تصحیح نمود تا کار به درستی انجام گردد.


با دستور زیر میتوان رکوردی که داده غیر عددی دارد مشخص نمود:

select *
from mytest
where regexp_like(c2, '[^0-9]+');

        C1 C2
---------- --------------------
         3 300000000+

خوب دوستان چند نکته در مورد طراحی قابل ذکر است:

  1. در صورتی که واقعا نیاز شما فقط عدد هست از نوع داده ای غیر عددی مثل varchar یا varchar2 ... برای ذخیره اعداد استفاده ننمایید، چون برای انجام عملیات های ریاضی هر چند بسیار ناچیز implicitly type conversion overhead خواهید داشت. همچنین احتمال بروز چنین مشکلاتی نیز افزایش می یابد.
  2. دوستان برنامه نویس در که صورتی ناگزیر به استفاده از داده غیر عددی برای ذخیره عداد هستید، حتما بررسی کنید که کارکتر غیر عددی در ستونی که قرار است بر روی آن اعمال ریاضی انجام گردد قرار ندهند (حتما در برنامه جلوی آن گرفته شود) تا در ادامه با چنین مشکلاتی رو به رو نشوید.

دوستان عزیز امیدوارم مطلب کاربردی بوده باشد.

شاد و پیروز باشید.

Nologging and Recovery !

recovery

این امکان وجود دارد که شما برای بعضی از کار ها از پایگاه داده بخواهید که redo برای آنکار تولید نکند. مثل create table as select, insert into select, create index, ... اگر شما بعد از این عملیات ها بکاپ تهیه کنید هیچ مشکلی نیست و شما به درستی زمان کمتری برای انجام آنکارها گذاشته اید. ولی اگر قبل از بکاپ دیتافایل آسیب ببیند چه مشکلی بوجود می آید ؟

بیایید با هم یک سناریو را دنبال کنیم:


اول یک tablespace و user جدا و دسترسی های لازم را ایجاد میکنیم:

[oracle@myos ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Mon Jul 3 11:09:42 2017

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
SYS@db11g> create tablespace mas datafile '+DATA';

Tablespace created.

SYS@db11g> create user masoud account unlock identified by masoud default tablespace mas quota unlimited on mas;

User created.

SYS@db11g> grant create table, create session, create sequence to masoud;

Grant succeeded.

SYS@db11g> disc
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

@> conn masoud
Enter password:
Connected.

MASOUD@db11g> create sequence myseq;

Sequence created.

MASOUD@db11g> create table t (c1 number, c2 varchar(10));

Table created.

خوب در اینجا ما یک user به نام masoud  داریم که tablespace پیش فرض اون mas هست حال داده در جدول t  میریزیم

begin 
  for i in 1..1000 loop 
    insert into t values (myseq.nextval, 'my val'); 
  end loop;
  commit;
end;
/

حال یک بکاپ از tablespace میگیریم :

RMAN> backup tablespace mas;

Starting backup at 03-JUL-2017 11:25:01
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=2591 device type=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: SID=11 device type=DISK
allocated channel: ORA_DISK_3
channel ORA_DISK_3: SID=528 device type=DISK
allocated channel: ORA_DISK_4
channel ORA_DISK_4: SID=1044 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00019 name=+DATA/db11g/datafile/mas.265.948366897
channel ORA_DISK_1: starting piece 1 at 03-JUL-2017 11:25:04
channel ORA_DISK_1: finished piece 1 at 03-JUL-2017 11:25:07
piece handle=+FRA/db11g/backupset/2017_07_03/nnndf0_tag20170703t112504_0.284.948367505 tag=TAG20170703T112504 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 03-JUL-2017 11:25:07

Starting Control File and SPFILE Autobackup at 03-JUL-2017 11:25:08
piece handle=+FRA/db11g/autobackup/2017_07_03/s_948367508.429.948367511 comment=NONE
Finished Control File and SPFILE Autobackup at 03-JUL-2017 11:25:15

حالا وضعیت قابل ریکاور بودن datafile رو ببینیم:

RMAN> report unrecoverable;

Report of files that need backup due to unrecoverable operations
File Type of Backup Required Name
---- ----------------------- -----------------------------------

پس همانگونه که میبینید هیچ datafile unrecoverable نیست (در حقیقت همه در صورت media failure قابل بازگشت هستند) حال یک عملیات nologging انجام میدهیم:


MASOUD@db11g> create index ix_t_c1 on t(c1) nologging;

Index created.

RMAN> report unrecoverable;

Report of files that need backup due to unrecoverable operations
File Type of Backup Required Name
---- ----------------------- -----------------------------------
19   full or incremental     +DATA/db11g/datafile/mas.265.948366897

SYS@db11g> select file#,to_char(UNRECOVERABLE_TIME,'yyyy-mm-dd:hh24:mi:ss')
from v$datafile where file#=19;

     FILE# TO_CHAR(UNRECOVERAB
---------- -------------------
        19 2017-07-03:14:17:01

همانگونه که مشاهده نمودید datafile شماره ۱۹ unrecoverable شد.


بیاید فرض کنیم که دیتافایل دچار آسیب شده و حال میخواهیم آن را recover کنیم:

RMAN> sql 'alter database datafile 19 offline';

using target database control file instead of recovery catalog
sql statement: alter database datafile 19 offline

RMAN> restore datafile 19;
.
.
.
Finished restore at 03-JUL-2017 14:30:43

RMAN> recover datafile 19;

Starting recover at 03-JUL-2017 14:31:06
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
using channel ORA_DISK_4

starting media recovery
media recovery complete, elapsed time: 00:00:03

Finished recover at 03-JUL-2017 14:31:10

RMAN> sql 'alter database datafile 19 online';

sql statement: alter database datafile 19 online

بسیار خوب فایل recover شد حال یک select میزنیم و سعی میکنیم تا از index استفاده شود.

MASOUD@db11g> select * from t where c1=7;
select * from t where c1=7
              *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 19, block # 140)
ORA-01110: data file 19: '+DATA/db11g/datafile/mas.265.948366897'
ORA-26040: Data block was loaded using the NOLOGGING option

بدرستی با مشکل رو به رو شدیم، چون ما redo برای این index ایجاد نکرده بودیم پس index هم زمان recovery نخواهیم داشت. ولی میتوانیم ببنیم دفیقا کدام index این مشکل رو ایجاد کرده و با کمی پیچیدگی میتوانیم این مشکل را حل کنیم:

MASOUD@db11g> select index_name,status,logging from user_indexes where tablespace_name='MAS';

INDEX_NAME                     STATUS   LOG
------------------------------ -------- ---
IX_T_C1                        VALID    NO

MASOUD@db11g> alter index IX_T_C1 rebuild nologging;
alter index IX_T_C1 rebuild nologging
* ERROR at line 1: ORA-01578: ORACLE data block corrupted (file # 19, block # 140)
ORA-01110: data file 18: '+DATA/db11g/datafile/mas.265.948366897'
ORA-26040: Data block was loaded using the NOLOGGING option MASOUD@db11g> alter index IX_T_C1 unusable; MASOUD@db11g> alter index ix_t_c1 rebuild nologging; Index altered. MASOUD@db11g> select * from t where c1=7; C1 C2 ---------- ---------- 7 my val

بسیار خوب همانگونه که دیدید مشکل حل شد و حال دوباره از tablespace بکاپ میگیریم که مشکل unrecoverable نیز نداشته باشیم.

RMAN> backup tablespace mas;

Finished backup at 03-JUL-2017 14:56:27

RMAN> report unrecoverable;

Report of files that need backup due to unrecoverable operations
File Type of Backup Required Name
---- ----------------------- -----------------------------------


حالا رفتار insert nologging را ببینیم:

MASOUD@db11g> alter table t nologging;

Table altered.

MASOUD@db11g> insert /*+ append */ into t select * from t;

1000 rows created.

SYS@db11g> select file#,to_char(UNRECOVERABLE_TIME,'yyyy-mm-dd:hh24:mi:ss') from v$datafile where file#=19;

     FILE# TO_CHAR(UNRECOVERAB
---------- -------------------
        19 2017-07-03:15:00:01

RMAN> report unrecoverable;

Report of files that need backup due to unrecoverable operations
File Type of Backup Required Name
---- ----------------------- -----------------------------------
19   full or incremental     +DATA/db11g/datafile/mas.265.948366897

RMAN> sql 'alter database datafile 19 offline';

sql statement: alter database datafile 19 offline

RMAN> restore datafile 19;

Starting restore at 03-JUL-2017 15:05:49
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
using channel ORA_DISK_4

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00019 to +DATA/db11g/datafile/mas.265.948366897
channel ORA_DISK_1: reading from backup piece +FRA/db11g/backupset/2017_07_03/nnndf0_tag20170703t145624_0.393.948380185
channel ORA_DISK_1: piece handle=+FRA/db11g/backupset/2017_07_03/nnndf0_tag20170703t145624_0.393.948380185 tag=TAG20170703T145624
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
Finished restore at 03-JUL-2017 15:05:52

RMAN> recover datafile 19;

Starting recover at 03-JUL-2017 15:05:59
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
using channel ORA_DISK_4

starting media recovery
media recovery complete, elapsed time: 00:00:02

Finished recover at 03-JUL-2017 15:06:03

RMAN> sql 'alter database datafile 19 online';

sql statement: alter database datafile 19 online

MASOUD@db11g> select * from t;
.
.
.
ERROR:
ORA-01578: ORACLE data block corrupted (file # 19, block # 136)
ORA-01110: data file 19: '+DATA/db11g/datafile/mas.265.948366897'
ORA-26040: Data block was loaded using the NOLOGGING option

همانگونه که مشاهده نمودید به مشکل برخوردیم و متاسفانه راهی برای برگرداندن دیتا وجود ندارد و این هزینه ای هست که در مقابل حذف redo و افزایش سرعت میپردازید.


 دوستان عزیز امیدوارم مطلب کاربردی بوده باشد.

شاد و پیروز باشید.