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…
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
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.