6 Ekim 2009 Salı

Oracle 11g Güvenlik Özellikleri

Oracle 11g versiyonu ile yeni ve üst düzey güvenlik özellikleri getirdi. Özellikle yeni sürüme geçiş öncesinde iyice incelenmesi ve test edilmesi gereken özellikler. (Hatta can sıkabilecek derecede geliştirilmiş özellikler). Bu konuda yazılmış pek çok makale bulabilirsiniz, fakat bence en faydalılarından birine Arup Nanda' nın makalesine aşağıdaki linkten ulaşabilirsiniz.

http://www.oracle.com/technetwork/articles/sql/11g-security-100258.html




24 Eylül 2009 Perşembe

Oracle' da rol istisnaları

Oracle veritabanında (rol kullanımından kaynaklanan) karşılaştığım bazı özel durumları not etmek istiyorum. Aslında bunlar bug olarak düşünülebilir fakat bu tarz bugların çözümüne yönelik bir şey yapılmayabilir.

Örneğin DBA rolüne sahip bir kullanıcı bile teorik olarak CREATE ANY MATERIALIZED VIEW, CREATE PUBLIC DATABASE LINK yetkileri olmasına rağmen başka bir kullanıcı altına bir DB link veya Materialized View create edemez.

Aşağıda karşılaştığım istisnaları ve çözümlerini kısaca açıklamaya çalıştım. Zaman buldukça ve karşılaştıkça yeni istinasları da eklemeyi düşünüyorum.

--Nesne Hakları
Genel kural:
Bir kullanıcının yetkisi olan bir objeyi bir procedure/function/pkg/view içinde kullanabilmesi için nesne üzerinde direk hakkı olması gerekiyor.
Mesela kullanıcının tablo üzerindeki rol üzerinden gelen hakları kullanıcının create edeceği herhangi bir SP içinde geçersiz oluyor. Bu durumda tablo için doğrudan yetki talebine ihtiyaç var.
Örneğin kullanıcı role üzerinden yetkisi olduğu bir tabloyu bir prosedür içinde select edemez. kendi schemasındaki prosedür içinde o tabloyu sorgulayabilmek için kullanıcıya doğrudan select hakkı verilmesi gerekiyor. (uygulama kullanıcıları ile normal kullanıcıları ayırmak bu yüzden de gerekli)

--DBLINK

DB link create edebilmek için şu 2 yöntem kullanabiliriz.
1. DB linki oluşturmak istediğimiz kullanıcıya yetki verip o kullanıcı ile login olup, linki oluşturmak ve yetkiyi geri almak.
2. DB linki oluşturmak istediğimiz schemaya yetki verip db link create scriptini çalıştıracak bir prosedürü o şema altında oluşturmak, prosedürü çalıştırmak, prosedürü drop etmek ve yetkiyi geri almak.

--MVIEW
Metarialized Veiw create etmek için role den bağımsız CREATE ANY MATERIALIZED VIEW yetkisinin kullanıcımıza doğrudan verilmesi gerekli.


25 Ağustos 2009 Salı

Change Oracle Database Name and DBID with NID utility


Change Oracle Database Name and DBID with NID utility

--close database with immediate 
SHUTDOWN IMMEDIATE
STARTUP MOUNT

--run "nid" command. end process of nid command database will be shutdown.
nid target=sys/oracle@RADB dbname=TSH2

--change db_name to new name in pfile
db_name =TSH2

--create a password file for new ORACLE_SID 
orapwd file=D:\oracle\product\11.1.0\db_1\database\pwdTSH2.ora password=oracle entries=10

--if os windows delete old service.
oradim -delete -SID RADB

--if os windows add service for new ORACLE_SID
oradim -new -SID TSH2

-- listener reload    
lsnrctl reload

--open database with resetlogs
STARTUP MOUNT

--if you want, you can rename database and redo file's name.

set linesize 200
select 'alter database rename file '''||name  ||''' to '''||replace(name, 'ORATST','ORCL')  ||''';' from v$datafile;
select 'alter database rename file '''||name  ||''' to '''||replace(name, 'ORATST','ORCL')  ||''';' from v$tempfile;
select 'alter database rename file '''||member||''' to '''||replace(member, 'ORATST','ORCL')||''';' from v$logfile;

ALTER DATABASE OPEN RESETLOGS;

2 Nisan 2009 Perşembe

Oracle - SESSIONS_PER_USER

Oracle veritabanında profil tanımları içinde bulununan SESSIONS_PER_USER değişkeni bir username ile veritabanında anlık login olabilecek session sayısı bilgisini atamak için kullanılır. Profile tanımında ayarlansa bile bu değişken default olarak etkili olmaz. Değişkenin etkili olması olabilmesi için RESOURCE_LIMIT initial parametresinin TRUE olarak ayarlanması gerekir.

Örnek profile tanımı:

CREATE PROFILE USER_PROF LIMIT CPU_PER_SESSION DEFAULT
CPU_PER_CALL DEFAULT
CONNECT_TIME DEFAULT
IDLE_TIME DEFAULT
SESSIONS_PER_USER 1
LOGICAL_READS_PER_SESSION DEFAULT
LOGICAL_READS_PER_CALL DEFAULT
PRIVATE_SGA DEFAULT
COMPOSITE_LIMIT DEFAULT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 3
PASSWORD_REUSE_MAX 2
PASSWORD_REUSE_TIME 1
PASSWORD_LOCK_TIME DEFAULT
FAILED_LOGIN_ATTEMPTS 3;

Resource limit' i etkin hale getirmek için:

SQL> alter system set resource_limit=TRUE scope=both;

http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams183.htm#REFRN10188

30 Mart 2009 Pazartesi

RMAN DUPLICATE

Recovery Manager(RMAN) programının veri yedekleme yanında, veri kurtarma, taşıma konusunda bize sunduğu faydalı özelliklerinden biri de DUPLICATE özelliğidir.

Duplicate özelliği veritabanının tamamının veya bir kısmının kopyasını çıkarmamıza olanak sağlar.
Duplicate özelliğini kullanabilmek için;
- Veritabanının RMAN ile alınmış cross-check edilmiş bir backupının olması(full veya incremental)
- Belirli bir zamana gelebilmek için veritabanın archive modda çalışması ve güncel arşivlerimizin erişilebilir olması gerekir.

DUPLICATE ile online olarak veritabanımızı kopyalabilir veya istediğimiz tablespacelerden oluşan yeni bir veritabanı hazırlayabiliriz.

DUPLICATE ile aynı host üzerinde veya farklı hostlar üzerinde veritabanını kurmak mümkündür.
Host sistemlerin OS versiyonlarının ve tabiki oracle executable versiyonlarının aynı olması gerekir.

DUPLICATE ile yapabileceklerimiz
- Veritabanını online olarak kopyalamak.
- Daha önce aldığımız backupı ve geri dönüş planını test etmek.
- Drop edilen(purge dahil) veya truncate edilen bir tabloyu veya nesneyi kurtarmak.
- Standby db kurulumu.

olarak sayılabilir. Farklı senaryolarda farklı ihtiyaçlar için de elbetteki kullanılabilir.

Örnek olarak databasemizdeki bazı tablespaceler hariç diğer tüm datamızı belirli bir zamana döneceğimiz bir senaryo oluşturalım.

1 - Target db(yani source db) spfile ile başlatıldıysa önce bir pfile create edilir.

--productiona baglanip olusturalim
sqlplus /nolog
conn /as sysdba
create pfile=D:\oracle\product\10.2.0\oradata\AUX1\initAUX1.ora from spfile;
exit


2 - Pfile içindeki lokasyon parametreleri yeni lokasyonlara göre düzenlenir.
Datafilelar farklı bir lokasyona kopyalanacak ise ve datafile isimleri rename edilmeyecekse aşağıdaki iki parametrenin de pfile içinde set edilmesi gerekir.

DB_FILE_NAME_CONVERT=("D:\oracle\oradata\orcl", "D:\oracle\oradata\AUX1")
LOG_FILE_NAME_CONVERT=("D:\oracle\oradata\orcl","D:\oracle\oradata\AUX1")


Örneği Windows üzerinde yaptığımız için windows üzerinde db instance' ı başlatabileceğimiz servis girdisini oluşturuyoruz. Unix üzerinde bu kısma gerek yok.

oradim -new -sid AUX1 -intpwd oracle -startmode manual -pfile D:\oracle\product\10.2.0\oradata\AUX1\initAUX1.ora

3 - Hazırlanan pfile kullanılarak AUXILIARY instance (AUX1) nomount olarak başlatılır. Bu instance yeni kurmak isteğimiz database'e aittir.

4 - Her iki instance'ın RMAN tarafından erişilebilir olduğundan emin olmak için gerekli TNS ve listener tanımları yapılır. SYS userı için şifre dosyası ayarlanır.

5 - RMAN DUPLICATE scripti hazırlanır.

CONNECT TARGET system/system@proddb;
CONNECT CATALOG rman/rman@catalogdb;
CONNECT AUXILIARY SYS/oracle;

CONFIGURE CHANNEL DEVICE TYPE disk CLEAR;
CONFIGURE DEFAULT DEVICE TYPE TO disk;
CONFIGURE DEVICE TYPE disk PARALLELISM 3;

RUN {
# the DUPLICATE command uses an automatic disk channel
set until time "TO_DATE('03/11/2008 17:19:25','DD/MM/YYYY HH24:MI:SS')";

DUPLICATE TARGET DATABASE TO AUX1
SKIP TABLESPACE USERS
LOGFILE
GROUP 1 ('D:\oracle\oradata\AUX1\redo01m1.log',
'D:\oracle\oradata\AUX1\redo01m2.log') SIZE 20M REUSE,
GROUP 2 ('D:\oracle\oradata\AUX1\redo02m1.log',
'D:\oracle\oradata\AUX1\redo02m2.log') SIZE 20M REUSE;
}


6 - Scriptimizi çalıştırmadan önce pwd dosyası, tns ayarları, listener ayarları son kez kontrol edilir. Bu kısım özellikle büyük dblerde gereksiz zaman kaybını engellemek için önemlidir.

7 - Hazırlanan script çalıştırılır. Script neticesinde yeni instance' ın çalışır durumda hazır olmasını bekleyebiliriz.


Örneğimizde kullanmak amacıyla tablespace, schema ve tabloları aşağıdaki scriptler ile oluşturabiliriz.

Yapacaklarımız kısaca şöyle :
1 - Örnek datamızı oluşturacağız.
2 - RMAN ile control file dahil full yedek alacağız.
3 - Yedek alındıktan sonra silmek istediğimiz tabloyu drop edeceğiz.
4 - Hazırladığımız RMAN DUPLICATE scriptini çalıştıracağız.


conn /as sysdba
create tablespace tbs datafile 'D:\oracle\oradata\orcl\tbs01.dbf' size 10M;

create user ra identified by ra default_tablespace tbs;
grant connect, resource to ra;

drop table ra.silinecek purge;

create table ra.silinecek
(
id number,
ad varchar(20)
)
tablespace tbs;

insert into ra.silinecek values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.silinecek values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.silinecek values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.silinecek values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.silinecek values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));

commit;

drop table ra.kalacak purge;

create table ra.kalacak
(
id number,
ad varchar(20)
)
tablespace tbs;

insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));

commit;

select * from ra.silinecek;

select * from ra.kalacak;

--kayitlarimiz kontrol ettik ve hepsi yerli yerinde.

alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;

--redolar switch edildikten sonra RMAN den control file dahil full yedek alınır.

--Yedek aldıktan sonra ra.silinecek tablomuzu drop(purge ile) edebiliriz.

drop table ra.silinecek purge;


Scriptleri sorunsuz çalıştırdıktan sonra prod dbnin istediğimiz zamana kadar recovery edilmiş halini yeni dbmizde(AUX1) hazır olarak bulmayı umabiliriz.
teşekkürler.





26 Mart 2009 Perşembe

Kill inactive sessions in scheduled time



We needed kill for all inactive reporting users which has been inactive log an hour. This must have been a scheduled time in future. We can use such a below method for this purpose.

- Create schedular job that contaning running time.
- Put the below PL/SQL block in action side in that job.


As a result, sessions are automatically closed. Of course, this only applied to risk-free for users who selects. Users in a transaction with the closure of such a method is risky. You can desire select statement which using v$session view.



begin
FOR i IN (select username from dba_users where username like 'TEMP%')
LOOP
execute immediate 'alter user ' || i.username || ' account lock';
END LOOP;
FOR i IN (select sid, serial#, username from v$session where username like 'TEMP%')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ' || '''' || i.sid || ',' || i.serial# || ''' immediate ';
END LOOP;
end;
/




13 Mart 2009 Cuma

Oracle Block change tracking

Oracle 10g ile gelen yeni ve kullanışlı bir özellik.
Normal şartlarda RMAN incremental backup alırken RMAN tüm blokları tarayarak bir önceki backuptan sonra bloğun değişip değişmediğine bakar ve eğer değişmişse yedeğini alır.
Burada en büyük zaman kaybına sebep olan şey RMAN ın bir bloğun değişip değişmediğini
anlaması için tüm blokları taramak zorunda kalmasıdır.

10g ile gelen bu yeni özellik ile blok değişimleri bir tracking file da tutulur.
Böylece RMAN sadece bu dosyayı inceleyerek yedek alması gereken bloklara karar verir ve tüm blokları okumak zorunda kalmaz. Bu şekilde backup zamanından ciddi anlamda kar edebiliriz.

Block tracking file tek bir dosyadır.
Default olarak DB_CREATE_FILE_DEST altında tutulur. İstenirse farklı bir lokasyonda saklanabilir.
RAC database için tracking file ortak storage üzerinde olmalıdır.

--baslatmak icin

SQL> alter database enable block tracking file;

--default lokasyonda bir tracking file açar

SQL> alter database enable block tracking using file '/disk/filename.f' reuse;

--belirttiğimiz lokasyonda tracking file açar. resuse parametresi mevcut dosyayı ezer.


--Block change tracking disable etmek için

SQL> alter database disable block change tracking;


Block change tracking disable edildiği zaman o ana kadar alınan incremental backuplar
geçersiz olur yeniden Level 0 backup alınması gerekir.

Tracking file başka bir lokasyona taşınabilir. Bunun için

1- database kapatılır

SQL> Shutdown immediate;

2- dosya fiziksel olarak yeni lokasyonuna taşınır.

cp old_file new_file

3- database mount modda açılır, dosya rename edilir ve database açılır

SQL> startup mount;
SQL> ALTER DATABASE RENAME FILE 'ora_home/dbs/change_trk.f' TO '/new_disk/change_trk.f';
SQL> alter database open;

Database açıkken de tracking disable edilip yeni lokasyonda tracking açılabilir. fakat
bu durumda önceki backuplar geçersiz olur.

teşekkürler.

3 Şubat 2009 Salı

String Aggregation Techniques

"Sütun olarak kaydedilmiş değerleri nasıl tek satır olarak yan yana ekleriz"in anlatıldığı güzel bir makale.

String Aggregation Techniques (oracle-base.com)

asktom.oracle.com


Bu da benim hazırladığım küçük bir örnek

Tablolar:

CREATE TABLE PERSONEL
(
ID NUMBER,
AD VARCHAR2(20),
MESLEK NUMBER
)
;

Insert into PERSONEL (ID, AD, MESLEK) Values (1, 'ramazan', NULL);
Insert into PERSONEL (ID, AD, MESLEK) Values (2, 'ahmet', NULL);
COMMIT;


CREATE TABLE GRUP
(
ID NUMBER,
AD VARCHAR2(20)
);

Insert into GRUP (ID, AD) Values (1, 'istanbul');
Insert into GRUP (ID, AD) Values (2, 'ankara');
Insert into GRUP (ID, AD) Values (3, 'trabzon');
COMMIT;


CREATE TABLE GRUPUYE
(
GK NUMBER,
PK NUMBER
);

Insert into GRUPUYE (GK, PK) Values (1, 1);
Insert into GRUPUYE (GK, PK) Values (2, 1);
Insert into GRUPUYE (GK, PK) Values (3, 1);
Insert into GRUPUYE (GK, PK) Values (1, 2);
COMMIT;


SQL>
1 SELECT pk,
2 LTRIM(MAX(SYS_CONNECT_BY_PATH(ad,','))
3 KEEP (DENSE_RANK LAST ORDER BY curr),',') AS gruplar
4 FROM (SELECT g.pk,
5 g.ad,
6 ROW_NUMBER() OVER (PARTITION BY g.pk ORDER BY ad) AS curr,
7 ROW_NUMBER() OVER (PARTITION BY g.pk ORDER BY ad) -1 AS prev
8 FROM (select pk, ad from grupuye, grup
9 where gk=id) g)
10 GROUP BY pk
11 CONNECT BY prev = PRIOR curr AND pk = PRIOR pk
12* START WITH curr = 1

PK GRUPLAR
---------- --------------------------------------------------
1 ankara,istanbul,trabzon
2 istanbul

25 Aralık 2008 Perşembe

Oracle' da Türkçe karakter ile sorgulama

Upper fonksiyonu default olarak i harfini I (büyük ı ) harfine dönüştürüyor.
Doğru çalıştırabilmek için NLS_SORT parametresini XTURKISH olarak set etmek
ve upper yerine nls_upper kullanmak gerekiyor.


SQL> alter session set NLS_SORT = 'XTURKISH' ;

SQL> select nls_upper ( 'i' ) from dual;

--Session bazında set etmeden ve herhangi bir ayar yapmadan sorgulamak için bu şekilde de kullanabiliriz.

SELECT sysdate
FROM dual
WHERE nls_upper ( 'i' , 'NLS_SORT = XTURKISH' ) = 'İ' ;


NLS_SORT parametresi client üzerinde veya yukarıdaki gibi session bazında set edilebilir.
Diğer bir yöntem database için logon trigger oluşturmak olabilir.

--database için örnek trigger

CREATE OR REPLACE TRIGGER NLS_LOGON
AFTER LOGON
ON DATABASE
DECLARE
sqlstr VARCHAR2(200) := 'alter session set NLS_SORT=XTURKISH';
BEGIN
IF (USER = 'DENEMEUSER') THEN
execute immediate sqlstr;
END IF;
END nls_logon;
/

--user için örnek trigger

CREATE OR REPLACE TRIGGER user_logon_nls
AFTER LOGON ON scott.schema
BEGIN
DECLARE
sqlstr VARCHAR2(200) := 'alter session set NLS_SORT=XTURKISH';
BEGIN
IF (USER = 'DENEMEUSER') THEN
execute immediate sqlstr;
END IF;
END;
/

24 Aralık 2008 Çarşamba

change SYSMAN password

When changed SYSMAN password  in database the Enterprise Manager doesn't care this case.

You have to change password manually.
you can apply following directions

1 - cd emoms.properties config file directory. open file your editor like vi.

cd $ORACLE_HOME/"hostname"_"SID"/sysman/config/

change  values hostname and SID your values for above command.

2-
change oracle.sysman.eml.mntr.emdRepPwdEncrypted   parameter to  FALSE
change oracle.sysman.eml.mntr.emdRepPwd to your SYSMAN password without encyrpted

save file

3-
emctl start dbconsole

4- check 
emoms.properties config file which has encrpyted password.

You can use your console.



22 Aralık 2008 Pazartesi

RMAN Tablespace Point-in-Time Recovery

RMAN Tablespace Point-in-Time Recovery (TSPITR) veritabanındaki bir tablespace' in belirli bir zamana dönülmesine olanak sağlan veri kurtarma seçeneklerinden biridir. TSPITR tablespace' de bulunan bütün datayı istediğimiz zamana dönecektir.

Bu işlem için gerekli olanlar;

- Veriyi kurtarmak istediğimiz zamandan önce alınmış ve cross-check yapılmış backup(full veya incremental)
- Backup alındıktan sonra Tablespace' i getirmek istediğimiz zamana kadar çıkan arşiv dosyaları
- İşlemi yapabilmek için gerekli disk alanı

Tablespce point-in-time recovery bir recovery işlemi olduğu için öncelikle mevcut tablespace üzerindeki tüm datayı ezecektir. Bu nedenle kesinti gerektirir ve tablespace üzerinde etkilenmesini istemediğimiz başka datamız varsa bunların da export ile bir yere yedeklenmesi gerekir. İşlem bittikten sonra export aldığımız kayıtlarımızı yeniden import edebiliriz.

Senaryo olarak şöyle bir örnek uygulabiliriz. Bir tablo drop edildi(purge dahil) ve tablesapce üzerinde başka bir tablo da yok. Bu durumda tabloyu kurtarmak için bu yöntemi uygulayabiliriz.

TSPITR iki şekilde uygulanabilir:
- uygulama veritabanı üzerinde canlı olarak
- Geçici bir instance üzerinde kurtarılmak istenen tablespace create edilerek. Bu durumda zorunlu tablespacelerin de (SYSTEM,UNDO) create edilmesi gerekir. Bu işlemi yapmak için datanın büyüklüğüne göre ekstra disk alanına ihtiyaç duyabiliriz.

1. yöntem uygulama veritabanı üzerinde çalışması nedeniyle ile riskli gelirse veya kesinti yapma şansınız yoksa 2. yöntemi rahatlıkla uygulabilirsiniz. Ben de kesinti yapamadığım için 2. yöntemi uygulamıştım.

Şimdi sırasıyla bu yöntemleri nasıl uygulabileceğimizi ve hazırlık için neler yapmamız gerektiğini anlatacağım.

Başlamadan önce her iki yöntem için ortak olan kısımlardan bahsedeyim.

Her iki yöntemde de AUX1 adından geçici bir instance create ediyoruz.
Bu instance uygulama veritabanından elde edilmiş bir pfile ile nomount olarak başlatılacak.

AUX1 instance için yapacaklarımız
- orapw dosyası hazırlamak.
- pfile hazırlamak.
- tns ve listener ayarlarını hazırlamak
- nomount olarak çalışır hale getirmek.

Hazırlıklarımızı yaptıktan sonra yöntemlerin kendine has kısımlarına geçebiliriz.

1. yöntem

Aşağıdaki script disk üzerinde alınmış bir backup için hazırlandı. Bu scripti kendi yedek şeklinize göre düzenleyebilirsiniz.

set ORACLE_SID=AUX1
Set NLS_DATE_FORMAT=MM/DD/YYYY HH24:MI:SS

connect target sys/oracle@orcl
connect auxiliary sys/oracle@aux1

run {
ALLOCATE AUXILIARY CHANNEL A1 TYPE DISK;
ALLOCATE CHANNEL c1 TYPE DISK;
recover tablespace tbs until time "TO_DATE('03/11/2008 17:19:29','DD/MM/YYYY HH24:MI:SS')";
}


Scripti çalıştırdığımızda RMAN sırayla şunları yapacak
- Geçici instance(AUX1) üzerinde ismini verdiğimiz tablespace ve gerekli olan tablespaceleri restore edecek.
- Geçici veritabanı istenilen tarihe kadar recover edilecek.
- Geçici veritabanı resetlogs ile açacak.
- Dönmek istediğimiz tablespace' in exportunu alacak.
- Dönmek istediğimiz tablespace' i uygulama veritabanına import edecek.


2. yöntem

Aşağıdaki parametreler datafileları rename etmeden devam edebilmemiz için gereklidir.Datafileları örnek scriptteki gibi rename edeceksek bu parametreleri eklememize gerek yok.


DB_FILE_NAME_CONVERT=("D:\oracle\product\10.2.0\oradata\orcl", "D:\oracle\product\10.2.0\oradata\AUX1")
LOG_FILE_NAME_CONVERT=("D:\oracle\product\10.2.0\oradata\orcl","D:\oracle\product\10.2.0\oradata\AUX1")


--------------------------------------------------

set ORACLE_SID=AUX1
Set NLS_DATE_FORMAT=MM/DD/YYYY HH24:MI:SS

rman connect /

run {
restore controlfile from 'D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\AUTOBACKUP\2008_11_03\O1_MF_N_669835169_4JY5N2DO_.BKP'
until time "TO_DATE('03/11/2008 17:19:29','DD/MM/YYYY HH24:MI:SS')";
}

sql "alter database mount clone database";

run {

ALLOCATE CHANNEL c1 TYPE DISK;

set until time "TO_DATE('03/11/2008 17:19:25','DD/MM/YYYY HH24:MI:SS')";

set newname for datafile 1 to 'D:\oracle\product\10.2.0\oradata\AUX1\system01.dbf';
set newname for datafile 2 to 'D:\oracle\product\10.2.0\oradata\AUX1\undotbs01.dbf';
set newname for datafile 3 to 'D:\oracle\product\10.2.0\oradata\AUX1\sysaux01.dbf';
set newname for datafile 5 to 'D:\oracle\product\10.2.0\oradata\AUX1\tbs01.dbf';

restore tablespace system, undotbs1, sysaux, tbs;

switch datafile all;

sql "alter database datafile 1,2,3,5 online";

recover database skip forever tablespace USERS;

sql "alter database rename file ''D:\oracle\product\10.1.0\oradata\orcl\REDO01.LOG'' to ''D:\oracle\product\10.2.0\oradata\AUX1\REDO01.LOG''";

sql "alter database rename file ''D:\oracle\product\10.1.0\oradata\orcl\REDO02.LOG'' to ''D:\oracle\product\10.2.0\oradata\AUX1\REDO02.LOG''";

sql "alter database rename file ''D:\oracle\product\10.1.0\oradata\orcl\REDO03.LOG'' to ''D:\oracle\product\10.2.0\oradata\AUX1\REDO03.LOG''";

release channel c1;
}

SQL> connect / as sysdba;
SQL> recover database until cancel using backup controlfile;


Bu aşamadan sonra yeni database resetlogs ile açarız ve istediğimiz tablespace hazır hale gelir.
Bundan sonra export ve import işlemlerini manuel yapmamız gerekir.

27 Şubat 2008 Çarşamba

EXP-00091: Exporting questionable statistics.

When exporting tables if raise an error like below

EXP-00091: Exporting questionable statistics.

cause : incomplete NLS_LANG character set between client and server.

solution : you must set NLS_LANG parameter client side which compatible to server character set.



query NLS_CHARACTERSET parameter of db

SQL> col value format a40 
SQL> select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET';

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET               AL32UTF8


You can set set NLS_LANG like below

set NLS_LANG=AMERICAN_AMERICA.AL32UTF8




Actually the important section of NLS_LANG is AL32UTF8. you can set your localization values before dot (.)
e.g:

set NLS_LANG=TURKISH_TURKEY.AL32UTF8









19 Eylül 2007 Çarşamba

Tanınmayan virüsleri nasıl tanırız

Diyelim ki bilgisayarınızda antivirüs programlarını bulamadığı bir virüs olduğunu düşünüyorsunuz.
kendinizce bazı dosyaları da buldunuz, fakat tanımlayamıyorsunuz. Bu durumda dosyanın ne olduğunu belirlemek gerek. Belki de bir sistem dosyasıdır da siz bilmiyorsunuzdur.
Her zaman lazım olabilir, lazım olmaması dileğiyle :)

Detaylı bilgi için

İngilizce ofis 2003 için türkçe yazım denetimi

C:\Program Files\Common Files\Microsoft Shared\PROOF altında
bu aşağıda adı yazılan 4 dosyayı atıp, word içinden default dil ayarlarını türkçe seçmeniz yeterli.
İngilizce ofis Türkçe dil denetimini de yapabilir hale geliyor. Dosya isimleri şöyle:

MSSP3TR.LEX
MSSP3TR.DLL
MSTH3TR.LEX
MSTH3TR.DLL

indirmek için buraya tıklayabilirsiniz.

Exchange 2003 üzerinde database ve log yönetimi

Exchange 2003 üzerinde log dosyaları oldukça büyük yerler tutabilir. Bu nedenle log fileların doğru olarak yapılandırılması gerekiyor.
Küçük boyuttaki bir sistem partitionı üzerinde büyüyen log dosyaları kısa sürede olmasa bile uzun vadede sorun yaşamamıza sebep olacaktır.
Bu nedenle log dosyalarının lokasyonlarını doğru olarak yapılandırmak gerekiyor.

Bu sorunu yaşamamak için uygulabileceğimiz bir kaç yöntem var.
Bunlardan biri circular logging.
Diğer yöntem ise mdbdata ve database klösürünün farklı ve daha büyük bir partitiona konumlandırılması ve sistem üzerinde full yedek alınması.

Circular logging ile ilgili detaylı açıklamayı buradan izleyebilirsiniz.

Exchange üzerinde database dosyası genelde farklı bir partionda konumlandırılır. Fakat log dosyaları bazen unutulabiliyor. Bu durumda çalışan bir sistemde log dosyalarının konumunun değiştirilmesi gerekir. Bu işlem hakkında detaylı açıklamayı yine buradan izlemeniz mümkün.
Burda dikkat edilecek husus taşıma aşamasında exchange servisinin çalışmaya devam etmesi ile birlikte kullanıcıları maillerine erişilemeyeceği.

6 Ağustos 2007 Pazartesi

TCMB üzerinden döviz kurlarını almak ASP.net 2.0

Asp.net 2.0 ile oluşturacağımız yeni projede dil olarak VB seçip default.aspx ve default.aspx.vb isimli dosyalarımızı oluşturuyoruz. Daha sonra default.aspx üzerine label1 ve label2 isimli kontrollerimizi ekliyoruz.
aşağıdaki kodu kod dosyasına kopyalıyoruz. Sonuç olarak c:\doviz.sql isimli dosyaya basit bir insert statement kaydedecektir. istersek scheduler tasks üzerinden bunu database'e insert edebiliriz. bu kod 1.1 için çalışmak üzere yazılmıştır biraz modifiye ettim o kadar.



Imports System
Imports System.IO
Imports System.Text
Partial Class Default2

Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Label1.Text = "insert into t_dovkur (dovkod, tarih, birim, doval, dovsat, efkal, efksat) values ("
Label1.Text += "'USD', '" + Today.Date + "', 1 ," + fnDovizKurlari(1, 1)
+ "," + fnDovizKurlari(1, 2) + " ," + fnDovizKurlari(1, 3) + ","
+ fnDovizKurlari(1, 4) +");"


Label2.Text = "insert into t_dovkur (dovkod, tarih, birim, doval, dovsat, efkal, efksat) values ("
Label2.Text += "'EUR', '" + Today.Date + "', 1 ," + fnDovizKurlari(2, 1)
+ "," + fnDovizKurlari(2, 2) + " ," + fnDovizKurlari(2, 3) + ","
+ fnDovizKurlari(2, 4) + '' );"



'Open a file for writing
Dim FILENAME As String = "c:\doviz.sql"

'Get a StreamReader class that can be used to read the file
Dim objStreamWriter As IO.StreamWriter
objStreamWriter = File.CreateText(FILENAME)

'Append the the end of the string, "A user viewed this demo at: "
'followed by the current date and time
objStreamWriter.WriteLine(Label1.Text)
objStreamWriter.WriteLine(Label2.Text)
'eger database icin gorevleyeceksek kullanabiliriz.
'objStreamWriter.WriteLine("Commit;")
'objStreamWriter.WriteLine("exit;")

'Close the stream
objStreamWriter.Close()

End Sub


Public Function fnDovizKurlari(ByVal strDoviz As String, ByVal strBicim As String)
Select Case strBicim
Case "1"
strBicim = "ForexBuying"
Case "2"
strBicim = "ForexSelling"
Case "3"
strBicim = "BanknoteBuying"
Case "4"
strBicim = "BanknoteSelling"
Case Else
strBicim = "ForexBuying"
End Select
Select Case strDoviz
Case "1"
strDoviz = "USD"
Case "2"
strDoviz = "EUR"
Case Else
strDoviz = "EUR"
End Select
Dim xmlOku As New System.Xml.XmlTextReader("http://www.tcmb.gov.tr/kurlar/today.xml")
Dim xmlBelge As New System.Xml.XmlDocument
xmlBelge.Load(xmlOku)
Dim xmlParca As System.Xml.XmlNodeList = xmlBelge.SelectNodes("/Tarih_Date/Currency[@Kod ='" + strDoviz + "']/" + strBicim)
Return xmlParca.Item(0).InnerXml.ToString
End Function

End Class

4 Ağustos 2007 Cumartesi

Oracle EM (Enterprise Manager) üzerinde export/import işlemindeki hata

Oracle EM üzerinde normal kullanıcı veya SYS kullanıcısının export/import işlemlerini yapabilmesi için Preferred Credential host username, password bilgilerini girmek gerekiyor. burda hosta ait kullanıcı ve şifreyi doğru girseniz de çalışmıyor. bunun için yapılması gerekenler şöyle :

You have to provide the 'Log on as a batch job' privilege:

1. Go to control panel/administrative tools
a. click on "local security policy"
b. click on "local policies"
c. click on "user rights assignments"
d. double click on "log on as a batch job"
e. click on "add" and add the user that was entered in the "normal username" or "privileged username" section of the EM Console.

2. Go to the Preferences link in the EM GUI
a. click on Preferred Credentials (link on the left menu)
b. under "Target Type: Host" click on "set credentials"
c. enter the OS user who has logon as a batch job privilege into the "normal username" and "normal password" fields

3. Test the connection
a. while in the Set Credentials window, click on "Test"


Aslında bu yöntemde Türkçe Windows XP Pro SP2 üzerinde çalışmadı. Dil ayarları English olduğu halde yine çalışmadı.

Çalıştırmayı başardığım andan Türkçe sistemde içinde uygun yöntemi paylaşacağım.

Ayrıntı bilgi ve diğer dillerdeki sonuçlar için :

http://www.orafaq.com/forum/t/45729/0/

http://forums.oracle.com/forums/thread.jspa?threadID=305172&start=45&tstart=0

Oracle10g, Enterprise Manager üzerinde normal kullanıcı logini

Oracle 10g üzerinde normal kullanıcıların EM (Enterprise Manager) üzerinde login olabilmesi için usera SELECT ANY DICTIONARY veya SELECT_CATALOG_ROLE yetkilerinden birinin verilmesi gerekir. aski halde user

"The application requires more database privileges than you have currently been granted"

şeklinde bir hata alacaktır. bu yetkiden sonra normal bir user EM' üzerinden login olabilir.

bununla birlikte bu yetkileri vermenin de ne kadar gerekli olduğunu düşünmek gerek.

http://www.orafaq.com/forum/t/85708/0/


3 Ağustos 2007 Cuma

Out of Office not enough memory hatası

Eğer Microsoft Office outlook üzerinde out of office' i aktif etmek isteğinizde
"Changes to the rule could not be saved. There is not enough memory or the rules are too complex, try deleting some rules."
böyle bir hata ile karşılaşırsanız. bunun nedeni kural eklerken kişi başına sınırlanmış 32 KB lık kural alanı sınırıdır. Bundan kurtulmak için silinmiş gibi görünen ama silinmeyen ve 32KB kıymetli alanımızı işgal eden kuralları tamamen silinmesi sağlamamız gerekiyor.

Server üzerinde bu alanda bulunanları görmek için microsfotun bir toolu var

Microsoft Exchange Server Information Store Viewer (MDBVU32)

http://www.microsoft.com/downloads/details.aspx?FamilyID=3D1C7482-4C6E-4EC5-983E-127100D71376&displaylang=en

ayrıca en kalıcı yöntem de outlook.exe yi /cleanrules parametresi ile açmak
böylece bütün kurallar siliniyor ve 32KB lik alan tamamen boşaltılıyor. tabiki bunu yapmadan önce kurallarınızı yedeklemeyi unutmayın.

kolay gelsin.

19 Temmuz 2007 Perşembe

Oracle, Ms Sql Farklılıkları (copy, insert)

Oracle ve MS-SQL dek bazı farklılıklar

Bir tablodaki tüm verileri veya bazı alanları başka bir tabloya aktarmak için

Oracle:

insert into table1 (select * from table2) ;

eğer tablo yapıları biribir aynı ise bu yapı çalışacaktır. Eğer tablo yapıları farklı ise alanları belirtelerek sql cümleciğini çalıştırabiliriz.

MS-SQL:

insert into table 1 select * from table2;

eğer alan belirlememiz gerekiyorsa

insert into table1 field1, field2 .. values select field1, field2 from table


Bir tabloyu verileriyle birlikte kopyalamak istiyorsak

Oracle
create table2 as select * from table1 where ...

MS-SQL
select * into table2 from table1 where ....