Arxiv

Archive for İ

Running Python Script from crontab

Oracle expdp — üçün yazmış olduğum sadə script adi halda yəni birbaşa çağırdıqda işləyirdi , lakin cron-a qoşduqda işləmirdi.

Crontab-in outputunu hər hansısa fayla verdikdən sonra expdp: command not found error-unu gördüm.
Çox zaman bu error ORACLE_HOME/bin tapılmadıqda çıxır. Dolayısı ilə bu PATH-ləri Python kod daxilində environment variables şəklində verməklə problemi həll etdim.

Nümunə kod aşağıdakıdır:

import os
import datetime
import subprocess

os.environ['HOME'] = "/home/oracle"
os.environ['PATH'] = "/opt/app/oracle/product/11.2.0/db_1/bin:/usr/sbin:/usr/lib64/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin"
os.environ['ORACLE_BASE']="/opt/app/oracle"
os.environ['ORACLE_HOME']="/opt/app/oracle/product/11.2.0/db_1"
os.environ['ORACLE_SID']="XXXXX"
os.environ['LD_LIBRARY_PATH'] = "/opt/app/oracle/product/11.2.0/db_1/lib:/lib:/usr/lib"


now = datetime.datetime.now()


file_name = 'xxxxx_'+str(now.day)+'_'+str(now.month)+'_'+str(now.year)+'_'+str(now.hour)+'_'+str(now.minute)+'_'+str(now.second)

comm = 'expdp'
connection = 'xxxx/xxxx'
schema = 'xxxxx'
dump_file = file_name+'.dmp'
log_file = file_name+'.log'

command = '%s %s schemas=%s directory=data_pump_directory dumpfile=%s logfile=%s' % (comm, connection, schema, dump_file, log_file)

cm = subprocess.call(command, shell=True, env=os.environ)

Crondan çağırıldıqda artıq Python fayl çalışacaq. Script çalışdıqda çalışdığı tarix və zaman da qeyd olunmaqla .dmp və .log fayllar generate olunacaq.
Məsələn aşağıdakı şəkildə:

xxxxx_31_1_2014_8_0_1.dmp
xxxxx_31_1_2014_8_0_1.log

Təşəkkürlər…

Kateqoriyalar: PHP/Python Etiketlər:

Enable History on SQL*PLUS

SQL PLUS-da çox istərdik ki, Linux terminalda olduğu kimi Up/Down Arrow-nu basmaqla əldə etdiyimiz kimi, history-imiz olsun. DEfault olaraq SQL*PLus-da bu yoxdur. Bu dəstəyi əlavə etmək üçün:

-- 1
[root@dhcppc3 ~]# wget http://utopia.knoware.nl/~hlub/uck/rlwrap/rlwrap-0.37.tar.gz
-- 2
[root@dhcppc3 ~]# tar -zxvf rlwrap-0.37.tar.gz
-- 3
[root@dhcppc3 ~]# cd rlwrap-0.37
-- 4
[root@dhcppc3 rlwrap-0.37]# ./configure

Əgər configure zamanı sonda :
You need the GNU readline library(ftp://ftp.gnu.org/gnu/readline/ ) to build
this program!

Adlı bir xəbərdarlıq varsa, o zaman aşağıdakıları edin:
İlk öncə yoxlayın ki, readline paketi install olunub ya yox? Mənim halımda quruludur.

[root@dhcppc3 rlwrap-0.37]# rpm -qa|grep readline
readline-6.0-4.el6.x86_64

Məhz bu səbəbdən biz readline-devel paketini yükləyirik:

[root@dhcppc3 rlwrap-0.37]# yum install readline-devel
.
.
.

Installed:
  readline-devel.x86_64 0:6.0-4.el6                                                                                                        Dependency Installed:
  ncurses-devel.x86_64 0:5.7-3.20090208.el6                                                                                                                            
Complete!

Daha sonra yenidən configure edək:

-- 1
[root@dhcppc3 rlwrap-0.37]# make

--2 
[root@dhcppc3 rlwrap-0.37]# make check
.
.
=============
1 test passed
=============

--3 
[root@dhcppc3 rlwrap-0.37]# make install

Daha sonra oracle user-inə keçərək .bash_profile faylına aşağıdakıları qeyd edə bilərsiniz:

[oracle@dhcppc3 ~]$ nano .bash_profile
-- alias rlsqlplus='rlwrap sqlplus'
-- alias rlrman='rlwrap rman'

Save edirik:

[oracle@dhcppc3 ~]$ source .bash_profile

[oracle@dhcppc3 admin]$ rlsqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Tue Jan 28 22:08:14 2014

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

Connected to an idle instance.

Və Enjoy 🙂
Təşəkkürlər…

General Difference Oracle vs. MySQL (part 1) : USER\SCHEMA\DATABASE

Oracle, MySQL Physical Data Structure və Logical Data Structure mövzularına girməzdən əvvəl bir sıra ümumi fərqlikləri ayrıca yazılar şəklində yazmağı məqsədə uyğun hesab edirəm…

Ilkin olaraq insanları çaşdıran məqamlardan biri , USER\SCHEMA\Database anlayışlarıdır.
Bu anlayışlar 2 RDBMS-də fərqlidir..Dolayısı ilə araşdırmaqda fayda var.

Bütün digər fərqlilikləri yazmazdan əvvəl mənim üçün əsas olan, DATABASE anlayışını izah edək:
Oracle-da:

database

Organized collection of data treated as a unit. The purpose of a database is to store and retrieve related information. Every Oracle database instance accesses only one database in its lifetime.

instance

The combination of the system global area (SGA) and background processes. An instance is associated with one and only one database.

Qısa olaraq:

Instance = Background Processes + Memory Region called SGA (System Global Area)
Database = Data files + Control Files + Online Redolog files

Database daimidir. Diskdə yerləşir.
Instance müvəqqətidir. RAM-da yerləşir.

Database aktiv deyil. Sadəcə disk-də yerləşən fayllar toplusudur.
Instance aktivdir. Əməliyyat sistemində hər hansı digər program kimi prosess şəklində fəaliyyət göstərir. Dolayısı ilə instance OS process-dir.

Oracle-da bir başa Database-ə qoşulma yoxdur, siz instance-a qoşulursuz, Database-i instance idarə edir.

İnstance-sı “startup” və “shutdown” edə bilərsiniz. Database-i isə “mount” və “open” , həmçinin “dismount” və “closed” edə bilərsiniz. Dolayısı ilə bir kimsə Oracle üçün “Oracle Start olundu” və yaxud “Oracle shutdown oldu” dedikdə çox güman ki, birinci halda “İnstance start olundu və Database open oldu” ikinci halda isə “Database closed oldu və İnstance shutdown oldu” demək istəmişdir.

Müqayisəli şəkildə irəliləyək:
Əyani şəkildə Oracle Database Start-ı göstərək:

-- 1
[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Sun Jan 26 02:42:59 2014

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

Connected to an idle instance.

SQL> 

--2 
SQL> startup nomount 
ORACLE instance started.

Total System Global Area  826753024 bytes
Fixed Size                  2217872 bytes
Variable Size             583010416 bytes
Database Buffers          239075328 bytes
Redo Buffers                2449408 bytes

Əgər diqqətlə output-a baxsaq görərik ki, ORACLE instance started.. Yani hələ database yoxdur.
Davam edək:

SQL> alter database mount;

Database altered.

SQL> select name,open_mode from v$database;

NAME      OPEN_MODE
--------- --------------------
DB01      MOUNTED

Indi isə gördüyünüz kimi, Databse mount olundu.
Daha sonra da:

SQL> alter database open;

Database altered.

SQL> select name,open_mode from v$database;

NAME      OPEN_MODE
--------- --------------------
DB01      READ WRITE

Ən sonda da Database open olundu və istifadəyə hazırdır.
Burda daha bir anlayışı irəli sürək ki, 1 instance yalnız 1 database-ə connect ola bilər. Dolayısı ilə instanc-a qoşulmuş hər hansı user öz object-ini məhz o Database-də yaradacaq.
Yəni USER-in object-ləri məhz connect olduğu Database-də saxlanılacaq. MySQL-də isə bu belə deyildir. Gəlin araşdıraq.

MySQL-də Database anlayışına gəldikdə orda da həmçinin, Oracle-ın database tərifi geçərlidir. Yəni ki, MySQL-də də database-də fiziki məlumatlar saxlanılır. Diskdə saxlanılır və.s Lakin prinsipial fərqlərə gəlin birlikdə baxaq.
Əsas etibarilə onu qeyd etməliyik ki, MySQL-də Oracle-ın İnstance anlayışı yoxdur həmçinin MySQL-də İnstance start olunmur, Database OPEN və yaxud CLOSE olunmur.

MySQL OS-də Service kimi start olunur. Bu START-ı siz Oracle-ın yuxardakı addımlarının toplusu olaraq qəbul edə bilərsiniz.
MySQL service Start olunduqdan sonra USER session açır Session Thread, Server Thread-ə connect olur və işləməyə başlayır.
Daha ətraflı izah üçün gəlin əyani olaraq baxaq:

[root@localhost ~]# service mysqld start
Starting mysqld:                                           [  OK  ]

Bu bizim həm bir növü Oracle-dakı İnstance start və Database open-umuzdur 😉

Daha sonra connect oluruq:

[root@localhost ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.15 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Default SUPER user olan root-la qoşulduq. İndi isə hər hansı USER yaradaq:

mysql> create user xxx identified by '12345';
Query OK, 0 rows affected (0.00 sec)

Disconnect olaq və yeni yaranmış USER-lə connect olaq:

mysql> exit
Bye
[root@localhost ~]# mysql -u xxx -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.15 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

İndi isə hər hansı əməliyyat etməyə çalışaq:

mysql> create table t1(x date);
ERROR 1046 (3D000): No database selected


ERROR 1046 (3D000): No database selected
— ERROR onu göstərir ki, cədvəlimizin hansı Database-də yerləşəcəyini biz seçməmişik.

Davam edək, MySQL Server-də hansı Database-lərin olduğuna baxaq:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

Bizim yeni yaradılmış USER-imiz Metadata (information_schema adından da göründüyü kimi) database-indən başqa heçnəyi görmür. Dolayısı ilə yeni yaradılmış USER heç bir əməliyyat yerinə yetirə bilməyəcək.
İndi isə eyni əməliyyatları Oracle-da edək:

SQL> create user xxx identified by 12345;

User created.

SQL> grant create session to xxx;

Grant succeeded.

SQL> grant create table to xxx;

Grant succeeded.

SQL> connect xxx/12345
Connected.
SQL> create table t1(x date);

Table created.

İndi isə Ümumiləşdirək. Əsas Fərqləndirmə:
Diqqət yetirdinizsə MySQL-də USER-in connect olması üçün hər hansı Database-in varlığına ehtiyac yoxdur, connect olduqdan sonra mövcud sonsuz sayda database-lərdən birini seçib işləyə bilər. Yəni MySQL user connect olduqdan sonra database-ini özü seçir.
Oracle-da isə əgər diqqət yetirdinizsə, Oracle install olunduqda və yaxud daha sonra Database create olunub, İnstance start-dır , Database open-dır. Və yeni yaradılmış bu xxx USER-i artıq məhz həmin Database-də fəaliyyət göstərir. Müvafiq GRANT-lar verdikdən sonra, session aça bilir cədvəlini create edə bilir.

Yenidən MySQL ilə davam edək…Super USER ilə connect olaq və database yaradaq:

[root@localhost ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.15 MySQL Community Server (GPL)

mysql> create database blog_test;
Query OK, 1 row affected (0.00 sec)

Yeni yaratdığımız USER-ə bu database-dən istifadə üçün GRANT verək:

mysql> create database blog_test;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on blog_test.* to xxx;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for xxx;
+----------------------------------------------------------------------------------------------------+
| Grants for xxx@%                                                                                   |
+----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'xxx'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' |
| GRANT ALL PRIVILEGES ON `blog_test`.* TO 'xxx'@'%'                                                 |
+----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Grant-dan göründüyü kimi, xxx user-ini artıq blog_test database-indən istifadə hüququ vardır.
xxx useri ilə qoşulaq:

[root@localhost ~]# mysql -u xxx -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.15 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| blog_test          |
+--------------------+
2 rows in set (0.00 sec)

mysql> use blog_test;
Database changed
mysql> create table t1(x date);
Query OK, 0 rows affected (0.23 sec)

DATABASE məntiqini izah etdikdən sonra istərdim ki, USER anlayışına da qısaca izah verək.
USER Oracle-da gördüyümüz kimi, connect olur və hər hansı object-ini yaratdıqda , həmin object-lər evvelceden connect olduğu database-də yaranaraq həmin USER tərəfindən OWN olur. Yəni hər USER öz objectinin OWNER-idir.
MySQL-də isə USER hər hansı object-in OWNER-i deyil hətta, OWNER-lik anlayışı yoxdur.

Əyani olaraq göstərək.
Oracle-da USER + objects = SCHEMA. Dolayısı ilə digər SCHEMA-dan (USER-in OWN etdiyi obyektlərdə) hər hansı məlumat oxumaq istəyək:
Bu məqsədlə ikinci nümunə user yaradaq:

SQL> create user xxx2 identified by 12345;

User created.

SQL> grant create session to xxx2;

Grant succeeded.

SQL> GRANT UNLIMITED TABLESPACE TO xxx;

Grant succeeded.

SQL> GRANT UNLIMITED TABLESPACE TO xxx2;

Grant succeeded.

Daha sonra xxx2 USER-lə connect olub cədvəl yaradaq və məlumat daxil edək:

SQL> create table t2(x date);

Table created.
SQL> insert into t2(x) values((select sysdate from dual));

1 row created.

SQL> select * from t2;

X
---------
26-JAN-14

Həmçinin xxx user-lə connect olub daha əvvəl yaratdığımız cədvələ məlumat daxil edək:

SQL> connect xxx/12345
Connected.
SQL> insert into t1(x) values((select sysdate from dual));

1 row created.

SQL> select * from t1;

X
---------
26-JAN-14

xxx user ilə xxx2 user-in cədvəlinə sorğu göndərək. SYS-lə müvafiq GRANT verək:

SQL> grant select on xxx2.t2 to xxx;

Grant succeeded.

xxx-lə connect olaq və select verək:

SQL> select * from xxx2.t2;

X
---------
26-JAN-14

Gördüyümüz kimi Oracle-da 1 Database-də bir neçə SCHEMA olur. SCHEMA isə hər bir USER və onun objectləri deməkdir.

Burda da MySQL fərqlənir…MySQL-də DATABASE = SCHEMA. Dolayısı ilə sonsuz sayda USER sonsuz sayda DATABASE\SCHEMA-dakı müvafiq GRANT verməklə oxuya bilər. Yəni bir daha qeyd edirəm ki, USER-in object-ləri yoxdur MySQL-də. Database-lərdə yerləşir bütün məlumatlar və hər hansı USER digər DATABASE\SCHEMA-dan məlumat istəyirsə ona bunun privilige-i olmalıdır.

mysql> create user xxx2 identified by '12345';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on blog_database.* to xxx2;
Query OK, 0 rows affected (0.00 sec)

İndi isə hər 2 user-lə connect olaq və DATABASE\SCHEMA-dan nümunə cədvələ select verək:
xxx user ilə:

[root@localhost ~]# mysql -u xxx -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.6.15 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> insert into blog_test.t1 values((select curdate()));
Query OK, 1 row affected (0.09 sec)

mysql> select * from blog_test.t1;
+------------+
| x          |
+------------+
| 2014-01-26 |
+------------+
1 row in set (0.00 sec)

xxx2 useri ilə:

[root@localhost ~]# mysql -u xxx2 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.6.15 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select * from blog_test.t1;
+------------+
| x          |
+------------+
| 2014-01-26 |
+------------+
1 row in set (0.00 sec)

Gördüyümüz kimi 2 müxtəlif USER eyni SCHEMA-dan select etdi.
Ümumiləşdirsək:
MySQL-də DATABASE = SCHEMA
Oracle-da USER + objects = SCHEMA

Ümumi və əsas fərqlilikləri başa düşmək vacib məsələdir.
Bu yazıda sizlərlə , Oracle və MySQL-də DATABASE ,USER və SCHEMA anlayışlarına baxdıq.
Ümidvaram ki, faydalı oldu.

Təşəkkürlər 😉

SP2-1503: Unable to initialize Oracle call interface

Test server-də Oracle 10g-den 11g R2-yə upgrade etdikdən sonra aşağıdakı qəribə error gəldi:

[oracle@bsnew ~]$ sqlplus / as sysdba
SP2-1503: Unable to initialize Oracle call interface
SP2-0152: ORACLE may not be functioning properly

Uzun test-lərdən sonra aşağıdakı addımları etdikdən sonra problem həll olundu:

$ cd $ORACLE_HOME/oracore/zoneinfo
$ ln -s timezone_14.dat timezone.dat
$ ln -s timezlrg_14.dat timezlrg.dat

Daha sonra da .bash_profile-a aşağıdakıları əlavə etdim :

[oracle@bsnew ~]$ nano .bash_profile

PATH=$PATH:$HOME/bin
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH

[oracle@bsnew ~]$ source .bash_profile

Və sonda sınayaq:

[oracle@bsnew ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Wed Jan 22 10:18:39 2014

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


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

DEFERRED_SEGMENT_CREATION parameter in Oracle 11g R2

Yanvar 21, 2014 2 şərh

11g OCA Administrator kitabını oxuyarkən qarşıma çıxan və mənə maraqlı olan, həmçinin həllini Oracle User Group vasitəsilə tapdığım problemi blog post şəklində yazıram. Bəlkə kiməsə kömək olar nə vaxtsa.

Qrupdakı müzakirə linki: Discussion

Kitabdakı məsələ bundan ibarət idi ki,
Chapter 7 page 245-də Figure 7-2-de aşağıdakı addımları atmağımızı istəyir SYS user ilə:

SQL> create table sh.xxx(c1 date);

Table created.

Kitabın dediyinə əsasən, dba_extents-dən select verdikdə bizə extent və block-lar haqqında məlumat gələcək.
Lakin mənim Oracle 11g R2-imdə heç bir məlumat gəlmədi.

SQL> SELECT tablespace_name,
  2         file_id,
  3         extent_id,
  4         block_id,
  5         blocks,
  6         bytes
  7    FROM dba_extents
  8   WHERE owner = 'SH' AND segment_name = 'XXX';

no rows selected

Bir neçə sınaqdan sonra aşkar olundu ki,
Əgər cədvələ hər hansı məlumat insert etsək o zaman məlumat əldə edə bilirik:

SQL> insert into sh.xxx(c1) values((select sysdate from dual));

1 row created.

SQL> commit;

Commit complete.

SQL> select * from sh.xxx;

C1
---------
21-JAN-14

dba_extents-ə select-imizi təkrarlasaq görərik ki,

SQL> SELECT tablespace_name,
  2         file_id,
  3         extent_id,
  4         block_id,
  5         blocks,
  6         bytes
  7    FROM dba_extents
  8   WHERE owner = 'SH' AND segment_name = 'XXX';

TABLESPACE_NAME                   FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS
------------------------------ ---------- ---------- ---------- ----------
     BYTES
----------
USERS                                   4          0        600          8
     65536

Bu tip darvanışın əsl səbəbi Oracle 11g R2-də gətirilmiş new feature olan Deferred segment creation və yaxud DEFERRED_SEGMENT_CREATION parametridir.

Default olaraq bu parametrin qiyməti True-dur:

SQL> show parameter DEFERRED_SEGMENT_CREATION;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE

Parametrin qısa məntiqi Javid Hasanov -un izahında:

11.2 ye qeder sen obyekt yaratdıqda derhal həmin obyektə gələcək insertlər üçün bir-neçə segment ayrılırdı. Buda serverin disk resurslarını səmərəsiz istifadə etmək demək idi. 11.2 isə DEFERRED_SEGMENT_CREATION parametri ile bunu idarə etəmək imkanı yaradıblar.

Əlavə: Yəni, 11.2-də obyekt yaradıldıqda məhz deferred_segment_creation = TRUE olduğu üçün avtomatik olaraq segment yaradılmır, adından da göründüyü kimi ertələnir. Və yalnız object-də hər hansı məlumat olduğu zaman segment yaradılır.

Segment Creation-u Force etmək, yəni dərhal yaradılması məqsədilə siz ya deferred_segment_creation parametrini FALSE edirik ya da table creation zamanı segment creation immediate clause əlavə edirik.

Nümunə olaraq:

SQL> create table sh.xxx2(c1 date) segment creation immediate;

Table created.

SQL> SELECT tablespace_name,
  2         file_id,
  3         extent_id,
  4         block_id,
  5         blocks,
  6         bytes
  7    FROM dba_extents
  8   WHERE owner = 'SH' AND segment_name = 'XXX2';

TABLESPACE_NAME                   FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS
------------------------------ ---------- ---------- ---------- ----------
     BYTES
----------
USERS                                   4          0        608          8
     65536

New Feature-un ızahı bu qədər.
Təşəkkürlər 😉

ORA-00201:Control file version 11.2.0.3.0 incompatible with ORACLE version 10.2.0.1.0

Test server-də Oracle 10g-den 11g-ye upgrade etdikden sonra…Hər şey yolunda görünsə də:

[oracle@bsnew ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 14 11:32:55 2014

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


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

SQL>

Öyrənmək məqsədilə,

SQL> shutdown immediate

Daha sonra :

SQL> startup nomount
ORACLE instance started.

Total System Global Area  730714112 bytes
Fixed Size                  2231952 bytes
Variable Size             255852912 bytes
Database Buffers          465567744 bytes
Redo Buffers                7061504 bytes

Və öyrənməyi davam etmək istərkən:

SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-00201: control file version 11.2.0.3.0 incompatible with ORACLE version
10.2.0.1.0
ORA-00202: control file: '/opt/oracle/bs/oradata/BANKSYST/control01.ctl'

Bu error-u gördüm. Dolayısı ilə, database mount moda keçmədi.
Error-dan aydın olur ki, compatibility problemi var.
Bəzi məlumatları toplayaq..Control file-ların path-i:

SQL> show parameter control_file

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time        integer     7
control_files                        string      /opt/oracle/bs/oradata/BANKSYS
                                                 T/control01.ctl, /opt/oracle/b
                                                 s/oradata/BANKSYST/control02.c
                                                 tl, /opt/oracle/bs/oradata/BAN
                                                 KSYST/control03.ctl

Bizim database-in pfile və yaxud spfile-dan istifadə etdiyini tapmaq üçün:

SQL> show parameter pfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /opt/oracle11g/bs/dbs/spfileBA
                                                 NKSYST.ora

Bizim database spfile-dan istifadə edir.

Default olaraq spfile və pfile-lar yerləşir $ORACLE_HOME/dbs-də.

[oracle@bsnew dbs]$ ls
hc_BANKSYST.dat  initBANKSYST.ora  init.ora  lkBANKSYST  orapwBANKSYST  spfileBANKSYST.ora

Oracle naming qaydasına əsasən spfile adı olmalıdır: spfile+ORACLE_SID , həmçinin pfile+ORACLE_SID.

[oracle@bsnew dbs]$ echo $ORACLE_SID
BANKSYST

Spfile = spfileBANKSYST.ora Pfile = initBANKSYST.ora

Daha sonra onu qeyd etməliyik ki, Oracle NOMOUNT mərhələsində parameter faylını oxuyur, RAM-da SGA yaradılır və background proseslər start olunur.
proseslərə baxmaq üçün:

[oracle@bsnew dbs]$ ps -ef | grep BANKSYST
oracle   10801     1  0 11:49 ?        00:00:00 ora_pmon_BANKSYST
oracle   10803     1  0 11:49 ?        00:00:00 ora_psp0_BANKSYST
oracle   10805     1  0 11:49 ?        00:00:00 ora_vktm_BANKSYST
oracle   10809     1  0 11:49 ?        00:00:00 ora_gen0_BANKSYST
oracle   10811     1  0 11:49 ?        00:00:00 ora_diag_BANKSYST
oracle   10813     1  0 11:49 ?        00:00:00 ora_dbrm_BANKSYST
oracle   10815     1  0 11:49 ?        00:00:00 ora_dia0_BANKSYST
oracle   10817     1  0 11:49 ?        00:00:00 ora_mman_BANKSYST
oracle   10819     1  0 11:49 ?        00:00:00 ora_dbw0_BANKSYST
oracle   10821     1  0 11:49 ?        00:00:00 ora_lgwr_BANKSYST
oracle   10823     1  0 11:49 ?        00:00:00 ora_ckpt_BANKSYST
oracle   10825     1  0 11:49 ?        00:00:00 ora_smon_BANKSYST
oracle   10827     1  0 11:49 ?        00:00:00 ora_reco_BANKSYST
oracle   10829     1  0 11:49 ?        00:00:00 ora_mmon_BANKSYST
oracle   10831     1  0 11:49 ?        00:00:00 ora_mmnl_BANKSYST
oracle   10833     1  0 11:49 ?        00:00:00 ora_d000_BANKSYST
oracle   10835     1  0 11:49 ?        00:00:00 ora_s000_BANKSYST
oracle   10836  8146  0 11:49 ?        00:00:00 oracleBANKSYST (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

Məlumatları toplamağa davam edirik:

SQL> show parameter compatible

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      10.2.0.1.0

Son nəticəyə gəlirik ki, çox güman ki spfile daxilində compatible parametrinin dəyərini 10.2.0.1.0-dan 11.2.0.3.0-ə dəyişsək problem düzələcək.

spfile-ı birbaşa dəyişmək imkanımız olmadığı üçün:

SQL> create pfile from spfile;

File created.

Faylımıza gedirik:

[oracle@bsnew ~]$ cd $ORACLE_HOME/dbs
[oracle@bsnew dbs]$ ls
hc_BANKSYST.dat  initBANKSYST.ora  init.ora  lkBANKSYST  orapwBANKSYST  spfileBANKSYST.ora

Onun içinə baxırıq:

[oracle@bsnew dbs]$ nano initBANKSYST.ora

BANKSYST.__db_cache_size=465567744
BANKSYST.__java_pool_size=41943040
BANKSYST.__large_pool_size=4194304
BANKSYST.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment
BANKSYST.__pga_aggregate_target=1035993088
BANKSYST.__sga_target=734003200
BANKSYST.__shared_io_pool_size=0
BANKSYST.__shared_pool_size=209715200
BANKSYST.__streams_pool_size=0
*.audit_file_dest='/opt/oracle/admin/BANKSYST/adump'
*.compatible='10.2.0.1.0'
*.control_files='/opt/oracle/bs/oradata/BANKSYST/control01.ctl','/opt/oracle/bs/oradata/BANKSYST/control02.ctl','/opt/oracle/bs/oradata/BANKSYST/control03.ctl'
*.core_dump_dest='/opt/oracle/admin/BANKSYST/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=8
*.db_name='BANKSYST'
*.db_recovery_file_dest_size=2147483648
*.db_recovery_file_dest='/opt/oracle/flash_recovery_area'
*.diagnostic_dest='/opt/oracle11g'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=BANKSYSTXDB)'
*.event=''
*.job_queue_processes=10
*.open_cursors=300
*.pga_aggregate_target=1033895936
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=734003200
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS2'
*.utl_file_dir='/bslog'

Dərhal görürük ki, *.compatible=’10.2.0.1.0′ və bu dəyəri dəyişirik: *.compatible=’11.2.0.3.0′

Pfile-dakı dəyişikliyi save etdikdən sonra bu pfile-dan spfile yaratmağa çalışaq:

SQL> create spfile from pfile;
create spfile from pfile
*
ERROR at line 1:
ORA-32002: cannot create SPFILE already being used by the instance

Məhz buna görə SHUTDOWN edirik:

SQL> shutdown immediate
ORA-01507: database not mounted


ORACLE instance shut down.

Daha sonra spfile-ı yaradaq:

SQL> create spfile from pfile;

File created.

Teorik olaraq indi bizim database mount olmalıdır:

SQL> startup nomount;
ORACLE instance started.

Total System Global Area  730714112 bytes
Fixed Size                  2231952 bytes
Variable Size             255852912 bytes
Database Buffers          465567744 bytes
Redo Buffers                7061504 bytes
SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

Bəli həm mount oldu, həm də open.
Qarşımıza çıxan problemi həll etmiş olduq.

Dəhşətli nəticəyə DBA yardımı olmadan gələ bilmədim. Yardımlarından dolayı Elgün Mikayılov-a təşəkkür edirəm.