Error: database disk image is malformed in CentOS 6.5

[root@tester1 ~]# yum groupinstall "Desktop Platform"
.
.
Error: database disk image is malformed
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Belə bir error-u gördükdən sonra, aşağıdakı addımı etməklə həll etdim:

[root@tester1 ~]# yum clean dbcache
Loaded plugins: fastestmirror, refresh-packagekit, security
Cleaning repos: base extras updates
4 sqlite files removed

Təşəkkürlər.

Kateqoriyalar: Linux Etiketlər:

Linux Install Tutorials

Hörmətli dostlar, artıq bir neçə müddətdir ki Linux (CentOS 5 və 6) haqqında video dərslər hazırlayıram.
Hər bir dərs addım-addım olub, sizlərə faydalı məlumatlar çatdırır.
İnstall üsullarının hamsını sınayıb dərslərə yığmışam.
Buyurun faydalanın:

1. Installing Centos 5.10 in Text Mode
2. Installing Centos 5.10 in GUİ Mode
3. CentOS 6.5 Network Installation with VNC
4. Centos 6.5 Kickstart Installation

Kateqoriyalar: Linux

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

GİT basics

GİT-i install etdikdən sonra, işə başlayaq. Daha əvvəlki yazımızda install haqqında danışmışdıq.
İndi isə özümüz üçün yeni work directory yaradaq və onun üzərində işləyək. Komandaları ardıcıllıqla keçirək:

[root@bsnew ~]# cd /home/
[root@bsnew home]# mkdir git_test
[root@bsnew home]# cd git_test/
[root@bsnew git_test]# git init
Initialized empty Git repository in /home/git_test/.git/

git init komandası bizim direktoriyanı GİT-ə əlavə edir. Yəni, biz deyirik ki, bu direktoriyanı versiyalamağa başla.
Lakin bizim direktoriyamız boş olduğu üçün statusa baxdıqda deyir ki, nothing to commit.

[root@bsnew git_test]# git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

nümunə README faylını yaradaq və içinə hər hansı məlumat yazaq.

[root@bsnew git_test]# vim README

İndi yenidən statusa baxdıqda:

[root@bsnew git_test]# git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       README
nothing added to commit but untracked files present (use "git add" to track)

Status dəyişdi, yeni status-da untracked faylın olduğunu bildirir.
bu faylı tracked etmək üçün onu add etməliyik:

[root@bsnew git_test]# git add README

Bir daha statusa baxaq:

[root@bsnew git_test]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   README
#

Gördüyünüz kimi yeni faylı gördü, dolayısı ilə artıq bu fayl track olunur.

İndi isə gəlin həmin bu README faylına əlavə sətrlər qeyd edək və faylı save edək.
Əvvəlki halı:

[root@bsnew git_test]# cat README
Test

Yeni halı:

[root@bsnew git_test]# cat README
Test
TEST2
TEST3

Statusu bir daha yoxlayaq:

[root@bsnew git_test]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   README
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   README
#

Track olunan README faylımızda olan dəyişiklik dərhal detect olundu və gördüyümüz kimi, modified yazılıb.
Lakin diqqətlə oxuduqda görürük ki, Changes not staged for commit yazılıb.
Bu mo deməkdir ki, bu yeni yazdığımız dəyişikliklər gələn dəfəki commit-də yer almayacaq. Buna diqqət yetirmək lazımdır.
Faylı Stage hala gətirə bilməyimiz üçün onu bir daha git add etməliyik. Ümumiləşdirdikdə görürük ki, git add həm hər hansı yeni faylı track etdirir həmçinin də, unstage halda olan faylı stage hala gətirir. Stage halda olan fayl commit-ə hazır fayl sayılır.

Sınayaq:

[root@bsnew git_test]# git add README
[root@bsnew git_test]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   README
#

Changes to be committed özündə commit olunacaq, son halda olan faylı göstərir.

Belə bir sual yaranır. Deyək ki, biz faylda dəyişiklik edirik və daha sonra bilmək istəyirik ki, hansı dəyişiklikləri etmişik.
Bunun üçün git diff-dən istifadə edəcik.

QEYD: git diff yalnız unstage halda olan fayldaki dəyişiklikləri göstərir

Sınayaq:

[root@bsnew git_test]# git diff
diff --git a/README b/README
index b3dd4d0..74ebf90 100644
--- a/README
+++ b/README
@@ -2,3 +2,6 @@ Test
 TEST2
 TEST3
 TEST4
+TEST5
+TEST6
+TEST7

Gördüyümüz
+TEST5
+TEST6
+TEST7

bizim etdiyimiz və unstage olunmuş dəyişikliklərdir.
Əgər biz unstage halındakı faylı, yuxarıdakı qaydada stage hala gətirsək git diff heç bir şey göstərməyəcək:

[root@bsnew git_test]# git add README

[root@bsnew git_test]# git diff
[root@bsnew git_test]#

Faylımız Stage halda commit-ə hazır olduğu üşün biz onu commit edə bilərik:

[root@bsnew git_test]# git commit
[master (root-commit) 96ff1ed] First Commit
 1 file changed, 7 insertions(+)
 create mode 100644 README

git commit run etdikdə bizim core.editor-da təyin etdiyimiz sevimli editorumuz açılır.
Və biz orda Fisr Commit yazmaqla ilk commitimizi elan edirik.
7 sətr insert olunub 1 faylımız var.

ÜMUMİLƏŞDİRMƏ:
Hər hansı yeni fayl əlavə edildikdə o `UNTRACKED` olaraq qeyd olunur. Faylı `TRACKED` etmək üçün bizim komandamız
git add file_name-dir.
TRACK olunmuş fayl əsas etibarı ilə 2 halda olur STAGED və UNSTAGED. UNSTAGED halında , commit zamanı dəyişikliklər commit olunmayacaq. Dolayısı ilə commit-dən əvvəl biz faylı STAGE hala gətirməliyik.
Bunun üçün də komandamız git add file_name-dır. STAGE olunmuş faylı commit edə bilərik.

Təbii ki, bəzən yorucu olur hər dəfə git add edib faylları STAGE hala gətirmək. STAGİNG area-nı skip etmək mümkündür:

README faylına əlavələr edək:

[root@bsnew git_test]# git diff
diff --git a/README b/README
index 74ebf90..e879f2e 100644
--- a/README
+++ b/README
@@ -5,3 +5,6 @@ TEST4
 TEST5
 TEST6
 TEST7
+TEST8
+TEST9
+TEST10

Adi şəkildə git commit etsək təbii ki, bu dəyişikliklər commit olunmayacaq çünki biz faylımızı STAGE etməmişik. Bir daha git add etmədən commit etmək üçün:

[root@bsnew git_test]# git commit -a -m "Added new Lines"
[master 9d8ffd2] Added new Lines
 1 file changed, 3 insertions(+)

[root@bsnew git_test]# git status
# On branch master
nothing to commit, working directory clean

Faylları necə silək? GİT üçün faylın silinməsi, həmin faylın stage area-dan silinməsi deməkdir. Ola bilsin ki, heç o fayl diskdən silinməsin lakin GİT onu görməsin. Bu faydalı ola bilər. Məsələn, biz istəyirik ki fayl olduğu kimi qalsən lakin GİT onu görməsin.
İlk öncə gəlin faylı birbaşa silək və bəzi testlər aparaq:

[root@bsnew git_test]# rm README
rm: remove regular file `README'? y

İndi isə git statusa baxaq:

[root@bsnew git_test]# git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    README
#
no changes added to commit (use "git add" and/or "git commit -a")

Faylı birbaşa silməyimizə baxmayaraq GİT həmin faylı unstaged olaraq görür. Faylı necə deyərlər Gİt-dən də silmək üçün:

[root@bsnew git_test]# git rm README
rm 'README'

[root@bsnew git_test]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    README
#

Status dəyişdi Changes to be committed. Dolayısı ilə əgər indi biz commit etmiş olsaq daha o faylı görməyəcik.

[root@bsnew git_test]# git commit

[master 6a9ee34] Deleted File
 1 file changed, 10 deletions(-)
 delete mode 100644 README

Bəli diqqətlə oxusaq görürük ki, 1 file changed 10 deletions(-). Faylımız silindi.

[root@bsnew git_test]# git status
# On branch master
nothing to commit, working directory clean

Bəli biz faylımızı həm diskdən, həm də GİT-dən silmiş olduq.
Lakin yuxarıda dediyim kimi, hərdən bizə lazım olur ki, fayl silinməsin sadəcə elə edək ki, GİT onu görməsin.
Bunu test edək:

[root@bsnew git_test]# touch readme.txt
[root@bsnew git_test]# nano  readme.txt
~ Yeni nəsə yazın ~

[root@bsnew git_test]# git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       readme.txt
nothing added to commit but untracked files present (use "git add" to track)

[root@bsnew git_test]# git add readme.txt

[root@bsnew git_test]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   readme.txt
#

[root@bsnew git_test]# git commit -m "Newfile"
[master e4adafe] Newfile
 1 file changed, 1 insertion(+)
 create mode 100644 readme.txt

[root@bsnew git_test]# git rm --cached readme.txt
rm 'readme.txt'

[root@bsnew git_test]# ls
readme.txt

[root@bsnew git_test]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    readme.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       readme.txt

[root@bsnew git_test]# git commit
[master 095efb1] File Modified
 1 file changed, 1 deletion(-)
 delete mode 100644 readme.txt

[root@bsnew git_test]# git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       readme.txt
nothing added to commit but untracked files present (use "git add" to track)

Gördüyümüz kimi, file artıq untracked olundu lakin, diskden silinmədi. Bizə də lazım olan elə bu idi.

* Faylların adının dəyişdirilməsi

Rename etmək üçün git mv komandasından istifadə etmək lazımdır.

[root@bsnew git_test]# git mv readme.txt readit.txt

[root@bsnew git_test]# ls
readit.txt

[root@bsnew git_test]# cat readit.txt
HELLo world

[root@bsnew git_test]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    readme.txt -> readit.txt
#

[root@bsnew git_test]# git commit
[master e1989bb] Renamed
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename readme.txt => readit.txt (100%)

[root@bsnew git_test]# git status
# On branch master
nothing to commit, working directory clean

Dərhal faylın rename olunduğu detect olundu və commitdən sonra artıq təsdiqləndi.

Fikrimcə ilkin olaraq bu qədər məlumat kifayət edər.
Təşəkkürlər ))

Kateqoriyalar: Git/GitHub, Linux

Installing GIT on Ubuntu 13.10

Versioning sistemlər arasında bəlkə də ən tanınmışı və sürətlisi olan GİT haqqında yazılardan ilkinə başlayırıq.
Bu yazıda GİT-in Ubuntu Linux üzərinə install-ı, ilkin config-inə baxacıq.

Dependency error almamaq üçün:

apt-get install libcurl4-openssl-dev libssl-dev

İlk olaraq GİT-in rəsmi saytından stable release-i download edirik,
http://git-scm.com/downloads

Daha sonra arxivi unpack edirik,

unzip git-master.zip

sh@shrzayev:~/Downloads$ cd git-master/

sh@shrzayev:~/Downloads/git-master$ make prefix=/usr/local all
.
.
.
sh@shrzayev:~/Downloads/git-master$ sudo make prefix=/usr/local install
.
.

Vəssalam, ən yeni versiya GİT-imiz install olundu

sh@shrzayev:~/Downloads/git-master$ /usr/local/bin/git --version
git version 1.9.0

Digər bir üsul isə təbii ki, apt-get -lə install etməkdir lakin onun versiyası daha aşağı olacaq:

sh@shrzayev:~$ sudo apt-get install git
.
.
sh@shrzayev:~$ git --version
git version 1.8.3.2

Beləliklə bizim əlimizdə GİT-imiz var.

İndi isə ilkin config-ləməni edək.
Öz adımız və mailimizi yazaq:

sh@shrzayev:~$ git config --global user.name "Shahriyar Rzayev"
sh@shrzayev:~$ git config --global user.email "rzayev.sehriyar@gmail.com"
sh@shrzayev:~$ git config --list
user.name=Shahriyar Rzayev
user.email=rzayev.sehriyar@gmail.com

Default editor-umuzu təyin edək, mən özümçün bunu komodo-edit olaraq təyin edirəm siz Linux-da available olan istənilən editor-u seçə bilərsiniz(Vİ, EMACS, GEDİT və.s)

sh@shrzayev:~$ git config --global core.editor komodo-edit
sh@shrzayev:~$ git config --list
user.name=Shahriyar Rzayev
user.email=rzayev.sehriyar@gmail.com
core.editor=komodo-edit

Default diff tool-umuzu təyin edirik:

sh@shrzayev:~$ git config --global merge.tool vimdiff

İlkin mərhələdə bizə lazım olanlar sadəcə bunlar idi.
Təşəkkürlər.

Overview of Physical Database Structure in MySQL

Oracle Physical Structure oxuyarkən MySQl ilə müqayisə etmək qərarına gəldim.
Ümumiyyətlə RDBMS-i müqayisəli şəkildə öyrənmək çox faydalıdır.
Bu yazımızda MySQL 5.6.15-in Fiziki data strukturu haqqında danışacıq.
Default MySQL installation-dan sonra Linux-da aşağıdakı struktur yaranır:
MySQL Installation Directory:

[root@linuxsrv1 ~]# which mysql
/usr/bin/mysql

MySQL Configuration File:

[root@linuxsrv1 ~]# locate my.cnf
/etc/my.cnf

MySQL Data Directory:

[root@linuxsrv1 ~]# mysql -u root -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.

mysql> select @@datadir;
+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

Bu 3 Directory-dən bizə lazım olan təbii ki, configuration faylı və Data Directory-dir. Biraz təriflərlə izah edək.
Data Directory — MySQL-in data file-larının saxladığı ərazi, direktoriya.
Data File-ın izahını mövzu irəlilədikcə verəcik.

Data Directory-yə gedək:

[root@linuxsrv1 ~]# cd /var/lib/mysql
.
.
[root@linuxsrv1 mysql]# ls -l
total 176144
-rw-rw----. 1 mysql mysql       56 Jan  4 02:53 auto.cnf
-rw-rw----. 1 mysql mysql 79691776 Feb  1 21:45 ibdata1
-rw-rw----. 1 mysql mysql 50331648 Feb  1 21:45 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 Jan  4 02:53 ib_logfile1
drwx------. 2 mysql mysql     4096 Jan  4 02:53 mysql
srwxrwxrwx. 1 mysql mysql        0 Feb  1 21:13 mysql.sock
drwx------. 2 mysql mysql     4096 Jan  4 02:53 performance_schema

1. auto.cnf — bu fayl MySQL installation zamanı avtomatik olaraq yaranır və daxilində server üçün Unique İD saxlayır.
[auto]
server-uuid=ecf27935-74c9-11e3-bc6a-080027f84458

2. mysql, performance_schema — bu iki database system database-ləridir, hər installation zamanı yaranır və System məlumatlarını özlərində saxlayırlar. Drop olunması qətiyyən.

3. ibdata1 — Tərcümə etmədən Dokumentasiyadan birbaşa bura paste edirəm:
A set of files with names such as ibdata1, ibdata2, and so on, that make up the InnoDB system tablespace. These files contain metadata about InnoDB tables, (the data dictionary), and the storage areas for the undo log, the change buffer, and the doublewrite buffer. They also can contain some or all of the table data also (depending on whether the file-per-table mode is in effect when each table is created). When the innodb_file_per_table option is enabled, data and indexes for newly created tables are stored in separate .ibd files rather than in the system tablespace.

4. ib_logfile0 və ib_logfile1 — Redo Log fayllar.


Ümumiləşdirmə N1,
ibdata1 faylı logical olaraq System Tablespace-idir. Həmçinin default MySQL configuration faylından istifadə etdikdə, bu fayl həm də cədvəl data və index-lərini saxlayır. Dolayısı ilə ibdata1 data file-dır.

Ümumiləşdirmə N2,
Yuxarıdakı tərifə əsasən default MySQL configuration ilə işlədikdə, bütün cədvəllər System Tablespace-də saxlanılır.

Bütün danışdıqlarımıza əsasən Yeri gəlmişkən, System Tablespace haqqında izah verək.

System Tablespace — Data File-ların toplusudur ki (ibdata1, ibdata2, ibdata3 və.s), özündə saxlayır:
Data Dictionary,
Undo Log,
Change Buffer,
Doublewrite Buffer.

Bütün bunları yadda saxladıqdan sonra System Tablespace-də yerləşən yuxarıda adı çəkilən hissələri izah edək.
Data Dictionary — table,column və index-lər haqqında metadata məlumatlarını saxlayır.
Undo Log — A storage area that holds copies of data modified by active transactions. If another transaction needs to see the original data (as part of a consistent read operation), the unmodified data is retrieved from this storage area. Ümumi olaraq Rollback Segment.
Change Buffer — Daha ərtaflı: Change Buffer
Doublewrite Buffer — Daha ətraflı: Doublewrite Buffer

ib_logfile0 və ib_logfile1 fayllarının Redo Log olduğunu demişdik.
Redo Log haqqında daha ərtaflı:
Redo Log

Ümumiləşdirmə N3,
MySQL-də default config faylı ilə start olunduqda yalnız və yalnız 1 ümumi TableSpace olacaq. System TableSpace.
1 tablespace və 1 data file.

Gəlin bu halı ətraflı araşdıraq. İlk öncə MySQL-i innodb_file_per_table = 0 olaraq start edək. Bu məqsədlə,
my.cnf faylını açırıq və [mysqld] kataloqu altında aşağıdakını yazırıq. Həmçinin hər bir commit-dən sonra dərhal data fayla flush olunması üçün biz əlavə 2 parameter də təyin edirik:

[root@linuxsrv1 ~]# nano /etc/my.cnf
.
.
[mysqld]
innodb_file_per_table          = 0
innodb_flush_method            = O_DIRECT
innodb_flush_log_at_trx_commit = 1 

Save edirik və daha sonra start\stop:

[root@linuxsrv1 ~]# service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

Və yoxlayırıq Bizdə System Database-lərdən başqa Database yoxdur və bütün cədvəllər də məhz system cədvəlləridir. Dolayısı ilə:

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

[root@linuxsrv1 ~]# cd /var/lib/mysql/
[root@linuxsrv1 mysql]# ls -l
total 176144
-rw-rw----. 1 mysql mysql       56 Jan  4 02:53 auto.cnf
-rw-rw----. 1 mysql mysql 79691776 Feb  2 12:20 ibdata1
-rw-rw----. 1 mysql mysql 50331648 Feb  2 12:20 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 Jan  4 02:53 ib_logfile1
drwx------. 2 mysql mysql     4096 Jan  4 02:53 mysql
srwxrwxrwx. 1 mysql mysql        0 Feb  2 12:18 mysql.sock
drwx------. 2 mysql mysql     4096 Jan  4 02:53 performance_schema

Metadata-ya sorğu göndərdikdə də nəticə gözləniləndir çünki MySQL-də başqa cədvəl yoxdur:

SELECT count(*) tables,
       concat(round(sum(table_rows)/1000000,2),'M') rows,
       concat(round(sum(data_length)/(1024*1024*1024),2),'G') data,
       concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx,
       concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size,
       round(sum(index_length)/sum(data_length),2) idxfrac
       FROM information_schema.TABLES
       WHERE  table_schema not in ('mysql','information_schema','performance_schema');

+--------+------+------+------+------------+---------+
| tables | rows | data | idx  | total_size | idxfrac |
+--------+------+------+------+------------+---------+
|      0 | NULL | NULL | NULL | NULL       |    NULL |
+--------+------+------+------+------------+---------+
1 row in set (0.00 sec)

Bir daha xatırladıram ki biz server-i innodb_file_per_table = 0 halda start etmişik, yəni bütün cədvəl və dataları yerləşir bizim 1 datafile-ımızda = System Tablespace-imizdə.

[root@linuxsrv1 mysql]# ls -l | grep ibdata*
-rw-rw----. 1 mysql mysql 79691776 Feb  2 12:20 ibdata1

Size = 79691776 = 76 MB

Bu həcmi yadda saxlayıb Yeni database və Cədvəllər yaradaq. MƏn sample Database olan Employees-den istifadə etdim.
Database import-dan sonra yoxlayaq:

mysql> show databases like 'emp%';
+-----------------+
| Database (emp%) |
+-----------------+
| employees       |
+-----------------+
1 row in set (0.00 sec)

Dərhal System Tablespace və onun istifadə etdiyi ibdata1 data faylının həcmini yenidən yoxlayaq:

[root@linuxsrv1 mysql]# ls -l | grep ibdata1 
-rw-rw----. 1 mysql mysql 281018368 Feb  2 15:30 ibdata1

Yeni size = 281018368 = 268 MB

Gördüyümüz kimi, yeni yaratdığımız cədvəllər ibdata1 = System TableSpace-də saxlandı. İddia edirik ki, yeni yaradılmış cədvəllərin toplam həcmi TƏQRİBƏN 268 – 76 = 192 MB-dir.
Metadata-dan öyrənək:

SELECT count(*) tables,
       concat(round(sum(table_rows)/1000000,2),'M') rows,
       concat(round(sum(data_length)/(1024),2),'K') data_K,
       concat(round(sum(index_length)/(1024),2),'K') idx_K,
       concat(round(sum(data_length+index_length)/(1024),2),'K') total_size_K,
       concat(round(sum(data_length)/(1024*1024),2),'M') data_M,
       concat(round(sum(index_length)/(1024*1024),2),'M') idx_M,
       concat(round(sum(data_length+index_length)/(1024*1024),2),'M') total_size_M,
       concat(round(sum(data_length)/(1024*1024*1024),2),'G') data_G,
       concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx_G,
       concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size_G,
       round(sum(index_length)/sum(data_length),2) idxfrac
       FROM information_schema.TABLES
       WHERE  table_schema not in ('mysql','information_schema','performance_schema');
+--------+-------+------------+-----------+--------------+---------+--------+--------------+--------+-------+--------------+---------+
| tables | rows  | data_K     | idx_K     | total_size_K | data_M  | idx_M  | total_size_M | data_G | idx_G | total_size_G | idxfrac |
+--------+-------+------------+-----------+--------------+---------+--------+--------------+--------+-------+--------------+---------+
|      6 | 3.91M | 138496.00K | 54464.00K | 192960.00K   | 135.25M | 53.19M | 188.44M      | 0.13G  | 0.05G | 0.18G        |    0.39 |
+--------+-------+------------+-----------+--------------+---------+--------+--------------+--------+-------+--------------+---------+
1 row in set (0.00 sec)

188.44 MB Təqribi qiymət düzgün gəldi. Bu da bir daha sübut etdi ki, Default olaraq MySQL-də hər şey System Tablespace-də və 1 data file-da saxlanılır.

Araşdırmamızı davam etdirək.
İkinci bir anlayışı irəli sürək.
Tərif:
MySQL-də 2 növ TableSpace var. System TableSpace-i ki, biz artıq onun haqqında danışdıq və “Hər Cədvəlin Öz TableSpace”-i. Buna biz innodb_file_per_table = 0 yox, məhz innodb_file_per_table = 1 etməklə nail oluruq.
Dolayısı ilə default olmayan config faylı ilə MySQL-li start etməklə biz per-table-tablespace əldə etmiş oluruq

Əyani surətdə göstərək:
İlk öncə test database-imizi drop edək:

mysql> drop database employees;
Query OK, 6 rows affected (0.85 sec)

Daha sonra my.cnf faylında dəyişiklik edək və MySQL restart edək.

[root@linuxsrv1 ~]# nano /etc/my.cnf
.
.
innodb_file_per_table          = 1

[root@linuxsrv1 ~]# service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

Employee database-i yenidən import edək. Bu andan etibarən employee directory-nin daxilində bəzi digər faylların yarandığını görürük:

[root@linuxsrv1 mysql]# cd /var/lib/mysql/employees/
[root@linuxsrv1 employees]# ll -h | grep .ibd
-rw-rw----. 1 mysql mysql 112K Feb  2 16:13 departments.ibd
-rw-rw----. 1 mysql mysql  29M Feb  2 16:13 dept_emp.ibd
-rw-rw----. 1 mysql mysql 128K Feb  2 16:13 dept_manager.ibd
-rw-rw----. 1 mysql mysql  22M Feb  2 16:13 employees.ibd
-rw-rw----. 1 mysql mysql 140M Feb  2 16:15 salaries.ibd
-rw-rw----. 1 mysql mysql  40M Feb  2 16:14 titles.ibd

Məhz bu .ibd fayllar hər cədvəlin öz TableSpace\Data File-ıdır. Faktiki olaraq burdan belə nəticə çıxır ki, innodb_file_per_table = 1 halında hər cədvəlin öz DATA File-ı olur.

Bunu biz Metadata-dan da öyrənə bilərik.
information_schema-ya məxsus 3 cədvəl var ki, bizim üçün faydalı məlumatları özündə saxlayır:

INNODB_SYS_TABLES , INNODB_SYS_DATAFILES, INNODB_SYS_TABLESPACES

Məsələn, yuxarıda iddia etdiyimiz kimi, hər cədvəlin öz data file-ı olduğunu sübut etmək üçün:

mysql> select * from information_schema.INNODB_SYS_DATAFILES where path like './emp%';
+-------+------------------------------+
| SPACE | PATH                         |
+-------+------------------------------+
|    52 | ./employees/employees.ibd    |
|    53 | ./employees/departments.ibd  |
|    54 | ./employees/dept_manager.ibd |
|    55 | ./employees/dept_emp.ibd     |
|    56 | ./employees/titles.ibd       |
|    57 | ./employees/salaries.ibd     |
+-------+------------------------------+
6 rows in set (0.00 sec)

System Tablespace-də olmayan cədvəllərin siyahısını öyrənmək üçün:

SELECT name, flag, space
  FROM information_schema.INNODB_SYS_TABLES
 WHERE space != 0;
+----------------------------+------+-------+
| name                       | flag | space |
+----------------------------+------+-------+
| employees/departments      |    1 |    53 |
| employees/dept_emp         |    1 |    55 |
| employees/dept_manager     |    1 |    54 |
| employees/employees        |    1 |    52 |
| employees/salaries         |    1 |    57 |
| employees/titles           |    1 |    56 |
| mysql/innodb_index_stats   |    1 |     2 |
| mysql/innodb_table_stats   |    1 |     1 |
| mysql/slave_master_info    |    1 |     4 |
| mysql/slave_relay_log_info |    1 |     3 |
| mysql/slave_worker_info    |    1 |     5 |
+----------------------------+------+-------+
11 rows in set (0.00 sec)

TableSpace haqqından maraqlı məlumatları əldə etmək üçün isə:

mysql> SELECT *
    ->   FROM information_schema.INNODB_SYS_TABLESPACES
    ->  WHERE name LIKE 'emp%';
+-------+------------------------+------+-------------+----------------------+-----------+---------------+
| SPACE | NAME                   | FLAG | FILE_FORMAT | ROW_FORMAT           | PAGE_SIZE | ZIP_PAGE_SIZE |
+-------+------------------------+------+-------------+----------------------+-----------+---------------+
|    52 | employees/employees    |    0 | Antelope    | Compact or Redundant |     16384 |             0 |
|    53 | employees/departments  |    0 | Antelope    | Compact or Redundant |     16384 |             0 |
|    54 | employees/dept_manager |    0 | Antelope    | Compact or Redundant |     16384 |             0 |
|    55 | employees/dept_emp     |    0 | Antelope    | Compact or Redundant |     16384 |             0 |
|    56 | employees/titles       |    0 | Antelope    | Compact or Redundant |     16384 |             0 |
|    57 | employees/salaries     |    0 | Antelope    | Compact or Redundant |     16384 |             0 |
+-------+------------------------+------+-------------+----------------------+-----------+---------------+
6 rows in set (0.00 sec)

Running Python Script from crontab

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

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

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

import os
import datetime
import subprocess

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


now = datetime.datetime.now()


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

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

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

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

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

xxxxx_31_1_2014_8_0_1.dmp
xxxxx_31_1_2014_8_0_1.log

Təşəkkürlər…

Kateqoriyalar: PHP/Python Etiketlər:
İzlə

Hər yeni yazı üçün e-poçt qutunuza göndəriş alın.

Digər 186 izləyiciyə qoşulun