دیتابیس اوراکل

دیتابیس اوراکل
طبقه بندی موضوعی

تغییر پسورد user یک دیتابیس دیگر با استفاده از db link

اگر بخواهیم پسورد یک user را که در دیتابیس دیگری قرار دارد با استفاده از database link تغییر دهیم ، میتوانیم از پروسیجر زیر برای انجام این کار استفاده کنیم.


create or replace procedure change_pass_prc authid current_user as

begin

  cursor usr_cur is

    select username from dba_users@pass_link;

  begin

    for usr_rec in usr_cur loop

      if usr_rec.username = 'USR1' then

        declare

          job binary_integer;

        begin

          dbms_job.submit@pass_link(job,'begin execute immediate ''alter user ' || usr_rec.username ||

                                                             ' identified by "USR1" ''; end;');

          commit;

        end;

        dbms_output.put_line(usr_rec.username || ' password changed.');

      end if;

    end loop; 

  when

  exception when others then 

     raise_application_error(-20000,sqlerrm);

end change_pass_prc;



غیر فعال شدن Flashback Database به صورت اتوماتیک

امروز وقتی خواستم به یک restore point که قبلا ایجاد کرده بودم flashback کنم به خطای زیر برخورد کردم :

 ORA-38729 signalled during: flashback pluggable database PDB_RDB1 to restore point RESTORE_POINT_PDB_RDB1_20180617125947

 

بعد وقتی چک کردم دیدم flashback database به صورت اتوماتیک غیرفعال شده است :

SQL> select flashback_on from v$database

FLASHBACK_ON

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

NO

بعد از گشتن در docها مختلف متوجه شدم که اگر اوراکل برای نوشتن flashback logها در مسیر FRA به مشکل I/O برخورد کند ، برای جلوگیری از hang کردن دیتابیس ، flashback را به صورت اتوماتیک disable میکند :

:If no guaranteed restore points are defined, then the instance remains unaffected when RVWR encounters I/O errors. Note the following cases

·      On a primary database, Oracle Database automatically disables Flashback Database while the database is open. All existing transactions and queries proceed unaffected. This behavior is expected for both single-instance and Oracle RAC databases


خطایی که موقع disable کردن flashback در alert log  نوشته شده بود به صورت زیر است :

ORA-38886: WARNING: Flashback database was disabled due to error when writing flashback database logs.

ORA-38701: Flashback database log 10 seq 12 thread 1: "/shst/fra/flashback/o1_mf_fjpbmf8r_.flb"

ORA-27072: File I/O error

 

· منابع 

https://docs.oracle.com/database/121/BRADV/flashdb.htm#BRADV601

https://jhdba.wordpress.com/2010/01/06/flashback-disabled-automatically-a-minor-rant

https://easyoradba.com/2010/05/20/ora-38701-flashback-database-log-seq-thread

 

flashback_pkg

من قصد دارم یک پکیج بنویسم که با اون بشه کارهای مختلف در رابطه با flashback رو انجام داد، به مرور زمان سعی میکنم این پکیج را کامل میکنم.

این اسکریپت در حال حاضر کارهای زیر را انجام میدهد:

1- ایجاد کردن restore point برای تمامی PDBهای یک root container

set serveroutput on; 

exec userA.create_restore_point_for_all_pdb_prc;


2- ایجاد کردن restore point برای یک PDB خاص

set serveroutput on; 

exec userA.flashback_pkg.create_restore_point_for_spec_pdb_prc('PDB_NAME');


3- انجام flashback در سطح PDB

set serveroutput on;

exec userA.flashback_pkg.flashback_pdb_prc('PDB_NAME','RESTORE_POINT_NAME');


4- بدست آوردن زمان flashback retention

select userA.flashback_pkg.get_flashback_retention_prc from dual;


flashback_pkg script


خطای ORA-38754 هنگام flashback database

در دیتابیس 12c ، اگر هنگام flashback  در یک PDB به یک restore point که قبلا ایجاد شده است به error زیر برخورد کردید :

ERROR at line 1:

ORA-38754: FLASHBACK DATABASE not started; required redo log is not available

ORA-38762: redo logs needed for SCN 1251365490 to SCN 1251403027

ORA-38761: redo log sequence 905 in thread 1, incarnation 1 could not be accessed

 

به این دلیل است که log archiveهایی که برای ریکاور کردن احتیاج دارد در مسیر FRA پیدا نمیکند. برای حل این مشکل باید ابتدا اگر بکاپی از آرشیوها دارید restore نمایید و مجددا flashback  را انجام دهید.

rman target /

RMAN> restore archivelog from sequence 904 ;

SQL> alter pluggable database PDB1 close immediate;

SQL> flashback pluggable database PDB1 to restore point PDB1_20180214;

SQL> alter pluggable database PDB1 open resetlogs;

تبدیل Dump File به دستورات DDL

برای تبدیل یک dumpfile به دستورات DDL میتوانیم از  sqlfile در import استفاده کنیم.


impdp system@rdb_pdb1 directory=datapump_dir dumpfile=test1.dmp logfile=test1.log remap_schema=test1:testddl sqlfile=test.sql


خروجی آن به شکل زیر است:


خروحی ddl



optimizer_unnest_scalar_sq_

از اوراکل 12c به بعد ، CBO میتواند بعضی از انواع scalar subqueryها را به صورت internally به outer joinها تبدیل کند. که این ویژگی با یکی از hidden parameterها بنام optimizer_unnest_scalar_sq_ کنترل میشود که مقدار آن به صورت پیش فرض به true ست شده است . این که این ویژگی جدید باعث بهینه تر شدن کوئری های شما میشود یا اوضاع آنها را بدتر میکند کاملا به شرایط سایت شما و کوئری هایی که اجرا میکنید بستگی دارد.

فقط باید این نکته را درنظر بگیرید که این ویژگی در همه موارد برای scalar subqueryها کار نمیکند. یعنی CBO در بعضی موارد ، حتی با وجود اینکه مقدار این پارامتر به true ست شده است ، scalar subqueryها را به join تبدیل نمیکند.


نکته) با استفاده از کوئری زیر، میتوانید مقدار پیش فرض hidden parameterها را در دیتابیس مشاهده کنید.

 select ksppinm, ksppstvl

  from x$ksppi a, x$ksppsv b

where a.indx=b.indx

    and ksppinm = '_optimizer_unnest_scalar_sq';



به مثال های زیر که در هر دو حالت true و false بودن این پارامتر اجرا شده است توجه نمایید:


مثال 1 :


_optimizer_unnest_scalar_sq_1_

_optimizer_unnest_scalar_sq_2_


Final query after CBO transformations :

_optimizer_unnest_scalar_sq_3_



مثال 2 :

_optimizer_unnest_scalar_sq_4_


_optimizer_unnest_scalar_sq_5_


Final query after CBO transformations :

_optimizer_unnest_scalar_sq_6_


n منابع 

اوراکل دیتاگارد

Oracle Data Guard


· Oracle Data Guard Overview

Oracle Data Guard یکی از optionهای Oracle Database Enterprise Edition است که نیاز به نصب و لایسنس جداگانه ندارد. (برای اولین بار در اوراکل 9i معرفی شد ).


پیکربندی دیتاگارد در واقع شامل  دو بخش کلی میشود :

1- دیتابیس production یا primary : دیتابیسی که بوسیله بیشتر اپلیکیشن ها قابل دسترسی است . دیتابیس اصلی میتواند RAC باشد یا Single Instance .

2- دیتابیس یا دیتابیس های استندبای : در واقع یک کپی از دیتابیس اصلی است. همانند دیتابیس اصلی ، دیتابیس استندبای هم میتواند RAC باشد یا Single Instance . با استفاده از بکاپ دیتابیس اصلی شما میتوانید تا حداکثر 30 دیتابیس استندبای ( در 11gr2 ) ایجاد کنید.

دیتابیس ها در پیکربندی Data Guard  با استفاده از Oracle Net به هم متصل میشوند . هیچ محدودیتی از این جهت که دیتابیس ها کجا میتوانند باشند وجود ندارد، مثلا شما میتوانید یک استندبای را روی همان سیستمی کانفیگ کنید که دیتابیس اصلی قرار دارد و استندبای دیگر را روی سیستمی که از لحاظ جغرافیایی در فاصله ای دورتر از دیتابیس اصلی قرار دارد.

 

استفاده از sequence در قسمت DEFAULT ستون یک جدول

یکی از مواردی که همواره در پایگاه داده ها مطرح است پرشدن یک ستون با استفاده از اعداد پشت سر هم است . در این خصوص راه کارهای زیادی در پایگاه داده اوراکل وجود دارد که یکی از آنها استفاده از sequence می باشد، در نسخه های قبل از 12C برای پر کردن ستون ها به وسیله sequence یا باید موقع وارد کردن رکورد از nextval استفاده کرد و یا با استفاده از trigger اینکار را انجام داد. در نسخه 12C این امکان وجود دارد که از sequence وتابع nextval در قسمت default ستون استفاده شود.


;create sequence test_seq


create table my_tab

(

, id number default test_seq.nextval

  (name varchar2(20

;(


;('insert into my_tab (name) values('aaaa

;commit


;select * from my_tab

                ID   NAME

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

        1aaaa


HugePage

وقتی که یک پروسس میخواهد از memory استفاده کند ، CPU  یک تکه از RAM را به آن اختصاص میدهد. در واقع CPU به اندازه یک  4k bytes ) chunk ) حافظه را به پروسس اختصاص میدهد. هر یک از اون chunkها یک page نامیده میشوند.

 

از اونجایی که آدرس فضایی که به یک پروسس اختصاص داده میشود ( همان pageها )  به صورت virtual است ، CPU و OS مجبور هستند که به خاطر بسپارند که هر page به چه process اختصاص دارد و  در کجا ذخیره شده است.

 

اگر تعداد pageها زیاد باشد ، این موضوع زمان زیادی میبرد و همچنین فضای زیادی اشغال میشود.

 

فرض کنید یک پروسس به 1G از ram نیاز دارد. اگر این 1G را بر اون 4K تقسیم کنیم ، باید در page table به اندازه  262144  ، entry وارد شود (1GB/4K) . اگر فرض کنید هر entry در Page Table  حدود 8bytes فضا مصرف میکند کل فضایی که فقط برایی ذخیره آدرس فیزیکی مصرف شده است  (2MB(262144*8 است. که وقتی تعداد پروسس ها زیاد شود هم فضای زیادی اشغال میشود هم جستجو در این page table سخت تر میشود.

 

در حال حاضر در معماری CPUهای جدید ، Pageها میتوانند اندازه بزرگتری داشته باشند.

 

نکته 1 ) اگر hardware شما پشتیبانی کند سایز Huge Page حداکثر میتواند 1G باشد.

نکاتی در مورد Temporary Tablespace

‫‫‫‫‫‫‫‫‫‫‫‫temporary tablespace ها شامل داده های ناپایدار هستند ، داده هایی که طول عمر آنها تنها محدود به طول عمر یک session میشود.                                                                                              

به طور مثال اگر ما یک sort داشته باشیم که در حافظه (RAM) جا نشود ، اوراکل برای انجام آن sort  از فضای temporary tablespace (که روی دیسک قرار دارد) استفاده میکند.  درواقع از فضای temporary tablespace  برای ذخیره کردن موارد زیر استفاده میشود :

         Intermediate sort results -

         Temporary tables and temporary indexes -

         Temporary LOBs -

         Temporary B-trees -