اوراکل 23ai– پشتیبانی Fast Ingest از Partitioning، Compression و LOB

Memoptimized Rowstore Fast Ingest یکی از قابلیتهای جدید اوراکل در نسخه 19c است که می تواند در زمینه IOT بسیار کاربردی باشد قبلا در مطلبی تحت عنوان “Memoptimized Fast Ingest در اوراکل 19c“، سعی کردیم به طور مفصل این قابلیت را شرح دهیم. اوراکل در نسخه 23c بهبودهایی را در این زمینه ایجاد کرده است که موضوع این مستند خواهد بود.

پشتیبانی از Partitioning

در نسخه 19c و 21c امکان تنظیم MEMOPTIMIZE FOR WRITE برای جداول پارتیشن شده وجود نداشت:

Connected to Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 
SQL> create table TBL1
  2  (
  3    id   NUMBER not null,
  4    text VARCHAR2(3000),
  5    mydate date
  6  )
  7  SEGMENT CREATION IMMEDIATE
  8  partition by range ( mydate )
  9  interval ( numtoyminterval(1,'MONTH'))
 10  (
 11   PARTITION p1 VALUES LESS THAN (TO_DATE('1-1-2015', 'DD-MM-YYYY'))
 12  );
Table created
SQL> ALTER TABLE tbl1 MEMOPTIMIZE FOR WRITE;
ORA-62165: MEMOPTIMIZE FOR WRITE cannot be enabled on table with specified partitioning type.

این قابلیت در نسخه 23c اضافه شد:

(بیشتر…)

قابلیت Materialized View Concurrent Refresh در اوراکل 23ai

بروز شدن همزمان Materialized Viewهای on-commit refresh از طریق sessionهای مختلف می تواند سبب رخ دادن eventای به نام enq: JI – contention شود چرا که این نوع از MVها به طور پیش فرض به صورت سریالی بروز می شوند و امکان بروزرسانی Concurrent را ندارند.

در قسمت زیر، از طریق دو session به طور همزمان دیتایی را در جدول مرجع MV درج کرده ایم که این  مسئله سبب شد تعداد زیادی از eventهای enq: JI – contention را شاهد باشیم:

SQL> create materialized view auther_contry_mv
refresh fast on commit
as
select country,count(*) from author_tbl group by country;
Materialized view created.
Session 1:
SQL>  begin
for i in  10000 ..19999 loop
insert into author_tbl values(i,'Rahmat Rabbani','m','Oracle DBA','IRAN');
commit;
end loop;
end;
/
PL/SQL procedure successfully completed.
Elapsed: 00:03:00.18
Session 2:
begin
for i in 1 ..9999 loop
insert into author_tbl values(i,'Rahmat Rabbani','m','Oracle DBA','IRAN');
commit;
end loop;
end;
/
PL/SQL procedure successfully completed.
Elapsed: 00:03:00.25

در نسخه 23c اوراکل از طریق قابلیت Materialized View Concurrent Refresh این محدودیت از بین برده است و با استفاده از این قابلیت می توان به صورت Concurrent این نوع از MVها را بروزرسانی کرد.

(بیشتر…)

تغییرات دستور OERR در اوراکل 23ai

در نسخه 23c دستور OERR اطلاعات بیشتری را برای بسیاری از خطاها(نسبت به نسخه های قبلی) ارائه می کند که این مسئله می تواند در شناسایی علت رخ دادن خطا و همچنین رفع سریع تر آن کمک کند.

بعنوان مثال، برای خطای ORA-00001: unique constraint (constraint_name) violated این دستور را در دو نسخه 21c و 23c اجرا می کنیم:

'Oracle 21c':
[oracle@OEL7 ~]$ oerr ora 00001
00001, 00000, "unique constraint (%s.%s) violated"
// *Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
//         For Trusted Oracle configured in DBMS MAC mode, you may see
//         this message if a duplicate entry exists at a different level.
// *Action: Either remove the unique restriction or do not insert the key.
'oracle 23c'
[oracle@IranHost ~]$ oerr ora 00001
00001, 00000, "unique constraint (%s.%s) violated on table %s.%s columns (%s)"
// *Cause:  An UPDATE, INSERT or MERGE statement attempted to update or
//          create a record that duplicated values limited by a unique
//          constraint. A unique constraint can be implemented as an
//          explicit unique constraint, a unique index, or a primary key.
//
//          Consider the case where a table has a unique constraint on columns
//          FIRSTNAME and LASTNAME. Because of this constraint, it is not
//          possible to insert a row containing values of FIRSTNAME and
//          LASTNAME that are identical to the values of these columns in an
//          existing table row.
// *Action: Determine what type of unique constraint was violated (explicit
//          unique constraint, unique index, or primary key), and which table
//          columns are affected by this unique constraint.
//
//          Then choose whether to change the constraint to allow duplicate
//          values; modify the SQL statement to no longer create a duplicate
//          value; or drop the constraint, unique index, or primary key.
// *Params: 1) constraint_schema: The schema name where the constraint
//             resides.
//          2) constraint_name: The name of the constraint.
//          3) table_schema: The schema name for the table affected by this
//             constraint.
//          4) table_name: The name of the table affected by this
//             constraint.
//          5) column_names: The column names affected by this
//             constraint.

قابلیت دیگر اوراکل 23c در این زمینه، اضافه شدن دستور OERR به محیط sqlplus است:

[oracle@IranHost ~]$ sqlplus "/as sysdba"
Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09

SQL> OERR
Usage: OERR <facility name> <error number>
SQL> OERR ora 01452
Message: "cannot CREATE UNIQUE INDEX; duplicate keys found"
Help: https://docs.oracle.com/error-help/db/ora-01452/
Cause:     A CREATE UNIQUE INDEX statement specified one or more
           columns that currently contained duplicate values. All values in
           the indexed columns must be unique by row to create a UNIQUE
           INDEX.
Action:    If the entries need not be unique, remove the keyword
           UNIQUE from the CREATE INDEX statement, then re-execute the
           statement. If the entries must be unique, as in a primary key,
           then remove duplicate values before creating the UNIQUE index.

قابلیت Read Only Session در اوراکل 23ai

یکی دیگر از پارامترهای جدید اوراکل در نسخه 23c، پارامتر read_only است:

SQL> show parameter READ_ONLY
NAME  TYPE        VALUE    
----- ----------- -------- 
read_only                            boolean     FALSE

این پارامتر صرفا در سطح session قابل تنظیم است و با تنظیم این پارامتر به مقدار true، امکان اجرای دستورات DML و DDL در سطح session از بین خواهد رفت:

SQL> alter system set read_only=true scope=spfile;
ORA-32017: failure in updating SPFILE
ORA-02065: illegal option for ALTER SYSTEM
 SQL> alter session set read_only=true;
Session altered.

SQL> delete tbl1;
ORA-28193: Can perform read operations only

SQL> drop table tbl1;
ORA-28193: Can perform read operations only

اگر تراکنشی در session در حال اجرا باشد، امکان فعال کردن این پارامتر وجود ندارد:

SQL> delete tbl1;
1 row deleted.

SQL> alter session set read_only=true;
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-65023: active transaction exists in container

این پارامتر برای هر دو نوع از userها یعنی local user و common user قابل استفاده است.

اوراکل 23ai – دستور ping در sqlplus

در اوراکل 23c می توانیم از دستور ping در محیط sqlplus استفاده کنیم. این دستور مشابه ابزار tnsping رفتار می کند و از طریق آن می توانیم در دسترس بودن IP و port را بررسی کنیم البته دستور ping درستی service_name و یا SID را چک نمی کند(همانند tnsping).

این دستور با کمک فایل tnsnames.ora اجرا می شود و net service name و یا IP را به عنوان ورودی می پذیرد البته امکان اجرای آن به روش easy connect هم وجود دارد.

(بیشتر…)

اوراکل 23ai- امکان استفاده از قابلیت Memoptimized Rowstore بدون تنظیم Hint

برای استفاده از قابلیت Memoptimized Rowstore در نسخه های 19c و 21c، ابتدا می بایست این قابلیت را در سطح جدول فعال می کردیم و بعد از آن، در زمان درج دیتا، Hintای را به دستور insert اضافه می کردیم با توجه به آنکه ممکن است application از قبل نوشته شده باشد، اضافه کردن Hint به دستور insert می تواند مانعی برای استفاده از قابلیت Memoptimized Rowstore شود.

SQL> ALTER TABLE tbl1 MEMOPTIMIZE FOR WRITE;
Table altered

SQL> INSERT /*+ MEMOPTIMIZE_WRITE */ INTO tbl1 VALUES (1,'usefzadeh.com');

بنابرین در نسخه های یاد شده، بدون استفاده از هینت MEMOPTIMIZE_WRITE امکان استفاده از این قابلیت وجود نداشت.

در نسخه 21c اوراکل پارامتری به نام MEMOPTIMIZE_WRITES را اضافه کرده است که از طریق آن می توان بدون تنظیم این Hint، از این قابلیت بهرمند شد:

SQL> show parameter memoptimize_writes
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
memoptimize_writes                   string      HINT

(بیشتر…)

اوراکل 23ai- قابلیت JSON Relational Duality View

اوراکل در نسخه 23c قابلیتی به نام JSON Relational Duality View را ارائه کرده است که می توان از طریق آن به طور همزمان از(بسیاری از) مزیتهای Relational data model و JSON data model بهرمند شد.

می دانیم که انتخاب هر کدام از این دیتامدلها می تواند بر حسب شرایط، مزایا و معایبی را به همراه داشته باشد. به طور مثال در مدل Relational می توان از مزیتهایی نظیر «جلوگیری از Data duplication، نرمالسازی، consistency» و … بهره گرفت و از طرف دیگر «خوانایی، سادگی، خود توصیفی، hierarchical document» نمونه هایی از مزیتهای JSON هستند.

بر اساس قابلیت JSON Relational Duality View، دیتا در جداول به صورت relational ذخیره می شوند و با ایجاد یک Duality View بر روی جداول رابطه ای، امکان دسترسی و دستکاری(Delete، Insert، Update) دیتا به صورت JSON هم به وجود خواهد آمد و Duality Viewها بر خلاف Viewهای معمولی، امکان write را بر روی جداول رابطه ای فراهم می کنند(حتی در حالت Complex View).

در زمان استفاده از این قابلیت، با توجه به ذخیره شدن اطلاعات در جداول رابطه ای، دستورات SQLای متعارف برای اجرای عملیات DML کاملا معتبر هستند و در کنار آن Developer این انتخاب را دارد تا با استفاده از Duality Viewها عملیات DML را با فرمت JSON انجام دهد که این مسئله mapping راحت تر بین Application Object و Relational Table را به همراه دارد و در بعضی از موارد می تواند نیاز به convert دیتا به فرمت JSON و یا برعکس را از بین ببرد.

(بیشتر…)

اوراکل 23ai– ابزار ConnStr

یکی دیگر از قابلیتهای جدید دیتابیس اوراکل در نسخه 23c، ابزار ConnStr است این ابزار خروجی لاگ listener را خوانده و بر اساس آن، برای هر کدام از سرویسها، connection string را به فرمتهای Easy Connect، JDBC و Python نمایش می دهد. علاوه بر آن، این ابزار می تواند برای هر کدام از سرویسها، net service nameای را در فایل tnsnames.ora ایجاد کند.

در حالت پیش فرض اگر سرویس listener پایین باشد، اجرای دستور ConnStr به خطا خواهد خورد:

 [oracle@OEL8 ~]$ lsnrctl  stop
LSNRCTL for Linux: Version 23.0.0.0.0 - Developer-Release on 05-SEP-2023 13:30:35
Copyright (c) 1991, 2023, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST= OEL8)(PORT=1521)))
The command completed successfully
[oracle@OEL8 ~]$ connstr
Using Listener: LISTENER with Oracle Home: /opt/oracle/product/23c/dbhomeFree
No listener endpoints found

بعد از استارت listener، اگر سرویسی رجیستر نشده باشد، ConnStr پیغام The listener supports no services را نمایش می دهد:

[oracle@OEL8 ~]$ lsnrctl  start
The listener supports no services
The command completed successfully
[oracle@OEL8 ~]$ connstr
Using Listener: LISTENER with Oracle Home: /opt/oracle/product/23c/dbhomeFree
The listener supports no services

(بیشتر…)

اوراکل 23ai-قابلیت Automatic Transaction Rollback(تنظیم اولویت برای تراکنشها)

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

--session 1:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
      2190
SQL> update USEF.TBL1 set  id=1;
1 row updated
--session 2:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
       944

SQL> update USEF.TBL1 set id=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

ممکن است کاربر دوم که تراکنشش در حالت انتظار قرار دارد، برای ما اولویت بیشتری داشته باشد. در این حالت چه راهکاری وجود دارد؟

(بیشتر…)

اوراکل 23ai– خواناتر شدن متن خطاها

در نسخه 23c، اوراکل متن بعضی از خطاها را به شکل خواناتری تغییر داده تا در شناسایی علت آن و همچنین رفع سریع تر این خطاها به Developer و یا DBA کمک کرده باشد.

برای مثال متن خطای معروف ORA-00979 تا قبل از نسخه 23c به صورت زیر بوده است:

SQL> select owner,object_type,count(*) from dba_objects group by  owner;

ORA-00979: not a GROUP BY expression

اما این متن در نسخه 23c به صورت زیر تغییر کرده است:

SQL> select owner,object_type,count(*) from dba_objects group by  owner;

ORA-00979: “OBJECT_TYPE”: must appear in the GROUP BY clause or be used in an aggregate function

در ادامه نمونه های دیگری از خطاهای معروفی که متن آنها تغییر کرده است را مشاهده می کنید.

(بیشتر…)