اوراکل 23ai – اجرای دستور SELECT بدون عبارت FROM

قبلا در مطلبی  نکاتی را در مورد “جدول dual و فراخوانی توابع در اوراکل و پستگرس” ارائه کردیم و توضیح دادیم که در دیتابیس پستگرس، در زمان فراخوانی توابع و عبارتها به همراه دستور select الزامی به استفاده از کلمه کلیدی FROM نخواهد بود. در صورتی که در دیتابیس اوراکل به ناچار باید از عبارت FROM در دستور SELECT استفاده کرد همچنین ثابت کردیم که به لحاظ پرفورمنسی استفاده از جدول dual در این مواقع بسیار کاربردی است.

حالا در نسخه 23c اوراکل امکان اجرای دستور SELECT را بدون عبارت FROM فراهم کرده است:

SQL*Plus: Release 21.0.0.0.0 - Production on Thu Jun 15 13:56:58 2023
SQL> select sysdate;
ORA-00923: FROM keyword not found where expected
Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release
SQL> SELECT sysdate;
SYSDATE
---------
15-JUN-23
SQL> select 15+85*98;
  15+85*98
----------
      8345

(بیشتر…)

جلوگیری از Blocking Session در زمان اجرای دستور Update(قابلیت Lock-free reservation)

شرایطی را در نظر بگیرید که قرار است فیلدی به عنوان شمارنده، دائما توسط تعداد زیادی session بروزرسانی شود(با همزمانی بالا) به این شیوه که با هر بار انجام «اقدامی مشخص»، دستور updateای اجرا شده و یک عدد به این شمارنده اضافه کند.

در این حالت با توجه به زیاد بودن تعداد sessionهای همزمان، احتمال رخ دادن Blocking session هم بسیار افزایش می یابد چرا که در دیتابیس اوراکل اگر دو کاربر قصد ویرایش یک رکورد را داشته باشند و با فاصله زمانی کمی دستور Update را اجرا کنند، کاربری که دیرتر دستور update را صادر کرده Block خواهد شد و تا زمانی که کاربر اول(کاربری که زودتر رکورد را در اختیار گرفته) به تراکنش خاتمه ندهد، کاربر دوم در حالت Block باقی خواهد ماند.

--session 1:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
      2190
SQL> update tbl_counter set counttt=counttt+1;
1 row updated
--session 2:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
       944

SQL> update tbl_counter set counttt=counttt+1;
Executing…

بلاک شدن session دوم را می توانیم از طریق دستور زیر ببینیم:

SQL>  select SID,ID1,ID2,LMODE,block,request from v$lock where type='TX';
       SID        ID1        ID2      LMODE      BLOCK    REQUEST
---------- ---------- ---------- ---------- ---------- ----------
       944     458766       2511          0          0          6
      2190     458766       2511          6          1          0

بنابرین زمانی که کاربران زیادی قصد کار بر روی یک رکورد را دارند، مکانیزم locking امکان ویرایش رکورد را در هر لحظه به یک نفر از آنها خواهد داد و بقیه sessionها Block می شوند. پیدا کردن ترفندی برای جلوگیری از Block شدن sessionها می تواند در بعضی از این شرایط نظیر «شرایط ذکر شده در ابتدای متن» بسیار راهگشا باشد.

(بیشتر…)

افزایش حداکثر تعداد ستونهای یک جدول به 4096

تا قبل از اوراکل نسخه 23c، حداکثر تعداد ستونهای یک جدول به عدد 1000 محدود بود:

ORA-01792: maximum number of columns in a table or view is 1000

در نسخه 23c هر جدول می تواند تا 4096 ستون داشته باشد البته برای استفاده از این قابلیت باید پارامتر max_columns را به extended تنظیم کرد:

Connected to Oracle Database 23c Free, Release 23.0.0.0.0 
SQL> create table tb (c1 number(10));
Table created
SQL> alter system set max_columns=extended scope=spfile;
System altered
SQL> declare
  2  comm varchar2(100);
  3  begin
  4    for i in 2..4095 loop
  5     comm:='alter table  tb add c'||''||i||' number';
  6     execute immediate comm;
  7    end loop;
  8  end;
  9  /
  PL/SQL procedure successfully completed
SQL> select count(*) from dba_tab_columns p where p.table_name='TB';
  COUNT(*)
----------
      4095

 

اوراکل 23ai- تنظیم اولویت برای PDB

سوال: اگر CDBای بیش از یک PDB داشته باشد، چگونه می توان در مورد ترتیب open شدن این PDBها اعمال نظر کرد؟

تا قبل از اوراکل 23c راهکاری در این زمینه وجود نداشت و با اجرای دستور startup، تضمینی در مورد ترتیب باز شدن این PDBها وجود نداشت(معمولا بر اساس شماره container این PDBها باز می شدند). اما در نسخه 23c قابلیت جدیدی ارائه شد و بر اساس آن می توان برای هر PDB یک PRIORITY تنظیم کرد تا از طریق آن، ترتیب انجام عملیاتهایی نظیر open کردن PDBء، upgrade و یا restoration را کنترل کرد.

ساختار کلی دستور را در قسمت زیر می بینید:

ALTER PLUGGABLE DATABASE <PDB name> PRIORITY <value>

در این دستور، نام PDB الزامی است و PRIORITY می تواند مقداری بین 1 تا 4096 بگیرد که هر چه این عدد کمتر باشد، PDB اولویت بیشتری دارد به طور مثال، PDB با اولویت 1 نسبت به PDB با اولویت 2 زودتر open خواهد شد.

SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 TEHRANPDB                      READ WRITE NO
         4 BABOLPDB                       READ WRITE NO
         5 VARAMINPDB                     READ WRITE NO
         6 ABADANPDB                      READ WRITE NO
SQL> ALTER PLUGGABLE DATABASE babolpdb PRIORITY 1;
Pluggable database altered.
SQL> ALTER PLUGGABLE DATABASE ABADANPDB PRIORITY 2;
Pluggable database altered.
SQL> ALTER PLUGGABLE DATABASE VARAMINPDB PRIORITY 3;
Pluggable database altered.
SQL> ALTER PLUGGABLE DATABASE TEHRANPDB PRIORITY 4;
Pluggable database altered.

با restart کردن دیتابیس خواهیم دید که دیتابیسها با ترتیب اعلام شده باز شده اند:

SQL> startup force;
SQL> select OPEN_TIME,NAME,PRIORITY from v$pdbs order by 1;
OPEN_TIME                                NAME         PRIORITY
---------------------------------------- ---------- ----------
10-MAY-23 05.52.43.190 PM +04:30         PDB$SEED            1
10-MAY-23 05.52.43.812 PM +04:30         BABOLPDB            1
10-MAY-23 05.52.44.889 PM +04:30         ABADANPDB           2
10-MAY-23 05.52.45.929 PM +04:30         VARAMINPDB          3
10-MAY-23 05.52.47.102 PM +04:30         TEHRANPDB           4

ترتیب باز شدن PDB در ALERT LOG هم ثبت شده است:

PDB$SEED(2):Opening pdb with Resource Manager plan: DEFAULT_PLAN
BABOLPDB(4):SUPLOG: Initialize PDB SUPLOG SGA, old value 0x0, new value 0x18
2023-05-10T17:52:44.739491+04:30
ABADANPDB(6):SUPLOG: Initialize PDB SUPLOG SGA, old value 0x0, new value 0x18
2023-05-10T17:52:45.784421+04:30
VARAMINPDB(5):SUPLOG: Initialize PDB SUPLOG SGA, old value 0x0, new value 0x18
2023-05-10T17:52:46.828984+04:30
TEHRANPDB(3):SUPLOG: Initialize PDB SUPLOG SGA, old value 0x0, new value 0x18

*همراه با اوراکل 12cR2، اولویت PDBها در زمینه upgrade از طریق دستور زیر قابل تنظیم است:

SQL*Plus: Release 12.0.0.0.0 - Production on Wed May 10 16:56:59 2023
SQL> ALTER PLUGGABLE DATABASE babolpdb UPGRADE PRIORITY 5;
Pluggable database altered.

 

قابلیت Annotation در اوراکل 23ai

در نسخه های قبل از 23c، از طریق قابلیت comment می توانیم برای objectهایی نظیر table ، table column، materialized view، view کامنت و یا توضیحاتی را ثبت کنیم. comment گذاری با محدودیتهایی هم همراه است برای مثال امکان دسته بندی کامنتها وجود ندارد و به طور کلی همه توضیحات در یک متن طولانی ثبت خواهند شد.

در اوراکل 23c قابلیت Annotation که شباهتهای زیادی به قابلیت comment دارد، ارائه شد که بر اساس آن می توانیم برای objectهایی نظیر table, view, materialized view, index و column توضیحاتی را به صورت دسته بندی شده و بر اساس name و value ثبت کنیم.

 برای هر کدام از این objectها می توان تعداد زیادی Annotation_name و Annotation_value تعریف کرد و هر Annotation باید حداقل شامل یک Annotation_name باشد ولی الزامی به تعریف Annotation_value وجود ندارد.

*در نحوه نامگذاری Annotation_nameها محدودیتی وجود ندارد.

SQL> create table STD 
(
id number  annotations (DESCRIPTION1 'student ID',Description2 ‘coooode daneshjoiieee!!’),
name varchar2(20)  annotations(Description ‘Full Name for students’)
)
annotations (DESCRIPTION ‘Student Table’);
Table created

(بیشتر…)

کاهش زمان ساخت Primary/Foreign Key

استفاده از عبارت parallel در زمان ساخت primary key منجر به انجام عملیات به صورت همروند نخواهد شد. دستور زیر را مشاهده کنید:

SQL> alter table all_table add constraint pk_1 primary key (id) parallel 10;
Table altered.
Elapsed: 00:00:12.36

با فعال کردن trace خواهیم دید که اوراکل برای ساخت ایندکس متناظر با این PK، از عبارت noparallel استفاده کرده و عبارت parallel تاثیر مثبتی در زمان ایجاد این Primary Key نداشته است:

PARSING IN CURSOR #140396268419760 len=72 dep=1 uid=109 oct=9 lid=109 tim=29571676036680 hv=2994446983 ad='b9930010' sqlid='c1ddax6t7r8n7'
CREATE UNIQUE INDEX "USEF"."PK_1" on "USEF"."ALL_TABLE"("ID") NOPARALLEL

بنابرین زمان اجرای دستور فوق با دستور زیر برابر خواهد بود و اجرای هر دو دستور به 13 ثانیه زمان نیاز دارد:

SQL> alter table all_table add constraint pk_1 primary key (id) noparallel;
Table altered.
Elapsed: 00:00:12.95

(بیشتر…)

نکاتی در مورد Materialized View و NoLogging

بروزرسانی Materialized Viewهای حجیم آن هم به صورت complete می تواند DBA را در جنبه های مختلفی به چالش بکشاند به ویژه آنکه دیتابیس در مود آرشیو قرار داشته باشد چرا که در این صورت، بروزرسانی MV منجر به ایجاد حجم زیادی از آرشیولاگ خواهد شد. البته اثرات منفی این مسئله، صرفا به فضای مصرفی redoها خلاصه نمی شود و از لحاظ پرفورمنسی هم می تواند بر روی عملکرد دیتابیس اثر منفی بگذارد.

در این متن بررسی می کنیم که غیرفعال کردن Logging در سطوح object، tablespace و database چه اثراتی را بر روی عملیات ساخت و بروزرسانی Materialized Viewها به همراه خواهد داشت(مطالعه مطلب “تاثیر عملیات NOLOGGING در دیتاگارد”  پیشنهاد می شود).

(بیشتر…)

اجرای کلاستر اوراکل در داکر(Oracle RAC 21c)

برای نصب Oracle RAC به منظور استفاده در محیط آموزشی و یا اجرای بعضی از تستها، معمولا از Oracle Virtual Box و یا VMware workstation استفاده می کنیم.

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

 البته در این زمینه، VM تنها گزینه ما نیست و استفاده از Docker می تواند به عنوان انتخابی دیگر، ایرادات ذکر شده را از بین ببرد.

اوراکل از نسخه 12c امکان اجرای Oracle RAC در داکر را برای محیط تست و develop فراهم کرده و در نسخه 21c، از اجرای Oracle RAC در محیط docker آن هم به صورت عملیاتی پشتیبانی می کند.

اجرای Oracle RAC در داکر، می تواند با استفاده از یک یا چند هاست انجام شود که در این متن صرفا از یک هاست استفاده خواهیم کرد و راه اندازی آن در چند هاست را به زمانی دیگر موکول می کنیم.

سیستم عاملی که از آن استفاده کرده ایم، Oracle Linux نسخه 7 می باشد و قرار است Oracle RAC نسخه 21c را در این محیط اجرا کنیم. این کار با کمک سه container انجام خواهد شد که یکی از آنها برای DNS server و دو container دیگر هم هر کدام نودهای کلاستر را تشکیل خواهند داد.

در ابتدا مراحل پیکربندی را مرور می کنیم:

1.نصب و اجرای داکر

2.آماده سازی داکر هاست

3.تنظیم Docker Network

4.نصب git و کلون Oracle Repository

5.ایجاد container برای DNS

6.ایجاد container برای راه اندازی نود اول کلاستر

7.اضافه کردن نود دوم کلاستر

(بیشتر…)

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

اجرای دیتابیس در محیط داکر می تواند مزایای متعددی را به همراه داشته باشد، که به عنوان نمونه می توان به “سادگی و افزایش سرعت در نصب و راه اندازی”، “اجرای نسخه های متعدد در یک هاست” و یا “اجرای دیتابیس در سیستم عاملهایی که امکان نصب مستقیم دیتابیس بر روی آنها وجود ندارد”، اشاره کرد.

در این مستند قصد داریم با گرفتن image از Oracle Container Registry، دیتابیس اوراکل را در محیط داکر اجرا کنیم برای این کار ابتدا باید در سایت oracle.com امور مقدماتی نظیر ایجاد اکانت را انجام دهیم و با توجه به انکه این متن بیشتر برای افرادی که با دیتابیس اوراکل آشنا نیستند، نوشته شده است، تمامی مراحل را با جزییات شرح داده ایم.

 

ساخت اکانت در oracle.com

در قدم اول اگر اکانتی در سایت اوراکل ندارید، با رفتن به آدرس زیر، این اکانت را ایجاد کنید:

https://profile.oracle.com/myprofile/account/create-account.jspx

 

(بیشتر…)

نکته ای در مورد Role و Privilege در اوراکل

زمانی که مجوزی از نوع object privilege و یا system privilege به کاربری داده می شود(و یا از کاربر گرفته(revoke) می شود)، بلافاصله sessionهای ان user که به دیتابیس متصل هستند، از این مجوزها بهره مند خواهند شد:

–session 1:

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Sep 16 19:48:16 2021
Version 19.11.0.0.0
SQL> show user
USER is "ALI"
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION

–session 2:

SQL> show user
USER is "USEF"
SQL> grant select any table to ALI;
Grant succeeded.

–session 1:

SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
SELECT ANY TABLE

اما این مسئله برای role صادق نیست و در صورت grant یا revoke کردن یک roleء، sessionهای جاری متاثر نخواهند شد مگر آنکه از دستور SET ROLE استفاده کنند:

(بیشتر…)