SVN Repository i Başka Sunucuya Taşıma

Merhabalar,

Bu yazımda SVN sunucumuzda bulunan repository i başka bir sunucuya nasıl aktaracağımdan bahsedeceğim. Aslında burda yapacağımız iş basit olarak yedek alma ve aldığımız yedeği başka sunucuda geri yükleme işidir.

  1. Repository inizin yedeğini alın.
  2. Yedek alma işlemini, svn in komutlarından “svnadmin” i kullanarak yapıyoruz. Aşağıdaki komutu kullanarak yedeğinizi alabilirsiniz.

    svnadmin dump /path/to/repository > repo_name.svn_dump
    

    Bu komut repository de bulunan tüm revizyonların da yedeğini alacaktır.

  3. Taşıyacağınız sunucuda aynı isimde bir repository oluşturun.
  4. Not: İlk önce taşıyacağınız sunucuya svn kurmanız gerekmektedir. Kurulum için buraya bakabilirsiniz.
    Aşağıdaki komutu çalıştırarak yeni bir repository oluşturabilirsiniz.

    svnadmin create /path/to/repository
    
  5. Almış olduğunuz yedeği Yeni sunucudaki boş repository e geri yükleyin.
  6. Almış olduğumuz yedeği yeni sunucuya taşıyoruz ve aşağıdaki komutu çalıştırıyoruz.

    svnadmin load /path/to/repository < repo_name.svn_dump
    

Artık repository miz yeni sunucuda aynı özelliklerle ve içeriklerle çalışmaktadır.

Oracle Enterprise Linux e SVN Sunucu Kurulumu

Merhabalar,

Bu yazımda Oracle Enterprise Linux e SubVersioN (SVN) kurulumunu anlatacağım. SVN, bir grup insanın aynı proje üzerinde ortak çalışmasını sağlayan ve geliştirdikleri kodları ortak bir makinede tutarak birbirleriyle çakışmasını önleyen, kodların başka kullanıcılar tarafından ezilmesini önleyen ve geçmişe dönük olarak kodları tutabilen bir uygulamadır.
Şimdi kuruluma başlayabiliriz:

  • RHEL tabanlı bir işletim sisteminde öncelikle SVN için gerekli olan paketleri kurun.
  • # yum install httpd mod_dav_svn subversion
    
  • SVN repository oluşturmak için aşağıdaki komutları çalıştırıyoruz:
    # mkdir /var/www/svn/
    # cd /var/www/svn/
    # svnadmin create testRepo
    
  • Bu repository i apache kullanıcısına atıyoruz.
  • # chown -R apache:apache testRepo
    
  • SVN konfigurasyon dosyasında bazı tanımlamalar yapmamız gerekiyor.
    /etc/httpd/conf.d/subversion.conf dosyasına aşağıdaki bilgileri girin.
  • # vi /etc/httpd/conf.d/subversion.conf
    
       DAV svn
       SVNParentPath /var/www/svn  
       AuthType Basic
       AuthName "Subversion repositories"
       AuthUserFile /etc/httpd/conf.d/svn.users 
       AuthzSVNAccessFile /var/www/svn/testRepo/conf/authz 
       Require valid-user
    
    

    Yukarıdaki dosyada bulunan,
    SVNParentPath parametresi svn repository lerinin kurulacağı klasörü gösteriyor.
    AuthUserFile parametresi ise svn repository sine erişecek olan kullanıcıların kayıt edileceği dosyayı gösteriyor.
    AuthzSVNAccessFile dosyası ise kayıtlı kullanıcıların repository olan yetkilendirilmesini yapıyor.

  • Repository erişecek kullanıcıları aşağıdaki kod ile oluşturuyoruz.
    Eğer parola dosyası yoksa “htpasswd -cm” parametresiyle çalıştırıyoruz.
  • # htpasswd -cm /etc/httpd/conf.d/svn.users oracle
    New password:
    Re-type new password:
    Adding password for user oracle
    
  • Eğer mevcut kullanıcıyı güncellemek istiyorsak ya da yeni kullanıcı ekleyeceksek “htpasswd -m” parametresiyle çalıştırıyoruz.
  • htpasswd -m /etc/httpd/conf.d/svn.users oracle2
    New password:
    Re-type new password:
    Adding password for user oracle2
    
  • Konfigurasyon dosyasında belirttiğimiz kullanıcı listesi dosyasını sorguladığımızda eklediğimiz kullanıcıları görebiliriz.
  • # cat /etc/httpd/conf.d/svn.users
    oracle:$apr1$9t19J…$hCF2GJTlizZfnPjKyk9rk/
    
  • Repository erişecek kullanıcıların yetkilendirilmesi için aşağıdaki kodu çalıştırıyoruz:
  • # vi /var/www/svn/testRepo/conf/authz
    ## grup oluşturmak için
    ## group_adi = kullanici_adi
    [groups]
    developer = oracle
    other = onur.cinar
    
    ##repository ye tanımlı kullanıcılara yetki vermek için
    ## [repository_adi/ repository klasörü]
    ## kullanıcı ya da group adı = (r,rw) yetkilerinden biri
    ## r = read, rw = read – write
    
    [/]
    @other = r
    @developer = rw
    
  • Httpd servisini restart edip, başlangıçta çalışması için chkconfig e yazıyoruz.
  • # /etc/init.d/httpd restart
    # chkconfig httpd on
    

SVN sunucumuz hazırdır. Kendi locallerinizde olan SVN clientlarla sunucuya bağlanabilirsiniz.

Oracle DB 11.2.0.4 kurulum Hata – error in invoking target 'agent nmhs of makefile ins_emagent.mk'

Merhabalar,
Eğer RHEL tabanlı bir işletim sistemine Oracle Database 11.2.0.4 versiyonu kurarken aşağıdaki hatayı alıyorsanız, çözümü çok basit.

install_11204_problem

Bunu düzeltmek için $ORACLE_HOME/sysman/lib/ins_emagent.mk dosyasını açarak aşağıdaki satırı düzenlemeniz gerekecektir.

171 #===========================
172 #  emdctl
173 #===========================
174
175 $(SYSMANBIN)emdctl:
176         $(MK_EMAGENT_NMECTL) 

176 numaralı satırı aşağıdaki gibi değiştirin.

171 #===========================
172 #  emdctl
173 #===========================
174
175 $(SYSMANBIN)emdctl:
176         $(MK_EMAGENT_NMECTL) -lnnz11

Bu dosyayı kaydettikten sonra “Retry” butonuna basarak kuruluma devam edebilirsiniz.

Tabloyu Başka Bir Tablespace Altına Taşımak

Merhabalar,

Oracle da bir tabloyu başka bir tablespace altına kopyalamak çok kolay. Aşağıdaki komutu çalıştırarak tabloyu taşıyabilirsiniz.

ALTER TABLE  MOVE TABLESPACE 

Fakat dikkat etmeniz gereken bir nokta var. Yukarıdaki komutu çalıştırdıktan sonra, bu tabloya bağlı tüm indexler “UNUSABLE” olacak. Bu indexleri tekrardan “REBUILD” yapmanız gerekecek.

alter index owner."index_name" rebuild;

Eğer isterseniz aşağıdaki komutu çalıştırarak indexlerin de tablespace ini değiştirebilirsiniz.

alter index owner."index_name" rebuild tablespace table_space;

Dikkat etmeniz gereken diğer nokta ise, taşıyacağınız tablo eğer LOB kolonu içeriyorsa, LOB kolonları ayrıca taşımanız gerekecektir. Aşağıdaki script LOB ları taşımak için kullanacağınız komutları çıkaracaktır.

SELECT 'ALTER TABLE owner.'||LOWER(TABLE_NAME)||' MOVE LOB('||LOWER(COLUMN_NAME)||') STORE AS (TABLESPACE table_space);'
FROM DBA_TAB_COLS
WHERE OWNER = 'schema_name' AND DATA_TYPE like '%LOB%';

Linux İşletim Sistemlerinde sunucu açıldığında otomatik olarak Oracle Veritabanını açmak

Merhabalar,

Geçenlerde bir müşterimiz için, sunucu açıldığında otomatik olarak veritabanını açan script yazmamız istenildi.
oracle-base.com dan bulduğum script, 11g ve üzeri single instance Oracle Veritabanı versiyonlarında, ve RHEL tabanlı işletim sistemlerinde test edilmiştir.

Öncelikle scriptin servis olarak çalışması için “init.d” klasörünün altına start ve shutdown scriptlerini çalıştıracak olan scripti koymamız gerekiyor.

“/etc/init.d/orclScript” dosyasını root kullanıcısıyla oluşturalım. İsterseniz aşağıdaki linkten bu dosyayı indirebilirsiniz.

orclScript

#!/bin/sh

# Set OS user of Oracle database to ORA_OWNER variable. 
ORA_OWNER=oracle

case "$1" in
    'start')
        # Start the Oracle databases:
        # The following command assumes that the oracle login 
        # will not prompt the user for any values
        # Remove "&" if you don't want startup as a background process.
        su $ORA_OWNER -c "/home/oracle/dbscripts/startup.sh >> /home/oracle/dbscripts/orclScript.log 2>&1" &

        touch /var/lock/subsys/orclScript
        ;;
    'stop')
        # Stop the Oracle databases:
        # The following command assumes that the oracle login 
        # will not prompt the user for any values
        su $ORA_OWNER -c "/home/oracle/dbscripts/shutdown.sh >> /home/oracle/dbscripts/orclScript.log 2>&1"
        rm -f /var/lock/subsys/orclScript
        ;;
esac

Bu dosyaya chmod 750 yetkisini verelim.

chmod 750 /etc/init.d/orclScript

Bu scriptin otomatik olarak çalışması için chkconfig e girmemiz gerekiyor.

chkconfig --add orclScript

Şimdi veritabanını açıp kapatacak scriptleri oluşturmamız gerekiyor. Bunun için scriptleri koyacağımız klasörü oluşturalım.
Veritabanını açıp kapadığımız OS kullanıcısıyla sisteme bağlanalım ve “home” klasörü altına “dbscripts” klasörünü oluşturalım. Ben “oracle” kullanıcısıyla bağlanıyorum.

# su - oracle
$ mkdir dbscripts

Bu klasörün altına aşağıdaki startup ve shutdown scriptlerini oluşturalım. Bu scriptlerde oracle parametrelerini kendi veritabanı parametrelerine göre değiştirmeyi unutmayın.

startup.sh

#!/bin/bash

export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_HOSTNAME=orcl11g.localdomain
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_home1
export PATH=$ORACLE_HOME/bin:/usr/sbin:/usr/local/bin:$PATH
export ORACLE_UNQNAME=orcl

export ORACLE_SID=orcl

# Start Listener
lsnrctl start

# Start Database
sqlplus / as sysdba << EOF
STARTUP;
EXIT;
EOF

shutdown.sh

#!/bin/bash

export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_HOSTNAME=orcl11g.localdomain
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_home1
export PATH=$ORACLE_HOME/bin:/usr/sbin:/usr/local/bin:$PATH
export ORACLE_UNQNAME=orcl

export ORACLE_SID=orcl 

# Stop Database
sqlplus / as sysdba << EOF
SHUTDOWN IMMEDIATE;
EXIT;
EOF

# Stop Listener
lsnrctl stop

Dosyaları oluşturduktan sonra yazma yetkisi verelim.

$ chmod u+x /home/oracle/dbscripts/startup.sh /home/oracle/dbscripts/shutdown.sh

orclScript servisini kapatıp açtığımız zaman veritabanımız ve listener ımız otomatik olarak açılıp kapanacaktır.

# service orclScript start
# service orclScript stop

Kaynak: oracle-base.com

Linux sunucularda otomatik olarak Huge Page Değeri hesaplamak

Merhabalar,
Büyük SGA e sahip olan veritabanlarımızda huge page ayarı yapmak sanal bellek yönetimi konusunda bize çok büyük kolaylık sağlar. Huge page ayarlamadan önce veritabanımızda Automatic Memory Management (AMM) ayarının yapılmamış olması gerekiyor. Çünkü AMM ve Huge Page Linux sunucularda uyumlu çalışmamaktadır. Onun yerine Huge Page kullanmak istediğiniz sunucularda, Automatic Shared Memory Management ve Automatic PGA Management yapmanız gerekecektir. Diğer önemli nokta ise bu scripti çalıştırmadan önce veritabanınızın çalışır halde olması gerekmektedir.
İlk önce sunucumuzdaki “memlock” değerlerini RAM miktarına göre ayarlamamız gerekmektedir. Örneğin 64 GB RAM imiz varsa, bu değeri KB olarak hesaplayıp, bu değerden küçük bir değer vermemiz gerekecektir. Bu değeri de “/etc/security/limits.conf” dosyasına yazmamız gerekiyor.

vi /etc/security/limits.conf

* soft memlock 60397977
* hard memlock 60397977

Bu ayarı yaptıktan sonra scriptimizi çalıştırabiliriz.
Aşağıdaki scripti veritabanı sunucumuzda oluşturup, çalışma yetkisi verelim.

Scripti buradan indirebilirsiniz.
hugepages.sh

$ chmod +x hugepages_settings.sh
$ ./hugepages_settings.sh
Recommended setting: vm.nr_hugepages = 1496

Gördüğünüz üzere script otomatik olarak bize huge page değerini vermektedir.
Peki buradaki 1496 değerini ne yapacağız?
“/etc/sysctl.conf” dosyasını root kullanıcısıyla açıp uygun bir yere aşağıdaki satırı yazmamız gerekiyor.

....
vm.nr_hugepages = 1496
...

Bu eklemeyi yaptıktan sonra veritabanımızı durdurup, sunucumuzu yeniden başlatmamız gerekecektir.
Sunucuyu yeniden başlattıktan sonra aşağıdaki komutu çalıştırdığımızda Huge Page ayarının yapılmış olduğunu göreceksiniz.

# grep HugePages /proc/meminfo
HugePages_Total: 1496
HugePages_Free: 485
HugePages_Rsvd: 446
HugePages_Surp: 0

Oracle Veritabanında Eksik Foreign Key Indexlerini Bulmak

Merhabalar,

Bazen veritabanında foreign key eksikliği nedeniyle ( enq: TM – contention wait ) beklemeler yaşayabilirsiniz. Supportta bununla ilgili bir döküman var (Doc ID 1019527.6). Bu yazımda bu scripti çalıştırıp eksik foreign key leri tespit etmekten bahsedeceğim.
Aşağıdaki scripti veritabanınızda TFSFKCHLK.SQL dosyası oluşturarak içine kopyalayın. Daha sonra eksik foreign keylerin olduğu schema ile veritabanınıza bağlanıp bu sorguyu çalıştırın.

$sqlplus onur/onur
@path/tfsfkchk

Bu sorguyu çalıştırdıktan sonra bulunduğunuz schemada “ck_log” diye bir tablo oluşturacaktır. Bu tabloyu sorguladığınızda yaratılacak indexlerin kolonları ve tablolarını görebiliriz.

select LineMsg from ck_log
where LineMsg NOT LIKE 'Checking%' AND
LineMsg NOT LIKE 'No foreign key%'
order by LineNum
/

Scripti buradan indirebilirsiniz. TFSFKCHLK.SQL

İsterseniz aşağıdaki scripti kopyalayarak sql dosyasını oluşturabilirsiniz.

SCRIPT

SET ECHO off
REM NAME: TFSFKCHLK.SQL
REM USAGE:"@path/tfsfkchk"
REM --------------------------------------------------------------------------
REM REQUIREMENTS:
REM None -- checks only the USER_ views
REM --------------------------------------------------------------------------
REM This file checks the current users Foreign Keys to make sure of the
REM following:
REM
REM 1) All the FK columns are have indexes to prevent a possible locking
REM problem that can slow down the database.
REM
REM 2) Checks the ORDER OF THE INDEXED COLUMNS. To prevent the locking
REM problem the columns MUST be index in the same order as the FK is
REM defined.
REM
REM 3) If the script finds and miss match the script reports the correct
REM order of columns that need to be added to prevent the locking
REM problem.
REM
REM
REM
REM -------------------------------------------------------------------------
REM Main text of script follows:

drop table ck_log;

create table ck_log (
LineNum number,
LineMsg varchar2(2000));

declare
t_CONSTRAINT_TYPE user_constraints.CONSTRAINT_TYPE%type;
t_CONSTRAINT_NAME USER_CONSTRAINTS.CONSTRAINT_NAME%type;
t_TABLE_NAME USER_CONSTRAINTS.TABLE_NAME%type;
t_R_CONSTRAINT_NAME USER_CONSTRAINTS.R_CONSTRAINT_NAME%type;
tt_CONSTRAINT_NAME USER_CONS_COLUMNS.CONSTRAINT_NAME%type;
tt_TABLE_NAME USER_CONS_COLUMNS.TABLE_NAME%type;
tt_COLUMN_NAME USER_CONS_COLUMNS.COLUMN_NAME%type;
tt_POSITION USER_CONS_COLUMNS.POSITION%type;
tt_Dummy number;
tt_dummyChar varchar2(2000);
l_Cons_Found_Flag VarChar2(1);
Err_TABLE_NAME USER_CONSTRAINTS.TABLE_NAME%type;
Err_COLUMN_NAME USER_CONS_COLUMNS.COLUMN_NAME%type;
Err_POSITION USER_CONS_COLUMNS.POSITION%type;

tLineNum number;

cursor UserTabs is
select table_name
from user_tables
order by table_name;

cursor TableCons is
select CONSTRAINT_TYPE,
CONSTRAINT_NAME,
R_CONSTRAINT_NAME
from user_constraints
where OWNER = USER
and table_name = t_Table_Name
and CONSTRAINT_TYPE = 'R'
order by TABLE_NAME, CONSTRAINT_NAME;

cursor ConColumns is
select CONSTRAINT_NAME,
TABLE_NAME,
COLUMN_NAME,
POSITION
from user_cons_columns
where OWNER = USER
and CONSTRAINT_NAME = t_CONSTRAINT_NAME
order by POSITION;

cursor IndexColumns is
select TABLE_NAME,
COLUMN_NAME,
POSITION
from user_cons_columns
where OWNER = USER
and CONSTRAINT_NAME = t_CONSTRAINT_NAME
order by POSITION;

DebugLevel number := 99; -- >>> 99 = dump all info`
DebugFlag varchar(1) := 'N'; -- Turn Debugging on
t_Error_Found varchar(1);

begin

tLineNum := 1000;
open UserTabs;
LOOP
Fetch UserTabs into t_TABLE_NAME;
t_Error_Found := 'N';
exit when UserTabs%NOTFOUND;

-- Log current table
tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, NULL );

tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Checking Table '||t_Table_Name);

l_Cons_Found_Flag := 'N';
open TableCons;
LOOP
FETCH TableCons INTO t_CONSTRAINT_TYPE,
t_CONSTRAINT_NAME,
t_R_CONSTRAINT_NAME;
exit when TableCons%NOTFOUND;

if ( DebugFlag = 'Y' and DebugLevel >= 99 )
then
begin
tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Found CONSTRAINT_NAME = '|| t_CONSTRAINT_NAME);

tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Found CONSTRAINT_TYPE = '|| t_CONSTRAINT_TYPE);

tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Found R_CONSTRAINT_NAME = '|| t_R_CONSTRAINT_NAME);
commit;
end;
end if;

open ConColumns;
LOOP
FETCH ConColumns INTO
tt_CONSTRAINT_NAME,
tt_TABLE_NAME,
tt_COLUMN_NAME,
tt_POSITION;
exit when ConColumns%NOTFOUND;
if ( DebugFlag = 'Y' and DebugLevel >= 99 )
then
begin
tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, NULL );

tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Found CONSTRAINT_NAME = '|| tt_CONSTRAINT_NAME);

tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Found TABLE_NAME = '|| tt_TABLE_NAME);

tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Found COLUMN_NAME = '|| tt_COLUMN_NAME);

tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Found POSITION = '|| tt_POSITION);
commit;
end;
end if;

begin
select 1 into tt_Dummy
from user_ind_columns
where TABLE_NAME = tt_TABLE_NAME
and COLUMN_NAME = tt_COLUMN_NAME
and COLUMN_POSITION = tt_POSITION;

if ( DebugFlag = 'Y' and DebugLevel >= 99 )
then
begin
tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Row Has matching Index' );
end;
end if;
exception
when Too_Many_Rows then
if ( DebugFlag = 'Y' and DebugLevel >= 99 )
then
begin
tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Row Has matching Index' );
end;
end if;

when no_data_found then
if ( DebugFlag = 'Y' and DebugLevel >= 99 )
then
begin
tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'NO MATCH FOUND' );
commit;
end;
end if;

t_Error_Found := 'Y';

select distinct TABLE_NAME
into tt_dummyChar
from user_cons_columns
where OWNER = USER
and CONSTRAINT_NAME = t_R_CONSTRAINT_NAME;

tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum, 'Changing data in table '||tt_dummyChar
||' will lock table ' ||tt_TABLE_NAME);

commit;
tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum,'Create an index on table '||tt_TABLE_NAME
||' with the following columns to remove lock problem');

open IndexColumns ;
loop
Fetch IndexColumns into Err_TABLE_NAME,
Err_COLUMN_NAME,
Err_POSITION;
exit when IndexColumns%NotFound;
tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum,'Column = '||Err_COLUMN_NAME||' ('||Err_POSITION||')');
end loop;
close IndexColumns;
end;
end loop;
commit;
close ConColumns;
end loop;
if ( t_Error_Found = 'N' )
then
begin
tLineNum := tLineNum + 1;
insert into ck_log ( LineNum, LineMsg ) values
( tLineNum,'No foreign key errors found');
end;
end if;
commit;
close TableCons;
end loop;
commit;
end;
/