Archive

Archive for the ‘Oracle’ Category

Use Oracle 12c Preinstall RPM with CentOS 6.5

Oracle-ın Linux üzərinə install-ı zamanı, bəzi pre-install addımlar atılmalıdır ki, burda yeni başlayanlara bəzən çətinlik yaradır.
Bu prosesi sadələşdirmək məqsədilə, Oracle 12cR1 üçün preinstall paketini təqdim edir.
Paketin adı: oracle-rdbms-server-12cR1-preinstall
Lakin bu paket yalnız, Oracle Public Yum Repo-da mövcuddur. Sözsüz ki, repo-ni aktivləşdirmək çox sadədir. Problem isə daha ciddidir, bu pre-install paketi dependency error verir (CentOS,Scientific Linux, Red Hat). Daha dəqiq desək Oracle Linux Kernel teleb edir(UEK).
Sınayaq:

Installing:
 oracle-rdbms-server-12cR1-preinstall    x86_64    1.0-8.el6                  /oracle-rdbms-server-12cR1-preinstall-1.0-8.el6.x86_64     37 k
Installing for dependencies:
 compat-libcap1                          x86_64    1.10-1                     base                                                       17 k
 compat-libstdc++-33                     x86_64    3.2.3-69.el6               base                                                      183 k
 kernel-uek                              x86_64    2.6.39-400.215.7.el6uek    ol6_UEK_latest                                             28 M
 kernel-uek-firmware                     noarch    2.6.39-400.215.7.el6uek    ol6_UEK_latest                                            3.7 M
 ksh                                     x86_64    20120801-10.el6_5.9        ol6_latest                                                757 k
 libaio-devel                            x86_64    0.3.107-10.el6             base                                                       13 k
 sysstat                                 x86_64    9.0.4-22.el6_5.1           ol6_latest                                                230 k

Bəli gördüyümüz kimi, kernel-uekkernel-uek-firmware
dependency tələb edir.
Sözsüz ki, 1 distro-da müxtəlif fərqli vendor-dan kernel olmamalıdır.
Nəticə etibarı ilə, biz bu pre-install RPM paketi CentOS-a qurmaq üçün, RPM-i yenidən rebuild etməli, bu əsnada isə UEK dependency-ni silməliyik.

Bütün addımlar aşağıdakı kimidir:

1. Install rpmbuild and related packages

[root@linuxsrv1 ~]#yum install rpm-build rpmdevtools

2. Bütün rebuild işlərini görmək üçün, tets user yaradaq

[root@linuxsrv1 ~]# useradd tester -p tester -m -s /bin/bash
[root@linuxsrv1 ~]# su - tester

3. Oracle pre-install source paketlərini əldə edirik

[tester@linuxsrv1 ~]$ wget http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/getPackageSource/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm
Saving to: “oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm”

100%[====================================================================================================>] 14,075      --.-K/s   in 0.06s   

2014-09-09 22:37:33 (241 KB/s) - “oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm” saved [14075/14075]

4. RPMTREE yaradırıq:

[tester@linuxsrv1 ~]$ rpmdev-setuptree
[tester@linuxsrv1 ~]$ ls -l
total 20
-rw-rw-r--. 1 tester tester 14075 Nov 21  2013 oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm
drwxrwxr-x. 8 tester tester  4096 Sep  9 22:40 rpmbuild
[tester@linuxsrv1 rpmbuild]$ ls -l
total 24
drwxrwxr-x. 3 tester tester 4096 Sep  9 22:40 BUILD
drwxr-xr-x. 2 tester tester 4096 Sep  9 22:40 BUILDROOT
drwxrwxr-x. 3 tester tester 4096 Sep  9 22:40 RPMS
drwxrwxr-x. 2 tester tester 4096 Sep  9 22:38 SOURCES
drwxrwxr-x. 2 tester tester 4096 Sep  9 22:38 SPECS
drwxrwxr-x. 2 tester tester 4096 Sep  9 22:40 SRPMS

5. src.rpm paketini test user ilə install edirik:

[tester@linuxsrv1 ~]$ rpm -ivh oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm
warning: oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
   1:oracle-rdbms-server-12c########################################### [100%]

6. Dependency hissəsində dəyişiklik edirik:

[tester@linuxsrv1 ~]$ nano rpmbuild/SPECS/oracle-rdbms-server-12cR1-preinstall.spec
#System requirement
Requires:procps module-init-tools ethtool initscripts
Requires:bc bind-utils nfs-utils util-linux-ng pam
Requires:xorg-x11-utils xorg-x11-xauth
#Requires:kernel-uek
Requires:smartmontools

7. Yeni SPEC fayldan RPM-i rebuild edirik:

[tester@linuxsrv1 rpmbuild]$ rpmbuild -ba SPECS/oracle-rdbms-server-12cR1-preinstall.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.iYRCvZ
+ umask 022
+ cd /home/tester/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ echo RPM_BUILD_ROOT=/home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
RPM_BUILD_ROOT=/home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
+ cd /home/tester/rpmbuild/BUILD
+ rm -rf oracle-rdbms-server-12cR1-preinstall-1.0
+ /bin/tar -xf -
+ /usr/bin/gzip -dc /home/tester/rpmbuild/SOURCES/oracle-rdbms-server-12cR1-preinstall-1.0.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd oracle-rdbms-server-12cR1-preinstall-1.0
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.kajs7z
+ umask 022
+ cd /home/tester/rpmbuild/BUILD
+ cd oracle-rdbms-server-12cR1-preinstall-1.0
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.yw8fMa
+ umask 022
+ cd /home/tester/rpmbuild/BUILD
+ '[' /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64 '!=' / ']'
+ rm -rf /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
++ dirname /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
+ mkdir -p /home/tester/rpmbuild/BUILDROOT
+ mkdir /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
+ cd oracle-rdbms-server-12cR1-preinstall-1.0
+ LANG=C
+ export LANG
+ unset DISPLAY
+ rm -rf /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
+ mkdir -p -m 755 /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/sysconfig/oracle-rdbms-server-12cR1-preinstall
+ mkdir -p -m 755 /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/usr/bin
+ mkdir -p -m 755 /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/rc.d/init.d
+ mkdir -p -m 755 /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/security/limits.d
+ mkdir -p -m 700 /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/var/log/oracle-rdbms-server-12cR1-preinstall/results
+ install -m 700 oracle-rdbms-server-12cR1-preinstall-verify /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/sysconfig/oracle-rdbms-server-12cR1-preinstall
+ install -m 700 oracle-rdbms-server-12cR1-preinstall-verify /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/usr/bin
+ install -m 600 oracle-rdbms-server-12cR1-preinstall.param /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/sysconfig/oracle-rdbms-server-12cR1-preinstall
+ install -m 700 oracle-rdbms-server-12cR1-preinstall-firstboot /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/rc.d/init.d
+ touch /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/security/limits.d/oracle-rdbms-server-12cR1-preinstall.conf
+ ln -f -s /etc/sysconfig/oracle-rdbms-server-12cR1-preinstall/oracle-rdbms-server-12cR1-preinstall-verify /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/usr/bin/oracle-rdbms-server-12cR1-preinstall-verify
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id /home/tester/rpmbuild/BUILD/oracle-rdbms-server-12cR1-preinstall-1.0
+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-python-bytecompile
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
warning: File listed twice: /etc/sysconfig/oracle-rdbms-server-12cR1-preinstall/oracle-rdbms-server-12cR1-preinstall-verify
warning: File listed twice: /etc/sysconfig/oracle-rdbms-server-12cR1-preinstall/oracle-rdbms-server-12cR1-preinstall.param
Provides: config(oracle-rdbms-server-12cR1-preinstall) = 1.0-11.el6 oracle-rdbms-server-12cR1-preinstall = 1.0
Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(VersionedDependencies) <= 3.0.3-1
Requires(pre): /bin/sh /etc/redhat-release
Requires(post): /bin/sh
Requires(preun): /bin/sh
Requires(postun): /bin/sh
Requires: /bin/bash
Processing files: oracle-rdbms-server-12cR1-preinstall-debuginfo-1.0-11.el6.x86_64
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
warning: Could not canonicalize hostname: linuxsrv1
Wrote: /home/tester/rpmbuild/SRPMS/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm
Wrote: /home/tester/rpmbuild/RPMS/x86_64/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64.rpm
Wrote: /home/tester/rpmbuild/RPMS/x86_64/oracle-rdbms-server-12cR1-preinstall-debuginfo-1.0-11.el6.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.7RHWGH
+ umask 022
+ cd /home/tester/rpmbuild/BUILD
+ cd oracle-rdbms-server-12cR1-preinstall-1.0
+ rm -rf /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
+ exit 0

8. Yeni yaradılmış RPM paketi install edək:

[tester@linuxsrv1 ~]$ cd rpmbuild/RPMS/x86_64/
[tester@linuxsrv1 x86_64]$ ls -l
total 20
-rw-rw-r--. 1 tester tester 15220 Sep  9 22:40 oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64.rpm
-rw-rw-r--. 1 tester tester  3424 Sep  9 22:40 oracle-rdbms-server-12cR1-preinstall-debuginfo-1.0-11.el6.x86_64.rpm
[tester@linuxsrv1 x86_64]$ su -
Password: 
[root@linuxsrv1 ~]# yum localinstall /home/tester/rpmbuild/RPMS/x86_64/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64.rpm
Dependencies Resolved

==============================================================================================================================================
 Package                                 Arch      Version                   Repository                                                  Size
==============================================================================================================================================
Installing:
 oracle-rdbms-server-12cR1-preinstall    x86_64    1.0-11.el6                /oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64     38 k
Installing for dependencies:
 compat-libcap1                          x86_64    1.10-1                    base                                                        17 k
 compat-libstdc++-33                     x86_64    3.2.3-69.el6              base                                                       183 k
 ksh                                     x86_64    20120801-10.el6_5.9       updates                                                    757 k
 libaio-devel                            x86_64    0.3.107-10.el6            base                                                        13 k
 sysstat                                 x86_64    9.0.4-22.el6_5.1          updates                                                    230 k

9. Uğurla install edirik

Installed:
  oracle-rdbms-server-12cR1-preinstall.x86_64 0:1.0-11.el6                                                                                    

Dependency Installed:
  compat-libcap1.x86_64 0:1.10-1                compat-libstdc++-33.x86_64 0:3.2.3-69.el6          ksh.x86_64 0:20120801-10.el6_5.9         
  libaio-devel.x86_64 0:0.3.107-10.el6          sysstat.x86_64 0:9.0.4-22.el6_5.1                 

Complete!

10.Uğurlu installdan sonra görürük ki, əvvəllər manual olaraq etdiyimiz bütün addımlar indi avtomatik olaraq yerinə yetirilmişdir:

[root@linuxsrv1 ~]# cat /etc/group | grep oracle
dba:x:54322:oracle
[root@linuxsrv1 ~]# cat /etc/group | grep oinstall
oinstall:x:54321:

[root@linuxsrv1 ~]# cat /etc/sysctl.conf | grep oracle
# oracle-rdbms-server-12cR1-preinstall setting for fs.file-max is 6815744
# oracle-rdbms-server-12cR1-preinstall setting for kernel.sem is '250 32000 100 128'
# oracle-rdbms-server-12cR1-preinstall setting for kernel.shmmni is 4096
# oracle-rdbms-server-12cR1-preinstall setting for kernel.shmall is 1073741824 on x86_64
# oracle-rdbms-server-12cR1-preinstall setting for kernel.shmmax is 4398046511104 on x86_64
# oracle-rdbms-server-12cR1-preinstall setting for net.core.rmem_default is 262144
# oracle-rdbms-server-12cR1-preinstall setting for net.core.rmem_max is 4194304
# oracle-rdbms-server-12cR1-preinstall setting for net.core.wmem_default is 262144
# oracle-rdbms-server-12cR1-preinstall setting for net.core.wmem_max is 1048576
# oracle-rdbms-server-12cR1-preinstall setting for fs.aio-max-nr is 1048576
# oracle-rdbms-server-12cR1-preinstall setting for net.ipv4.ip_local_port_range is 9000 65500

Artıq hazırladığım paketi aşağıdakı linkdən yükləyə bilərsiniz:

12c Preinstall RPM for CentOS

Təşəkkürlər.

File “cx_Oracle.pyc”, line 10, in __load importError: No module named decimal

Python ilə Tkinter vasitəsilə tez bir şəkildə simple Oracle password changer yazmaq lazım oldu.
Həmçinin bu .py faylı .exe-yə convert edib user-ə təqdim etmək lazım idi.
Source Kodları tapa bilərsiniz:

Password Changer GitHUB

Repo-da həm bizim əsl GUİ kodları həmçinin də setup.py faylı var ki, biz onun vasitəsilə .exe yaradırıq.
Lakin py2exe-ni çalışdırdıqda mövzunun adında olduğu kimi cx_ORACLE error verir.

Qeyd edim ki, cx_ORACLE Python və Oracle arasında əlaqə yaradan library-dir.
Uzun axtarışdan sonra aşkarladım ki,
Aşağıdakı şərti setup.py faylına yazdıqda problem həll olur. Bunu tapmaq mənim 1 saatımı apardı lakin sizlər daha bu qədər vaxt itirməyin:

opts={“py2exe” : {“dll_excludes”: [“OCI.dll”,], “includes” : [“decimal”, ]}

Setup.py faylında artıq qeyd olunub.
Kiçik GUİ-dən print screen:

password_changer

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.