Əsas səhifə > MySQL, MySQL administration, Oracle, Oracle Administration > General Difference Oracle vs. MySQL (part 1) : USER\SCHEMA\DATABASE

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😉

  1. Hələlik heç bir şərh yoxdur
  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: