تجربیات کاری چند دوست



در موارد نادری مشاهده میشود که رابط گرافیکی لینوکس غیر فعال شده و با تغییر inittab و run level نیز مشکل رفع نمیشود . در این مواقع پس از Reboot سیستم با محیط زیر روبرو میشوید :

بعضی اوقات نیز بدلیل آپدیت ناقص این خطا بروز میکند. جهت رفع آن از دستور زیر استفاده کنید :

> yum groupinstall graphical-server-environment

> reboot



Kernel panic – not syncing: VFS: Unale to mount root fs on unknown-block(0.0)

kernel

دلیل بروز مشکل :

بروزرسانی ناقص Kernel و بقیه پکیج ها در هنگام استفاده از دستور yum update

شرح : در زمان Update  ، سرور دچار هنگی شده و پس از Reboot با پیغام بالا مواجه شدیم و امکان Boot با Kernel های قبلی نیز مقدور نبود .

راه حل :

در صفحه Boot بر روی Kernel قبلی کلیک کرده و Ctrl + E را بزنید . سپس طبق شکل زیر عمل نمایید :


سپس Ctrl + x را فشار دهید.

سیستم در حالت Rescue بالا می آید . سپس دستورات زیر را میزنیم :

# rpm –qa |grep kernel

# Yum remove newkernelname*

# Reboot

 

 


سلام خدمت دوستان

شاید برای خودتون یا همکارانتون پیش اومده باشه که به اشتباه یک پارتیشن را حذف کرده باشید . اگر آن پارتیشن محتوی دیتای مهمی باشه حتماً دچار استرس شدید خواهید شد !!

یکی از بهترین و سریعترین ابزارها که باهاش میتونید در کسری از دقیقه پارتیشن های لینوکسی و ویندوزی رو بطور کامل بازیابی کنید GParted نسخه Live هست که میتونید از این اینجا دانلود کنید . بهترین آموزشش هم اینجا ببینید.


در قسمت تنظیمات VM به دیسک شماره 2 مقدار 200 گیگ فضا اضافه میکنیم (فضای قبلی 35 گیگ بوده). اگر Editor مربوط به فضای دیسک در حالت غیرفعال باشد معمولاً بدلیل وجود snapshot میباشد . پس از حذف snapshot ها Editor های مربوطه فعال میشوند.


# lsblk


NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT

fd0             2:0    1     4K  0 disk

sda             8:0    0   110G  0 disk

sda1          8:1    0   953M  0 part /boot

sda2          8:2    0  47.3G  0 part

rhel-root 253:0    0 178.6G  0 lvm  /

rhel-swap 253:1    0   9.3G  0 lvm  [SWAP]

rhel-home 253:2    0 316.5G  0 lvm  /home

│ └─rhel-var  253:3    0 319.7G  0 lvm  /var

└─sda3          8:3    0  61.8G  0 part

  └─rhel-home 253:2    0 316.5G  0 lvm  /home

sdb             8:16   0   280G  0 disk

sdb1          8:17   0    80G  0 part

│ └─rhel-var  253:3    0 319.7G  0 lvm  /var

└─sdb2          8:18   0   200G  0 part

  └─rhel-var  253:3    0 319.7G  0 lvm  /var

sdc             8:32   0    35G  0 disk

└─sdc1          8:33   0    35G  0 part

  └─rhel-var  253:3    0 319.7G  0 lvm  /var

sdd             8:48   0   200G  0 disk

sdd1          8:49   0    50G  0 part

│ └─rhel-home 253:2    0 316.5G  0 lvm  /home

└─sdd2          8:50   0   150G  0 part

  └─rhel-root 253:0    0 178.6G  0 lvm  /

sde             8:64   0   200G  0 disk

└─sde1          8:65   0   200G  0 part

  └─rhel-home 253:2    0 316.5G  0 lvm  /home

sr0            11:0    1  1024M  0 rom

 

همانطور که مشاهده میکنید دیسک sdc هنوز فضای قبلی خود را نشان میدهد .

ادامه مطلب

select id,
       sum(decode(x, 1, cnt, 0)) c1,
       sum(decode(x, 2, cnt, 0)) c2,
       sum(decode(x, 3, cnt, 0)) c3,
       sum(decode(x, 4, cnt, 0)) c4
  from (select 1 id, 10 cnt, 1 x
          from dual
        union all
        select 2 id, 20 cnt, 2 x
          from dual
        union all
        select 3 id, 30 cnt, 3 x
          from dual
        union all
        select 4 id, 40 cnt, 4 x
          from dual
     )
 group by id order by id

ID   C1   C2   C3   C4

1    10    0    0    0
2    0    20    0    0
3    0    0    30    0
4    0    0    0    40



برای متوقف کردن یک job در حال اجرا در export data pump به دو روش زیر می توان عمل کرد:

1-ابتدا از view زیر وضعیت jobها به همراه نامشان را مشاهده کنید:

select * from dba_datapump_jobs

سپس job مورد نظر که در وضعیت executing می باشد را جستجو کنید.

SYS SYS_EXPORT_FULL_01 EXPORT FULL EXECUTING

پس از مشاهده job_name باید با دستور زیر وارد محیط export data pump شوید:

oracle@dbserver ~]$ expdp system/manager attach=SYS_EXPORT_FULL_01]

پس از مشاهده مشخصات باید job را بصورت زیر متوقف کنید:

Export> KILL_JOB
Are you sure you wish to stop this job ([yes]/no): yes
[oracle@dbserver ~]$
روش دیگر استفاده از دستور زیر در محیط sql است:

SQL> DECLARE
h1 NUMBER;
BEGIN
h1:=DBMS_DATAPUMP.ATTACH(‘SYS_EXPORT_FULL_01‘,’SYSTEM‘);
DBMS_DATAPUMP.STOP_JOB (h1,1,0);
END;
/


قبل از هر چیز به تعریف دو اصطلاح می پردازیم:

Distributed Transaction:تراکنشی که در سطح شبکه بین دو دیتابیس انجام می شود.

In-Doubt Transaction: تراکنش نیمه تمامی از نوع Distributed که وضعیت commit یا rollback آن مشخص نیست.

اگر چنین تراکنشی در دیتابیس انجام شود و به دلایلی نیمه تمام باقی بماند پس از اجرای مجدد آن هنگام COMMIT با سه خطای پی در پی به شرح زیر مواجه می شویم:

ora-02050: transaction  21.534654 rolled back,some remote DBs may be in-doubt

ora-02056: bad two phase command number rdonly from coord

ora-02063: preceding line from BANK

برای رفع مشکل می توانیم از دستورات ALTER SESSION ADVISE COMMIT یا ALTER SESSION ADVISE ROLLBACK قبل از کوئری خود استفاده کنیم.

مثال :

insert into SUPERIORCUSTS

 SELECT B.BRANCH_CODE BR,trunc(INSERT_SYSDATE) as INSERT_DATE,COUNT(*) as cnt

 FROM VC.ORGANIZATION A  JOIN RP.VW_CLIENT_INFO_BANK@REMOTE B  ON A.CIF = B.EXTERNAL_REF

 WHERE B.CLIENT_TYPE = 1 and trunc(INSERT_SYSDATE) = trunc(sysdate - 1) 

 GROUP BY B.BRANCH_CODE, trunc(INSERT_SYSDATE);   

commit; 

insert انجام می شود ولی بعد از commit خطاهای مذکور را دریافت می کنیم.کافیست قبل از اجرای مجدد کوئری فوق، یک یا دو بار دستور ALTER SESSION ADVISE COMMIT را اجرا کنیم.(یا چنانچه بخواهیم تغییرات حاصل از کوئری قبل را cancel کنیم بجای commit از rollback استفاده می کنیم)



ممکن است گاهی متوجه عملیات مرتب سازی (SORT) در دستورات خود نشوید.SORT معمولا در موارد زیر استفاده می شود:

  •       CREATE INDEX
  •       GROUP BY
  •       ORDER BY
  •       INTERSECT
  •       MINUS
  •       UNION
  •       DISTINCT
  •       Unindexed table joins
  •       Some correlated subqueries
 
ههدف شما می بایست همیشه کاهش یا حذف SORT در دستور SQL  باشد.استفاده از SORT در لایه application اتفاق می افتدبنابراین برنامه نویس باید به گونه ای دستورSQL  خود را بنویسد که از SORTهای ناخواسته جلوگیری شود.نکاتی در ذیل مطرح می شود که باید در کد ملاحظه کرد:

1-  از distinct اجتناب کنید مگر اینکه واقعا نیاز باشد.

2-  از UNION ALL به جای UNION استفاده شود مگر اینکه نیاز باشد رکوردهای مشابه حذف گردند.

3- سعی کنید از HASH JOIN بجای SORT_MERGE_JOIN استفاده شود.ضمنا استفاده از HINTها باعث می شود OPTIMIZER از INDEX HINT های مناسب استفاده کند تا از SORTها جلوگیری شود.مثلا cost based optimizer  از عملیات SORT اجتناب می کند وقتیکه FIRST_ROWS hint استفاده شود.

4-  از مناسبترین ایندکسها در کد خود استفاده کنید.

چنانچه در مانیتورینگ با مشکلاتی ناشی از SORT مواجه شدید افزایش مقدار پارامتر SORT_AREA_SIZE متناظر با میزان کل فضای حافظه قابل ملاحظه است.



برای بازگردانی اطلاعات در فرآیند ریکاوری Rman پس از دستور restore database  می توانیم از دستور Recover database until available redo استفاده کنیم که از ویژگیهای اوراکل نسخه 12 می باشد.در نسخه های قبل، پس از دستور recover database ممکن بود به دلیل مواجه شدن با مشکل، ریکاوری ناتمام بماند و مجبور بودیم به محیط sqlplus سوئیچ کرده و برای اتمام فرآیند از دستور recover database using backup controlfile until cancel استفاده کنیم ویا متناظر با archivefile دچار مشکل از عبارت until time و یا until sequence استفاده کنیم.اما در نسخه 12cR2 پس از اجرای دستور Recover database until available redo فرآیند ریکاوری بطور اتوماتیک تا آخرین log موجود انجام می شود و از بروز خطاهای RMAN-06053: unable to perform media recovery because of missing log و(بطور مثال) RMAN-06025: no backup of archived log for thread 1 with sequence 1 and starting SCN of 543788891 found to restore جلوگیری می شود.


در اوراکل 12c امکان ثبت رویدادنگاری از دستورات DDL وجود دارد ، البته این امکان در 11g نیز وجود داشت ولی در نسخه جدید رویدادنگاری ها جدای از alert log دخیره میشوند . با این امکان میتوان متوجه شد که چه تغییراتی توسط چه کسی و در چه زمانی بر روی پایگاه داده اعمال شده است . بزای فعالسازی این امکان باید پارامتر ENABLE_DDL_LOGGING را فعال کنیم ، این پارامتر میتواند در سطح دیتابیس یا سشن فعال شود . پس از فعال شدن این پارامتر تمام دستورات DDL در قالب یک فایل XML و یک لاگ فایل در مسیر  ORACLE_BASE/diag/rdbms/DBNAME/log|ddl$  ذخیره خواهند شد. یک فایل XML شامل اطلاعاتی نظیر دستور DDL ، آدرس IP ، زمان اجرا و . میباشد .

دستور فعال سازی DDL logging : 

ALTER SYSTEM|SESSION SET ENABLE_DDL_LOGGING=TRUE;

در صورت فعال سازی دستورات زیر رویدادنگاری خواهند شد :

CREATE|ALTER|DROP|TRUNCATE TABLE
DROP USER
CREATE|ALTER|DROP PACKAGE|FUNCTION|VIEW|SYNONYM|SEQUENC

بیشتر بخوانید :

enable_ddl_logging Tips in Oracle 11g



تا پیش از اوراکل 12 چنانچه بخواهید برای ستونی از یک جدول Defaul Value تعیین کنید، باید یک Trigger و Sequence ایجاد شود؛ تا هنگام Insert در جدول مورد نظر، Trigger  اجرا شود و با اضافه شدن  Sequnce،  مقدار آن در ستون مورد نظر قرار گیرد، مانند مثال زیر :

CREATE TABLE Person (
ID NUMBER(10) NOT NULL,
… );

ALTER TABLE departments ADD (
CONSTRAINT person_pk PRIMARY KEY (ID));

CREATE SEQUENCE person_seq START WITH 1;

CREATE OR REPLACE TRIGGER person_trgr
BEFORE INSERT ON Person
FOR EACH ROW

BEGIN
SELECT person_seq.NEXTVAL
INTO :new.id
FROM dual;
END;

ولی در اوراکل 12C نیازی به ساختن Trigger نیست و میتوان تنها با استفاده از Sequence برای ستون مورد نظر Default Value تعیین کرد. به عنوان مثال :

CREATE SEQUENCE person_seq;

CREATE TABLE Person (
ID NUMBER(10) DEFUALT person_seq.NEXTVAL,
… );


در نسخه های پیشین شما تحت هیچ شرایطی امکان تعریف چند ایندکس روی یک ستون یا یک مجموعه از ستونهای مشترک را نداشتید . اوراکل 12c R1 این امکان را به شرط متفاوت بودن نوع ایندکس ها فراهم کرده است . البته همچنان اوراکل فقط از یک ایندکس که اصطلاها به آن فعال یا آشکار -active/visible- گفته میشود استفاده خواهد کرد . در صورتی که بخواهید ایندکس های پنهان نیز به کار گرفته شوند باید مقدار پارامتر OPTIMIZER_USE_INVISIBLE_INDEXES را برابر true قرار دهید .

مثالی از ساخت ایندکس ها :

create index idx_person_1 on person(national_code,gender);
create bitmap index idx_peson_2 on person(national_code,gender) invisible;

بیشتر بخوانید :

Multiple Indexes on the Same Set of Columns in Oracle Database 12c Release 1



تعداد  Redolog های تولید شده به تفکیک ساعت


select to_char(first_time,'YYYY-MM-DD') day,

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'00',1,0)),'9999') "00",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'01',1,0)),'9999') "01",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'02',1,0)),'9999') "02",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'03',1,0)),'9999') "03",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'04',1,0)),'9999') "04",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'05',1,0)),'9999') "05",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'06',1,0)),'9999') "06",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'07',1,0)),'9999') "07",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'08',1,0)),'9999') "08",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'09',1,0)),'9999') "09",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'10',1,0)),'9999') "10",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'11',1,0)),'9999') "11",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'12',1,0)),'9999') "12",

ادامه مطلب

برای چک کردن corruption  در datafileها ،archivefileها ، controlfileها و spfile  می توانید از Rman استفاده نمایید.ضمنا می توانید مشخص کنید که یک backupset قابل restore می باشد یا خیر.دستور RMAN VALIDATE برای چک کردن موارد ذکر شده کاربرد دارد.

VALIDATE

BACKUP…VALIDATE

RESTORE…VALIDATE

طریقه استفاده از دستور به صورت زیر است:

Rman>validate database;

و برای اعتبارسنجی controlfile:

RMAN>validate current controlfile;

برای چک کردن آرشیو فایلها:

RMAN>validate archivelog all;

بصورت ترکیبی هم در دستور می توان چک کردن آیتمهای مختلف را بیان کرد:

RMAN>validate check logical database include current controlfile plus archivelog

ادامه مطلب

 

1- ابتدا Plan  های مربوط به کوئری مورد نظر را از طریق زیر می یابیم :

) select * from dba_sql_plan_baselines b where b.signature in

select s.exact_matching_signature from v$sql s where sql_id = '0p09g7ftbkmk0

(

2- سپس sql_handle و plan_name ای که از مرحله قبل بدست آمده، در دستور زیر قرار داده و آن را اجرا می کنیم :


set serveroutput on

declare

l_plans_dropped pls_integer;

begin

l_plans_dropped:=dbms_spm.drop_sql_plan_baseline(sql_handle => 'SQL_cfffc84dd93b2190',plan_name => 'SQL_PLAN_czzy89rcmq8ch9865aff3');

dbms_output.put_line(l_plans_dropped);

end;

/

 


هنگام اجرای export data pump در RAC database چنانچه از پارامتر cluster استفاده نکنیم مقدار پیش فرض آن که YES می باشد در هنگام اجرا لحاظ می گردد و به این معنی است که process مربوطه از تمامی instance های موجود در RAC جهت اجرای export  استفاده می کند.اگر این پارامتر را در دستور expdp خود بصورت cluster=no استفاده کنیم به این معنی است که فقط instance ی که دستور در آن اجرا شده است مورد استفاده قرار می گیرد و در برخی موارد مزیت آن جلوگیری از cluster wait می باشد.


اکنون در اوراکل 12c R1 امکان تعریف ستون های نامرئی -invisible columns- برای جداول  وجود دارد ، وفتی فیلد به عنوان یک ستون نامرئی تعریف میشود دیگر در نتایح جستجوهای عادی نمایش داده نخواهد شد و برای استفاده از این ستون ها باید بطور مستقیم به آن ها اشاره کرد.
 تعریف این ستون ها بسیار ساده است :
CREATE TABLE emp (eno number(6), ename name varchar2(40), sal number(9) INVISIBLE);
همینطور میتوان آن  را غیر فعال کرد :
ALTER TABLE emp MODIFY (sal visible);
 - در عبارت insert نیز باید صریحا به نام این ستون ها اشاره کرد.
 -  virtual column ها و  partition column ها نیز میتوانند به عنوان یک ستون
نامرئی تعریف شوند.
 - امکان استفاده از ستون ها
نامرئی در جداول موقت - temporary table - ، جداول خارجی - external tables - و جداول کلاستر - cluster table -  وجود ندارد .
 
بیشتر بخوانید :

Invisible Columns in Oracle Database 12c Release 1 (12.1)


در نسخه 12c R1 تغییر نام و جابجا کردن دیتافایل ها بسیار ساده تر شده است ، از این نسخه به بعد میتوان بدون ایجاد اختلال در عملکرد پایگاه داده و به صورت بر خط دیتافایل ها را تغییر نام داد یا جابجا کرد ، در طول مدتی که دیتافایل در حال انتقال است کاربر میتواند  query  و دستورات DML و DDL را اجرا کند . همینطور از این طریق میتوان دیتافایل ها را بین فصای ذخیره سازی ASM و غیر  ASM و بلعکس جا به جا کرد.

در این نسخه میتوان از دستور ALTER DATABASE MOVE DATAFILE برای انتقال دیتافایل استفاده کرد ، در ادامه چند مثال برای استفاده از آن ذکر شده است :

تغییر نام دیتافایل :

ALTER DATABASE MOVE DATAFILE '/u00/data/OLD_File.dbf'  TO '/u00/data/NEW_File.dbf';

انتقال دیتافایل به ASM :

ALTER DATABASE MOVE DATAFILE '/u00/data/FileToMove.dbf' TO '+DG_DATA';

انتقال دیتافایل بین دیسک گروپ های ASM :

 ALTER DATABASE MOVE DATAFILE '+DG_DATA/DBNAME/DATAFILE/File.dbf ' TO '+DG_DATA_02';

بازنویسی دیتافایل در صورتی که دیتافایلی به همان نام در مسیر جدید موجود باشد :

ALTER DATABASE MOVE DATAFILE '/u00/data/File.dbf' TO '/u00/data_new/File.dbf' REUSE;

کپی کردن دیتافایل به مسیر جدید بدون حذف دیتا فایل در مسیر قبلی :

ALTER DATABASE MOVE DATAFILE '/u00/data/File.dbf' TO '/u00/data_new/File.dbf' KEEP;


بیشتر بخوانید :

Online Move Datafile in Oracle Database 12c Release 1 (12.1)



گاهی ( مثلا در نبود Oracle Enterprise Manager ) نیاز به اجرای Sql tuning به صورت دستی می باشد؛ مراحل زیر عملیات Sql tuning را در خط فرمان نشان می دهد :

 1- ابتدا باید  sql_id کوئری مورد نظر را بیابید.

select sq.sql_id,sq.sql_text from v$sql sq where sq.sql_text like '%Your Query%';

یا

select sql_id from v$session where sid = x

 


2- در گام بعدی برای کوئری یک tuning task ایجاد می کنیم :

SET SERVEROUTPUT ON

declare

stmt_task VARCHAR2(40);

begin

tune_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => ' 5fktw7d0p8mut');

DBMS_OUTPUT.put_line('task_id: ' || tune_task);

end;

/

task_id: TASK_1042

ادامه مطلب

گاهی نیاز است برای بهبود سرعت پرس و جو ، بجای  select تو در تو از join استفاده کنیم.مثال زیر نمونه ای از این تبدیل می باشد:

 select *
FROM emp A
WHERE A.sal between 800 and 2000
AND A.deptno NOT IN
(SELECT B.deptno
FROM dept B
WHERE B.deptno = A.deptno
AND B.dname = 'sales');
//-----------------------------------
SELECT *
FROM emp A
left join dept B on B.deptno = A.deptno AND B.dname='sales'
WHERE A.sal between 800 and 2000
and B.dname is null


معرفی DRBD

Distributed Replicated Block Device یکی از ابزارهای مورد استفاده در سیستم عامل های بر پایه لینوکس است که از آن برای Sync کردن دائمی یا موقتی یک یا چند دیسک بین چند سیستم استفاده می شود.. DRBD مشابه RAID1 عمل می‌کند با این تفاوت که از بستر شبکه بهره گرفته شده است یعنی در هر زمان داده ها بر روی دو (یا چند) دیسک واقعی نوشته می‌شود و در صورت از دست دادن یکی از دیسک‌ها می‌توان از دیسک دیگر استفاده و به اطلاعات دسترسی پیدا نمود.کاربر اصلی DRBD  در سیستم‌های کلاسترینگ می باشد. همچنین میتوان برای سایت های DISASTER به عنوان روشی مطمئن در یکسان سازی دیتای دو سرور استفاده نمود. ( پیشنهاد می شود از این روش برای یکسان سازی Application ها و وب سرورهااستفاده شود و برای دیتابیس ها از روشهای مختص همان دیتابیس نظیر Active Data Guard در اوراکل  ، استفاده شود )

ادامه مطلب


با سلام

این تصویر یکی از متداول ترین خطاهای محیط کنسول نسخه 11g میباشد . جهت رفع این خطا مراحل زیر را طی کنید:

1- در ایتدا از درست تنظیم شدن environmental setting از جمله ORACLE_HOME, $ORACLE_SID , $ORACLE_BASE$  اطمینان حاصل کنید . در محیط ویدوز این تنظیمات در قسمت  Environment Variables و در لینوکس داخل Bash_Profile قرار میگیرند.

2- دسترسی کاربر اوراکل به مسیر کامل App را چک نمایید . در محیط ویندوز کاربر عضو Ora_Dba به کل مسیر پوشه App دسترسی داشته و همچنین Owner آن تعریف شود.

3- اطمینان حاصل کنید که کاربرهای DBSNMP و SYSMAN در وضعیت Lock قرار نداشته باشند.

4- تنظیمات Regional and timezone settings را چک کنید . یک نمونه از تنظیمات صحیح به شکل زیر میباشد.


پس از کنترل و تنظیم نمودن موارد ذکر شده سیستم را یکبار Reboot کنید.

در بیشتر مواقع با انجام تنظیمات بالا مشکل رفع میگردد . در صورت عدم رفع میبایست OEM Reposiroty را با دستورات زیر یکبار حذف و دوباره نصب کنید.


emca -deconfig dbcontrol db -repos drop

emca -config dbcontrol db -repos create


در صورتی که یکی از دستورات insert,delete,update را در محیط sqlplus بزنید و بدون commit از محیط exit کنید ، بطور اتوماتیک commit انجام میشود . جهت غیرفعالسازی این امکان مراحل زیر را انجام دهید.

در صورت بستن پنجره Sqlplus پروسه به PMON سپرده شده و تراکنش Rollback میگردد.



SQL> show exitcommit
exitcommit ON
SQL> delete from dept where deptno=30;
1 row deleted.
SQL> exit;
$sqlplus scott/tiger
SQL> select * from dept where deptno=30;
0 row.
**********
SQL> set exitcommit off
SQL> show exitcommit
exitcommit OFF
SQL> delete from dept where deptno=30;
1 row deleted.
SQL> exit;
$sqlplus scott/tiger
SQL> select * from dept where deptno=30;;
DEPTNO DNAME LOC
---------- -------------- -------------
30 SALES CHICAGO


سوال ) تفاوت In/Not In و Exists/Not Exists در چیست ؟ کدامیک سریع تر هستند ؟ 

 

    الف) تفاوت در نتیجه

 همیشه Not In و  Not Exists شبیه هم نیستند و ممکن است پاسخ های متفاوتی داشته باشند .

 (مثال ۱ ) به طور مثال :

select count(*) from emp 
where empno not in ( select mgr from emp ); 

COUNT(*) 
---------- 
0 

این پاسخ به ما میگوید که همه مدیر هستند . 


حال به پرس و جوی زیر دقت کنید :

select count(*) from emp T1 
where not exists ( select null from emp T2 where t2.mgr = t1.empno ); 

COUNT(*) 
---------- 

ولی این پاسخ نشان میدهد ۹ نفر مدیر نیستند! 

ادامه مطلب

یکی از بهترین روشها برای مشاهده مقادیر Bind Variable ها استفاده از ابزار TOAD میباشد.
بدین منظور مراحل زیر را طی نمایید :

DATABASE --> MONITOR --> SGA Trace/Optimization

پس از ورود به این ابزار و مشاهده لیست کوئری های اجرا شده در SGA میتوان با انتخاب گزینه Substitute values for bind variables if possible مقادیر مذکور را مشاهده نمود. این گزینه از نسخه 10 به Toad اضافه شده است. لازم به توضیح است این روش برای کوئری های ORM جواب نمیدهد و برای آنها باید از روش زیر استفاده کنید.

چنانچه نرم افزار Toad در دسترس نباشد و یا کوئری ها از نوع ORM باشند میتوانید از کوئری زیر استفاده کنید:
SET PAUSE ON
SET PAUSE 'Press Return to Continue'
SET PAGESIZE 60
SET LINESIZE 300
 
COLUMN sql_text FORMAT A120
COLUMN sql_id FORMAT A13
COLUMN bind_name FORMAT A10
COLUMN bind_value FORMAT A26
 
SELECT 
  sql_id,
  t.sql_text sql_text,  
  b.name bind_name,
  b.value_string bind_value 
FROM
  v$sql t 
JOIN
  v$sql_bind_capture b  using (sql_id)
WHERE
  b.value_string is not null  
AND
  sql_id='&sqlid'
/


مثال 1 : فرض کنید 1000000 کارمند وجود دارند و از بین آنها میخواهیم فردی را انتخاب کنیم که دارای حقوق 20 میلیون تومان میباشد . در صورتی که تنها یک نفر این حقوق را دریافت کند ،

Selectivity ما برابر با 1  تقسیم بر 1000000 میباشد که بسیار نزدیک به صفر است .

Cardinality برابر است با تعداد کل رکورد ها ضربدر Selectivity .

در این مثال Cardinality=1 میباشد.

;Select * from Employee where salary=20000000

ادامه مطلب

1- اگر در محیط عملیاتی اقدام به ساخت ایندکس میکنید حتما از حالت Online استفاده کنید تا کاربران دچار Lock Conflict نشوند . همچنین جهت تسریع در ساخت ایندکس میتوان درجه Parallel را تنظیم نمود(معمولاً بیش از 8 توصیه نمیشود).دقت شود که پس از ساخت ایندکس حتما Degree آن برداشته شود .

2- سعی کنید TBS محل ذخیره ایندکس ها جدا از TBS دیتاها باشد.
3- در صورت امکان دیتافایلهای محل ذخیره ایندکس ها را بر روی هارد های
SSD قرار دهید . تا کمترین Latency را در I/O داشته باشید.

ادامه مطلب

گاهی اوقات نیاز است به دلایل امنیتی ارتباط بین دیتابیس و نرم افزار را رمز نگاری کرد . یکی از بهترین روشها استفاده از SSL در ارتباطات TNS و LISTENER است . در این مقاله به پیاده سازی این راهکار خواهیم پرداخت.


با دنبال کردن مراحل زیر میتوان ارتباط بین برنامه و دیتابیس را ایجاد کرد:

در این مستند فرض را بر این گرفته که server با نام ol7-121.localdomain بوده و client یک سیستم ویندوزی با نام "my-computer" میباشد و oracle client بر روی آن نصب میباشد.

 

ایجاد wallet بر روی سرور:

1-    ساخت wallet بصورت auto_login بر روی سرور

 

$ mkdir -p /u01/app/oracle/wallet

 

$ orapki wallet create -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -auto_login_local

 

2-    ساخت certificate بصورت self-signed  و load به wallet

$  orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -dn "CN=`hostname`" -keysize 1024 -self_signed -validity 3650

ادامه مطلب

برای exclude  نمودن جداول در صورتی که تعداد جداول کم است ونیازی به ایجاد parfile  نیست میتوانید برای سیستم عامل ویندوز از الگوی زیر استفاده نمایید.

EXCLUDE=TABLE:\"IN (\'NEWATTACHMENT\'',\'NEWLOG\')\"

 برای سیستم عامل لینوکس از الگوی زیر استفاده نمایید.

EXCLUDE=TABLE:\""IN \(\'BC_CONTENT\',\'INF_CONTENT\'\)\""

نام جداول حتماً باید با حروف بزرگ نوشته شوند

 ASMبه عنوان جایگزین مستقیم برای RAID در نظر گرفته نمیشود، اگرچه با ASM Mirroring عملکرد مشابهی به وجود خواهد آمد. این موضوع به شدت به نیازهای شما، بودجه شما، پیکربندی فعلی دیسکهای شما و راحتی در مدیریت هرکدام وابسته است.

برای بیان نکات کلیدی به صورت کاملا ساده شما میتوانید کلا 4 پیکره بندی مختلف پیاده سازی بکنید:

(ASM (External Redundancy) and Disk (non-RAID

در صورتی که تعهد حداکثر پایداری برای سیستمی داده اید، بهتر است از این پیکره بندی استفاده نکنید. در صورتی که ASM بر رویExternal تنظیم شود و هیچ Redundancy نرم افزاری نیز وجود نداشته باشد و دیسکها نیز عضو RAID نباشند، از بین رفتن هر دیسکی منجر به از دست رفتن دیتا از ASM Diskgroup میشود. (نگارنده اشاره کرده است که این حالت را حتی در محیط تستی نیز پیاده نمیکند اما به هر حال این حالت ممکن است)

(ASM (Normal/High Redundancy) and Disk (non-RAID

به DBA اجازه میدهد تا Failure Groupها و File Protection‌ را به کمک ASM مدیریت کند که این موضوع میتواند در شرایطی که سازمان مدیریت SAN‌ ندارد دارایی با ارزشی باشد، اما به هر حال DBA مسئول پیکره بندی صحیح برای جلوگیری از قطعی سیستم در حین failureها و از آن مهمتر مسئول پایش failure groupها برای اطمینان از وجود فضای کافی برای failureهاست.

 بار mirorring دست نرم افزار و به تبع آن پردازشگر سرورهاست.

 از دست رفت دیسک به ASM (و همچنین پیکره بندی Diskgroup/File Protection مناسبوابسته است و امکان پردازش متوالی/بدون قطعی وجود دارد. (با این فرض که Failure Group‌ روی همان دستگاه فیزیکی وجود ندارد.)

 میتوان از ظرفیت ماکزیمم استفاده نمود و وما I/O زیاد نمیشود.

ادامه مطلب

صورت مسئله :

بدلیل حساس بودن دیتای موجود در یک ستون خاص ، میخواهیم کاری کنیم که در صورتی که تنها کاربران دارای مجوز مشاهده آن ستون به دیتابیس لاگین نمودند توانایی دیدن محتوای ستون مورد نظر را داشته باشند .

مراحل کار :

1- ایجاد یک تابع جهت تعریف کاربران مجاز

create or replace function VPD( p_owner in varchar2, p_name in varchar2 ) return varchar2
    as
    begin
            if sys_context( 'userenv', 'session_user' ) in( 'user1','user2') --and SYS_CONTEXT('USERENV','HOST')in('DOMAIN\TESTPC','hamed')
            and sys_context('userenv','ip_address') in ('192.168.1.10','192.168.1.20')
            then
                    return NULL;
            else
                   return '1=0';
            end if;
   end;
   /
ادامه مطلب

گاهی اوقات نیاز است که کاربر نتواند اقدام به ALTER نمودن جداول نماید . در مثال زیر تمامی دسترسیهای کاربر به جز دستور TRUNCATE گرفته میشود.

CREATE OR REPLACE TRIGGER TEST.DDLTrigger
  BEFORE DDL ON schema
BEGIN
  if (ora_sysevent = 'TRUNCATE') then
    null; -- I do not care about truncate
  else
    raise_application_error(-20000, 'YOU CAN NOT DO DDL!');
  end if;
END;

ادامه مطلب

تبلیغات

محل تبلیغات شما

آخرین مطالب

محل تبلیغات شما محل تبلیغات شما

آخرین وبلاگ ها

آخرین جستجو ها

Fashion معرفی لینک و تبلیغات سایت مذهبی !گمنامم موفق باش Carlos good گردشگری نگاه