انجام عملیات redefinition در یک مرحله با کمک پروسیجر REDEF_TABLE (اوراکل 12c)

همانطور که می دانید در اوراکل 11g، برای هرگونه استفاده از بسته DBMS_REDEFINITION باید مراحلی را طی نمود و انجام عملیات در یک گام امکان پذیر نمی باشد.

در اوراکل نسخه 12c، پروسیجر جدیدی به نام REDEF_TABLE به بسته DBMS_REDEFINITION اضافه شده است که از طریق ان می توان عملیاتی نظیر جابجایی انلاین و تغییر tablespace جداول و همچنین تغییر نوع فشرده سازی جداول و ایندکسها را صرفا در یک مرحله انجام داد.

(بیشتر…)

پارامتر dml_lock_timeout در بسته DBMS_REDEFINITION(اوراکل 12c)

همانطور که می دانید، در زمان  اجرای پروسیجر FINISH_REDEF_TABLE، باید برای مدت زمان کوتاهی جدول به صورت exclusive قفل شود تا اجرای پروسیجر با موفقیت خاتمه یابد در غیر این صورت، اجرای این پروسیجر تا اتمام تراکنشهایی دیگری که بر روی جدول در حال اجرا هستند، متوقف و در حالت انتطار باقی خواهد ماند:

(بیشتر…)

مشاهده پیشرفت عملیات REDEFINITION با کمک ویوی V$ONLINE_REDEF

در اوراکل نسخه 12c، با کمک ویوی V$ONLINE_REDEF می توان روند پیشرفت عملیات REDEFINITION را به صورت انلاین دنبال کرد:

SQL> exec DBMS_REDEFINITION.REDEF_TABLE(‘USEF’,’MYTBL’,’ROW STORE COMPRESS ADVANCED’);

SQL> select ORIGINAL_TABLE_NAME,INTERIM_TABLE_NAME,OPERATION,SUBOPERATION,PROGRESS from V$ONLINE_REDEF ;

نکاتی در مورد نامگذاری اشیا در اوراکل

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

نکته 1: اشیاهای زیر namespace مختص به خود را دارند و امکان تکرار اسامی در بین این objectها وجود دارد:

Indexe – Constraint –  Cluster – Database trigger – Private database link – Dimension

مثال: با اجرای دستورات زیر، constraint و database link همنامی را ایجاد می کنیم:

SQL> alter table TBL1  add constraint name1 primary key (FILE#);

Table altered

SQL> create database link name1 connect to usef identified by pa using ‘mydb’;

Database link created

همچنین objectهای زیر namespace مشترکی دارند و تکرار اسامی در بین آنها، امکان پذیر نمی باشد:

TableView – SequencePrivate synonym Stand-alone procedure – Stand-alone stored function – Package – Materialized view – User-defined type

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

SQL> create table v1 as select * from v$datafile;

Table created

SQL> create view v1 as select * from dual;

ORA-00955: name is already used by an existing object

(بیشتر…)

مخاطرات اهدای مجوز create any job به کاربران

با اهدای مجوز سیستمی create any job به یک کاربر، آن کاربر می تواند بدون اطلاع کاربران دیگر، برای آنها جاب ایجاد کند که در این صورت، کاربری که جاب را ایجاد می کند، creator و کاربری که جاب برای آن ایجاد می شود، owner نامیده می شود.

جاب ایجاد شده با مجوز owner اجرا می شود این مسئله به creator این امکان را می دهد تا با ایجاد جاب برای کاربران با سطح دسترسی بالا، مجوزی را برای خود اخذ کنند.

(بیشتر…)

بررسی تغییرات dbms_job در اوراکل 19c

تا قبل از اوراکل نسخه 10g، برای ایجاد جاب در محیط دیتابیس، از بسته dbms_job استفاده می شد در نسخه 10g بهبودی در این زمینه ایجاد شد و اوراکل با ارائه بسته dbms_scheduler، بسیاری از نقاط ضعف dbms_job را پوشش داد و عملا استفاده از این بسته را به حداقل رساند.

اما با این حال، کاربران می توانند کماکان از این بسته(dbms_job) برای تعریف جاب جدید و یا مدیریت جابهای قبلی(جابهای ایجاد شده در نسخه های قدیمی تر) استفاده کنند و حتی اوراکل هم برای زمانبندی بعضی از کارها، از همین بسته استفاده می کند.

(بیشتر…)

pin کردن object در shared pool

می دانیم که shared pool فرم پارس شده دستورات sql و pl/sql را در صورت دارا بودن فضای کافی در خود نگهداری می کند و نسخه قابل اجرای دستورات، در این قسمت از حافظه باقی خواهند ماند تا در صورت اجرای مکرر یک دستور، از کامپایل مجدد آن و یا به بیانی دقیق تر، از انجام عملیات hard pars جلوگیری شود.

فرض کنید به دلایلی چون عدم استفاده از bind variable در قسمتی از برنامه، فضای خالی ای در shared pool باقی نمانده است در این صورت، اوراکل فرمهای پارس شده را بر اساس الگوریتم LRU از حافظه خارج خواهد کرد این مسئله ممکن است سبب age out شدن objectهای سیستمی و یا applicationای شود که به کررات مورد دستیابی قرار می گیرند.

با در نظر داشتن این مسئله، قصد داریم به این سوال پاسخ دهیم که چگونه می توان این objectها را در shared pool سنجاق کرد تا الگوریتم LRU نتواند آنها را برای خروج از shared pool انتخاب کند.

(بیشتر…)

اوراکل 12c – جابجایی ترتیب قرارگیری ستونهای یک جدول

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

SQL> create table mytbl(id number,name varchar2(9),age number);

Table created

بعد از مدتی تصمیم گرفته ایم تا به این جدول، ستونی را با عنوان last_name اضافه کنیم:

SQL> ALTER TABLE mytbl ADD (last_name varchar2(9));

Table altered

ستون last_name  به لحاظ ترتیب قرار گیری بصورت پیش فرض، به عنوان آخرین ستون این جدول در انتهای لیست ستونها قرار می گیرد:

SQL> desc mytbl;

Name      Type        Nullable

——— ———– ——–

ID        NUMBER      Y                        

NAME      VARCHAR2(9) Y                        

AGE       NUMBER      Y                        

LAST_NAME VARCHAR2(9) Y 

قصد داریم ستونهای AGE و LAST_NAME را به لحاظ ترتیب منطقی قرارگیری در جدول با هم جابجا کنیم، برای این کار می توانیم از دستور ALTER TABLE .. MODIFY(COLUMN_NAME INVISIBLE) که در اوراکل 12c ارائه شد، استفاده کنیم. در قسمت زیر، نحوه انجام این کار را مشاهده می کنید:

SQL> ALTER TABLE mytbl MODIFY (LAST_NAME INVISIBLE,AGE INVISIBLE);

Table altered

SQL> ALTER TABLE mytbl MODIFY (LAST_NAME VISIBLE,AGE VISIBLE);

Table altered

SQL> desc mytbl;

Name      Type        Nullable Default Comments

——— ———– ——– ——- ——–

ID        NUMBER      Y                        

NAME      VARCHAR2(9) Y                        

LAST_NAME VARCHAR2(9) Y                        

AGE       NUMBER      Y    

(بیشتر…)

بهبودهای EZconnect در اوراکل 19c

زمانی که از پروتکل tcp/ip برای برقراری ارتباط با یک دیتابیس اوراکل استفاده می کنیم، اتصال به روش Easy Connect در مواردی می تواند جایگزین مناسبی برای فایل tnsnames.ora باشد. ساختار کلی Easy Connect تا قبل از اوراکل نسخه 19c، به صورت زیر می باشد:

host[:port][/service_name]

(بیشتر…)

اهدای مجوز insert و update در سطح ستون

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

دستور grant در مثال زیر، مجوز اجرای دستور update بر روی ستونهای name و last_name از جدول sys.mytbl را به کاربر usef اهدا می کند:

SQL> create table sys.mytbl(id number,name varchar2(9),last_name varchar2(9));

Table created

SQL> insert into sys.mytbl values(1,’vahid’,’usefzadeh’);

1 row inserted

SQL> commit;

Commit complete

SQL> grant update(name,last_name) on mytbl to usef;

Grant succeeded

(بیشتر…)