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

در این وبلاگ تجربیاتی که در حین کار بدست آورده ایم را به اشتراک خواهیم گذاشت

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

در این وبلاگ تجربیاتی که در حین کار بدست آورده ایم را به اشتراک خواهیم گذاشت

تجربیات کاری چند دوست
آخرین نظرات
  • ۱۶ مرداد ۹۸، ۰۱:۰۰ - علی جهان نما
    عالی بود

۸ مطلب با موضوع «Oracle Administration» ثبت شده است

ALTER TABLE...SPLIT PARTITION

۱۵
ارديبهشت

 

ALTER TABLE...SPLIT PARTITION

از دستور فوق برای تقسیم یک پارتیشن به دو پارتیشن استفاده می شود و محتویات پارتیشن اول را در دو پارتیشن جدید منتقل  می کند.این دستور فقط  در جداول حاوی range partition و list partition قابل استفاده است (و نمی توان برای hash partiotion استفاده کرد).فرم نوشتاری دستور به دو صورت است:

فرم اول جدول دارای range partition   را به دو پارتیشن تقسیم می کند:

 

ALTER TABLE table_name SPLIT PARTITION partition_name

  AT (range_part_value)

  INTO 

  (

    PARTITION new_part1

      [TABLESPACE tablespace_name],

    PARTITION new_part2 

      [TABLESPACE tablespace_name]

  );

 

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

 

 

ALTER TABLE table_name SPLIT PARTITION partition_name

  VALUES (value[, value]...) 

  INTO 

  (

    PARTITION new_part1

      [TABLESPACE tablespace_name],

    PARTITION new_part2 

      [TABLESPACE tablespace_name]

  );

 

مثال یک:

جدول sales را با سه پارتیشن ذیل در نظر بگیرید:

 

CREATE TABLE sales

  PARTITION europe VALUES('FRANCE', 'ITALY'),

  PARTITION asia VALUES('INDIA', 'PAKISTAN'),

(

  dept_no     number,  

  part_no     varchar2,

  country     varchar2(20),

  date        date,

  amount      number

)

PARTITION BY LIST(country)

(

  PARTITION americas VALUES('US', 'CANADA')

);

دستور زیر پارتیشن Americas را به دو پارتیشن us و Canada تقسیم می کند:

 

ALTER TABLE sales SPLIT PARTITION americas 

 VALUES ('US')

 INTO (PARTITION us, PARTITION canada);

 

 

مثال دو:

CREATE TABLE sales

(

  dept_no     number,

  part_no     varchar2,

  country     varchar2(20),

  date        date,

  amount      number

)

PARTITION BY RANGE(date)

(

  PARTITION q1_2012 

    VALUES LESS THAN('2012-Apr-01'),

  PARTITION q2_2012 

    VALUES LESS THAN('2012-Jul-01'),

  PARTITION q3_2012 

    VALUES LESS THAN('2012-Oct-01'),

  PARTITION q4_2012 

    VALUES LESS THAN('2013-Jan-01')

);

 

جدول از چهار پارتیشن زیر تشکیل شده است:

q1_2012, q2_2012, q3_2012, and q4_2012

 

دستور زیر q4_2012  را به دو پارتیشن  q4_2012_p1  و  q4_2012_p2 تقسیم می کند:

 

ALTER TABLE sales SPLIT PARTITION q4_2012

  AT ('15-Nov-2012')

  INTO 

  (

    PARTITION q4_2012_p1,

    PARTITION q4_2012_p2

  );

 

توجه : اگر tablespace جدیدی برای پارتیشنها تعریف نشود از tablespace پیش فرض استفاده می گردد.

 

 

 

 


  • حسین مومنی

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

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 استفاده می کنیم)


  • حسین مومنی

در اوراکل 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


  • صادق جوانمرد

تعداد  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

  • حسین مومنی
اکنون در اوراکل 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)


  • صادق جوانمرد


با سلام

این تصویر یکی از متداول ترین خطاهای محیط کنسول نسخه 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

  • حامد اسماعیلی