اوراکل 23ai –چند ویوی جدید برای بررسی مسائل پرفورمنسی Data Pump

در اوراکل نسخه 23ai، ویوهای جدیدی در زمینه Data Pump اضافه شده اند که می توان از طریق آنها دلایل کندی  اجرای Data Pump را شناسایی کرد. لیست این ویوها را در قسمت زیر می بینید:

(G)V$DATAPUMP_PROCESS_INFO
(G)V$DATAPUMP_PROCESSWAIT_INFO
(G)V$DATAPUMP_SESSIONWAIT_INFO

ویوی V$DATAPUMP_PROCESS_INFO اطلاعاتی را در مورد جابهای مربوط به Data Pump نمایش می دهد نظیر SESSIONID، SPID، PROGRAM و …

SQL> desc V$DATAPUMP_PROCESS_INFO
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CUR_DATE                                           VARCHAR2(19)
 PROGRAM                                            VARCHAR2(84)
 SESSIONID                                          NUMBER
 STATUS                                             VARCHAR2(8)
 USERNAME                                           VARCHAR2(128)
 JOBNAME                                            VARCHAR2(128)
 SPID                                               VARCHAR2(24)
 SERIALNUMBER                                       NUMBER
 PROCESSID                                          NUMBER
 CON_ID                                             NUMBER

(بیشتر…)

نصب نسخه FREE اوراکل 23ai

در این متن قصد داریم مراحل نصب Oracle Database 23ai free را بر روی اوراکل لینوکس 8 توضیح دهیم در ابتدا باید متذکر شویم که حجم هر دیتابیس(PDB) در نسخه FREE نمی تواند بیشتر از 12GB شود و همچنین برای استفاده از RAM و CPU هم محدودیت دارد:

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

(بیشتر…)

ذخیره AWR snapshot خارج از SYSAUX

همانطور که می دانید AWR snapshotها در SYSAUX tablespace ذخیره می شوند و تا نسخه 19c نمی توان آنها را در tablespace مجزایی ذخیره کرد. این امکان در نسخه 19c با اضافه شدن پارامتر TABLESPACE_NAME به پروسیجر dbms_workload_repository.modify_snapshot_settings به وجود آمد.

Connected to Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 
SQL> desc dbms_workload_repository.modify_snapshot_settings
Parameter       Type     Mode Default? 
--------------- -------- ---- -------- 
RETENTION       NUMBER   IN   Y        
INTERVAL        NUMBER   IN   Y        
TOPNSQL         NUMBER   IN   Y        
DBID            NUMBER   IN   Y        
TABLESPACE_NAME VARCHAR2 IN   Y        
RETENTION       NUMBER   IN   Y        
INTERVAL        NUMBER   IN   Y        
TOPNSQL         VARCHAR2 IN            
DBID            NUMBER   IN   Y        
TABLESPACE_NAME VARCHAR2 IN   Y      

همچنین اوراکل در نسخه 21c ستون TABLESPACE_NAME را به ویوی awr_cdb_wr_control اضافه کرده است که از طریق آن می توانیم tablespace جاری AWR  را مشخص کنیم:

(بیشتر…)

اوراکل 23ai – قابلیت Transport Tablespace بر روی Network

در اوراکل نسخه 23ai امکان پیاده سازی قابلیت Transport Tablespace از طریق network به وجود آمد برای این کار باید از ابزار RMAN استفاده کرد و از طریق آن دیتافایلهای tablespace مورد نظر را از دیتابیس مبدا به دیتابیس مقصد منتقل کرد.

این کار با اجرای دستور RESTORE FOREIGN TABLESPACE در دیتابیس مقصد قابل انجام است با اجرای این دستور، حتی Metadata مربوط به TABLESPACE هم از طریق ایجاد فایل dump به دیتابیس مقصد منتقل خواهند شد و به صورت خودکار در این دیتابیس برخواهند گشت.

(بیشتر…)

اوراکل 23ai – اجرای sysdate بر اساس time zone هر PDB

همانطور که می دانید توابع SYSDATE و SYSTIMESTAMP ساعت جاری سیستم را برمی گردانند این توابع date را بر اساس time zone سیستم عامل نمایش می دهند و اگر time zone متفاوتی برای دیتابیس تنظیم شود، تغییری در رفتار این توابع ایجاد نمی شود:

[oracle@OEL8 ~]$ timedatectl
               Local time: Thu 2024-02-15 13:14:48 +0330
           Universal time: Thu 2024-02-15 09:44:48 UTC
                 RTC time: Thu 2024-02-15 07:37:09
                Time zone: Asia/Tehran (+0330, +0330)
SQL> select sysdate , SYSTIMESTAMP ;
SYSDATE   SYSTIMESTAMP
--------- ----------------------------------------
15-FEB-24 15-FEB-24 01.25.54.270895 PM +03:30

SQL> ALTER DATABASE SET TIME_ZONE='Asia/Tokyo';
Database altered.

SQL> select sysdate , SYSTIMESTAMP ;
SYSDATE   SYSTIMESTAMP
--------- ----------------------------------------
15-FEB-24 15-FEB-24 01.26.37.200429 PM +03:30

در نسخه 23ai می توان با تنظیم پارامتر time_at_dbtimezone به مقدار USER_SQL این توابع را مجاب کرد تا date را بر اساس time zone دیتابیس برگردانند صرف نظر از time zone سیستم عامل!

(بیشتر…)

اوراکل 23ai- افزایش حداکثر اندازه پسورد از 30 بایت به 1024 بایت

تا قبل از نسخه 23ai، پسورد کاربران و roleها حداکثر می توانست 30 بایت باشد:

SQL> create user u1 identified by a123456789012345678901234567890;
ORA-00972: identifier is too long
SQL> create role r1 identified by a123456789012345678901234567890;
ORA-00972: identifier is too long

در اوراکل 23ai این محدودیت به 1024 بایت تغییر کرده است:

SQL> create user u1 identified by a123456789012345678901234567890;
User created.
SQL> create role r1 identified by a123456789012345678901234567890;
Role created.

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

یکی دیگر از قابلیتهای جدید اوراکل در نسخه 23cء، JSON Schema است از طریق این قابلیت می توانیم برای هر کدام از keyهای JSON، دیتاتایپی را تنظیم کنیم و محدودیتهای دیگر نظیر minLength و maxLength را برای هر کدام از کلیدها اعمال کنیم. این کار با اضافه کردن عبارت VALIDATE به متن دستور create table قابل انجام است.

ساختار جدول زیر را در نظر بگیرید! در این جدول صرفا JSON Documentای را می توانیم در ستون ettelaat ذخیره کنیم که حداقل شامل فیلدهای  First_Name و Last_Name باشند(“required”: [“First_Name”, “Last_Name”]) و این دو فیلد باید از نوع string هم باشند همچنین در صورت وجود فیلد Age در داکیومنت JSON، این فیلد باید از نوع number باشد.

SQL> CREATE TABLE TB_Person (
  2    id          NUMBER PRIMARY KEY,
  3    ettelaat json VALIDATE '{
  4      "type": "object",
  5      "properties": {
  6        "First_Name": {
  7          "type": "string",
  8          "minLength": 5,
  9          "maxLength": 20
 10        },
 11        "Last_Name": {
 12          "type": "string",
 13          "minimum": 5,
 14          "maximum": 30
 15        },
 16  	  "Age": {
 17          "type": "number"
 18        }
 19      },
 20      "required": ["First_Name", "Last_Name"]
 21    }'
 22    );

Table created

(بیشتر…)

اوراکل 23ai- قابلیت Dictionary Protection

زمانی که یکی از مجوزهای system “ANY” privilege نظیر select any table، drop any table و … را به کاربری می دهیم، آن کاربر امکان دسترسی به objectهای شمای sys و جداول Data Dictionary را ندارد:

SQL*Plus: Release 10.1.0.4.2 - Production on Tue Jan 9 10:38:31 2024
SQL> show user
USER is "SYS"
SQL> create table sys.tb as select * from dual;
Table created.
SQL> create user usef identified by a;
User created.
SQL> grant create session,select any table to usef;
Grant succeeded.
SQL> conn usef/a
Connected.
SQL> select * from sys.tb;
ORA-00942: table or view does not exist
SQL> select * from v$datafile;
ORA-00942: table or view does not exist

اگر تصمیم داریم این محدودیت را حداقل در مورد مجوز select any table برای یک کاربر برداریم، می توانیم مجوز SELECT ANY DICTIONARY را به آن کاربر اعطا کنیم:

SQL> grant SELECT ANY DICTIONARY to usef;
Grant succeeded.
SQL> conn usef/a
Connected.
SQL> select * from sys.tb;
D
-
X
SQL> select file# from v$datafile where rownum=1;
     FILE#
----------
         1

البته از اوراکل 12c، دسترسی به بعضی از جداول Data Dictionary حتی با داشتن مجوز  SELECT ANY DICTIONARY  هم امکان پذیر نیست. لیست بعضی از این جداول را در قسمت زیر می بینید:

USER$, ENC$ , DEFAULT_PWD$, LINK$, USER_HISTORY$, CDB_LOCAL_ADMINAUTH$, XS$VERIFIERS

(بیشتر…)

اوراکل 23ai- تخمین صرفه جویی در فضا با DEDUPLICATION

DEDUPLICATION یکی از قابلیتهای جدید اوراکل در نسخه 11g است که همراه با SECUREFILE LOBها ارائه شد و می توان بعد از ایجاد جدول هم این قابلیت را برای SECUREFILE LOBها فعال کرد اما سوال مهمی که در این زمینه مطرح می شود آن است که DEDUPLICATION برای LOBهای موجود چقدر فضا آزاد می کند؟

در اوراکل نسخه 23c، تابعی در این زمینه ارائه شد که می تواند تا حدودی به این سوال پاسخ دهد. این تابع نام جدول(و یا نام پارتیشنی از جدول) را دریافت می کند و حداکثر 100 هزار رکورد از آن جدول را بررسی کرده و نهایتا تخمینی از میزان ذخیره سازی فضا را ارائه می کند.

در ادامه، سناریوی تستی را در این زمینه می بینید.

SQL> create table tbl (id number,describe clob);
Table created

در این جدول اطلاعاتی را درج می کنیم که بیشتر آن تکراری هستند:

SQL> begin
  2    for i in 1 .. 70000 loop
  3      insert into tbl
  4      values
  5        (1,
  6         lpad('www.usefzadeh.com',
  7              1000000000000000000000000000000000000000000000000000000000000000000000000000000000,
  8              'a'));
  9    end loop;
 10    insert into tbl values (2, 'Ramtollah Rabbani');
 11    insert into tbl values (3, 'Armin Bahamin');
 12    insert into tbl values (4, 'Jamshid Khan');
 13    commit;
 14  end;
 15  /

PL/SQL procedure successfully completed

(بیشتر…)

امکان تغییر رفتار پیش فرض kill session در اوراکل 23ai

زمانی که sessionای را در اوراکل kill می کنیم، به صورت پیش فرض آن session در حالت SOFTء، kill خواهد شد:

SQL> ALTER SYSTEM KILL SESSION '1025,44801';
System altered.

جزییات اجرای این دستور را می توانیم در Alert Log ببنیم:

2023-12-19T13:32:18.731476+03:30
(4):A user has terminated a session.
KILL SESSION for sid=(1025, 44801):
  Reason = alter system kill session
  Mode = KILL SOFT -/-/-/-
  Requestor = USER (orapid = 55, ospid = 3267554, inst = 1)
    User = oracle
    Program = sqlplus@OEL8 (TNS V1-V3)
  Owner = Process: USER (orapid = 75, ospid = 3268895)
    User = 462710969
    Program = plsqldev.exe
  Result = ORA-0

برای kill کردن session در حالت HARD می توانیم عبارت immediate را به انتهای دستور اضافه کنیم:

SQL> ALTER SYSTEM KILL SESSION '1025,43030' IMMEDIATE;
System altered.

مجددا با کمک Alert Log جزییات اجرای این دستور را هم خواهیم دید:

2023-12-19T13:33:07.749571+03:30
(4):A user has terminated a session.
KILL SESSION for sid=(1025, 43030):
  Reason = alter system kill session
  Mode = KILL HARD SAFE -/-/-/-
  Requestor = USER (orapid = 55, ospid = 3267554, inst = 1)
    User = oracle
    Program = sqlplus@OEL8 (TNS V1-V3)
  Owner = Process: USER (orapid = 75, ospid = 3268940)
    User = 462710969
    Program = plsqldev.exe
  Result = ORA-0

در نسخه 23c اوراکل Hidden Parameterای به نام kill_session_force_ را اضافه کرده است که می توان از طریق آن، این رفتار پیش فرض را تغییر داد:

(بیشتر…)