Arxiv

Archive for İ

Installing MySQL 5.6 on CentOS 6.4 using YUM

Bildiyimiz kimi EL-6 Linux-lar üçün MySQL official repo yox idi.
Hər OS özü MySQL-i build edirdi və öz native repo-sunda yerləşdirirdi.
Lakin Oracle Official YUM repo-nu təqdim edib.
Biz də onu indi sizlərlə test edəcik.

İlk öncə rəsmi repo-nu əlavə etməliyik. Bu məqsədlə repo faylını downlaod edirik:

Download

Daha sonra onu install edirik:

[root@localhost Downloads]# yum localinstall mysql-community-release-el6-3.noarch.rpm
.
.
.
  Installing : mysql-community-release-el6-3.noarch                         1/1 
  Verifying  : mysql-community-release-el6-3.noarch                         1/1 

Installed:
  mysql-community-release.noarch 0:el6-3                                        

Complete!

Enable olduğunu test edirik:

[root@localhost ~]# yum repolist enabled | grep "mysql-community"
mysql-community                  MySQL Community Server                      18

MySQL-in install-ına keçməmişdən əvvəl mütləq şəkildə köhnə mysql-libs paketini silmək lazımdır:

[root@localhost ~]# yum remove mysql-libs
Loaded plugins: fastestmirror, refresh-packagekit, security
Setting up Remove Process
.
.
.
Removed:
  mysql-libs.x86_64 0:5.1.69-1.el6_4                                            

Dependency Removed:
  cronie.x86_64 0:1.4.4-7.el6                                                   
  cronie-anacron.x86_64 0:1.4.4-7.el6                                           
  crontabs.noarch 0:1.10-33.el6                                                 
  postfix.x86_64 2:2.6.6-2.2.el6_1                                              
  redhat-lsb-core.x86_64 0:4.0-7.el6.centos                                     
  redhat-lsb-graphics.x86_64 0:4.0-7.el6.centos                                 
  redhat-lsb-printing.x86_64 0:4.0-7.el6.centos                                 
  sysstat.x86_64 0:9.0.4-20.el6                                                 

Complete!

Və MySQL-in ən son versiyası olan 5.6.14-ü install edirik:

[root@localhost ~]# yum install mysql-server
.
.
Installed:
  mysql-community-server.x86_64 0:5.6.14-3.el6                                  

Dependency Installed:
  mysql-community-client.x86_64 0:5.6.14-3.el6                                  
  mysql-community-common.x86_64 0:5.6.14-3.el6                                  
  mysql-community-libs.x86_64 0:5.6.14-3.el6                                    

Complete!

MySQL-i start edirik:

[root@localhost ~]# service mysqld start
Initializing MySQL database:  2013-10-28 20:39:24 0 
.
.
                                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

Və ən sonda production server-lərdə istifadəsi məsləhət görülən mysql_secure_installation scriptini çalışdırırıq.

[root@localhost ~]# /usr/bin/mysql_secure_installation
.
.
All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

Və 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 13
Server version: 5.6.14 MySQL Community Server (GPL)

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

Çox sadə yolla artıq həm də MySQL-i update etmək olacaq.
Təşəkkürlər 😉

Exploring JOINs in MySQL and Oracle(part2 OUTER JOIN)

Bugün hər iki DB-də Outer Join-lərə baxırıq.

xatırladaq ki bizim nümunə cədvəllər daha əvvəlki yazımızda var
pure-natural-join

İndi isə testlərimizə başlayaq.Left Join

-- Oracle

-- Left Join
-- 2 syntax 2si də doğrudur:

-- *
select * from t2 left join t1 using(name_id);

-- *
select * from t2 left outer join t1 using(name_id);

-- MySQL

-- Left Join

-- *
select * from t2 left outer join t1 using(name_id);

-- *
select * from t2 left join t1 using(name_id);

İkinci olaraq Right Join:

-- Oracle
-- Right Join

-- *
select * from t1 right join t2 using(name_id);

-- *
select * from t1 right outer join t2 using(name_id)

-- MySQL
-- Right Join 

-- *
select * from t1 right join t2 using(name_id);

-- *
select * from t1 right outer join t2 using(name_id);

Output-lara diqqətlə nəzər salsaq görərik ki, Oracle Join-li sorğumuzda hansı sıra ilə yazdığımıza diqqət yetirir və result-ı ona uyğun qaytarır.
MySQL isə Join-in hansı cədvələ uyğun olduğuna əsasən result qaytarır.

Indi isə Outer Join:
Full outer join — bir növü left join + right join-dir. Bunu daha aydın göstərmək üçün gəlin t1 cədvəlinə yeni məlumatlar əlavə edək:

-- Oracle 

insert into t1(id1, name1, name_id) values(10,'elvin',12);
insert into t1(id1, name1, name_id) values(11,'ehmed',13);
insert into t1(id1, name1, name_id) values(12,'ziya',14);

-- Full outer join

-- *
select * from t1 full join t2 using(name_id);

-- *
select * from t1 full outer join t2 using(name_id);

Və möcüzəli şəkildə aşkarlayırıq ki, MySQL-də FULL JOİN = İNNER JOİN, FULL OUTER JOİN isə yoxdur.

-- MySQL

-- Full Join = İnner Join

select * from t1 full join t2 using(name_id);

select * from t1 inner join t2 using(name_id);


Bonus:
Cartesioan Product generation

-- Oracle

-- Cross Join

select * from t1 cross join t2;

-- MySQL

-- Cross Join

select * from t1 cross join t2;

Təşəkkürlər 😉

Exploring JOINs in MySQL and Oracle(part1 PURE NATURAL JOIN)

Bu və ardıcıl yazılarda JOIN-lərə baxacıq. MySQL və Oracle-da JOİN-ləri araşdıracıq.
Birinci yazı həsr olunur PURE NATURAL JOİN-e
Oracle üçün Mənbə : Oracle 11g SQL Fundamentals Chapter 7

Oracle üçün nümunə cədvəl və məlumatlar:

create table t1(
id1 number,
name1 varchar2(25),
name_id number
);

create table t2(
id2 number,
name2 varchar(25),
name_id number
);

insert into t2(id2,name2,name_id) values(1,'farid',1);
insert into t2(id2,name2,name_id) values(2,'arif',2);
insert into t2(id2,name2,name_id) values(3,'zulfugar',3);
insert into t2(id2,name2,name_id) values(4,'xxx',4);
insert into t2(id2,name2,name_id) values(5,'yyy',5);
insert into t2(id2,name2,name_id) values(6,'zzz',6);

insert into t1(id1,name1,name_id) values(1,'shahriyar',1);
insert into t1(id1,name1,name_id) values(2,'orxan',2);
insert into t1(id1,name1,name_id) values(3,'elvin',3);

MySQL üçün nümunə cədvəl və məlumatlar:

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) DEFAULT NULL,
  `name_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

CREATE TABLE `t2` (
  `id2` int(11) NOT NULL AUTO_INCREMENT,
  `name2` varchar(25) DEFAULT NULL,
  `name_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id2`)
)

insert into t1(name,name_id) values('shahriyar',1),('orxan',2),('elvin',3);

insert into t2(name2,name_id) values('farid',1),('arif',2),('zulfugar',3);
insert into t2(name2,name_id) values('xxx',4);
insert into t2(name2,name_id) values('yyy',5);
insert into t2(name2,name_id) values('zzz',6);

The NATURAL JOİN clause:

Hər iki RDBMS-dəki cədvəllərdəki məlumatlar aşağıdakı kimidir:

MariaDB [join_test]> select * from t2;
+-----+----------+---------+
| id2 | name2    | name_id |
+-----+----------+---------+
|   1 | farid    |       1 |
|   2 | arif     |       2 |
|   3 | zulfugar |       3 |
|  10 | xxx      |       4 |
|  11 | yyy      |       5 |
|  12 | zzz      |       6 |
+-----+----------+---------+
6 rows in set (0.00 sec)

MariaDB [join_test]> select * from t1;
+----+-----------+---------+
| id | name      | name_id |
+----+-----------+---------+
|  1 | shahriyar |       1 |
|  2 | orxan     |       2 |
|  3 | elvin     |       3 |
+----+-----------+---------+
3 rows in set (0.00 sec)

Oracle 11g SQL Fundamentals kitabından page 319-dakı query-ləri sınayaq:

-- Oracle

select * from t1 natural join t2;
>>>
+---------+----+-----------+-----+----------+
| NAME_İD |İD1 | NAME1     | İD2 | NAME2    |
+---------+----+-----------+-----+----------+
|       1 |  1 | shahriyar |   1 | farid    |
|       2 |  2 | orxan     |   2 | arif     |
|       3 |  3 | elvin     |   3 | zulfugar |
+---------+----+-----------+-----+----------+

-- MySQL

MariaDB [join_test]> select * from t1 natural join t2;
+---------+----+-----------+-----+----------+
| name_id | id | name      | id2 | name2    |
+---------+----+-----------+-----+----------+
|       1 |  1 | shahriyar |   1 | farid    |
|       2 |  2 | orxan     |   2 | arif     |
|       3 |  3 | elvin     |   3 | zulfugar |
+---------+----+-----------+-----+----------+
3 rows in set (0.01 sec)

Eyni nəticə çıxdı.
Davam edək:

-- Oracle

select * from t1,t2
where t1.name_id = t2.name_id;
>>>

+----+-----------+---------+-----+----------+---------+
|İD1 | NAME1     | NAME_İD | İD2 | NAME2    | NAME_İD_1
+----+-----------+---------+-----+----------+---------+
|  1 | shahriyar |       1 |   1 | farid    |       1 |
|  2 | orxan     |       2 |   2 | arif     |       2 |
|  3 | elvin     |       3 |   3 | zulfugar |       3 |
+----+-----------+---------+-----+----------+---------+

-- MySQL

MariaDB [join_test]> select * from t1,t2
     where t1.name_id = t2.name_id;
+----+-----------+---------+-----+----------+---------+
| id | name      | name_id | id2 | name2    | name_id |
+----+-----------+---------+-----+----------+---------+
|  1 | shahriyar |       1 |   1 | farid    |       1 |
|  2 | orxan     |       2 |   2 | arif     |       2 |
|  3 | elvin     |       3 |   3 | zulfugar |       3 |
+----+-----------+---------+-----+----------+---------+
3 rows in set (0.00 sec)

Gördüyümüz kimi Syntax eynidir və nəticələr də eynidir.

NATURAL join üçün maraqlı məqamlardan biri,
Əgər natural join şərti zamanı eyni adlı column-lar tapılmazsa o zaman Cartesian join result geri dönəcək:

-- Oracle

-- Nümunə cədvəlimizi yaradaq

create table t3(
id3 number,
name3 varchar2(25),
name_id1 number
);

insert into t3 select * from t2;

Gördüyümüz kimi bu cədvəldə t1 və t2 (yuxarıdakı cədvəllər) ilə eyni adlı column yoxdur.
Və az əvvəl söylədiyimiz iddiani test edək:

select * from t2 natural join t3;
>>> 
.
.
36 rows

Niyə məhz 36?

select count(*) from t2;
>>> 6

select count(*) from t3;
>>> 6

Cartesian Join zamanı isə bildiyimiz kimi t2xt3 qədər row qayıtmalıdır və 6×6=36.
Eyni hal MySQL üçün də geçərlidir:

create table t3(
id3 int not null auto_increment,
name3 varchar(25),
name_id1 int,
primary key(id3)
);

MariaDB [join_test]> insert into t3 select * from t2;
Query OK, 6 rows affected (0.04 sec)
Records: 6  Duplicates: 0  Warnings: 0

MariaDB [join_test]> select * from t3 natural join t2;

.
.
36 rows in set (0.00 sec)

Dolayısı ilə hər 2 RDBMS üçün column match-i tapmayan natural join, Cartesian join result qaytarır və bu aşağıdakı sorğuya bərabərdir:

-- Oracle

select * from t2,t3;
>>> 
36 rows fetched

-- MySQL

select * from t2,t3;
>>>
36 rows in set (0.00 sec)

Ən sonda hər iki RDBMS-də NATURAL LEFT JOİN və NATURAL RİGHT JOİN-ə baxaq.
Xatırladıram ki t1 və t2 cədvəlində aşağıdakı məlumatlar var:
t1:

t2:

-- Oracle
-- NATURAL LEFT JOİN

select * from t1 natural left join t2;

-- Oracle
-- NATURAL RIGHT JOİN

select * from t1 natural right join t2;

Nəticə MySQL-də də eynidir. Fərq yalnız ondadır ki,
MySQL right join-dirsə adına uyğun ilk öncə sağdakı cədvəldən məlumatları sıralayır.

-- MySQL
-- NATURAL LEFT JOİN

select * from t1 natural left join t2;

-- MySQL
-- NATURAL RIGHT JOİN

select * from t1 natural right join t2;

NATURAL JOİN haqqında bu qədər..
Təşəkkürlər 😉

Insert procedure with incremental session variable

Bu MySQL prosedur daxilinde biz 1 сədvəldən cursor vasitəsilə məlumatı çəkib digər bir cədvələ session variable increment etməklə insert edirik.
Şəxsi task-ım olan bu prosedur kodunu paylaşıram:

DELIMITER $$
 
CREATE  PROCEDURE insert_it()
BEGIN
    declare var_match int;
	declare v_last_row_fetched int default 0;
	
     
    declare cursor1 cursor for
    select id from wd_matches;
 
    declare continue handler for not found set v_last_row_fetched=1;
 
    set v_last_row_fetched=0;
    open cursor1;
    cursor_loop: loop
    fetch cursor1 into var_match;
            if v_last_row_fetched=1 then
                    leave cursor_loop;
            end if;
			
			set @matcher = var_match;
			set @counter=0;

			inserting: loop
				if @counter > 17 then
					leave inserting;
				end if;

				set @counter = @counter+1;
				
				insert into wd_squads(`match`,player,ord,`status`) values(@matcher,0,@counter,'0');
				
			end loop inserting;
    end loop cursor_loop;
    close cursor1;
    set v_last_row_fetched=0;
end $$

Təşəkkürlər 😉

Kateqoriyalar: My Stored Routines

MySQL’s Group by vs. Oracle’s Group by

Group by məntiqini yəqin ki hər kəs bilir. Fundamental SQL-ə daxildir.
MySQL-in default Group by behave-inə Oracle-ın default-u ilə birlikdə baxacıq.
Ən sonda da MySQL-in Oracle-a (Oracle like MySQL) oxşar şəkildə işlədilməsinə baxacıq.

İLk öncə default sql_mode ilə çalışan MySQL server-ə baxaq:

mysql> select @@global.sql_mode;
+------------------------+
| @@global.sql_mode      |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)

Və çox maraqlı bir sorğu ))

-- MySQL
select * from employees group by DEPARTMENT_ID;

Möcüzəli şəkildə görürük ki, normal qaydada result gəldi.
indiki halda sorğumuz hər DEPARTMENT_ID-yə aid 1-ci EMPLOYEE_İD-li işçiləri çıxardır.
Oracle üçün eyni sorğu:

-- Oracle
select * from employees group by department_id;
>>> ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"

Əlbəttə bu belə də olmalı idi ))

Davam edək. İkinci sorğumuz da eyni dərəcədə məntiqsizdir necə deyərlər:

-- MySQL
mysql> select department_id, salary from employees group by department_id;
+---------------+--------+
| department_id | salary |
+---------------+--------+
|             1 |  89949 |
|             2 |  99178 |
|             3 |  53465 |
|             4 |  42566 |
|             5 |  57778 |
|             6 |  80147 |
|             7 |  69412 |
.
.

Yenə default MySQL-də result gəlir. Burda da group by şərtimizə uyğun olaraq hər department_id-yə uyğun 1-ci salary qayıdır.

-- Oracle
select department_id, salary from employees group by department_id;
>>> ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"

Belə tip ERROR-ların gəlməsi bizi daha düzgün sorğu məntiqi qurmağa məcbur edir. Bu çox gözəldir.

Davam edək və daha bir sorğuya baxaq.

-- MySQL

mysql> select DEPARTMENT_ID,employee_id, sum(salary) from employees group by DEPARTMENT_ID;
+---------------+-------------+-------------+
| DEPARTMENT_ID | employee_id | sum(salary) |
+---------------+-------------+-------------+
|             1 |           2 |     3696222 |
|             2 |          53 |     6434950 |
|             3 |          16 |     6802927 |
|             4 |          35 |     7087003 |
|             5 |          20 |     7663093 |
|             6 |           6 |     7987810 |

Gördüyümüz kimi employee_id yuxarıdakı qaydaya uyğun olaraq yenə, department_id-yə uyğun olaraq birincilər gəldi. salary sum() isə düzgün olaraq hesablandı.

Eyni sorğu Oracle-da:

-- Oracle

select DEPARTMENT_ID,employee_id, sum(salary) from employees group by DEPARTMENT_ID;
>>> ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"

Yenidən Oracle bizə ERROR çıxartdır. Çox gözəl.

Eyni sorğu üzərindən employee_id-ni də group by-a salaq.

-- MySQL
mysql> select DEPARTMENT_ID,employee_id, sum(salary) from employees group by DEPARTMENT_ID,employee_id order by DEPARTMENT_ID;
+---------------+-------------+--------+
| DEPARTMENT_ID | employee_id | salary |
+---------------+-------------+--------+
|             1 |           2 |  89949 |
|             1 |          10 |  86809 |
|             1 |          15 |  63270 |
|             1 |          21 |  98654 |
|             1 |          81 |  63036 |
|             1 |         106 |  41379 |
|             1 |         109 |  93638 |
|             1 |         178 |  44590 |
|             1 |         211 |  48328 |
|             1 |         242 |  91293 |


-- Oracle
select DEPARTMENT_ID, employee_id, sum(salary) from employees group by DEPARTMENT_ID, employee_id order by department_id;
>>>
DEPARTMENT_İD     EMPLOYEE_İD     SUM(SALARY)
10	          200	          4400
20	          201 	          13000
20	          202	          6000
30	          114	          11000
30	          115	          3100
30	          116	          2900
30	          117	          2800

Eyni nəticəni çıxartdılar. Hər bir departamenti ayrıca sıralamaqla hər bi işçinin salary-sini ayrı-ayrı çıxadır. Dolayısı ilə burda SUM məntiqsizlik üzündən öz qüvvəsini itirir.
Hər bir departamantə uyğun hər bir işçinin maaşının cəmini tapmaq olmur 😉

NƏTİCƏ:
MySQL-dən əgər default konfiqurasiyalı istifadə edəciksə hər bir yazdığımız sorğunu dəfələrlə test etməli, ən azından group by məntiqini düzgün qurmalıyıq.
Oracle-da isə düzgün yazmasanız onszu da ERROR çıxacaq. Təbrik edəcək ))

MySQL-i məhz bu GROUP BY halında Oracle-a bənzər şəkildə ERROR-lar verib bizi xəbərdar etməsini necə təmin edə bilərik.
Bunun üçün MySQL SQL_MODE-da dəyişiklik etməliyik.
my.cnf faylına aşağıdakı sətri [mysqld] kataloqu altında qeyd edirik:

sql_mode = ONLY_FULL_GROUP_BY

MySQL-ə restart veririk.
Indi isə əvvəl düzgün işləyən hər sorğunu sınayaq:

-- 1
mysql> select * from employees group by department_id;
ERROR 1055 (42000): 'mysqlspp.employees.EMPLOYEE_ID' isn't in GROUP BY

-- 2
mysql> select department_id, salary from employees group by department_id;
ERROR 1055 (42000): 'mysqlspp.employees.SALARY' isn't in GROUP BY

-- 3
mysql> select DEPARTMENT_ID,employee_id, sum(salary) from employees group by DEPARTMENT_ID;
ERROR 1055 (42000): 'mysqlspp.employees.EMPLOYEE_ID' isn't in GROUP BY

Gördüyümüz kimi daha əvvəl düzgün işləyən sorğular indi ERROR verir.
Bu şəkildə etməklə biz MySQL-in daha strict şəkildə Oracle kimi çalışmasını təmin etmiş oluruq.

* ƏLAVƏ *
Having-i də test edib bura yazmağa qərar verdim.
sql_mode = ” etdikdən sonra
Bərabər şəkildə düzgün işləyən sorğular:

-- Oracle

select DEPARTMENT_ID,
avg(salary),
count(*)
from employees
group by DEPARTMENT_ID
having avg(salary) > 10000;

-- MySQL

select DEPARTMENT_ID,
avg(salary),
count(*)
from employees
group by DEPARTMENT_ID
having avg(salary) > 70000;

Lakin ALİAS verdikdə fərqlilik ortaya çıxır:


-- Oracle

select DEPARTMENT_ID,
avg(salary) as avgx,
count(*)
from employees
group by DEPARTMENT_ID
having avgx > 10000;

>>> ORA-00904: "AVGX": invalid identifier
00904. 00000 -  "%s: invalid identifier"

-- MySQL

select DEPARTMENT_ID,
avg(salary) as avgx,
count(*)
from employees
group by DEPARTMENT_ID
having avgx > 70000;

+---------------+------------+----------+
| DEPARTMENT_ID | avgx       | count(*) |
+---------------+------------+----------+
|             1 | 71081.1923 |       52 |
|             5 | 72293.3302 |      106 |
|             6 | 73282.6606 |      109 |
|             8 | 70504.3158 |       95 |
|             9 | 73321.0227 |       88 |
|            13 | 71513.8165 |      109 |
|            15 | 70468.3707 |      116 |
|            16 | 70079.0294 |      102 |
|            17 | 70019.2455 |      110 |
|            20 | 72301.6667 |       57 |
+---------------+------------+----------+

Yenə də əgər istəsək ki, məhz bu davranışın da qarşısını alaq o zaman sql_mode-da dəyişiklik etməliyik:

mysql> set @@sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)


mysql> select DEPARTMENT_ID,
avg(salary) as avgx,
count(*)
from employees
group by DEPARTMENT_ID
having avgx > 70000;

ERROR 1463 (42000): Non-grouping field 'avgx' is used in HAVING clause

Təşəkkürlər ))

Oracle general functions in MySQL

Oktyabr 17, 2013 1 şərh

“General functions simplify working with columns that potentially contain null values.
These functions accept input parameters of all types”

Və bu siyahıya NVL, NVL2, NULLİF, COALESCE daxildir.

NVL
Funksiya məqsədi qısa olaraq:
The NVL function evaluates whether a column or expression of any data type is null
or not. If the term is null, an alternative not null value is returned; otherwise, the
initial term is returned.

Əyani olaraq test edək. commission_pct-də null qiymətlər var bu səbəblə count() az çıxardır:

select count(commission_pct) from employees;
>>> 35

Gördüyümüz kimi az çıxartdı çünki null-ları exclude etdi. Çıxış yolu kimi NVL istifadə edəcik:

select count(nvl(commission_pct,0)) from employees;
>>> 107

Burda NVL funksiyası commission_pct-də NULL gördüyü yerlərdə 0 atdı və count da öz növbəsində
düzgün hesabladı.
Daha aydın sadə bir misal:

select nvl(null,0) from dual;
>>> 0

MySQL-də NVL-i əvəzləyən funksiya IFNULL()-dur.
Bu məqsədlə nümunə cədvəlimizi yaradaq:

create table nulling(
id int not null auto_increment,
first_name varchar(25),
last_name varchar(25),
commission double(8,2),
primary key(id)
);

insert into nulling(first_name,last_name,commission) 
values('x','y',0.5),('x','y',0.5),
('x','y',0.5),('x','y',0.5),
('x','y',null),('x','y',null),('x','y',null),('x','y',null);

mysql> select * from nulling;
+----+------------+-----------+------------+
| id | first_name | last_name | commission |
+----+------------+-----------+------------+
|  1 | x          | y         |       0.50 |
|  2 | x          | y         |       0.50 |
|  3 | x          | y         |       0.50 |
|  4 | x          | y         |       0.50 |
|  5 | x          | y         |       NULL |
|  6 | x          | y         |       NULL |
|  7 | x          | y         |       NULL |
|  8 | x          | y         |       NULL |
+----+------------+-----------+------------+
8 rows in set (0.00 sec)

Test edək:

mysql> select count(commission) from nulling;
+-------------------+
| count(commission) |
+-------------------+
|                 4 |
+-------------------+
1 row in set (0.03 sec)

mysql> select count(ifnull(commission,0)) from nulling;
+-----------------------------+
| count(ifnull(commission,0)) |
+-----------------------------+
|                           8 |
+-----------------------------+
1 row in set (0.00 sec)

Yuxarıdakına bənzər sadə misal:

mysql> select ifnull(null,0) from dual;
+----------------+
| ifnull(null,0) |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

Lakin Oracle-da NVL funksiyasının önəmli şərtlərindən biri NVL(original,
ifnull) şərtində The data types of the original and ifnull
parameters must always be compatible.
Yəni data tiplər uyğun olmalıdır.

select first_name, last_name, nvl(commission_pct,'Null qiymet') from employees;
>>> ORA-01722: invalid number
01722. 00000 -  "invalid number"

Lakin MySQL-də belə bir məhdudiyyət yoxdur:

mysql> select last_name, first_name, ifnull(commission,'Null qiymet') from nulling;
+-----------+------------+----------------------------------+
| last_name | first_name | ifnull(commission,'Null qiymet') |
+-----------+------------+----------------------------------+
| y         | x          | 0.50                             |
| y         | x          | 0.50                             |
| y         | x          | 0.50                             |
| y         | x          | 0.50                             |
| y         | x          | Null qiymet                      |
| y         | x          | Null qiymet                      |
| y         | x          | Null qiymet                      |
| y         | x          | Null qiymet                      |
+-----------+------------+----------------------------------+
8 rows in set (0.00 sec)

NVL2
It evaluates whether a column or expression of any data type is null or not.
If the first term is not null, the second parameter is returned, else the third parameter is
returned.

NVL-ə oxşar olan bu funksiya 3 parametr qəbul edir. Əgər 1-ci NULL deyilsə 2-ci parametr qaytarılır, əgər 1ci NULL-dursa 3-cü.

select nvl2(null,'NULL deyil','NULL-dur') from dual;
>>> NULL-dur

select nvl2(1,'NULL deyil','NULL-dur') from dual;
>>> NULL deyil

MySQL-də belə bir funksiya yoxdur onun əvəzinə İF() istifadə edəcik:

mysql> select if(null,'NULL deyil','NULL-dur') from dual;
+----------------------------------+
| if(null,'NULL deyil','NULL-dur') |
+----------------------------------+
| NULL-dur                         |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select if(1,'NULL deyil','NULL-dur') from dual;
+-------------------------------+
| if(1,'NULL deyil','NULL-dur') |
+-------------------------------+
| NULL deyil                    |
+-------------------------------+
1 row in set (0.00 sec)

NULLIF
Oracle və MySQL-də mövcuddur eyni funksionallığı yerinə yetirir:

-- Oracle
select nullif(1,1) from dual;
>>> NULL

select nullif(1,2) from dual;
>>> 1

-- MySQL

mysql> select nullif(1,1) from dual;
+-------------+
| nullif(1,1) |
+-------------+
|        NULL |
+-------------+
1 row in set (0.00 sec)

mysql> select nullif(1,2) from dual;
+-------------+
| nullif(1,2) |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

COALESCE
Eyni adlı funksiya hər 2 RDBMS-də var və eyni işi görürlər.

-- Oracle

select coalesce(null,null,null) from dual;
>>> NULL

select coalesce(null,1,2) from dual;
>>> 1

select coalesce(3,1,2) from dual;
>>> 3

-- MySQL

mysql> select coalesce(null,null,null) from dual;
+--------------------------+
| coalesce(null,null,null) |
+--------------------------+
|                     NULL |
+--------------------------+
1 row in set (0.00 sec)

mysql> select coalesce(null,1,2) from dual;
+--------------------+
| coalesce(null,1,2) |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.00 sec)

mysql> select coalesce(3,1,2) from dual;
+-----------------+
| coalesce(3,1,2) |
+-----------------+
|               3 |
+-----------------+
1 row in set (0.00 sec)

Təşəkkürlər 😉

Installing Oracle 11g client on Fedora 19 and Ubuntu 12.04

Fedora üçün Göstərilən əməliyyatlar bütün Red Hat based sistemlər üçün, həmçinin Ubuntu üçün göstərilənlər də bütün Debian based sistemlər üçün geçərlidir.

Oracle client-in install-ı mənim 2 GB ram-lıq Netbook-umdan remote olaraq Oracle DB-yə qoşulmaq istəyimdəndir.

Bunun üçün ilk öncə Instant Client kitabxanalarını download edirik. Download linki:
Instant Client Downloads
* Fedora *

Aşağıdakı 3 paket lazımdır:

oracle-instantclient11.2-basic-11.2.0.4.0-1.i386.rpm
oracle-instantclient11.2-devel-11.2.0.4.0-1.i386.rpm
oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.i386.rpm

Daha sonra bu paketləri install edirik:

[root@sh-fedora Downloads]# rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.i386.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:oracle-instantclient11.2-basic-11################################# [100%]
[root@sh-fedora Downloads]# rpm -ivh oracle-instantclient11.2-devel-11.2.0.4.0-1.i386.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:oracle-instantclient11.2-devel-11################################# [100%]
[root@sh-fedora Downloads]# rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.i386.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:oracle-instantclient11.2-sqlplus-################################# [100%]

sqplus-i çağırdıqda aşağıdakı error-u görürük:

[root@sh-fedora ~]# sqlplus
sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory

Həlli üçün oracle.conf faylı yaradırıq və onun daxilinə qeyd edirik:

-- 1
[root@sh-fedora ~]# nano /etc/ld.so.conf.d/oracle.conf

-- 2 yuxarıdakı fayla yazırıq
/usr/lib/oracle/11.2/client/lib

--3
[root@sh-fedora ~]# ldconfig

Daha sonra sqlplus-ı işlədirik:

[root@sh-fedora ~]# sqlplus

SQL*Plus: Release 11.2.0.4.0 Production on Thu Oct 17 02:17:10 2013

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


* Ubuntu *

Debian based sistemlərdə sadəcə fərqlilik .rpm paketlərin .deb-ə çevirərək qurulmasındadır. Bunun üçün bizə alien paketi lazım olduğundan ilk öncə onu qurmalıyıq:

--1
apt-get install alien

-- 2
alien -i oracle-instantclient11.2-basic-11.2.0.4.0-1.i386.rpm

-- 3
alien -i oracle-instantclient11.2-devel-11.2.0.4.0-1.i386.rpm

--4
alien -i oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.i386.rpm

Təşəkkürlər 😉

Kateqoriyalar: Linux, Oracle

Oracle’s to_char, to_date and to_number functions equivalents in MySQL

Oktyabr 11, 2013 2 şərh

Çox faydalı explicit conversion funksiyalarından danışacıq bugün.
Oracle-da olan to_char, to_number və to_date-ə baxacıq.

İlk öncə to_char-ın date ilə işlənməsinə. Bu funksiyanın köməyi ilə biz müxtəlif şəkildə date tiplərlə necə deyərlər oynaya bilərik. İlk Öncə Oracle nümunə daha sonra da MySQL nümunəyə baxırıq:
current date-i hər iki RDBMS-dən götürürük:

select sysdate from dual;
>>> 08-OCT-13

select curdate() from dual;
+------------+
| curdate()  |
+------------+
| 2013-10-10 |
+------------+

Nümunələrə baxaq:

-- 1
-- Oracle

select to_char(sysdate,'Month') from dual;
>>> October

-- MySQL
select date_format(curdate(),'%M') from dual;
+-----------------------------+
| date_format(curdate(),'%M') |
+-----------------------------+
| October                     |
+-----------------------------+

-- 2
-- Oracle 

select to_char(sysdate,'MM') from dual;
>>> 10

-- MySQL
select date_format(curdate(),'%m') from dual;

+-----------------------------+
| date_format(curdate(),'%m') |
+-----------------------------+
| 10                          |
+-----------------------------+

-- 3
-- Oracle

select to_char(sysdate,'YYYY') from dual;
>>> 2013

-- MySQL
select date_format(curdate(),'%Y') from dual;
+-----------------------------+
| date_format(curdate(),'%Y') |
+-----------------------------+
| 2013                        |
+-----------------------------+

-- 4
-- Oracle

select to_char(sysdate,'YY') from dual;
>>> 13

-- MySQL

select date_format(curdate(),'%y') from dual;
+-----------------------------+
| date_format(curdate(),'%y') |
+-----------------------------+
| 13                          |
+-----------------------------+

-- 5
-- Oracle

select to_char(sysdate,'Day') from dual;
>>> Thursday 

-- MySQL
select date_format(curdate(),'%W') from dual;
+-----------------------------+
| date_format(curdate(),'%W') |
+-----------------------------+
| Thursday                    |
+-----------------------------+

-- 6
-- Oracle

select to_char(sysdate,'DD') from dual;
>>> 10

-- MySQL

select date_format(curdate(),'%d') from dual;
+-----------------------------+
| date_format(curdate(),'%d') |
+-----------------------------+
| 10                          |
+-----------------------------+

Və.s bu kimi nümunələrlə davam etmək olar lakin, düşünürəm ki, ən çox istifadə olunanlar elə bunlardır.
MySQL date_format funksiyası haqqında daha ətraflı dokumentasiyada:
function_date-format

Daha sonra to_date funksiyası:

-- 1
-- Oracle

SELECT TO_DATE('25,10,2013', 'DD,MM,YYYY') FROM dual;
SELECT TO_DATE('25.10.2013', 'DD.MM.YYYY') FROM dual;
SELECT TO_DATE('25/10/2013', 'DD/MM/YYYY') FROM dual;
>>> 25-OCT-13

-- MySQL

SELECT STR_TO_DATE('25,10,2013', '%d,%m,%YYYY');
+------------------------------------------+
| STR_TO_DATE('25,10,2013', '%d,%m,%YYYY') |
+------------------------------------------+
| 2013-10-25                               |
+------------------------------------------+


SELECT STR_TO_DATE('25.10.2013', '%d.%m.%YYYY');
+------------------------------------------+
| STR_TO_DATE('25.10.2013', '%d.%m.%YYYY') |
+------------------------------------------+
| 2013-10-25                               |
+------------------------------------------+


SELECT STR_TO_DATE('25/10/2013', '%d/%m/%YYYY');
+------------------------------------------+
| STR_TO_DATE('25/10/2013', '%d/%m/%YYYY') |
+------------------------------------------+
| 2013-10-25                               |
+------------------------------------------+


-- 2
-- Oracle

select to_date('25,OCT','DD,MON') from dual;
>>> 25-OCT-13

-- MySQL

SELECT STR_TO_DATE('25,10', '%d,%m');
+-------------------------------+
| STR_TO_DATE('25,10', '%d,%m') |
+-------------------------------+
| 0000-10-25                    |
+-------------------------------+

Yuxarıdakı son misaldan belə nəticə çıxır ki, Oracle-dan fərqli olaraq MySQL default olaraq heç bir əlavələr etmir və göstərilməyən şərtin əvəzinə 0-lar yazır.

str_to_date funksiyası haqqında: function_str_to_date

Və sonuncu to_number funksiyası haqqında:

-- 1
-- Oracle

select to_number('$1000') from dual;
>>> ORA-01722: invalid number
01722. 00000 -  "invalid number"

-- MySQL

mysql> select cast('$1000' as unsigned) from dual;
+---------------------------+
| cast('$1000' as unsigned) |
+---------------------------+
|                         0 |
+---------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: '$1000' |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)


-- 2
-- Oracle

select to_number('$1000','$9999') from dual;
>>> 1000

-- MySQL

select cast(substr('$1000',2) as unsigned) from dual;
+-------------------------------------+
| cast(substr('$1000',2) as unsigned) |
+-------------------------------------+
|                                1000 |
+-------------------------------------+

MySQL CAST funksiyası haqqında daha ətraflı:
CAST

Təşəkkürlər 😉

Kateqoriyalar: MySQL, Oracle, Oracle SQL

Installing Oracle SQL Developer 4.x on Ubuntu 12.04

SQL Developer Java-da yazılması səbəbilə hər hansı install-a ehtiyac yoxdur. Sadəcə arxivi unzip edib istifadəyə başlamaq olar lakin mən 4-cü yeni versiya install edmək istədikdə platform-free paket tapa bilmədim. Dolayısı ilə .rpm paketi .deb-ə çevirib install edəcik:
Ardıcıllıqla:

-- 1
root@sh-asus:~# apt-get install alien

-- 2
sudo alien --scripts -d sqldeveloper-4.0.0.12.84-1.noarch.rpm
..
..
sqldeveloper_4.0.0.12.84-2_all.deb generated

-- 3
sudo dpkg -i sqldeveloper_4.0.0.12.84-2_all.deb
..

Selecting previously unselected package sqldeveloper.
(Reading database ... 246169 files and directories currently installed.)
Unpacking sqldeveloper (from sqldeveloper_4.0.0.12.84-2_all.deb) ...
Setting up sqldeveloper (4.0.0.12.84-2) ...

HOME-da .sqldeveloper adli folder yaradırıq:

sh@sh-asus:~$ mkdir .sqldeveloper

Run edirik:

sudo /opt/sqldeveloper/sqldeveloper.sh

Bizdən JDK-nın yerini istiyəcək. Qeyd edim ki 4-cü versiya SQL Developer Java 7 tələb edir.
Məndə Java 7 path-i:
/usr/lib/jvm/java-7-openjdk-amd64

Qeyd edirik və SQL Developer işləyəcək. Yeni Uİ xoşuma gəldi ))

Təşəkkürlər 😉

Oracle 11g R2 silent installation on CentOS 6.4

Oktyabr 4, 2013 4 şərh

CentOS server(desktop versiya yox)-ə GUİ-siz Oracle installation zamanı, ki bunun adı silent installation-dur qarşılaşdığım bitməyən problemlərdən dolayı bu məqaləni yazmağa məcbur oldum…Necə deyərlər çəkdiyim zülmü digər yeni başlayanlar da çəkməsin deyə 😉

Yazını 2 hissəyə bölürəm 1-cisi install mühitinin hazırlanması 2-ci isə Oracle-ın install-ı.
Bütün addımları ardıcıllıqla etsəniz sizdə də alınacaq.
Mühitin hazırlanması :
1. Dependency paketlərinin yüklənilməsi

[root@linuxsrv1 ~]# yum -y install binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel gcc gcc-c++ libaio libaio-devel libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel

Qeyd edim ki, installation zamanı məhz bu paket dependency-lərdən dolayı ERROR çıxdı və installation ABORT olundu. ERROR tam olaraq belədir:

SEVERE: [FATAL] [INS-13013] Target environment do not meet some mandatory requirements.
CAUSE: Some of the mandatory prerequisites are not met. See logs for details. /usr/oracle/app/oraInventory/logs/installActions2013-10-05_03-04-19AM.log
ACTION: Identify the list of failed prerequisite checks from the log: /usr/oracle/app/oraInventory/logs/installActions2013-10-05_03-04-19AM.log. Then either from the log file or from installation manual find the appropriate configuration to meet the prerequisites and fix it manually.

Dediyi kimi log file-a baxdıqda paketlərdən bəzilərinin CHECK zamanı failed olduğunu gördüm.
Bundan çıxış yolu kimi yuxarıdakı install etdiyiniz paketlərə əlavə olaraq aşağıdakıları da install edin. Ardıcıllıqla komandaları keçirdin:

yum install libaio.i686
yum install glibc.i686
yum install compat-libstdc++-33.i686
yum install libaio-devel.i686
yum install libstdc++.i686
yum install unixODBC.i686
yum install unixODBC-devel.i686

pdksh-5.2.14 paketi isə ümumiyyətlə repo-da yoxdur. Dolayısı ilə .rpm-ini tapıb install etməliyik:

[root@linuxsrv1 ~]# wget ftp://ftp.pbone.net/mirror/www.whiteboxlinux.org/whitebox/4/en/os/x86_64/WhiteBox/RPMS/pdksh-5.2.14-30.x86_64.rpm

[root@linuxsrv1 ~]# rpm -ivh pdksh-5.2.14-30.x86_64.rpm

2. Kernel parameter-lərə əlavələr

[root@linuxsrv1 ~]# nano /etc/sysctl.conf

faylı açırıq aşağıdakı sətrləri tapırıq və onu comment edirik:

# Disable netfilter on bridges.
#net.bridge.bridge-nf-call-ip6tables = 0
#net.bridge.bridge-nf-call-iptables = 0
#net.bridge.bridge-nf-call-arptables = 0

Daha sonra faylın sonuna əlavə edirik:

net.ipv4.ip_local_port_range = 9000 65500
fs.file-max = 6815744
kernel.shmall = 10523004
kernel.shmmax = 6465333657
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_max=1048576
fs.aio-max-nr = 1048576 

Faylı save edirik. Daha sonra aşağıdakı komandanı işlədirik:

[root@linuxsrv1 ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.ip_local_port_range = 9000 65500
fs.file-max = 6815744
kernel.shmall = 10523004
kernel.shmmax = 6465333657
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576

Sizdə də eyni nəticələrdisə davam edı bilərik.

3. Oracle üçün system user-inin yaradılması
Ardıcıllıqla:

[root@linuxsrv1 ~]# groupadd -g 200 oinstall
[root@linuxsrv1 ~]# groupadd -g 201 dba
[root@linuxsrv1 ~]# useradd -u 440 -g oinstall -G dba -d /usr/oracle oracle

Daha sonra aşağıdakı qaydada faylı açırıq və əlavəni edirik(elave1-lerin arasında gördüyümüzü):

[root@linuxsrv1 ~]# nano /etc/pam.d/login

session    required     pam_selinux.so open
session    required     pam_namespace.so
# elave1
session    required     pam_limits.so
# elave1
session    optional     pam_keyinit.so force revoke
session    include	system-auth

Daha sonra aşağıdakı qaydada digər bir faylı açın və sonuncu sətrə əlavələr edin:

[root@linuxsrv1 ~]# nano /etc/security/limits.conf

# sonuncu sətrə əlavə edin

oracle   soft   nproc   2047
oracle   hard   nproc   16384
oracle   soft   nofile   1024
oracle   hard   nofile   65536

Yenə eyni qaydada digər faylın sonuna əlavə edirik:

[root@linuxsrv1 ~]# nano /etc/profile

# Sonuna əlavə edin
 if [ $USER = "oracle" ]; then
      if [ $SHELL = "/bin/ksh" ]; then
           ulimit -p 16384
           ulimit -n 65536
      else
           ulimit -u 16384 -n 65536
      fi
fi


4. Oracle user-inə keçək və bəzi əməliyyatlar edək:

Ardıcıllıqla:

[oracle@linuxsrv1 ~]$ chmod 755 /usr/oracle
[oracle@linuxsrv1 ~]$ mkdir /usr/oracle/app
[oracle@linuxsrv1 ~]$ chmod 775 /usr/oracle/app
[oracle@linuxsrv1 ~]$ mkdir /usr/oracle/oradata
[oracle@linuxsrv1 ~]$ chmod 775 /usr/oracle/oradata

bash_profile-a ORACLE_BASE olacaq path-ı qeyd edirik:

[oracle@linuxsrv1 ~]$ nano ~/.bash_profile

# sonuncu sətrə əlavə edin

umask 022
export ORACLE_BASE=/usr/oracle/app

Download etdiyimiz Oracle .zip fayllarını unzip edəcəyimiz tmp directory-ni yaradaq:

[oracle@linuxsrv1 ~]$ mkdir tmp

Keçirik 2-ci mərhələyə Oracle installation

1. Əlimizdə olan .zip faylları yerləşdiririk tmp papkasına və unzip edirik:

[oracle@linuxsrv1 ~]$ cd tmp
[oracle@linuxsrv1 tmp]$ ls
linux.x64_11gR2_database_1of2.zip  linux.x64_11gR2_database_2of2.zip
[oracle@linuxsrv1 tmp]$ unzip linux.x64_11gR2_database_1of2.zip
[oracle@linuxsrv1 tmp]$ unzip linux.x64_11gR2_database_2of2.zip
[oracle@linuxsrv1 tmp]$ ls
database  linux.x64_11gR2_database_1of2.zip  linux.x64_11gR2_database_2of2.zip

2. silent installation üçün response file-ın hazırlanması..
response file-ımızı enterprise.rsp adlandırırı. Aşağıdakı ardıcıllıqla komandaları keçirdək:

[oracle@linuxsrv1 ~]$ cd /usr/oracle/tmp/database/response
[oracle@linuxsrv1 response]$ ls
dbca.rsp  db_install.rsp  netca.rsp
[oracle@linuxsrv1 response]$ touch enterprise.rsp
[oracle@linuxsrv1 response]$ ls
dbca.rsp  db_install.rsp  enterprise.rsp  netca.rsp

Daha sonra response file-ımız olan enterprise.rsp daxiline aşağıdakıları yazaq:

oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0

oracle.install.option=INSTALL_DB_SWONLY

ORACLE_HOSTNAME=linuxsrv1

UNIX_GROUP_NAME=oinstall

INVENTORY_LOCATION=/usr/oracle/app/oraInventory

SELECTED_LANGUAGES=en

ORACLE_HOME=/usr/oracle/app/product/11.2.0/dbhome_1

ORACLE_BASE=/usr/oracle/app

oracle.install.db.InstallEdition=EE

oracle.install.db.isCustomInstall=false

oracle.install.db.customComponents=oracle.server:11.2.0.1.0,oracle.sysman.ccr:10.2.7.0.0,oracle.xdk:11.2.0.1.0,oracle.rdbms.oci:11.2.0.1.0,oracle.network:11.2.0.1.0,oracle.network.listener:11.2.0.1.0,oracle.rdbms:11.2.0.1.0,oracle.options:11.2.0.1.0,oracle.rdbms.partitioning:11.2.0.1.0,oracle.oraolap:11.2.0.1.0,oracle.rdbms.dm:11.2.0.1.0,oracle.rdbms.dv:11.2.0.1.0,orcle.rdbms.lbac:11.2.0.1.0,oracle.rdbms.rat:11.2.0.1.0

oracle.install.db.DBA_GROUP=dba

oracle.install.db.OPER_GROUP=dba

oracle.install.db.CLUSTER_NODES=

oracle.install.db.config.starterdb.type=GENERAL_PURPOSE

oracle.install.db.config.starterdb.globalDBName=ORCL

oracle.install.db.config.starterdb.SID=ORCL

oracle.install.db.config.starterdb.characterSet=AL32UTF8

oracle.install.db.config.starterdb.memoryOption=true

oracle.install.db.config.starterdb.memoryLimit=512

oracle.install.db.config.starterdb.installExampleSchemas=true

oracle.install.db.config.starterdb.enableSecuritySettings=true

oracle.install.db.config.starterdb.password.ALL=

oracle.install.db.config.starterdb.password.SYS=

oracle.install.db.config.starterdb.password.SYSTEM=

oracle.install.db.config.starterdb.password.SYSMAN=

oracle.install.db.config.starterdb.password.DBSNMP=

oracle.install.db.config.starterdb.control=DB_CONTROL

oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL=

oracle.install.db.config.starterdb.dbcontrol.enableEmailNotification=false

oracle.install.db.config.starterdb.dbcontrol.emailAddress=

oracle.install.db.config.starterdb.dbcontrol.SMTPServer=

oracle.install.db.config.starterdb.automatedBackup.enable=false

oracle.install.db.config.starterdb.automatedBackup.osuid=

oracle.install.db.config.starterdb.automatedBackup.ospwd=

oracle.install.db.config.starterdb.storageType=

oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=

oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=

oracle.install.db.config.asm.diskGroup=

oracle.install.db.config.asm.ASMSNMPPassword=

MYORACLESUPPORT_USERNAME=

MYORACLESUPPORT_PASSWORD=

SECURITY_UPDATES_VIA_MYORACLESUPPORT=false

DECLINE_SECURITY_UPDATES=true

PROXY_HOST=

PROXY_PORT=

PROXY_USER=

PROXY_PWD=

oraInst.loc faylını yaradırıq və daxilinə qeyd edirik:

[root@linuxsrv1 ~]# touch /etc/oraInst.loc
[root@linuxsrv1 ~]# nano /etc/oraInst.loc
# Aşağıdakıları Qeyd edirik və faylı save edirik.
inventory_loc=/usr/oracle/app/oraInventory
inst_group=oinstall

Permission-larımızı veririk:

[root@linuxsrv1 etc]# chown oracle:oinstall oraInst.loc
[root@linuxsrv1 etc]# chmod 664 oraInst.loc

İndi də son komandamızı keçirdək və installation-a başlayaq aşağıda da gördüyünüz kimi WARNING çıxacaq lakin buna məhəl qoymuruq yəni qətiyyən installation-u abort(CTRL+C) etmirik!:

[oracle@linuxsrv1 database]$ ./runInstaller -silent -noconfig -responseFile /usr/oracle/tmp/database/response/enterprise.rsp
Starting Oracle Universal Installer...

Checking Temp space: must be greater than 120 MB.   Actual 41180 MB    Passed
Checking swap space: must be greater than 150 MB.   Actual 2559 MB    Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2013-10-05_03-23-07AM. Please wait ...
 [WARNING] [INS-13014] Target environment do not meet some optional requirements.
   CAUSE: Some of the optional prerequisites are not met.

Bir müddət səbrli olmalısınız çünki installation status bildirilmir. Sadəcə success kimi ən sonda belə bir yazı gələcək:

The following configuration scripts need to be executed as the “root” user.
#!/bin/sh
#Root scripts to run

/usr/oracle/app/product/11.2.0/dbhome_1/root.sh
To execute the configuration scripts:
1. Open a terminal window
2. Log in as “root”
3. Run the scripts
4. Return to this window and hit “Enter” key to continue

Successfully Setup Software.

Çıxan mesajda deyildiyi kimi root user-lə /usr/oracle/app/product/11.2.0/dbhome_1/root.sh scriptini run edirik:

[root@linuxsrv1 ~]# cd /usr/oracle/app/product/11.2.0/dbhome_1/
[root@linuxsrv1 dbhome_1]# ./root.sh
Check /usr/oracle/app/product/11.2.0/dbhome_1/install/root_linuxsrv1_2013-10-05_03-35-47.log for the output of root script

VƏ ən sonda DBCA ilə silent database creation etməliyik:

[oracle@linuxsrv1 ~]$ dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbName ORCL -sid ORCL -SysPassword change_on_install -SystemPassword manager -emConfiguration NONE -datafileDestination /usr/oracle/app/oradata -storageType FS -characterSet AL32UTF8 -memoryPercentage 40

Vəssalam bununla installation-umuz bitmiş hesab olunur.
İndi də Oracle-a connect olmağa çalışaq. Bunun üçün listener-i start etməliyik. Və ümumiyyətlə hər dəfə biz bəzi dəyişənləri yazmamaq məqsədilə bash_profile faylına son əlavələri edirik
(QEYD: oracle user-i ilə etməlisiniz):

[oracle@linuxsrv1 ~]$ nano ~/.bash_profile
# ən sonuna əlavə edin 
export ORACLE_HOME=/usr/oracle/app3/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

oracle user-indən logout oluruq daha sonra login oluruq!

listener-i start edirik:

[oracle@linuxsrv1 ~]$ lsnrctl start

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 05-OCT-2013 03:45:42

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

Starting /usr/oracle/app/product/11.2.0/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Log messages written to /usr/oracle/app/diag/tnslsnr/linuxsrv1/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=linuxsrv1)(PORT=1521)))

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                05-OCT-2013 03:45:43
Uptime                    0 days 0 hr. 0 min. 1 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Log File         /usr/oracle/app/diag/tnslsnr/linuxsrv1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=linuxsrv1)(PORT=1521)))
The listener supports no services
The command completed successfully

Qeyd edək ki, biz yuxarıda dbca ilə database yaratmışdıq və onun SİD-ni ORCL vermişdik.
connect oluruq…

[oracle@linuxsrv1 ~]$ export ORACLE_SID=ORCL
[oracle@linuxsrv1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Sat Oct 5 03:47:17 2013

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

Connected to an idle instance.

SQL> show user            
USER is "SYS"

Oracle 11g R2 Centos 6.4 üzərinə silent installation haqqında bu yazıda göstərilən hər şey test Linux üzərində test məqsədlə edilmişdir.
Ən sonda mənə ən azı 2 saat vaxtını ayıran Mahir müəllimə köməyinə görə təşəkkür edirəm.. 🙂