You are on page 1of 205

‫بسم ال الرحمن الرحيم‬

‫الجزء الول‬

Obay Salah Mirgani (Oracle 10g DBA OCP)

obaysalah@hotmail.com

1
‫الفهرس‬

‫الصفحة‬ ‫الموضوع‬ ‫المسلسل‬

3 ‫الهداء‬ 1

4 ‫المقدمة‬ 2

6 ‫مكونات قاعدة البيانات أوركل‬ 3


Oracle Architectural Components

27 ‫إنشاء قاعدة البيانات أوركل‬ 4


Creating an Oracle Database

47 ‫التحكم فى قاعدة البيانات‬ 5


Controlling the Database

63 Managing Tablespaces and Data files 6

79 Control File & Redo Log Files 7

100 ‫إدارة المستخدمين‬ 8


Administering Usersِ

126 ‫تأمين ومراقبة قاعدة البيانات‬ 9


Oracle Database Security & Monitoringِ

160 Oracle Net Services & Database Link & metrlized View 10

189 Undo Management & Flashback Technology 11

2
‫الهداء‬

‫تكاد تُحــرق من اشواقنا لهبا‬ ‫إلى رِحـــابك دًبجًنا رسائلنا‬


‫وقبلها قد بعثنا الدمــع منسكبا‬ ‫يا قارئ الحرف اهديناك احرفنا‬
‫مهرا وإل قد بعثنا القلب والهدبا‬ ‫شوقا إليك فهل ترضـى محبتنا‬
‫ومن دمانا كتبنا الشعر والخطبا‬ ‫فغيرنا بمداد الحــبر قد كتبوا‬

‫‪3‬‬
‫المقدمة‬

‫هذا هو الجزء الول من الكتاب العربى لدارة قاعدة البيانات اوركل والذى هو على جزئين ‪ ،‬وحسبى‬
‫من هذا الكتاب أنى كتبته لى ولمثالى ‪ ،‬فأنا اول المستفدين منه ‪ ،‬فإنى اعود له كل مره وقد خططته بيدى فأجد‬
‫فيه المعلومة الشاردة التى تعودت أن اصل اليها بعد بحث عميق‪.‬‬

‫هذا الكتاب يقول لك هكذا تنجز مهامك فى إدارة قاعدة البيانات بأسط الطرق وبأقل جهد ودون تًكلف او‬
‫تعقيد ‪ ،‬حاولت أن اتناول فيه المادة العلمية بإسلوب سهل بسيط ؛ فكنت احيانا أجمع عدة مواضيع فى فصل واحد‬
‫لرتباطهما فى الفكرة والمضمون ‪ ،‬واحيانا اقدم واحيانا اُرجئ الى حيث تكون المعلومة افيد واقيم‪.‬‬

‫أما الجانب العملى فكان له اوًفر الحظ والنصيب ‪ ،‬فقد طرحته فى شكلين ‪ ،‬الول كتابة النصوص العملية‬
‫فى قوالب بحيث يستطيع القارئ نسخها وتنفيذها او تعديلها متى شاء ‪ ،‬والثانى صور لتنفيذ النصوص على محرر‬
‫ال ‪ SQL*PLUS‬لتثبت لك الفكرة بأكثر من طرح‪.‬‬

‫املى أن يستفيد القارئ العربى من هذا الكتاب الذى ناقشت فيه جزء من اهم المواضيع المتعلقة بإدارة‬
‫قاعدة البيانات اوركل ‪ ،‬وبقىَ الجزء الخر سوف اطرحه فى الجزء الثانى من الكتاب والذى سوف يكون بين‬
‫يديك قريبا لو امًد ال لنا فى العمار‪.‬‬

‫وقبل البدء لى عندك طلب ايها القارئ ‪ ،‬دعوة خالصة منك أن يعفو ال عنى فإنى ل أعلم أحد عنده‬
‫من الذنوب مثل ما لدى ولكن أسأل ال أن يديم علينا ستره فى الدنيا والخره‪.‬‬

‫كتبه أبى صلح ميرغنى (لباشا)‬

‫‪4‬‬
5
‫عند الحديث عن قواعد البيانات لبد من البدء عن مكونات قاعدة البيانات وطريقة‬
‫عملها حتى يتسنى لنا بعد ذلك الحديث عن التفاصيل التى ل يمكن إستيعابها حتى نفهم تكوينها وطريقة‬
‫عملها أولً ‪.‬‬

‫ً‬

‫‪6‬‬
‫‪Oracle Instance‬‬ ‫‪Oracle Database‬‬

‫قاعدة البيانات اوركل تتكون من جزئين رئيسيين وهما ‪ Oracle Instance‬و ‪Oracle Database‬‬
‫وسنتحدث عن كل منها بالتفصيل فيما بعد ‪.‬‬

‫‪7‬‬
:Oracle Instance 1.1

8
‫وهى تتكون من جزئين رئيسيين كما فى الشكل اعله ‪-:‬‬
‫•‪Memory Structure‬‬
‫•‪Background Processes‬‬

‫‪:Memory Structure 1.1.1‬‬

‫وهى تتكون لحظة فتح ال ‪ Instance‬وهى عبارة عن جزء من الذاكرة يتم تخصيصه لعمل قاعدة‬
‫البيانات اوركل وهى تتكون من جزئيين ‪-:‬‬

‫‪SGA( System Global Area(-1‬‬


‫‪(Program Global Area (PGA -2‬‬

‫‪:System Global Area (SGA) 1.1.1.1‬‬

‫وتسمى ايضا ‪ Shared Global Area‬وهى جزء من الذاكرة يخصص للمعلومات التى تكون‬
‫مشتركة ومتاحة لجميع مستخدمى قواعد البيانات ‪ ،‬وتحتوى على معلومات التحكم التى تستخدم من قبل‬
‫ال ‪ Oracle Server‬وهى تتكون فى ال ‪ Virtual Memory‬وتتكون لحظة فتح ال ‪ ، Instance‬ومقاس‬

‫‪9‬‬
‫هذه الذاكرة يتحدد بواسطة المتغير ‪ SGA_MAX_SIZE‬فى ملف المتغيرات (‪، )Parameter File‬‬
‫وهى ذاكرة ‪ Dynamic‬أى يمكن تغيير مقاسها دون إغلق قاعدة البيانات وهى تتكون من قسمين ‪-:‬‬
‫‪Mandatory Memory -1‬‬
‫‪Optional Memory -2‬‬

‫‪Mandatory Memory‬‬ ‫‪:‬‬


‫‪ :Shared Pool -1‬ويتم التحكم فى مقاس هذه الذاكرة بواسطة المتغير‬
‫‪ ، SHARED_POOL_SIZE‬وتحتوى على جزئين ‪:‬‬
‫‪Library Cache -1‬‬
‫‪Data Dictionary Cache -2‬‬
‫‪ : Database Buffer Cache -2‬ويتم التحكم فى مقاس هذا الجزء من الذاكرة بواسطة‬
‫المتغير ‪. DB_CACHE_SIZE‬‬
‫;‪ALTER SYSTEM SET DB_CACHE_SIZE = 96M‬‬

‫وهكذا باقى اجزاء الذاكرة يتم التعديل بنفس الطريقة السابقة ‪.‬‬
‫‪ Redo Log Buffer -3‬ويتم تحديد مقاس هذا الجزء من الذاكرة بواسطة المتغير‬
‫‪. LOG_BUFFER‬‬

‫‪Optional Memory‬‬ ‫‪:‬‬


‫‪Large Pool -1‬‬
‫‪Java Pool -2‬‬
‫‪Streams Pool -3‬‬

‫والجدول أدناه يوضح أجزاء الذاكرة ‪: SGA‬‬

‫‪SGA Component‬‬ ‫‪Size Controlled By‬‬ ‫‪Areas Of Influence‬‬ ‫‪Simple Descriptions‬‬

‫‪10‬‬
Shared Pool SHAREAD_POOL_SIZE Library cache Oracle need to allocate
Shared SQL Areas* & deallocate memory
Oracle 6 thru 10g as SQL or Procedural
Private SQL Areas* Code is executed based
PL/SQL Procedures* on the individual needs
and Packages of users sessions and in
accordance to the LRU
Various Control*
algorithm
Structure

Highly accessed
memory structure that
Dictionary Cache provide information on
Row Cache * object structure to SQL
statements being parsed
Redo Log Buffer LOG_BUFFER Redo entries * Holds changes made to
data and allows for
Oracle 6 thru 10g reconstruction of data
in the case of failure
Database Buffer DB_2K_CACHE_SIZE Write List * Holds copies of data
Cache DB_4K_CACHE_SIZE requested by SQL and
DB_8K_CACHE_SIZE LRU List * reduces requests to disk
DB_16K_CACHE_SIZE by having data in
Oracle 6 thru 10g DB_32K_CACHE_SIZE memory
DB_KEEP_CACHE_SIZ You may have many
E different buffer caches
DB_RECYCLE_CACHE that help segregate on
_SIZE usage patterns
Large Pool LARGE_POOL_SIZE Shared server * For large memory
allocations
Oracle XA *
Form Oracle 8i I/O Server Processes
Backup & Restore
Java Pool JAVA_POOL_SIZE Run stats* Memory available for
the java memory
From Oracle 8i Methods* manager to use for all
Classes* things Java
Session code*
Data in JVM
Streams Pool STREAMS_POOL_SIZE Stream activity* New to Oracle 10g
Memory available for
From Oracle 10g Stream Processing

11
‫يمكن معرفة مقاس ال ‪ SGA‬بالنظر فى ملف المتغيرات (‪ ، )Parameters File‬او عن طريق كتابة‬
‫المر التالى ‪-:‬‬
‫‪SQL> SHOW SGA‬‬

‫‪:Related Views‬‬
‫* ‪V$SGA‬‬

‫‪:Program Global Area (PGA) 1.1.1.2‬‬


‫وتسمى أيضا ‪ Process Global Area‬وهو جزء من الذاكرة يتكون خارج ال ‪Instance‬‬
‫وهو يحتوى على معلومات خاصة لل ‪ Server Process‬الحالى ويتكون هذا الجزء من الذاكرة لحظة‬
‫إنشاء ال ‪ Server Process‬وتنتهى لحظة إنتهاء ال ‪ . Server Process‬وهذا الجزء ليس متاحة لباقى‬
‫المتصلين أى لكل ‪ Server Process‬فى قاعدة البيانات ‪ PGA‬خاصة به تحتوى على معلومات خاصة‬
‫به ‪.‬وهى تحتوى على ثلثة أجزاء ‪-:‬‬
‫‪Private SQL Area -1‬‬
‫‪Session Memory -2‬‬
‫‪SQL Work Area -3‬‬

‫‪Background Processes 1.1.2‬‬

‫‪12‬‬
‫وق بل الحد يث عن ال ‪ Background Processes‬ل بد من الذ كر بأن هناك ثل ثة انواع من ال‬
‫‪-: Processes‬‬

‫‪ -: User‬و هو يبدأ الع مل عند ما يطلب الم ستخدم الت صال بقوا عد البيانات‬ ‫‪process -1‬‬
‫عن طريق احد ادوات قواعد البيانات ‪.‬‬
‫ـد طلب‬
‫ـال بال ‪ Instances‬بعـ‬
‫ـة التصـ‬
‫ـم انشاؤه لحظـ‬
‫‪ -: Server‬ويتـ‬ ‫‪Process -2‬‬
‫ال ‪ User Process‬التصال بقواعد البيانات فيتم التحقق من المستخدم فلحظة التصال هى لحظة إنشاء‬
‫ال ‪ Server Process‬و هو يكون ب ين ال ‪ User Process‬وال ‪ ، Instance‬فل كل ‪ User Process‬فى‬
‫قاعدة البيانات ‪ Server Process‬خاص به هذا إذا ك نا نع مل فى بيئة ال ‪ Dedicated Server‬أ ما إذا‬
‫ل ‪ ،‬عموما سنناقش هذا المر لحقا ‪.‬‬
‫كنا نعمل فى بيئة ال ‪ Shared Server‬فالمر يختلف قلي ً‬
‫‪ - :Background Processes -3‬وهـو موضوع نقاشنـا فـى هذه الفقرة وهـى عبارة عـن معالجات‬
‫تعمـل فـى قاعدة البيانات بحيـث تقوم بمهام مختلفـة تبدأ العمـل لحظـة فتـح ال ‪ ، Instance‬وتنقسـم الى‬
‫قسمين‪-:‬‬

‫‪ :Mandatory -1‬ل بد من عملها لحظة فتح ال ‪. Instance‬‬

‫‪13‬‬
‫‪ : Optional -2‬وبدونها تستطيع ال ‪ Instance‬العمل وهذا النوع يعمل فى بعض الحوال التى يتم‬
‫فيه تهيئة قاعدة البيانات للعمل على خيارات معينة ‪.‬‬

‫‪:Mandatory Processes 1.1.2.1‬‬


‫ول يمكن لقاعدة البيانات العمل دون هذه ال ‪ ، Processes‬وهى‪-:‬‬

‫‪14‬‬
‫‪: (System Monitor (SMON -1‬‬
‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 1‬ويقوم بعمل السترجاع (‬
‫‪ )Recovery‬إذا حصل مشكلة فى ال ‪ ، Instance‬واذا كنا نعمل على البيئة (‪RAC) Real‬‬
‫‪ Application Clusters‬وهى عمل اكثر من ‪ Instance‬فى قاعدة البيانات الواحدة فإن ال ‪SMON‬‬
‫فى ال ‪ Instance‬السليمة يستطيع عمل ‪ Recovery‬لل ‪ Instance‬الخرى التى حدث فيها مشكلة ‪.‬‬

‫كذلك يستطيع ال ‪ SMON‬عمل تنظيف لل ‪ Segments‬المؤقتة التى لم يتم استخدامها من‬


‫فترة طويلة ‪.‬‬

‫‪: (Process Monitor (PMON -2‬‬


‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 1‬ويقوم بعمل ‪ Recovery‬لل‬
‫‪ Process‬إذا حصلت مشكلة فى ال ‪ ، User Process‬كذلك يقوم تنظيف ال ‪Database Buffer‬‬
‫‪ Cache‬لتاحة المصادر فى هذا الجزء من الذاكرة لل ‪ ، Process‬وكذلك يقوم بتسجيل المعلومات حول‬
‫ال ‪ Instance‬وال ‪ ، Dispatcher Processes‬وايضا يقوم بعمل اختبار لل ‪Dispatcher Processes‬‬
‫وال ‪ Server Processes‬ويقوم بعمل إعادة تشغيل فى حالة وجود مشكلة فيهم ‪.‬‬

‫‪: (Log Writer (LGWR -3‬‬


‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 1‬ويقوم بعمل كتابة للبيانات‬
‫الموجودة فى ال ‪ Red Log Buffer‬ويكتبها فى ال ‪ ، Redo Log Files‬ويقوم بهذه العملية فى‬
‫الحوال التية ‪-:‬‬
‫‪-1‬لحظة عمل ‪. Commit‬‬
‫‪-2‬كل ثلث ثوانى ‪.‬‬
‫‪-3‬عندما يمتلئ ثلث ال ‪. Redo Log Buffer‬‬
‫‪-4‬لحظة عمل ‪، DBWn‬سنناقش هذا لحقا ‪.‬‬
‫كذلك اال ‪ LGWR‬يقوم بكتابة التزامن لل ‪ Redo Log Groups‬فإذا حدثت مشكلة فى ‪Redo log‬‬
‫‪ File‬فإن ال ‪ LGWR‬يقوم بإرسال خطأ لملف ‪. Alert Log‬‬
‫ملحظة ‪ :‬يجب النتباه إلى أنه لحظة عمل ‪ Commit‬فإن ال ‪ LGWR‬يقوم بكتابة البيانات المثبتة‬
‫وغيرها الموجودة فى ال ‪ Redo log Buffer‬إلى ال ‪. Redo Log File‬‬
‫نستفيد من عملية ال ‪ LGWR‬فى السترجاع إذا حصلت مشكلة فى ال ‪. Instance‬‬

‫‪15‬‬
‫‪:(Database Writer (DBWn -4‬‬
‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 20‬ويقوم بكتابة البيانات الموجودة فى ال‬
‫‪ Database Buffer Cache‬لل ‪ ، Datafiles‬ويمكن تهيئة قاعدة البيانات لتعمل بأكثر من ‪DBWn‬‬
‫حسب الحاجة واقصلى عدد ‪. 20‬والمتغير الذي يتحكم فى عدد هذا ال ‪ Process‬هو‬
‫‪. DB_WRITER_PROCESSES‬‬

‫ويعمل هذا ال ‪ Process‬بكتابة البيانات الموجودة فى ال ‪ Database Buffer Cache‬لل ‪Datafiles‬‬


‫فى الحالت التية ‪-:‬‬
‫‪ -1‬لحظة حدوث ال ‪ Checkpoint‬وسنتحدث عن ذلك لحقا ‪.‬‬
‫‪ -2‬كل ثلث ثوانى ‪.‬‬
‫‪ -3‬لحظة حدوث ال ‪ Log Switch‬وسنتحدث عنه لحقا ‪.‬‬
‫‪ -4‬لحظة إغلق قاعدة البيانات ‪.‬‬
‫‪ -5‬لحظة وصول ال ‪ Block‬للقيمة المحددة ‪.‬‬
‫‪ -6‬لحظة إمتلء ال ‪. Buffer‬‬
‫‪ -7‬عند عمل التى ‪-:‬‬
‫* ‪Tablespace Offline‬‬
‫* ‪Tablespace Read Only‬‬
‫* ‪Table Drop or Truncate‬‬
‫* ‪Tablespace Begin Backup‬‬

‫‪:CKPT) Checkpoint Process) -5‬‬

‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 1‬ويقوم بالتأكد من أن كل‬


‫التعديلت التى تتم على البيانات فى ال ‪ Buffer‬تم كتابتها وتثبيتها فى ال ‪ Datafiles‬ومن ثم يقوم بعمل‬
‫تزامن كامل لكل ال ‪ Datafiles‬ويقوم بعمل تعديل لل ‪ Datafiles headers‬؛ وال ‪ Control files‬يتم‬

‫‪16‬‬
‫تعديله عند اخر ‪ ، SCN‬بحيث يتم تزامن كامل لقاعدة البيانات ونضمن أنه يمكن استرجاع قاعدة البيانات‬
‫فى حال حدوث مشكلة ‪.‬‬
‫ويتم عمل ال ‪ CKPT‬فى الحالت التالية ‪-:‬‬
‫‪ -1‬لحظة حدوث ‪.Log Switch‬‬
‫‪ -2‬عند وصول الزمن المحدد فى المتغير ‪LOG_CHECKPOINT_TIMEOUT‬‬
‫‪ -3‬عند ما يصل عدد ال ‪ BLOCKS‬المحدد فى المتغير‬
‫‪LOG_CHECKPOINT_INTERVAL‬‬
‫‪ -4‬عند وصول عدد ال ‪ Buffer‬المحدد فى المتغير ‪. FAST_START_IO_TARGET‬‬
‫‪ -5‬عند تنفيذ الوامر التالية ‪-:‬‬
‫‪;SQL> ALTER SYSTEM SWITCH LOGFILE‬‬
‫‪;SQL> ALTER SYSTEM CHECKPOINT‬‬

‫‪: (Recover (RECO -6‬‬


‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 1‬وستخدم هذا ال ‪Process‬‬
‫لمعالجة مشكلة العمليات الموزعة المعلقة نتيجة مشكلة فى الشبكة او النظام ‪ ،‬فبعد فترة محددة يقوم ال‬
‫‪ Process‬بمحاولة التصال عن بعد ومحاولة اكمال العملية أو التراجع عنها ‪.‬‬

‫‪:Optional Processes 1.1.2.2‬‬


‫ويمكن لقاعدة البيانات العمل دون هذه ال ‪ Processes‬ولكثرة هذه ال ‪ Processes‬سنتطرق لهمها‬
‫‪-:‬‬
‫‪: (Archiver (ARCn -1‬‬
‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 10‬ويقوم بكتابة ال ‪Online Red‬‬
‫‪ log Files‬فى ملف الرشيف (‪ )Archive Log Destination‬بعد حدوث ال ‪ ، Log Switch‬هذا ال‬

‫‪17‬‬
‫ يتم التحكم فى عدد‬, Archive Log Mode ‫ يعمل إذا كانت قاعدة البيانات تعمل فى النمط‬Process
. LOG_ARCHIVE_MAX_PROCESSES ‫ عن طريق المتغير‬Process ‫هذا ال‬

:(Recovery Writer(RVWR -2
‫ عند‬Process ‫ نستفيد من هذا ال‬Oracle 10g ‫ تم استحداثه فى الصدارة‬Process ‫هذا ال‬
. ‫ سنناقش هذا الموضوع لحقا‬، Flashback Database ‫عملية ال‬

.(Lock Monitor (LMON -3


. Lock Manager DAEMON -4
. LCKn) Lock Process) -5
. (Block Server Process (BSPn -6
. (Queue Monitor (QMNnَ -7
. (Event Monitor (EMNn -8
. (Shared Server Processes (Snnnٍ -9
. (Memory Manager (MMAN-10
.(Parallel Execution slaves (Pnnn-11
. (Trace Writer (TRWR -12
. DMON -13
. (Dispatcher (Dnnn -14
. MMON -15
. (Wakeup Monitor Process (WMON -16
. (Memory Monitor Light (MMON -17
. RBAL -18
. ARBx -19
. ASMB -20
. (Change Tracking Writer (CTWR -21
. (Job Queue Monitoring (CJQn -22

:Oracle Database 1.2

-: ‫وهو الجزء الثانى من مكونات قاعدة البيانات اوركل كما ذكرنا سابقا‬
Oracle Database server = Oracle Instance + oracle Database
-: ‫ويحتوى هذا الجزء من مجموعة من الملفات‬
-: Control files -1

18
‫فى قاعدة البيانات بجانب انه يحتوى عن المعلومات‬ ‫وهو الملف المسؤل عن التزامن‬
‫الساسية عن قاعدة البيانات كإسم قاعدة البيانات وبدونه ل تعمل قاعدة البيانات إذ أنه يحتوى على‬
‫مسارات ملفات قاعدة البيانات وإذا تمت إضافة ملف فى قاعدة البيانات يتم تحديث ال ‪Control file‬‬
‫اوتومتيكيا ‪.‬‬

‫‪-: Redo log files -2‬‬


‫ويستخدم هذا الملف حتى نستطيع عمل إسترجاع لقاعدة البيانات (‪ )Recover‬فى حالة‬
‫حدوث مشكلة فى قاعدة البيانات ‪ ،‬إذ أنه يحفظ التغيرات التى تحدث فى قاعدة البيانات ‪.‬‬
‫يتم تحديد هذا الملف عند فتح قاعدة البيانات عن طريق ال ‪ ، Parameter file‬ولحمايته من الفقدان‬
‫يجب استخدام اكثر من نسخة من هذا الملف عن طريق تحديد هذه النسخ فى ملف ال ‪. Parameter file‬‬

‫‪-: Database files -3‬‬


‫وهو المخزن الحقيقى للبيانات فى قاعدة البيانات أى أنه يحتوى على الجداول والمناظير‬
‫والمراجع (‪ ) Table & Views & Indexes‬والكائنات الخرى ‪.‬‬

‫‪-: Archived redo log files -4‬‬


‫وهو عبارة عن نسخة من ال ‪ Redo log files‬ونحتاجه أيضا عند عمل إسترجاع‬
‫لقاعدة البيانات (‪. )Recover‬‬

‫‪ -5‬الملفات الخرى‪-:‬‬
‫* ‪ Parameter file‬ويستخدم لعمل تهيئة لل ‪ Oracle Instance‬لحظة‬
‫تشغيلها‬
‫* ‪Password file‬ويسمح هذا الملف للمستخدمين التصال بقاعدة البيانات عن‬
‫بعد كمدراء لقاعدة البيانات ‪ ،‬وليس لتخزين كلمات السر للمستخدمين فى قاعدة البيانات كما يتصور‬
‫البعض ‪.‬‬
‫‪-:Tablespace and Data File‬‬

‫وهنا لبد من الحديث إلى انه يمكن تقسيم قاعدة البيانات الى (‪: )Physical & Logical‬‬

‫‪19‬‬
‫‪ :Physical‬حيث يمكن التعامل مع هذا النوع سواء كانت قاعدة البيانات مفتوحة أو مغلقة بحيث‬
‫يمكن التعامل مع هذا النوع عن طريق نظام التشغيل أو عن طريق قاعدة البيانات‪.‬‬

‫‪ :Logical‬ول نستطيع التعامل مع هذا النوع إلى أذا كانت قاعدة البيانات مفتوحة‪.‬‬

‫‪-:Tablespace and Data File‬‬

‫‪20‬‬
‫قاعدة البيانات فيزيائيا تتقسم إلى ملفات تخزينية يمكن أن تشاهد عن طريق نظام التشغيل وهى ملفات ال‬
‫‪ ، Data files‬وكذلك قاعدة البيانات تنقسم إلى وحدات تخزين منطقية (‪ )Logical‬وتسمى هذه الوحدات‬
‫‪. Tablespace‬‬

‫‪21‬‬
‫ال ‪ Tablespace‬وهو وحدة منطقية يحتوى على ‪ Data file‬واحد أو أكثر وكل ‪ Data file‬ينتمى فى‬
‫الحقيقة إلى ‪ Tablespace‬واحد ‪.‬‬
‫يمكن إنشاء ‪ Bigfile Tablespaces‬بحيث يحتوى على ملف ‪ Data file‬واحد ولكن كبير جدا بحيث‬
‫يكون اكبر من ‪. 4GB‬‬
‫ال ‪ Tablespace‬يتكون من مجموعة من الوحدات المنطقية الصغر وهى تسمى ‪ Segments‬وهى‬
‫وحدات منطقية يتكون منها ال ‪ Tablespace‬بحيث تنتمى ال ‪ Segment‬ل ‪ Tablespace‬واحد فقط‬
‫وهى تتكون من مجموعة من الوحدات المنطقية الصغر التى تسمى ‪ Extents‬وهى ايضا وحدات منطقية‬
‫تنتمى كل ‪ Extent‬ل ‪ Segment‬واحد وتتكون أيضا ال ‪ Extents‬من مجموعة أخرى أصغر وهى‬
‫أصغر وحدة منطقية تسمى ال ‪. Blocks‬‬
‫وعند إنشاء قاعدة البيانات يتم تحديد حجم ال ‪ Block‬لقاعدة البيانات ‪ ،‬ويمكن أن يكون حجم ال ‪Block‬‬
‫‪ 3BK‬او ‪ 5BK‬أو غيره وأكبر حجم لل ‪ Block‬يتوقف على نظام التشغيل ‪ ،‬وقبل الصدار ‪Oracle 9i‬‬
‫‪ Release‬كانت قاعدة البيانات تعمل على حجم واحد لل ‪ Block‬وابتدا ًء من الصدار ‪Oracle 9i‬‬
‫‪ Release‬أمكن لقاعدة البيانات العمل بأحجام مختلفة من الل ‪Block‬‬

‫ولنفترض السناريو التى ‪-:‬‬

‫‪22‬‬
‫!‪D‬‬

‫‪T2‬‬ ‫‪T2‬‬ ‫‪T2‬‬


‫‪D2‬‬

‫‪T1‬‬ ‫‪T1‬‬ ‫‪T1‬‬ ‫‪T1‬‬ ‫‪T1‬‬ ‫‪T1‬‬

‫‪T3‬‬ ‫‪T3‬‬ ‫‪T3‬‬

‫فانفترض أن هذا الشكل يمثل ‪ Tablepace‬يسمى ‪ . Users‬هذا ال ‪ Tablespace‬يحتوى على ملفين من‬
‫ال ‪Data file ( (D1&D2‬هذا ال ‪ Tablespace‬يحتوى على مجموعة من ال ‪Segments‬‬
‫‪ )(T1&T2&T3‬ال ‪ Segment‬الول ‪ T1‬مقسم إلى مجموعة من ال ‪ Extents‬وكل ‪ Extent‬بالطبع‬
‫مكون من مجموعة من ال ‪ ، Blocks‬نلحظ هنا أن ال ‪ Segment T1‬يمتد على كل من الملفين (‬
‫‪ )D1&D2‬أى أن جزء من ال ‪ Segment‬فى الملف ‪ D1‬والجزء الخر فى الملف ‪ D2‬لكن فى الوقت‬
‫نفسه هو ينتمى ل ‪ Tablespace‬واحد ‪.‬‬

‫قبل نهاية هذا الباب فلنتابع معا هذا السناريو وهو يوضح خطوات عمل قاعدة البيانات ‪:‬‬

‫‪23‬‬
‫‪1‬‬ ‫‪Instance‬‬

‫‪SGA‬‬

‫‪Database‬‬ ‫‪Redo log‬‬


‫‪buffer cache‬‬ ‫‪buffer‬‬

‫‪Database‬‬
‫‪3 Server‬‬ ‫‪LogWriter‬‬
‫‪Writer‬‬
‫‪process‬‬ ‫)‪(LGWR‬‬
‫‪2‬‬ ‫)‪(DBWn‬‬

‫‪User process‬‬

‫‪-1‬ال ‪ Instance‬تعمل على المخدم (‪.)Server‬‬


‫‪-2‬فى هذه المرحلة المستخدم يحاول التصال بقاعدة البيانات عن طريق ال ‪ Application‬أو‬
‫أحد أدوات قواعد البيانات‪.‬‬
‫‪-3‬فى هذه اللحظة تم التحقق من طلب المستخدم وتم إنشاء التصال وتكوين ‪Server‬‬
‫‪.Process‬‬

‫‪24‬‬
‫‪Instance‬‬

‫‪SGA‬‬

‫‪5‬‬ ‫‪7 Database‬‬ ‫‪Redo log‬‬


‫‪buffer cache‬‬ ‫‪buffer‬‬

‫‪Database‬‬
‫‪Server‬‬ ‫‪LogWriter‬‬
‫‪Writer‬‬
‫‪10‬‬ ‫‪process‬‬ ‫)‪(LGWR‬‬
‫)‪(DBWn‬‬

‫‪User process‬‬ ‫‪9‬‬


‫‪8‬‬
‫‪6‬‬

‫‪4‬‬
‫‪The user updates a row.‬‬
‫‪-4‬هنا المستخدم طلب تعديل صف ‪.‬‬
‫‪-5‬ال ‪ Server Process‬يستقبل هذا الطلب ويقوم بعمل اختبار لل ‪ Shared Pool‬هل هذا‬
‫الطلب موجود فى ال ‪ Shared SQL Area‬إذا كان موجود يقوم بالتأكد من أن للمستخدم‬
‫صلحية الوصول لهذا البيانات ‪ ،‬اما إذا كان هذا الطلب غير موجود يقوم بإنشاء ‪Shared‬‬
‫‪ SQL Area‬جديد ‪.‬‬
‫‪-6‬فى هذه المرحلة يقوم ال ‪ Server Process‬بجلب البيانات المطلوبة من ال ‪ Data file‬من‬
‫الجدول أو من ال ‪ Data Block‬المخزنة فى ال ‪. SGA‬‬
‫‪-7‬بعد جلب البيانات هنا يقوم ال ‪ Server‬بتعديل الجدول فى ال ‪. SGA‬‬
‫‪-8‬لحظة عمل ‪ Commit‬يقوم ال ‪ LGWR‬بكتابة العملية فى ال ‪. Redo Log File‬‬
‫‪-9‬يقوم ال ‪ DBWn‬بكتابة التعديلت فى ال ‪ Disk‬اى فى ال ‪. Data File‬‬
‫‪-10‬اخيرا يرسل ال ‪ Server Process‬يرسل رسالة بنجاح أو فشل العملية ‪.‬‬

‫‪25‬‬
26
‫النقاط الرئيسية التى سنناقشها فى هذا الباب ‪-:‬‬
‫•فهم الشروط الضرورية لنشاء قاعدة البيانات ‪.‬‬
‫•إنشاء قاعدة بيانات بالطريقة اليدوية ‪.‬‬

‫‪27‬‬
‫•إنشاء قاعدة البيانات بالداة ‪. DBCA‬‬

‫من أهم مهام مدير قاعدة البيانات هو التخطيط لقاعدة البيانات ‪ ،‬إذ ل يتصور مديرا ناجحا لقاعدة‬
‫البيانات ل يخطط بصورةٍ ما لقاعدة بياناته ‪ ،‬فما نوع البيانات التى سوف نخزنها فى كل ‪Tablespace‬‬
‫وكم ‪ Data file‬فى كل ‪ Tablespace‬وكيف سيتم تخزين ملفات قاعدة البيانات فيزيائيا على الديسك ‪،‬‬
‫وكيف سيتم عمل نسخ احتياطى لقاعدة البيانات ‪ ،‬وكيف نحافظ على قاعدة البيانات ‪ ،‬وكيف نستطيع رفع‬
‫الداءة فى قاعدة البيانات وغيرها من السئلة التى يجب ان تجد لها جوابا ‪.‬‬
‫بعد ذلك يجب أن نحدد ما نحتاجه من الذاكرة والديسك المناسب حسب متطلبات قاعدة البيانات‬
‫وعموما يجب وضع هذه العتبارات عند إنشاء قاعدة البيانات ‪.‬‬
‫فى الحقيقة يمكن إنشاء قاعدة البيانات أثناء إنزال الوركل عن طريق ال ‪OUI (Oracle‬‬
‫‪ )Universal Installer‬وذلك بواسطة الداة ‪ DBCA‬ولكن قد نحتاج لنشاء قاعدة بيانات أخرى ‪.،‬‬

‫‪28‬‬
‫عند إنشاء قاعدة بيانات اوركل يجب مراعاة النقاط التية‪-:‬‬
‫‪-1‬كم عدد ال ‪ Application‬التى تعمل على قاعدة البيانات ‪.‬‬
‫‪-2‬عدد المستخدمين إذ نحتاج وضع المتغير ‪ process‬فى ملف المتغيرات (‪)parameter file‬‬
‫‪.‬‬
‫‪-3‬مساحة الذاكرة ‪ SGA‬فهذه الذاكرة مطلوبة لعمل ال ‪ Instance‬وهى ل تقبل المشاركة بين‬
‫أكثر من ‪ Instance‬أى لكل ‪ Instance‬ذاكرة ‪ SGA‬خاصة بها ‪.‬‬
‫‪-4‬كذلك ال ‪ Block_Size‬الذى يعتمد عليه ال ‪. Row_Size‬‬
‫‪-5‬هل يمكن إغلق قاعدة البيانات لعمل النسخ الحتياطى ‪.‬‬

‫‪ -1‬إنشاء قاعدة البيانات بالطريقة اليدوية (‪: )Manually‬‬

‫قبل البدء يجب الشارة إلى أننا سنستخدم نظام التشغيل ‪. windows‬‬

‫‪-1‬تحديد اسم ال ‪ -: )Instance (ORACLE_SID‬فقد يكون هناك أكثر من ‪Oracle‬‬


‫‪ Instance‬فى الجهاز الواحد وذلك باستخدام المتغير ‪ . ORACLE_SID‬اسم ال ‪Instance‬‬
‫هنا ‪. OBAY‬‬

‫‪D:\ORACLE\PRODUCT\10.2.0>SET ORACLE_SID=OBAY‬‬

‫‪29‬‬
‫‪-2‬إنشاء ‪ Oracle Service‬وذلك لننا نعمل على نظام التشغيل ‪ WINDOWS‬إذ نحتاج لل‬
‫‪ Service‬لكل ‪ Instance‬تعمل فى نظام التشغيل ‪ WINDOWS‬ول يلزمنا ذلك فى نظام‬
‫التشغيل ‪. LINUX‬‬
‫وهى بإختصار عبارة عن ‪ SERVICE‬يتم إنشاؤها فى ال ‪. WINDOWS‬‬

‫‪D:\ORACLE\PRODUCT\10.2.0\DB_1>ORADIM –NEW –SID ‬‬
‫‪%ORACLE_SID% ­INTPWD PASSWORD –STARTMODE M‬‬

‫يمكن التحقق من النشاء عن طريق نظام التشغيل بالذهاب الى الٍ‪. Services‬‬

‫‪-3‬إنشاء ملف المتغيرات (‪ -: )Parameter File‬وذلك بنسخ الملف من المسار التالى ‪:‬‬

‫‪D:\ORACLE\PRODUCT\10.2.0\db_1\database\copy ‬‬
‫‪init.ora  INITobay.ora‬‬
‫اما إذا كنا نعمل على نظام التشغيل لينكس (‪ )UNUX‬فإن المسار سيكون ‪:‬‬
‫‪$ORACLE_HOME/DB‬‬
‫نتابع الخطوات السابقة ‪:‬‬

‫‪30‬‬
‫بالطبع نحتاج لتعديل ملف المتغيرات حسب المعطيات الجديدة ‪ ،‬على سبيل المثال ‪-:‬‬

‫‪31‬‬
CONTROL_FILES =
(‘D:\oracle\product\10.1.0\oradata\OBAY\CONTROL01.
CTL,
D:\oracle\product\10.1.0\oradata\OBAY\CONTROL02.CT
L,
D:\oracle\product\10.1.0\oradata\OBAY\CONTROL03.CT
L(
UNDO_MANAGEMENT = AUTO
undo_tablespace = ‘UNDO'
DB_NAME = OBAY
DB_BLOCK_SIZE = 8192
background_dump_dest =
'D:\oracle\product\10.1.0\admin\obay\bdump’
user_dump_dest =
'D:\oracle\product\10.1.0\admin\obay\udump'
core_dump_dest =
'D:\oracle\product\10.1.0\admin\obay\cdump'

NOMOUNT ‫ فى الوضع‬Instance ‫ تشغيل ال‬-4

32
‫ الن نقوم بإنشاء قاعدة البيانات‬-5

create database obay


Logfile
group 1
('D:\oracle\product\10.1.0\oradata\OBAY\redo1.log'(
size 10m,
group 2
('D:\oracle\product\10.1.0\oradata\OBAY\redo2.log'(
size 10m,
group 3
('D:\oracle\product\10.1.0\oradata\OBAY\redo3.log'(
size 10m
datafile
'd:\obay\system.dbf' size 50m
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
extent management local
sysaux datafile
'D:\oracle\product\10.1.0\oradata\OBAY\sysaux.dbf'
size 10m
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
undo tablespace undo
datafile
'D:\oracle\product\10.1.0\oradata\OBAY\undo.dbf'
size 20m
default temporary tablespace temp tempfile
'D:\oracle\product\10.1.0\oradata\OBAY\temp.dbf'
size 20m
default tablespace userdata1 datafile
'D:\oracle\product\10.1.0\oradata\OBAY\userdb.dbf'
size 10m ;

33
‫كما ذكرت سابقا أنت تستطيع إنشاء قاعدة البيانات حسب متطلباتك الخاصة وليست فقط كما‬
‫هو مذكور فى النموزج أعله ‪ ,‬لكن لبد من إنشاء (‪) SYSTEM & SYSAUX TABLESPACE‬‬
‫‪.‬‬
‫إذا حدث خطأ اثناء إنشاء قاعدة البيانات فإن الخطأ سيكتب فى الملف ‪ Alert Log‬الموجود فى المسار‬
‫المحدد فى ملف المتغيرات بالمتغير ال ‪. BACKGROUND_DUMP_DEST‬‬

‫أما إذا ظهرت الرسالة ‪ ORA-01031‬اثناء إنشاء قاعدة البيانات فهذا يعنى ان مستخدم نظام التشغيل‬
‫ليس عضوا فى المجموعة ‪ ORA_DBA‬فيجب إضافته فى المجموعة ‪.‬‬

‫بعد إنشاء قاعدة البيانات يمكن تشغيلها فى الوضع ‪ MOUNT‬او فتحها للستخدام ‪.‬‬

‫‪ -6‬إنشاء ال ‪ -: Data Dictionary‬وذلك من خلل تشغيل الملف فى المسار التالى ‪-:‬‬

‫‪D:\ORACLE\PRODUCT\10.1.0\DB_1\RDBMS\ADMIN\CATALOG.‬‬
‫‪SQL‬‬

‫‪34‬‬
‫ولكن يجب تشغيل الملف على المستخدم ‪. SYS‬‬

‫كذلك نشغل الملف على المسار التالى ‪-:‬‬

‫‪D:\ORACLE\PRODUCT\10.1.0\DB_1\RDBMS\ADMIN\CATPROC.‬‬
‫‪SQL‬‬

‫وذلك لنشاء كل ال ‪ Structures‬المطلوبة لعمل ‪. PL/SQL‬‬

‫ل يختلف المر كثيرا عند إستخدام نظام التشغيل (‪)UNIX‬‬

‫‪ -2‬إنشاء قاعدة البيانات عن طريق ال(‪: )DBCA‬‬

‫‪35‬‬
‫وهى أداة اصدرتها اوركل لعدة اغراض ‪-:‬‬
‫‪-1‬إنشاء قاعدة البيانات ‪.‬‬
‫‪-2‬إعادة تهيثة قاعدة البيانات ‪.‬‬
‫‪-3‬حذف قاعدة البيانات ‪.‬‬
‫‪ -4‬إنشاء قوالب لقاعدة البيانات (‪. )Templates‬‬

‫نتابع خطوات إنشاء قاعدة بيانات اوركل عن طريق الداة‬


‫‪)DATABASE CONFIGURATION ASSISTANT (DBCA‬‬

‫‪36‬‬
‫هنا الخيارات المتاحة للمستخدم ‪ ،‬سنختار بالطبع الخيار الول إنشاء قاعدة بيانات ‪.‬‬
‫إذا اخترت الخيار الثانى سيعرض لى قواعد البيانات الموجودة عندى ومن ثم اختار قاعدة البيانات المراد‬
‫إعادة تهيئتها ‪ ،‬وبعد ذلك سيعرض لى بعض الخيارات لعادة تهيئتها ‪.‬‬
‫الخيار الثالث بالطبع استطيع من خلله خذف قاعدة البيانات ‪ ،‬فقط ما على إل أن اختار قاعدة البيانات‬
‫المراد حزفها ‪.‬‬
‫الخيار الخير هو إما لنشاء قالب جديد وهو القالب الذى ستكون عليه قاعدة البيانات (‪ )Template‬أو‬
‫حذف قالب موجود ‪.‬‬

‫فى هذه الخطوة نختار القالب (‪ )Template‬الذى يتناسب مع مع متطلباتنا إذا لم يوجد نستطيع إنشاء قالب‬
‫بالخيار الرابع (‪. )Manage Template‬‬
‫ولنفترض أننا اخترنا القالب ‪. General Purpose‬‬

‫‪37‬‬
‫نختار هنا اسم قاعدة البيانات واسم ال ‪ )Instance (SID‬وليس بالضرورى أن يكون نفس السم ‪.‬‬

‫هنا بعض الخيارات كعمل نسخ احتياطى كل فترة معينة او تشغيل اليميل للرسال والستقبال ‪.‬‬

‫‪38‬‬
‫يمكن عمل كلمة سر واحدة لكل المستخدمين كما فى الخيار الول ويمكن تحديد كلمة سر لكل مستخدم‬
‫كما فى الخيار الثانى ‪.‬‬

‫هنا نحدد طريقة تخزين الملفات ‪،‬وقد اخترنا الطريقة الولى وهى ادارة الملفات عن طريق نظام التشغيل‪.‬‬
‫الطريقة الثانى هى طريقة تخزين وإدارة الية ولها ميزات سنتعرف عليها لحقا ‪.‬‬

‫‪39‬‬
‫نختار هنا مكان تخزين ملفات قاعدة البيانات ‪ .‬ولنفترض هنا الخيار الول وهو يعنى التخزين حسب ما‬
‫هو محدد فى القالب الذى اخترناه والذى كان ‪. General Purpose‬‬

‫يمكن فى هذه الخطوة أن نحدد ‪ Flash Recovery Area‬وهى مكان لتخزين وإدارة عمليات النسخ‬

‫الحتياطى والسترجاع وسنتحدث عنها لحقُا ‪ ,‬كما يمكن تشغيل الرشيف كما سنعرف لحقا ‪.‬‬

‫‪40‬‬
‫كما يمكن مشاهدة بعض المتغيرات والمعلومات عن قاعدة البيانات بالذهاب ال ‪File Location‬‬
‫‪. Variables‬‬

‫هنا يمكن إنشاء نموزج لل ‪ Schema‬للتدريب ‪.‬‬

‫فى هذه الشاشة يمكن أن نغير فى حجم الذاكرة ونحدد حجم ال ‪ Block‬لقاعدة البيانات وغيرها من‬
‫المتغيرات الموجودة فى ملف المتغيرات ‪.‬‬

‫‪41‬‬
‫هنا يمكن مشاهدة اماكن تخزين ملفات قاعدة البيانات ‪.‬‬

‫نختار هنا الخيار الول لنشاء قاعدة البيانات ‪ ،‬كما يمكن حفظ خطوات انشاء قاعدة البيانات كقالب وذلك‬
‫باختيار الخيار الثانى ‪.‬‬
‫عند الضغط على الخيار ‪ Finish‬تظهر الصفحة التالية ‪-:‬‬

‫‪42‬‬
‫وهى عبار عن تفاصيل ومعلومات عن قاعدة البينات التى نريد إنشاءها بالطبع يمكن حفظها بالضغط‬
‫على الخيار حفظ ‪.‬‬

‫ل حتى ينتهى أنشاء قاعدة البيانات ‪.‬‬


‫انتظر قلي ً‬

‫‪43‬‬
44
‫فى الباب السابق قمنا بإنشاء قاعدة البيانات وسنناقش فى هذا الفصل كيفية التحكم فى قاعدة‬
‫البيانات ‪ ،‬وهو امر مهم لمدير قاعدة البيانات ‪.‬‬

‫‪45‬‬
‫تخيل أنك مدير لقاعدة بيانات عملقة ‪ ،‬يتتطلب منك المرأن تكون هذه القاعدة متاحة للجميع‬
‫حتى زمن محدد بعد هذا الوقت تكون متاحة لعدد معين للمستخدمين ‪ ،‬هذا العدد من المستخدمين بعد زمن‬
‫اخر يستطيع فقط القراءة أى ل يستطيع الكتابة والتعديل ول المسح ‪.‬‬
‫هل تخيلت معى العمل الذى ينتظرك ؛ بالطبع عملً كبيرا لكن ليس صعبا إذا عرفت ماذا تريد أن‬
‫تفعل بالضبط ‪.‬‬
‫والن اول ما يجب أن تعرفه أنك تستطيع أن تتحكم فى قاعدة البيانات إذا كانت تعمل فى نظام التشغيل‬
‫ل ‪ STOP‬ليقاف العمل وكذلك ‪START‬‬
‫ويندوز عن طريق ال ‪ Services‬وهناك عدة خيارات أو ً‬
‫ل (& ‪Manual Disabled‬‬
‫للتشغيل وايضا ‪ RESTART‬لعادة التشغيل وكذلك هنا خيارات اخرى مث ً‬
‫‪.& (Automatic‬‬
‫‪ :Automatic‬والمعنى أنه لحظة تشغيل نظام التشغيل تعمل ال ‪ Services‬اليا إذا كانت فى الخيار‬
‫‪.START‬‬
‫‪ :Manual‬وهى أن تقوم بعمل تشغيل يدوى لل ‪ Services‬بعد تشغيل نظام التشغيل‪.‬‬
‫‪ :Disabled‬والمعنى إيقاف عمل ال ‪ Services‬مهما كان حالتها‪.‬‬

‫‪46‬‬
‫ملف المتغيرات (‪:)Initialization Parameter File‬‬
‫وهذا الملف شأنه عجيب إذ ل تعمل قاعدة البيانات دون هذا الملف لذا كان لزاما أن نتحدث عنه‬
‫فى هذا الفصل فهو اول ملف تحتاجه قاعدة البيانات عند تشغيلها ‪ ،‬فهو يحتوى على إسم قاعدة البيانات‬
‫وكذلك اسم ومكان ال ‪ Control Files‬وايضا عن طريقه تتهيأ الذاكرة (‪. )SGA‬‬
‫فلحظة تشغيل قاعدة البيانات يتم قراءة هذا الملف فيتم تكوين الذاكرة ويتم معرفة اسم ومكان‬
‫ملف ال ‪.Control Files‬‬
‫وهذا الملف قد يكون ‪-:‬‬
‫ويكون اسمه (‬ ‫‪:(Static Parameter File (PFILE.1‬‬
‫‪ ، )initSID.ora‬حيث ال ‪ SID‬هو اسم ال ‪.Instance‬‬
‫وهو ملفى نصى نستطيع أن نجرى عليه التغيرات التى‬
‫نحتاجها ثم نحفظه وذلك عن طريق نظام التشغيل ‪ ،‬ولكى‬
‫يحدث التاثير فى‬
‫قاعدة البيانات لبد من إغلقها وفتحها من جديد ‪.‬‬
‫وهذا نموزج لملف ‪: PFILE‬‬

‫‪47‬‬
‫يكو ن اسمه‬ ‫‪:(Persistent Parameter File (SPFILE.2‬‬
‫‪ ، spfileSID.ora‬حيث ال ‪ SID‬هو اسم ال ‪ ، Instance‬وهو ملف ثنائى ل نستطيع‬
‫التغيير فيه إلى عن طريق الوركل بواسطة المر ‪-:‬‬

‫‪ALTER SYSTEM SET %PARAMETER%=VALUE‬‬

‫;‪ALTER SYSTEM SET undo_tablespace = UNDO‬‬

‫وقد ل نحتاج لعادة تشغي قاعدة البيانات حتى تحدث التأثيرات وذلك حسب العامل ‪. SCOPE‬‬

‫=‪ALTER SYSTEM SET parameter = value [SCOPE ‬‬
‫]‪MEMORY|SPFILE|BOTH‬‬

‫وقد يأخذ العامل ‪SCOPE‬احدى ثلث قيم ‪-:‬‬


‫‪ :MEMORY-1‬وهى تعنى أن التغييرات تحدث فقط فى ال ‪ Instance‬التى تعمل‬
‫الن فأول إعاد ة تشغيل لقاعدة البيانات نفقد التغييرات‪.‬‬
‫‪ :SPFILE-2‬التغييرات هنا تحدث فى الملف ويحدث التاثير عند إعادة تشغيل‬
‫قاعدة البيانات‪.‬‬
‫‪ :BOTH-3‬التغييرات هنا تحدث فى ال ‪ Instance‬الحالية كما تحدث أيضا فى‬
‫الملف ‪ SPFILE‬اى أن التغييرات تظل باقية عند إعادة تشغيل قاعدة البيانات‪.‬‬
‫والصل ان التغيرات تحدث فى كل من ال ‪ Instance‬الحالية وال ‪ SPFILE‬اى (‪ )BOTH‬ولكن يعتمد‬
‫التغيير ايضا على المتغير فبعض المتغيرات ل يمكن تعديلها إل بوسطة الخيار ‪ ، SPIFLE‬اى ل يمكن‬
‫تغييرها إل بعد إغلق قاعدة البيانات‪.‬‬

‫يمكن إنشاء ملف ال ‪ SPFILE‬من الملف ‪ PFILE‬ولكن يجب أن يملك المستخدم الصلحية‬
‫‪.SYSDBA‬‬

‫;‪CREATE SPFILE FROM PFILE‬‬

‫‪48‬‬
‫كما يمكن إنشاء ملف ال ‪ PFILE‬من الملف ‪.SPFILE‬‬

‫تشغيل قاعدة البيانات (‪:)Starting Up Database‬‬

‫لتشغيل قاعدة البيانات يلزمك تحديد الحالة التى تريد أن تعمل بها قاعدة بياناتك ‪-:‬‬
‫‪.NOMOUNT-1‬‬
‫‪.MOUNT-2‬‬
‫‪.OPEN-3‬‬

‫‪Starting Up an Oracle DB Instance:‬‬

‫‪OPEN‬‬
‫‪STARTUP‬‬ ‫‪All files opened as‬‬
‫‪described by the control‬‬
‫‪file for this instance‬‬

‫‪Control file‬‬
‫‪opened for this‬‬
‫‪instance‬‬

‫‪Instance‬‬
‫‪started‬‬

‫‪:NOMOUNT‬‬
‫نشغل ال ‪ Instance‬فى هذه الحالة إذا أردنا أن نقوم بإنشاء قاعدة بيانات أو لعادة إنشاء ملف‬
‫ال ‪ ، Control Files‬وعند تشغيل ال ‪ Instance‬فى هذه الحالة تحدث الخطوات التالية ‪-:‬‬
‫‪-1‬قراءة ملف المتغيرات وذلك حسب الترتيب التالى ‪-:‬‬
‫ل ‪.spfileSID.ora‬‬
‫او ً‬ ‫*‬
‫* اذا لم يجده بيحث عن ‪.spfile.ora‬‬
‫إذا لم يجده يبحث عن ‪.initSID.ora‬‬ ‫*‬

‫‪49‬‬
‫‪ -2‬تكوين ال ‪.SGA‬‬
‫‪ -3‬تشغيل ال ‪.background processes‬‬
‫‪ -4‬فتح ملف ال ‪ alertSID.log‬وملف ال ‪. trace files‬‬

‫‪:MOUNT‬‬
‫تشغل ال ‪ Instance‬فى هذه الحالة عند إجراء بعض العمليات على قاعدة البيانات‬
‫كتغيير اسم ال ‪ Data files‬أو انجاز استرجاع كلى لقاعدة البيانات او تشغيل قاعدة البيانات فى ب‬
‫ل ‪ ،‬وعند تشغيل ال ‪ Instance‬فى هذه الحالة تحدث الخطوات التالية‬
‫عض الوضاع كوضع الرشيف مث ُ‬
‫‪-:‬‬
‫‪-1‬الوصول الى ملف ال ‪ Control files‬وفتحه بعدما تم تحديده بواسطة ملف المتغيرات ‪.‬‬
‫‪-2‬قراءة ملف ال ‪ Control files‬لتحديد ملفات ال ‪ Data Files‬ومعرفة حالتها وكذلك لتحديد‬
‫ملفات ال ‪. Redo log Files‬‬

‫‪:OPEN‬‬
‫هذا هو الوضع الصلى عند تشغيل قاعدة البيانات بحيث تكون ال ‪ Instance‬مفتوحة وقاعدة‬
‫البيانات متاحة بحيث يستطيع المستخدمين التصال بقاعدة البيانات وتنفيذ عملياتهم ‪.‬‬
‫واثناء التشغيل فى هذه الحالة تحدث الخطوات التالية ‪-:‬‬

‫‪50‬‬
‫‪-1‬فتح ملفات ال ‪.Online Data Files‬‬
‫‪-2‬فتح ملفات ال ‪.Online Redo Log Files‬‬

‫أو‬

‫ل فى الوضع‬
‫هكذا تكون قاعدة البيانات متاحة للمستخدمين ‪ ،‬وإذا كانت قاعدة البيانات مفتوحة مث ً‬
‫‪ NOMOUNT OR MOUNT‬وأردت أن تفتحها فى الوضع ‪ OPEN‬يلزمك استخدام المر‬
‫‪.ALTER‬‬

‫‪51‬‬
‫إغلق قاعدة البيانات (‪:)Shutting Down The Database‬‬
‫عند إغلق قاعدة البيانات يجب أن تملك الصلحية ‪ SYSDBA OR SYSOPER‬وهناك عدة‬
‫اوضاع لغلق قاعدة البيانات ‪-:‬‬
‫‪.NORMAL-1‬‬
‫‪.TRANSACTIONAL-2‬‬
‫‪.IMMEDIATE-3‬‬
‫‪.ABORT-4‬‬

‫‪52‬‬
‫‪:NORMAL -1‬‬

‫وهو الوضع الصلى لغلق قاعدة البيانات واثناء الغلق تحدث الخطوات التالية ‪-:‬‬
‫•ل يسمح بإتصال مستخدم جديد بقاعدة البيانات ‪.‬‬
‫•‪ Oracle Server‬ينتظر كل المستخدمين من انهاء اتصالهم قبل‬
‫اكمال إغلق قاعدة البيانات‪.‬‬
‫•كل البيانات الموجود فى ال ‪ Buffer‬يجب أن تكتب فى الديسك‪.‬‬
‫•إنهاء ال ‪ Background Processes‬وكذلك إالغاء ال ‪SGA‬من‬
‫الذاكرة‪.‬‬
‫•إغلق قاعدة البيانات‪.‬‬
‫يتم إغلق ملفات قاعدة البيانات قبل أغلق‬ ‫•‬
‫ال ‪.Instance‬‬
‫•ل تحتاج لعملية إسترجاع لل ‪Instance‬عند فتح قاعدة البيانات من‬
‫جديد‪.‬‬

‫‪53‬‬
‫‪: TRANSACTIONAL -2‬‬
‫فى هذا الوضع من الغلق تحدث الخطوات التالية ‪-:‬‬
‫•كل المستخدمين ل يستطيعون بدء عمليات جديدة ‪.‬‬
‫•عند إنتهاء المستخدم من العملية (‪ )Transaction‬الحالية يتم قطع‬
‫إتصاله بقاعدة البيانات‪.‬‬
‫•لحظة إنتهاء كل العمليات (‪ )Transactions‬فى قاعدة البيانات يتم‬
‫إغلق قاعدة البيانات ‪.‬‬
‫ل تحتاج لعملية إسترجاع لل ‪Instance‬عند فتح قاعدة‬ ‫•‬
‫البيانات من جديد‪.‬‬

‫‪:IMMEDIATE-3‬‬
‫فى هذا الوضع من الغلق تحدث الخطوات التالية ‪-:‬‬
‫•العمليات الحالية فى قاعدة البيانات يتم قطعها مباشرةً ‪.‬‬
‫•‪ Oracle Server‬ل ينتظر المستخدميين الحاليين فى قاعدة البيانات‬
‫حتى ينهوا إتصالهم‪.‬‬
‫•‪ Oracle Server‬يقوم بعمل تراجع للعمليات النشطة حاليا فلى ال‬
‫‪.Instance‬‬
‫•يتم إغلق ملفات قاعدة البيانات قبل أغلق ال ‪.Instance‬‬
‫•ل تحتاج لعملية إسترجاع لل ‪Instance‬عند فتح قاعدة البيانات من‬
‫جديد ‪.‬‬

‫‪54‬‬
‫‪:ABORT -4‬‬
‫فى هذا الوضع من الغلق تحدث الخطوات التالية ‪-:‬‬
‫•العمليات الحالية فى قاعدة البيانات يتم قطعها مباشرةً ‪.‬‬
‫•ل ينتظر المستخدميين الحاليين فى قاعدة البيانات حتى ينهوا‬
‫إتصالهم‪.‬‬
‫•البيانات الموجودة فى ال ‪ Buffer‬ل تكتب فى الديسك‪.‬‬
‫•العمليات التى لم يتم تثبيتها ل يتم التراجع عنها ‪.‬‬
‫•يتم إنهاء ال ‪ Instance‬دون إغلق ملفات قاعدة البيانات‪.‬‬
‫•عند فتح قاعدة البيانات من جديد نحتاج لعمل إسترجاع لل‬

‫‪.Instance‬‬

‫‪Opening a Database in Read-Only Mode:‬‬

‫يمكن فتح قاعدة البيانات فى الوضع ‪ Read Only‬وذلك لعدم اجراء أى تعديلت على قاعدة اليبانات ‪.‬‬
‫اثناء فتح قاعدة البيانات فى الوضع ‪ Read Only‬يمكن القيام ببعض المهام ‪-:‬‬
‫‪-1‬تنفيذ إستعلم ‪.‬‬
‫‪-2‬وضع ملفات ال ‪ Data Files‬فى الوضع ‪. and online offline‬‬
‫‪-3‬إنجاز إسترجاع لملفات ‪.offline data file and tablespace‬‬

‫‪55‬‬
‫‪Opening a Database in Restricted Mode:‬‬

‫فى هذا الوضع يمنع دخول المستخدمين لقاعدة البيانات إل إذا كان المستخدم يملك صلحية‬
‫‪RESTRICTED SESSION PRIVILEGE.‬‬

‫فى الحقيقة هذا الوضع مفيد فى البعض الحيان مثلً اثناء قيامك بعمل تصدير ‪ Export‬لقاعدة البيانات‬
‫ول تريد من المستخدمين من الدخول لقاعدة البيانات ‪.‬‬

‫او‬

‫‪56‬‬
‫الن كل المستخدمين الذين ل يملكون صلحية ال ‪ RESTRICTED SESSION PRIVILEGE‬ل‬
‫يستطيعون دخول قاعدة البيانات ‪.‬‬

‫الن يمكن إنهاء كل اتصالت المستخدمين الذين اتصلوا قبل تطبيق النمط ‪RESTRICTED‬‬
‫‪ SESSION‬وذلك على خطوتين ‪-:‬‬
‫‪-1‬تحديد ال ‪ SESSION‬التى نريد إلغاءها وذلك عن طريق الستعلم التى ‪:‬‬

‫‪SELECT SID, SERIAL# FROM V$SESSION‬‬

‫‪-2‬إلغاء ال ‪.SESSION‬‬

‫‪57‬‬
58
‫تحدثنا سابقا ان التخزين فى قاعدة البيانات يكون على حالتين الول التخزين المنطقى ‪Logical‬‬
‫فى ال ‪ Tablespaces‬والثانى ‪ Physical‬فى ال ‪. Data Files‬‬

‫وذكرنا كذلك أن اى ‪ Data Files‬يكون فى قاعدة البيانات هو فى الحقيقة ينتمى ل‬


‫‪ Tablespace‬واحد ‪.‬‬

‫بمعنى اخر أنه ل يوجد ‪ Data Files‬فى قاعدة البيانات ل ينتمى ل ‪. Tablespace‬‬

‫‪59‬‬
‫وعموما فى هذا الفصل سنتحدث عن ‪-:‬‬
‫‪-1‬مفاهيم عامة عن ال ‪.Tablespaces‬‬
‫‪-2‬إنشاء ال ‪.Tablespaces‬‬
‫‪-3‬إدارة ال ‪.Tablespaces‬‬
‫‪-4‬كيفية الحصول على معلومات عن ال ‪.Tablespaces‬‬

‫‪60‬‬
‫‪-1‬مفاهيم عامة عن ال ‪:Tablespaces‬‬

‫‪61‬‬
‫الشكل اعله يوضح الخيارات المتاحة لل ‪ Tablespaces‬وهى ‪:‬‬
‫‪ :Space Management in Tablespaces‬وهى كيفية إدارة المساحة‬ ‫‪-‬‬ ‫‪1‬‬
‫فى ال‪ Tablespaces‬وهناك نوعان‪-:‬‬
‫‪.Locally Managed Tablespaces -1‬‬
‫هنا يتم إدارة ال‪ Extents‬فى ال‪ Tablespace‬عن طريق ال‪ Tablespace‬بواسطة‬
‫ال ‪ ،Bitmaps‬فلحظة تخصيص ال‪ Extents‬أو تحريرها يقوم ال‪ Oracle Server‬بتغير‬
‫ال‬ ‫قيمة ال‪ Bitmap‬للحالة الجديدة ‪ .‬وهذا النوع من الدارة هو الصل عند إنشاء‬
‫‪ Tablespace‬فى الصدار ‪ ، Oracle 10g‬وقد صار هذا النوع متاح إبتداء من الصدار ‪, Oracle 8i‬‬
‫ولنه ل يحدث تعديل فى ال‪ Dictionary Data‬فإنه ل يتم ‪.Generate Undo Information‬‬
‫لتحويل إدارة ال‪ Tablespace‬من ال ‪Data Dictionary‬الى ‪ Locally‬نستخدم‬

‫‪DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL‬‬

‫فى هذا النوع من إدارة ال‪ Tablespace‬هناك نوعان لدارة ال‪:Extents‬‬


‫‪ :Automatic -1‬هنا ل نحدد حجم ال‪ Extent‬إنما يتم تحديده عن‬
‫عن طريق النظام ‪ ،‬ول يمكن تطبيق هذا النوع فى‬
‫(‪.)Temporary Tablespace‬‬
‫‪ :Uniform -2‬هنا يمكن تحديد حجم ال‪ Extent‬فى ال‪Tablespace‬‬
‫والصل حجم ال‪ extent‬هو ‪ .IMB‬ل يمكن تطبيق هذا‬
‫‪.Undo Tablespace‬‬ ‫النوع فى‬

‫وكذلك فى هذا النوع من إدارة ال‪ Tablespace‬هناك نوعان لدارة ال‪:Segement‬‬


‫‪.Automatic -1‬‬
‫‪.Manual -2‬‬

‫‪Dictionary- Managed Tablespaces: -2‬‬


‫هنا يتم إدارة ال‪ Extents‬فى ال‪ Tablespace‬عن طريق ال‪Data Dictionary‬‬
‫فلحظة تخصيص ال ‪ Extents‬أو تحريرها يقوم ال ‪Oracle Server‬‬
‫بتغير ال ‪. Data Dictionary Tables‬‬

‫‪:Logging-2‬‬

‫‪62‬‬
‫‪ :Yes-1‬المعنى لحظة تغير الكائنات فى ال ‪ Tablespaces‬فانه يتم‬
‫كتابة التغييرات فى ال ‪.Redo Log Files‬‬
‫‪ :NO-2‬المعنى لحظة تغير الكائنات فى ال ‪ Tablespaces‬فانه ل يتم‬
‫كتابة كل التغييرات فى ال ‪.Redo Log Files‬‬

‫‪:Mode -3‬‬
‫‪ :Read Only -1‬المعنى هنا أننا ل نستطيع الكتابة أو التعديل أو المسح على البيانات‬
‫الموجودة فى ال ‪ ، Tablespace‬بالطبع ل نستطيع أن نضع كل من‬
‫ال(‪ ) System & Sysaux Tablspace‬فى الوضع ‪ Read‬‬
‫‪.Only‬‬
‫‪ :Read and write -2‬المعنى أننا نستطيع الكتابة أو التعديل أو المسح على البيانات‬
‫الموجودة فى ال ‪.Tablespace‬‬

‫‪:Views -4‬‬
‫وهى الستعلمات لمعرفة معلومات عن ال ‪ Tablespaces‬وال ‪..Data Files‬‬
‫‪DBA_TABLESPACES‬‬
‫‪V$TABLESPACE‬‬
‫‪DBA_DATA_FILES‬‬
‫‪V$DATAFILE‬‬
‫‪DBA_TEMP_FILES‬‬
‫‪V$TEMPFILE‬‬

‫‪:Contains -5‬‬
‫‪ : Permanent -1‬وهو لتخزين الكائنات المستديمة فى قاعدة البيانات ‪.‬‬
‫‪ :Temporary -2‬لتخزين الكائنات المؤقتة فى قاعدة البيانات لذلك تحتاج قاعدة‬
‫مثلً لعمليات ترتيب البيانات‪.‬‬ ‫البيانات ‪،‬‬
‫‪ :Undo -3‬تستخدمه ال ‪ Database Server‬لتخزين ال ‪ Undo Information‬وهو‬
‫فى قاعدة البيانات ويتم إنشاءه أثناء إنشاء قاعدة البيانات ويمكن اضافة اخرى عندما‬ ‫ضرورى‬
‫نحتاج لذلك لكن فى الوقت الواحد يعمل ‪ Undo‬واحد فقط يحدد عن طريق ملف المتغيرات‬
‫‪.‬‬ ‫‪.%Undo_Tablespace=%Value‬‬
‫‪.‬‬
‫‪:Status -6‬‬

‫‪63‬‬
‫‪ :Online -1‬أى أن ال ‪ Tablespace‬متاح لجميع المستخدمين ‪.‬‬
‫‪ :Offline -2‬اى أن ال ‪ Tablespace‬غير متاح للمستخدمين وهناك عدة خيارات لهذا الوضع‬
‫(‪ . ) Normal & Temporary & Immediate & For Recover‬ل يمكن وضع‬
‫(‪ )System & Undo Tablespace‬فى الوضع ‪.Offline‬‬

‫‪:SQL‬‬ ‫‪-7‬‬
‫‪ :Create -1‬لنشاء ال ‪.Tablespace‬‬
‫‪ :Alter -2‬لجراء تغيرات على ال ‪.Tablespace‬‬
‫‪ :Drop -3‬لحذف ال ‪.Tablespace‬‬

‫‪:Type -8‬‬
‫‪ :Small Tablespace -1‬وهو ‪ Tablespace‬يحتوى على ‪ Data File‬واحد أو أكثر وهو‬
‫الصل عند إنشاء ‪.Tablespace‬‬
‫‪ :Big Tablespace -2‬وهو نوع جديد من ال ‪ Tablespace‬صار متاح فى الصدار‬
‫‪ ، Oracle 10g‬بحيث تصل مساحته الى ‪ )Terabytes(TB 128‬ويحتوى على ملف‬
‫واحد فقط ‪.‬‬ ‫‪data File‬‬

‫تعريف عن بعض ال ‪:Tablespace‬‬

‫‪:System Tablespace‬‬ ‫‪-1‬‬


‫هو أهم ‪ Tablespace‬فى قاعدة البيانات على الطلق إذ ل تعمل قاعدة‬
‫البيانات بدونه كذلك ل نستطيع تغير حالته إلى الوضع (‪. ) Read only & Offline‬‬

‫‪64‬‬
‫يستخدم هذا ال ‪ Tablespace‬من قبل ال ‪ Oracle Server‬لدارة قاعدة البيانات ‪ ،‬حيث يحتوى‬
‫على ال ‪ Data Dictionary‬والجداول التى تحتوى على معلومات إدارية حول قاعدة البيانات ‪ ،‬كذلك‬
‫يحتوى على (‪.)Sys Schema‬‬

‫‪:Sysaux Tablespace -2‬‬


‫وهو ‪ Tablespace‬مساعد لل ‪ System Tablespace‬يحتوى على بعض المكونات والمنتجات‬
‫التى تستخدم فى إدارة قاعدة البيانات ‪ .‬وهذا ال ‪ Tablespace‬صار ضرورى فى قاعدة البيانات إبتداءً‬
‫من الصدار ‪. Oracle10g‬‬

‫‪:Temp -3‬‬
‫وهو ‪ Tablespace‬يستخدم لتخزين الجداول والمراجع المؤقتة ‪ ،‬مثل عند الترتيب ‪ .‬وقد يكون‬
‫هناك أكثر من ‪ Temporary Tablespace‬فى قاعدة البيانات الواحدة ولكن يعمل واحد فى اللحظة على‬
‫قاعدة البيانات ‪.‬‬

‫‪:Undo -4‬‬
‫يستخدم هذا ال ‪ Tablespace‬من قبل ال ‪ Oracle Server‬لتخزين ال ‪Undo‬‬
‫‪Information‬‬
‫‪ ،‬هل فكرت كيف يمكن التراجع عن عملية تعديل لحقل معين ‪ ،‬المعلومات القديمة يتم حفظها فى هذا ال‬
‫‪.Tablespace‬‬

‫عملى‪:‬‬

‫‪ -1‬انشاء ‪ Tablespace‬جديد ‪:‬‬

‫'‪CREATE TABLESPACE TEST DATAFILE 'D:\TEST\TEST1DBF‬‬


‫;‪SIZE 10M NOLOGGING‬‬

‫‪65‬‬
Locally Managed ‫ فإن الصل هو‬Tablespace ‫بما أننا لم نحدد نوع إدارة ال‬
.Tablespace

CREATE TABLESPACE TEST DATAFILE 'D:\TEST\TEST.DBF'


SIZE 10M EXTENT MANAGEMENT LOCAL UNIFORM 100K;

CREATE TABLESPACE TEST DATAFILE 'D:\TEST\TEST.DBF'


SIZE 10M EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

Tablespaces ‫ زيادة حجم ال‬-2

.Tablespace ‫ جديد لل‬Data File ‫الطريقة الولى إضافة‬

ALTER TABLESPACE TEST ADD DATAFILE


‘D:\TEST\TEST.DBF’ SIZE 5M;

66
. ‫ الموجودة‬Data File ‫الطريقة الثانية زيادة حجم ال‬

ALTER DATABASE DATAFILE 'D:\TEST\TEST.DBF' RESIZE


12M;

:Tablespace ‫ حزف ال‬-3

.Data Files ‫ فقط دون ال‬Tablespace ‫الطريقة الولى مسح ال‬

DROP TABLESPACE TEST;

Tablespace ‫ موجود على نظام التشغيل ويمكن إستخدامه عند إنشاء‬Data File ‫بهذه الطريقة يظل ال‬
. ‫جديد‬

CREATE TABLESPACE OBAY DATAFILE 'D:\TEST\TEST.DBF'


REUSE;

.Data File ‫ ومعه ال‬Tablespace ‫الطريقة الثانية حزف ال‬

DROP TABLESPACE OBAY INCLUDING CONTENTS AND


67
DATAFILES;
:Read Only ‫ إلى الوضع‬Tablespace ‫ تحويل ال‬-4

ALTER TABLESPACE TEST READ ONLY;

.Read Only ‫ فى الوضع‬System Tablespace ‫حاول أن تضع ال‬

.Sysaux Tablespace ‫لحظ الرسالة كذلك الحال عن ال‬

:Read Write ‫ الى الوضع‬Tablespace ‫ تحويل ال‬-5

ALTER TABLESPACE TEST READ WRITE;

68
:Offline ‫ الى الوضع‬Tablespace ‫ تحويل ال‬-6

ALTER TABLESPACE TEST OFFLINE

:Online ‫ الى الوضع‬Tablespace ‫ نحويل ال‬7

ALTER TABLESPACE TEST OFFLINE;

:Tablespace ‫ لعادة تسمية ال‬8-

ALTER TABLESPACE TEST RENAM TO EXAM;

:Temporary Tablespace ‫ إنشاء‬-9

CREATE TEMPORARY TABLESPACE TEMPEXAM TEMPFILE


'D:\TEST\TEMPEXAM.DBF' SIZE 7M;

69
.‫ فى قاعدة البيانات‬Default Temporary Tablespace ‫ هو ال‬Tablespace ‫وحتى يكون هذا ال‬

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE


TEMPEXAM;

. Default Temporary Tablespace ‫يمكن التأكد من ال‬

SELECT PROPERTY_NAME,PROPERTY_VALUE FROM


DATABASE_PROPERTIES WHERE
PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';

:Temporary Tablespace Group ‫ إنشاء‬-10


‫ المستخدم‬Resource ‫ تستخدم عند نقص ال‬Oracle 10g ‫وهو ميزة مستحدثة فى الصدار‬
. ‫للتخزين المؤقت‬

CREATE TEMPORARY TABLESPACE TEMPG1 TEMPFILE


'D:\TEST\TEMPG1.DBF' SIZE 4M TABLESPACE GROUP
GROUB1;

70
.Group ‫ اخر لنفس ال‬Tablespace ‫أنشاء‬

.Group ‫ موجود أصلً لل‬Tablespace ‫إضافة‬

ALTER TABLESPACE TEMPEXAM TABLESPACE GROUP GROUP1;

:Big Tablespace ‫ إنشاء‬-11

CREATE BIGFILE TABLESPACE BIG1 DATAFILE


‘D:\TEST\BIG1.BDF’ SIZE 20M;

TABLESPACES & DATAFILES ‫للستعلم عن ال‬


DBA_TABLESPACES
USER_TABLESPACES
DBA_TABLESPACE_GROUPS
V$TABLESPACE

71
DBA_DATA_FILES
DBA_TEMP_FILES

72
‫‪:Control File‬‬

‫او يمكن أن نسميه ملف التحكم وهو ملف ثنائى اى ل يمكن قراءته إذ أنه ليس نصيا ‪،‬‬
‫وبدونه ل تعمل قاعدة البيانات ‪ ،‬وييم قراءته فى الوضع ‪ ، Mount‬إذا يمكن أن نفتح قاعدة البيانات فى‬
‫الوضع ‪ Nomount‬حتى لو فقدنا ملف ال ‪. Control File‬‬

‫‪73‬‬
‫وبالطبع يكون تابع لقاعدة بيانات واحدة ‪ ،‬ويتم تحديثه فقط عن طريق ال ‪ Oracle Server‬اثناء‬
‫عمل قاعدة البيانات فل يستطيع مدير قاعدة البيانات تحديثه ‪.‬‬
‫إذا فقدنا ال ‪ Control File‬نحتاج لسترجاعه قبل فتح قاعدة البيانات من جديد ‪.‬‬
‫يتم إنشاؤه أثناء إنشاء قاعدة البيانات ‪ ،‬كما يمكن زيادة عدد ال ‪ Control File‬بعد إنشاء قاعدة‬
‫البيانات حتى نستطيع السترجاع إذا فقدنا احد ال ‪. Control File‬‬

‫ويحتوى ال ‪ Control Files‬على التى ‪-:‬‬


‫‪ -1‬اسم قاعدة البيانات‪.‬‬
‫‪ -2‬وقت إنشاء قاعدة البيانات‪.‬‬
‫‪ -3‬اسماء ال ‪.Tablespaces‬‬
‫‪ -4‬إسم ومكان ال ‪ Data Files‬وال ‪.Redo Log Files‬‬
‫‪ -5‬ال ‪ Redo Log‬الحلى وكذلك رقمه المتسلسل ‪.‬‬
‫ل معومات ال ‪ . RMAN‬سناقش ذلك لحقا ‪.‬‬
‫‪ -6‬ومعلومات عن النسخ الحتياطى ‪ .‬مث ً‬
‫‪ -7‬ومعلومات عن الرشيف ‪.‬‬
‫‪ -8‬يحتوى على المعلومات التالية (‪MAXLOGFILES . MAXLOGMEMBERS.‬‬
‫‪.)MAXLOGHISTORY. MAXDATAFILES .MAXINSTANCES‬‬

‫‪:Multiplexing the Control File‬‬


‫والمعنى أن قاعدة البيانات تعمل على عدد من ال ‪ Control File‬مع العلم أن كل ملفات ال‬
‫‪ Control File‬هى طبق الصل ‪ ،‬نستطيع بهذه الطريقة تأمين قاعدة البينات فى حال فقدان احد ال‬
‫‪.Control File‬‬
‫والفضل كذلك توزيع هذه الملفات على عدد من ال ‪ Disk‬حتى ل نفقدها جميعا ‪.‬‬

‫‪74‬‬
‫الن نفترض أن لدينا قاعدة البيانات اسمها ‪ OBAY‬تحتوى على ‪ 3‬ملفات من ال ‪Control‬‬
‫‪ Files‬نريد أن نضيف لها ملف ‪ Control File‬اخر ‪.‬‬
‫سنقوم بعمل هذا السناريو فى حالين ‪-:‬‬
‫الحال الول ‪ :‬باستخدام ال ‪.SPFILE‬‬
‫الحال الثانى ‪ :‬باستخدام ال ‪.init.ora‬‬

‫الحالة الولى (‪-: )SPFILE‬‬


‫‪ -1‬نقوم بتعديل المتغير ‪ Control_files‬على ملف المتغيرات (‪ ) SPFILE‬ونضيف اليه مكان ال‬
‫‪ Control File‬الذى نريد أن نضيفه لقاعدة البيانات ‪.‬‬

‫‪ALTER SYSTEM SET‬‬


‫‪CONTROL_FILES='D:\oracle\product\10.1.0\oradata\OBAY‬‬
‫‪\CONTROL01.CTL','D:\oracle\product\10.1.0\oradata\OB‬‬
‫\‪AY\CONTROL02.CTL','D:\oracle\product\10.1.0\oradata‬‬
‫‪OBAY\CONTROL03.CTL','D:\oracle\product\10.1.0\oradat‬‬
‫‪a\OBAY\CONTROL04.CTL' SCOPE=SPFILE‬‬

‫‪ -2‬يلزمنا إغلق قاعدة البيانات الن حتى يتم تحديث التعديل السابق ‪.‬‬

‫‪ -3‬عن طريق نظام التشغيل نقوم بعمل نسخ لحد ملفات ال ‪ Control Files‬ال موجودة الن ونضعه‬
‫ونسميه كما حددناه فى المتغير ‪Control_Files‬‬

‫‪75‬‬
‫‪ -4‬الن يمكن فتح قاعدة البيانات ‪.‬‬

‫وهكذا قاعدة البيانات الن تعمل باربعة من ال ‪ Control Files‬بدلً من ثلثة ‪.‬‬

‫لحظ أن العملية تتطلب إغلق لقاعدة البيانات ومن ثم عمل نسخ على نظام التشغيل ومن ثم فتح‬
‫قاعد البيانات من جديد ‪.‬‬

‫‪76‬‬
‫الحالة الثانية (‪-: )init.ora‬‬
‫فى الحالة الولى قاعدة البيانات كانت تعمل على ملف المتغيرات (‪ )SPFILE‬والن نفترض‬
‫أن قاعدة البيانات تعمل على ملف المتغيرات (‪-: )initobay.ora‬‬
‫‪ -1‬قفل قاعدة البيانات ‪.‬‬

‫‪ -2‬تعديل المتغير ‪ Control_Files‬على ملف المتغيرات ‪.initobay.ora‬‬

‫وذلك عن طريق نظام التشغيل ‪.‬‬

‫‪77‬‬
‫عند كتابة المر اعله سيفتح ملف المتغيرات ونعدل فى المتغير ‪ Control_Files‬بحيث نكتب المسار‬
‫الجديد واسم الملف الجديد ‪ ،‬ولنفترض أن اسمه ‪ CONTROL05‬فى نفس المسار ‪.‬‬

‫بعد التعديل نقوم بحفظ التعديلت على الملف ‪.‬‬


‫‪ -3‬عن طريق نظام التشغيل نقوم بعمل نسخ لحد ملفات ال ‪ Control Files‬الموجودة الن ونضعه‬
‫ونسميه كما حددناه فى المتغير ‪. Control_Files‬‬

‫‪ -5‬فتح قاعدة البيانات ‪.‬‬

‫بالطبع يمكن التحقق من التعديل عن طريق المر ‪.SHOW APRAMAETERS‬‬

‫‪78‬‬
‫تغيير إسم قاعدة البيانات ‪-:‬‬

‫هل فكرت يوما تغيير إسم قاعدة بياناتك ؛ لشك أنك فكرت فى هذا لكن كيف الطريق إلى ذلك ‪،‬‬
‫فى الحقيقة المر جدُ يسير ‪ .‬فتغيير إسم قاعدة البيانات يلزم تعديل ملفين اثنين هما ملف المتغيرات‬
‫‪ Parameter File‬وملف التحكم ‪ . Control File‬واليك الخطوات ‪-:‬‬

‫‪ -1‬التأكد من إسم قاعدة البيانات الن عن طريق الستعلم التالى ‪:‬‬

‫;‪SELECT NAME FROM V$DATABASE‬‬

‫إسم قاعدة البيانات الن ‪.OBAY‬‬

‫‪79‬‬
‫‪ -2‬الن نقوم نقوم بتغيير إسم قاعدة البيانات على ملف التحكم ال ‪ . Control File‬لكن المشكلة أن هذا‬
‫الملف ليس نصيا حتى نستطيع تعديله ‪ ،‬فهو ملف ثنائى ‪ ،‬لذا يمكن اللجوء لعمل نسخ احتياطى لهذا الملف‬
‫ك ‪. Trace File‬‬
‫نتيجة هذا النسخ الحتياطى ‪ Trace File‬عباره عن ملف نصى يحتوى على كود يمكن ان‬
‫يستعمل لنشاء ‪ Control File‬جديد ‪ ،‬كما يمكن التعديل فى هذا الكود ‪ .‬بحيث نغير اسم قاعدة البيانات ‪.‬‬
‫يوجد هذا الملف فى المسار المعرف فى المتغير ‪. user_dump_dest‬‬
‫والن نجرى عملية النسخ الحتياطى ‪.‬‬

‫;‪ALTER DATABASE BACKUP CONTROLFILE TO TRACE‬‬

‫عند فتح هذا الملف يكون شكله كالتالى ‪:‬‬

‫‪80‬‬
‫ما يهمنا فى هذا الملف هو ما قمنا بتظليله ‪ ،‬والن نقوم بعمل نسخ لهذا الجزء المظلل ونحفظه‬
‫فى ملف جديد ولنفترض أن اسمه ‪. Control.trc‬‬

‫بالطبع إذا قمنا بعمل نسخ احتياطى لل ‪ Control File‬بالطريقة اعله ثم بعد ذلك قمنا بتغير‬
‫تكوينات قاعدة البيانات مثلً إضافة ‪ Tablespace‬أو ‪ ، Data File‬فيلزمنا تعديل ال ‪Trace File‬‬
‫بالتعديلت الجديدة فى حال استخدمناه لنشاء ‪.Control File‬‬
‫يكون شكل الملف ‪ Control.trc‬كالتى ‪:‬‬

‫هذا هو الملف ‪ Control.trc‬الذى سنستخدمه لنشاء ال ‪ Control File‬الجديد ولكن قبل ذلك يلزمنا‬
‫تعديل ما قمت بتظليله على النحو التالى ‪-:‬‬

‫‪81‬‬
‫بعد إجراء هذه التعديلت يلزمنا الحفظ ‪.‬‬

‫‪ -3‬نقوم بإغلق قاعدة البيانات ‪.‬‬

‫‪ -4‬تغيير إسم قاعدة البيانات على الملف ‪ INITobay.ora‬وهو ملف المتغيرات (‪ )PFILE‬التى تعمل به‬
‫قاعدة البيانات الحالية ‪.‬‬

‫نغير إسم قاعدة البيانات ‪ db_name‬من ‪ OBAY‬الى ‪ TEST‬ثم نحفظ التعديلت ‪.‬‬

‫‪ -5‬مسح ملفات ال ‪ Control Files‬الحالية فى قاعدة البيانات‪.‬‬

‫‪82‬‬
‫‪ -6‬تشغيل قاعدة البيانات فى الوضع ‪. NOMOUNT‬‬

‫‪ -7‬الن نقوم بإنشاء ال ‪ Control File‬باستخدام ال ‪ Trace File‬الذى قمنا بانشاءه سابقا ‪.‬‬

‫‪ -8‬نفتح قاعدة البيانات فى الوضع ‪.RESETLOGS‬‬

‫‪ -9‬للتأكد من تغيير اسم قاعدة البيانات‬

‫‪83‬‬
:Redo Log Files

84
‫هذا الملف لتسجيل التغييرات التى تحصل على البيانات بحيث يتم تسجيل التغييرات التى تم تثبيتها او ل ‪،‬‬
‫نستفيد من هذا الملفات فى استرجاع قاعدة البيانات فى حال حدوث فشل ‪ .‬بحيث تكون هناك بعض‬
‫البيانات لم تكتب فى ال ‪ Data Files‬بينما كتبت فى هذا الملفات ‪.‬‬

‫يكون هذا الملف فى شكل ‪ GROUP‬بحيث تعمل كل قاعدة البيانات على على القل باثنين من ال‬
‫‪. Groups‬‬

‫إذا يستخدم هذا الملف اساسا لعملية السترجاع فى حالة حدوث خطا إذ يحتوى على التغييرات التى‬
‫تحصل على البيانات ‪.‬‬

‫ولضمان الحفاظ على هذا الملف فإن كل ‪ Group‬ينتظم فى شكل ‪ Members‬وكل ال ‪Member‬‬
‫داخل ال ‪ Group‬هى نسخة طبق الصل الهدف منها تقليل نسبة خطر الفقدان ‪.‬‬

‫‪ LGWR Background Process‬يقوم بكتابة البيانات الموجود ال ‪ Redo log Buffer‬الى ال ‪Redo‬‬
‫‪.Log Files‬‬

‫‪85‬‬
‫لحظة ملئ ال ‪ Redo Log File‬فان ال ‪ LGWR‬يقوم بالتحول لل ‪ Redo Log File‬الخرى فى عملية‬
‫تعرف بال ‪. Log Switch‬‬

‫إذا فال ‪ Oracle Server‬يقوم بكتابة كل التغيرات على قاعدة البيانات فى ال ‪ . Redo Log Buffer‬هذه‬
‫المتغيرات تكتب من ال ‪ Buffer‬إلى ال ‪ Redo Log File‬عن طريق ال ‪ LGWR‬فى الحالت التالية‬
‫‪-:‬‬
‫‪ -1‬لحظة نثبيت العمليات (‪.)Commit‬‬
‫‪ -2‬لحظة إمتلء ال ‪ Buffer‬الى الثلث ‪.‬‬
‫‪ -3‬قبل عملية ‪.DBWn‬‬

‫إذا عملية ال ‪ Log Switch‬تحدث اليًا دون تدخل من مدير قاعدة البيانات ‪ ،‬لكن قد يحتاج مدير قاعدة‬
‫البيانات احيانا لعمل هذه المهمة يدويا من خلل المر التالى ‪-:‬‬

‫;‪ALTER SYSTEM SWITCH LOGFILE‬‬

‫كذلك عملية ال ‪ Checkpoint‬تحدث اليا عند حدوث ال ‪ Log Switch‬وهى تقوم بعمل تعديل لل‬
‫‪ Header‬لكل ال ‪ Data Files‬وال ‪ Control Files‬للشارة بأن اكمل بنجاح ‪.‬‬

‫ايضا يمكن عمل ‪ Checkpoint‬اليا عن طريق مدير قاعدة البيانات بالمر التالى ‪-:‬‬

‫;‪ALTER SYSTEM CHECKPOINT‬‬

‫‪86‬‬
: Online Redo Log Files Group ‫إضافة‬

‫ وذلك عن‬، ‫ جديد‬Online Redo Log Files Group ‫فى بعض الحيان نحتاج لضافة‬
-: ‫طريق المر التالى‬

ALTER DATABASE ADD LOGFILE GROUP 4


‘D:\ORACLE\PRODUCT\10.1.0\ORADATA\OBAY\REDO04.RD
O’ SIZE 10M;

87
-: Groups ‫ لل‬Members ‫ولضافة‬

ALTER DATABASE ADD LOGFILE MEMBER


'D:\oracle\product\10.1.0\oradata\OBAY\RED1.RDO'
TO GROUP 1,
,'D:\oracle\product\10.1.0\oradata\OBAY\RED2.RDO
' TO GROUP 2,
'D:\oracle\product\10.1.0\oradata\OBAY\RED3.RDO'
TO GROUP
3,'D:\oracle\product\10.1.0\oradata\OBAY\RED4.RD
O' TO GROUP 4;

-:Online Redo Log Groups ‫حذف‬

ALTER DATABASE DROP LOGFILE GROUP 4;

‫ كذلك ل يمكن حذف‬، Groups ‫مع ملحظة أن قاعدة اليببانات تعمل على القل على اثنين من ال‬
. current or active Groups

‫ تظل الملفات موجودة على مستوى نظام التشغيل‬Oracle ‫ عن طريق ال‬Group ‫أيضا عند حذف ال‬
.

88
-:Online Redo Log Members ‫حذف‬

ALTER DATABASE DROP LOGFILE MEMBER


‘D:\ORACLE\PRODUCT\10.1.0\ORADATA\OBAY\RED3.RDO;

-:Clearing Online Redo Log Files

‫ فهى ضمنا تعنى‬، Group ‫ فى ال‬Members ‫وهى لحل مشكلة العطل الذى يحدث لكل ال‬
. Redo Log Files ‫إعادة إنشاء لل‬

ALTER DATABASE CLEAR LOGFILE GROUP 2;

Clearing ‫ فإن عملية ال‬Archive log ‫إذا كانت قاعدة البيانات تعمل فى الوضع‬
‫ عموما سنتحدث عن موضوع الرشيف لحقا ولكن‬، ‫ لم تتم ارشفته‬Group 2 ‫اعله ستفشل إذا كان ال‬
‫لحل‬
-: ‫هذا الشكال يمكن تعديل المر السابق للتى‬

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP


2;

89
‫ولكن يجب قبل القيام بهذا المر بعمل نسخ إحتياطى كامل لقاعدة البيانات ( ‪. )Full Backup‬‬

‫إعادة تسمية ال ‪-:Redo Log Files‬‬


‫يمكن إعادة تسمية ال ‪ Redo Log Files‬او تغيير مكانه عن طريق إضافة ‪ Log File‬جديد‬
‫وحذف القديم ‪ .‬يمكن كذلك إستخدام المر ‪ ALTER DATABASE RENAME FILE‬لكن هذا‬
‫المر يتطلب جلب قاعدة البيانات فى الوضع ‪.MOUNT‬‬

‫فقدان ال ‪:Redo Log File‬‬


‫إذا فقدنا ‪ Member‬من ال ‪ Redo Log Files Group‬فإن قاعدة البيانات ستظل‬
‫مفتوحة ومتاحة ما دام أن هناك ‪ Member‬اخرى فى ال ‪ ، Group‬لكن سوف نستقبل رسائل تحذيرية‬
‫فى ال ‪ . Alert log File‬بالطبع يمكن السترجاع بعمل نسخ لحد ال ‪ Member‬الموجود ومن ثم اعادة‬
‫تسميتها ‪.‬‬

‫للستلم عن ال ‪:Redo Log File‬‬

‫‪90‬‬
91
92
‫سنتطرق قى هذا الفصل لكل من التى‪-:‬‬

‫•إنشاء وإدارة المستخدمين فى قاعدة البيانات اوركل ‪.‬‬


‫•إنشاء وإدارة الوظائف ‪. Roles‬‬
‫•منح وسحب الصلحيات ‪.Privileges‬‬
‫•التحكم فى الموارد ‪ Resource‬المستخدمة عن طريق‬
‫المستخدمين ‪.‬‬

‫وهذا الفصل من الهمية بمكان ‪ ،‬بحيث يعتبر من اهم اولويات مدير قاعدة البيانات ‪.‬‬

‫فالفكرة الساسية تقوم على أن الوصول لقاعدة البيانات يتطلب وجود مستخدم يمتلك صلحية‬
‫الوصول ‪ ،‬إذا ل يمكن ان تظل قاعدة البيانات متاحة للجميع ‪.‬‬

‫واول ما يمكن مناقشته هنا كيفية إنشاء مستخدم فى قاعدة البيانات ‪ .‬فمدير قاعدة البيانات يجب مراعاة‬
‫التى عند إنشاء المستخدمين ‪-:‬‬
‫‪ -1‬ان يكون اسم المستخدم فريدا فى قاعدة البيانات وأن ل يتعدى عدد حروفه ‪ 30‬حرفا ‪ ،‬وايضا ل‬
‫ل‪.‬‬
‫يحتوى على مساحات ويبتدئ بحرف اى ليس رقما مث ً‬
‫‪ -2‬وسيلة التحقق ‪ .‬سواء اكان ذلك عن طريق قاعدة البيانات او عن طريق نظام التشغيل او غيره ‪.‬‬

‫‪93‬‬
‫‪ Default Tablespace -3‬وهو ال ‪ Tablespace‬الذى يستخدم لنشاء وتخزين كائنات المستخدم ‪.‬‬
‫‪ Temporary Tablespace -4‬وهو ال ‪ Tablespace‬الذي يستخدم لنشاء الكائنات المؤقتة للمستخدم ‪.‬‬
‫‪ -5‬ال ‪ Profile‬للمستخدم وهو لدارة الموارد وكلمة السر للمستخدم ‪.‬‬

‫عند إنشاء مستخدم فى قاعدة اليبانات يتم خلق ‪ Schema‬وهى مجموعة الكائنات الممتلكة للمستخدم‬
‫وتكون اسم ال ‪ Schema‬بنفس اسم المستخدم ‪.‬‬
‫ولنفترض اننا الن نريد إنشاء مستخدم ‪. TEST‬‬

‫‪CREATE USER TEST IDENTIFIED BY TEST DEFAULT‬‬


‫‪TABLESPACE USERS TEMPORARY TABLESPACE TEMP‬‬
‫;‪PROFILE DEFAULT PASSWORD EXPIRE ACCOUNT UNLOCK‬‬

‫فى السناريو السابق قمنا بخلق مستخدم اسمه ‪ TEST‬وكلمة السر لهذا المستخدم ايضا ‪TEST‬‬
‫‪ ،‬هذه المستخدم ينشئ ويخزن الكائنات فى ‪ ، Users Tablespace‬كما يخزن الكائنات المؤقتة فى‬
‫‪ . Temp Tablespace‬هذا المستخدم يجب عليه تغيير كلمة السر عند اول دخول كما نشاهد ادناه ‪،‬‬
‫ايضا هذا المستخدم ‪ ACCOUNT‬غير مغلق اى يمكن التصال بعد تغيير كلمة السر‪.‬‬

‫بالطبع قد لنحتاج لتحديد ال ‪ Default Tablespace‬وكذلك ال ‪.Temporary Tablespace‬‬

‫‪94‬‬
‫بمعنى اخر إذا كان ‪ Default Temporary Tablespace‬فى قاعدة البيانات هو ‪ Temp‬وكان ال‬
‫‪ Default Tablespace‬فى قاعدة البيانات هو ‪ Users‬فل يلزمنا تحديد ذلك عند إنشاء المستخدم إذا كنا‬
‫ل نريد تغيير ال ‪.Default‬‬
‫كذلك الحال بالنسبة لل ‪ Profile‬فإنه إذا لم يتم تحديده فسوف يُمنح ال ‪. Default Profile‬‬

‫‪:QUOTA‬‬
‫وهى الحصة المتاحة للمستخدم لنشاء الكائنات فى ال ‪ Tablespaces‬وبدونها يكون المستخدم‬
‫عاجز عن إنشاء اى كائن ‪.‬‬
‫لذا يمكن لمدير قاعدة البيانات منع المستخدم من إنشاء أى كائن عن طريق منحه حصة ‪Quota‬‬
‫تساوى صفر فى ال ‪. Tablespace‬‬
‫كذلك يستطيع مدير قاعدة البيانات منح المستخدم حصة ‪ Quota‬غير محدودة فى ال ‪Tablespace‬‬
‫عن طريق منحه ‪. Unlimited‬‬
‫يمكن منح الحصة للمستخدم اثناء النشاء او بعد ذلك ‪.‬‬

‫فلنفترض الن اننا نريد منح حصة تساوى صفر للمستخدم ‪ TEST‬فى ‪. Users Tablespace‬‬

‫;‪ALTER USER TEST QUOTA 0M ON USERS‬‬

‫ولنفترض الن اننا نريد منحه حصه غير محدودة فى ‪. Users Tablespace‬‬

‫;‪ALTER USER TEST QUOTA UNLIMITED ON USERS‬‬

‫‪95‬‬
‫هناك خيار اخر وهو منح هذا المستخدم صلحية تسمى ‪ . Unlimited Tablespace‬وهى صلحية‬
‫تسمح لهذا المستخدم حصة غير محدودة فى ال ‪.Tablespaces‬‬

‫;‪ALTER USER TEST QUOTA UNLIMITED ON USERS‬‬

‫كما ذكرنا سابقا يمكن منح الحصة اثناء خلق إنشاء المستخدم كالتى ‪-:‬‬

‫‪CREATE USER TEST IDENTIFIED BY TEST QUOTA 2M ON‬‬


‫;‪USERS‬‬

‫يمكن الستعلم عن الحصة عن طريق ‪-:‬‬


‫‪DBA_TS_QUOTAS‬‬
‫‪USER_TS_QUOTAS‬‬

‫وسيلة التحقيق ‪-:‬‬


‫وهى طريقة التحقق من المستخدمين للوصول لقاعدة البيانات ‪ ،‬فلحظة إنشاء المستخدم لبد من‬
‫اختيار وسيلة التحقق ‪-:‬‬

‫كلمة السر (‪ : )Password‬وهى الطريقة المستخدمة فى السناريوهات السابقة ‪ ،‬بحيث يكون‬


‫التحقق عن طريق قاعدة البيانات اوركل عند محاولة الدخول فيتم التحقق من كلمة السر ‪.‬‬

‫‪96‬‬
‫وهى تكون كالتى ‪.identified by password -:‬‬

‫‪ :External‬ويكون التحقق عن طريق نظام التشغيل بحيث يستطيع المستخدم التصال بقاعدة‬
‫البيانات دون إدخال اسم المستخدم وكلمة السر لقاعدة البيانات‪ .‬وذلك لن كلمة السر لقاعدة البيانات‬
‫غير مستخدمة فى هذا النوع من التحقق ‪.‬‬
‫يتطلب هذا النوع من التحقق تهيئة المتغير ‪ OS_AUTHENT_PREFIX‬بحيث يحتوى على قيمة‬
‫حرفية هى ‪ $OPS‬فى الصل ‪ ،‬بالطبع نستطيع تغيره كما نشاء ‪ ،‬هذا المتغير نحتاجه عند عملية‬
‫التحقق من المستخدم الذى يريد التصال بقاعدة البيانات ‪.‬‬
‫ولنفترض أننا قمنا بتغيير المتغير اعله الى القيمة ‪ ، OBAY‬ومستخدم نظام التشغيل الذى نستخدمه‬
‫هو ‪ ADMINISTRATOR‬إذا يلزمنا إنشاء مستخدم فى قاعدة البيانات اسمه‬
‫‪ OBAYADMINISTRATOR‬ونختار طريق التحقق ‪. External‬‬

‫تابع معى الخطوات ‪-:‬‬


‫‪ -1‬نتأكد من قيمة المتغير ‪OS_AUTHENT_PREFIX‬‬

‫;‪SHOW PARAMETER OS_AUTHENT_PREFIX‬‬

‫‪ -2‬نقوم بتغير المتغير الى القيمة ‪ OBAY‬مثلً‬

‫'‪ALTER SYSTEM SET OS_AUTHENT_PREFIX='OBAY‬‬


‫;‪SCOPE=SPFILE‬‬

‫‪97‬‬
‫بالطبع نحتاج لغلق قاعدة البيانات وفتحها من جديد ‪.‬‬

‫‪ -3‬الن يمكن التأكد من قيمة التغير ‪.‬‬

‫‪ -4‬الن نقوم بخلق المستخدم ‪ OBAYADMINISTRATOR‬فى قاعدة البيانات ‪.‬‬

‫‪CREATE USER OBAYADMINISTRATOR IDENTIFIED‬‬


‫;‪EXTERNALLY‬‬

‫يمكن الستعلم عن المستخدمين فى قاعدة البيانات عن طريق ‪:‬‬


‫‪DBA_USERS‬‬
‫كما يمكن معرفة نوع التحقق عن ال ‪ SESSION‬المفتوحة فى قاعدة البيانات‬

‫‪SELECT sid,authentication_type, osuser FROM‬‬


‫;‪V$SESSION_CONNECT_INFO‬‬

‫‪98‬‬
‫الن المستخدم ‪ OBAYADMINISTRATOR‬يستطيع التصال بقاعدة البيانات مباشرة ودون التحقق‬
‫من قاعدة البيانات فالتحقق يتم عن طريق نظام التشغيل‪.‬‬
‫الصلحيات (‪:)Privilege‬‬
‫كل المستخدمين الذين قمنا بخلقهم فى السناريوهات السابقة ل يستطيعون التصال بقاعدة البيانات‬
‫ل عن القيام بأى مهام اخرى إذ ليس لديهم صلحيات لذلك ‪.‬‬
‫فض ً‬
‫فى الخطوات السابقة قمنا بخلق المستخدم وحددنا له طريقة التحقق ومنحناه الحصة المطلوبة‬
‫وحددنا له ال ‪ Profile‬لدارة كلمة السر والموارد ‪ ،‬لكن ينتظرنا الن أن نعطيه صلحيات للعمل فى‬
‫قاعدة البيانات ‪ .‬ويكون منح الصلحيات عن طريق مدير قاعدة البيانات او ممن يملك الصلحيات ‪.‬‬

‫هناك نوعن من الصلحيات ‪-:‬‬


‫‪ -:System -1‬وهو لتمكين المستخدمين من انجاز اعمال معينة على قاعدة البيانات ‪.‬‬
‫وهناك اكثر من ‪ 700‬صلحية ‪ System Privileges‬على قاعدة اليبانات ‪ ،‬على سبيل المثال ‪:‬‬

‫‪ : SYSDBA & SYSOPER‬هذه الصلحيات تسمح للمستخدم إغلق وفتح قاعدة البيانات‪.‬‬
‫‪ : CREATE TABLESPACE‬تسمح للمستخدم إنشاء ‪.Tablespace‬‬

‫عموما يمكن استعراض كل الصلحيات ‪ System Privileges‬المتاحة لمدير قاعدة البيانات عن طريق‬
‫الستعلم التى ‪-:‬‬

‫;‪SELECT PRIVILEGE FROM DBA_SYS_PRIVS‬‬


‫ولنفترض أننا نريد منح بعض الصلحيات ‪ System Privileges‬للمستخدم ‪. TEST‬‬

‫;‪GRANT CREATE TABLESPACE TO TEST‬‬

‫هكذا منحنا المستخدم ‪ TEST‬صلحية إنشاء ال ‪. Tablespace‬‬

‫يجب مراعاة الكلمة ‪ ANY‬عند منح الصلحيات ‪ ،‬ولتوضيح هذا المعنى نلحظ الفرق بين الصلحيتين ‪:‬‬

‫‪99‬‬
‫‪ :SELECT TABLE‬تسمح للمستخدم عمل ‪ SELECT‬على الجداول التى يملكها المستخدم‪.‬‬
‫‪ :SELECT ANY TABLE‬تسمح للمستخدم عمل استعلم ‪ SELECT‬على الجداول التى يملكها‬
‫المستخدمين الخرين‪.‬‬

‫هناك خيار عند منح الصلحيات ‪ System Privileges‬للمستخدم وهو الخيار ‪WITH ADMIN‬‬
‫‪.OPTION‬‬
‫هذا الخيار يعنى ان المستخدم بعد أن يملك الصلحية يستطيع منحها لغيره من المستخدمين ‪.‬‬

‫;‪GRANT ALTER SYSTEM TO TEST WITH ADMIN OPTION‬‬

‫المستخدم ‪ TEST‬الن يملك الصلحية ‪ ALTER SYSTEM‬ويستطيع منحها لغيره من‬


‫المستخدمين ‪.‬‬
‫هنااك بعض الصلحيات التى يجب ان ل تمنح الى لمديرى قاعدة البيانات ويجب مراعاة السرية عند‬
‫المنح مثلً (‪SYSDBA & SYSOPER & RESTRICTED SESSION & ALTER‬‬
‫‪ )DATABASE‬وغيره من الصلحيات التى يجب أن تكون فقط لمدراء قاعدة البيانات ‪..‬‬
‫بالطبع يمكن سحب الصلحيات من المستخدمين ‪ ،‬ولنفترض أننا نريد سحب صلحية ‪CREATE‬‬
‫‪ TABLESPACE‬من المستخدم ‪.TEST‬‬

‫;‪REVOKE CREATE TABLESPACE FROM TEST‬‬

‫تخيل معى هذا السناريو وهو أن مدير قاعدة البيانات منح المستخدم ‪ TEST‬صلحية‬
‫‪ CREATE TABLESPACE‬عن طريق الخيار ‪ ، WITH ADMIN OPTION‬قام المستخدم‬
‫‪ TEST‬بإنشاء ‪ Tablespace‬ومن ثم منح هذه الصلحية لمستخدم اخر اسمه ‪.TEST1‬‬
‫اراد مدير قاعدة البيانات سحب الصلحية ‪ CREATE TABLESPACE‬من المستخدم ‪.TEST‬‬

‫‪100‬‬
‫اول سيستم سحب الصلحية من المستخدم دون التاثير على المهام التى نفذها بواسطة هذه الصلحية‬
‫وهى هنا انشاء ال ‪.Tablespace‬‬
‫ثانيا ‪ :‬المستخدم ‪ TEST1‬ل يتاثر بسحب الصلحيات من المستخدم ‪TEST‬‬

‫هذا المستخدم يستطيع معرفة ما يمكله من صلحيات ‪ System Privileges‬عن طريق الستعلم ‪-:‬‬

‫;‪SELECT PRIVILEGE FROM USER_SYS_PRIVS‬‬

‫للستعلم ‪:‬‬
‫‪DBA_ROLES‬‬
‫‪USER_ROLE_PRIVS‬‬
‫‪DBA_ROLE_PRIVS‬‬
‫‪ROLE_ROLE_PRIVS‬‬
‫‪ROLE_SYS_PRIVS‬‬
‫‪ROLE_TAB_PRIVS‬‬
‫‪SESSION_PRIVS‬‬

‫‪ -:Privileges Object -2‬وهو لتمكين المستخدم للوصول واستعمال الكائن المعين ‪ ،‬بدون هذه‬
‫الصلحيات المستخدم له الصلحيات على الكائنات التى يملكها فقط ‪.‬‬

‫‪101‬‬
‫المستخدم فى قاعدة البيانات له صلحيات بالطبع على الكائنات التى يملكها ‪ ،‬يستطيع المستخدم ان يمنح‬
‫صلحيات لمستخدم اخر للوصول للكائنات التى يملكها ‪ ،‬وكذلك مدير قاعدة البينات يستطيع منح‬
‫صلحيات للمستخدمين للوصول لكائنات يملكها مستخدم اخر ‪.‬‬

‫نفترض ان المستخدم ‪ TEST‬يملك جدول اسمه ‪ ، EXAMPLE‬هذا المستخدم يريد منح صلحية‬
‫‪ SELECT‬على هذا الجدول للمستخدم ‪.TEST1‬‬

‫;‪GRANT SELECT ON EXAMPLE TO TEST1‬‬

‫ماذا لو اراد مدير قاعدة البيانات منح صلحية ‪ SELECT‬على الجدول ‪ EXAMPLE‬الذى يمتلكه‬
‫المستخدم ‪ TEST‬للمستخدم ‪.TEST1‬‬

‫;‪GRANT SELECT ON TEST.EXAMPLE TO TEST1‬‬

‫كذلك يمكن استخدام الخيار ‪ WITH GRANT OPTION‬عند منح الصلحيات ‪Objects‬‬
‫‪ Privileges‬إشارة إلى أن هذا المستخدم بعد ان يملك هذه الصلحية يمكن أن يمنحها غيره من‬
‫المستخدمين ‪.‬‬

‫‪GRANT INSERT ON EXAMPLE TO TEST1 WITH GRANT‬‬


‫;‪OPTION‬‬

‫‪102‬‬
‫الن المستخدم ‪ TEST1‬يستطيع منح صلحية ‪ SELECT‬على الجدول ‪ EXAMPLE‬الذى‬
‫يملكه المستخدم ‪ TEST‬لغيره من المستخدمين ‪.‬‬

‫ماذا لو اراد المستخدم ‪ TEST‬سحب صلحية ال ‪ SELECT‬على الجدول ‪ EXAMPLE‬الذى‬


‫يملكه من المستخدم ‪ TEST1‬مع ملحظة ان المستخدم ‪ TEST1‬منح هذه الصلحية لغيره من‬
‫المستخدمين ولنفترض انه ‪ ، TEST2‬النتيجة هى ان الصلحية ستسحب من المستخدم ‪ TEST1‬وكذلك‬
‫كل المستخدمين الممنوحين الصلحية عن طريق المستخدم ‪ TEST1‬؛ وهنا هو المستخدم ‪. TEST2‬‬

‫سنتابع هذا السناريو عمليا ‪-:‬‬

‫;‪SHOW USER‬‬

‫نحن الن نعمل على المستخدم ‪.TEST‬‬

‫المستخدم ‪ TEST‬يملك جدولً واحدا هو ‪.EXAMPLE‬‬


‫الن المستخدم ‪ TEST‬سيمنح صلحية ‪ SELECT‬على الجدول ‪ EXAMPLE‬الذى يمتلكه للمستخدم‬
‫‪.TEST1‬‬

‫‪GRANT SELECT ON EXAMPLE TO TEST1 WITH GRANT‬‬


‫;‪OPTION‬‬

‫‪103‬‬
‫الن المستخدم ‪ TEST1‬يستطيع منح صلحية ‪ SELECT‬على الجدول ‪ EXAMPLE‬الذى يمتلكه‬

‫المستخدم ‪ TEST‬للمستخدم ‪.TEST2‬‬

‫;‪GRANT SELECT ON TEST.EXAMPLE TO TEST2‬‬

‫;‪SELECT * FROM TEST.EXAMPLE‬‬


‫الن المستخدم ‪ TEST2‬يستطيع عمل ‪ SELECT‬على الجدول ‪. EXAMPLE‬‬

‫الن نقوم بسحب الصلحية من المستخدم ‪. TEST1‬‬

‫;‪REVOKE SELECT ON EXAMPLE FROM TEST1‬‬

‫عن طريق المستخدم ‪ TEST1‬نقوم بعمل ‪ SELECT‬للجدول ‪. EXAMPLE‬‬

‫‪104‬‬
‫لحظ ان المستخدم فقد صلحية عمل اسنعلم ‪ SELECT‬على الجدول ‪. EXAMPLE‬‬

‫;‪SELECT * FROM TEST.EXAMPLE‬‬

‫ماذا عن المستخدم ‪.TEST2‬‬

‫;‪SELECT * FROM TEST.EXAMPLE‬‬

‫كذلك المستخدم ‪ TEST2‬ل يملك صلحية الستعلم على الجدول ‪. EXAMPLE‬‬


‫يمكن منح الصلحية على مستوى العمود ‪ ،‬مثلً ‪:‬‬

‫‪105‬‬
‫يمكن الستعلم عن ال ‪ Objects Privileges‬بعدة طرق منها ‪:‬‬
‫‪DBA_TAB_PRIVS‬‬
‫‪ALL_TAB_PRIVS‬‬
‫‪USER_TAB_PRIV‬‬
‫‪DBA_COL_PRIVS‬‬
‫‪ALL_COL_PRIVS‬‬
‫‪USER_COL_PRIVS‬‬
‫‪SESSION_PRIVS‬‬

‫‪-:ROLES‬‬
‫تخيل معى انك تعمل مدير لقاعدة بيانات بها اكثر من ‪ 100‬مستخدم ‪ ،‬هؤلء المستخدمين على‬
‫مستويات مختلفة من الصلحيات ‪ ،‬ولنفترض انهم على خمسة مستويات ‪.‬‬

‫ما العمل إذا ؟ هل تمنح كل مستخدم صلحياته بمفرده ؟ يلزمك إذا عملً شاقا طويلً ‪.‬‬
‫الحل بكل بساطة هو فى ال ‪.ROLES‬‬

‫‪106‬‬
‫الفكرة هى انه يمكن دمج مجموعة من الصلحيات فى كائن واحد يسمى ‪ ، ROLE‬فالسناريو‬
‫السابق لمدير قاعدة البينات الذى يدير قاعدة بيانات بها اكثر من ‪ 100‬مستخدم على مستويات مختلفة‬
‫وهى خمسة مستويات ابسط مما تتخيل ‪ ،‬يلزمنا المرإنشاء خمسة من ال ‪ ROLES‬بعد ذلك نمنح‬
‫الصلحيات لهذه ال ‪ ROLES‬حسب المستويات ومن ثم منحها للمستخدمين ‪.‬‬
‫هذا الحل يسهل علينا عملية ادارة الصلحيات فبدل من ادارة اكثر من ‪ 100‬مستخدم يلزمنا المر ادارة‬
‫خمسة من ال ‪.ROLES‬‬
‫كذلك عند تعديل اى من ال ‪ ROLES‬فإن التعديل ينعكس اليا على المستخدمين فيسهل علينا‬
‫عملية التعديل ‪ ،‬كذلك هذه العملية تحسن الداة ‪.‬‬

‫ولنفترض اننا نريد إنشاء ‪ ROLE‬جديدة تسمى ‪ ،OBAY‬هذه ال ‪ ROLE‬نمنحها بعض‬


‫الصلحيات ولتكن ‪ ، CONNECT & RESOURCE‬بعد ذلك نمنح هذه ال ‪ ROLE‬للمستخدم‬
‫‪.TEST‬‬

‫;‪CREATE ROLE OBAY‬‬

‫يجب مراعاة أن إسم ال ‪ ROLE‬ان يكون فريدا فى قاعدة البيانات بحيث يكون السم لم يستعمل‬
‫كمستخدم ول ك ‪ Roles‬فى قاعدة البيانات‪.‬‬

‫بالطبع يمكن انشاء ‪ ROLE‬ومنحها درجة من السرية عن طريق منحها كلمة سر للتحقق ‪.‬‬

‫;‪CREATE ROLE ROLENAME IDENTIFIED BY PASSWORD‬‬

‫الن نمنح هذه ال ‪ ROLE‬بعض الصلحيات ‪.‬‬

‫;‪GRANT CONNECT,RESOURCE TO OBAY‬‬


‫;‪GRANT OBAY TO TEST‬‬

‫‪107‬‬
‫ملحظة ‪ :‬يمكن اختيار الخيار ‪ WITH ADMIN OPTION‬عند منح ال ‪ . ROLE‬هذا الخيار يمكن‬
‫المستخدم بعد امتلك ال ‪ ROLES‬منحها لغيره من المستخدمين ‪.‬‬

‫يمكن سحب ال ‪ ROLE‬من المستخدم بنفس طريقة سحب ال ‪. System Privilege‬‬

‫;‪REVOKE OBAY FROM TEST‬‬

‫كذلك يمكن اجراء تعديلت على ال ‪ ROLES‬ولنفترض مثلً اننا نريد عمل كلمة سر لل ‪OBAY‬‬
‫‪. ROLE‬‬

‫;‪ALTER ROLE OBAY IDENTIFIED BY OBAY‬‬

‫يمكن حذف ال ‪ ROLE‬عن طريق المر ‪.‬‬

‫;‪DROP ROLE OBAY‬‬


‫عند حذف ال ‪ ROLE‬يقوم ‪ ORACLE SERVER‬بحذف هذه ال ‪ ROLE‬من كل المستخدمين الذين‬
‫مُنحوا هذا ال ‪ ROLE‬اليا‪.‬‬

‫‪108‬‬
‫‪:PROFILES‬‬
‫وهو لإدارة كلمة السر وكذلك الموارد ‪ ،‬فبعد كم سيتم انهاء كلمة السر؟ وماهى عدد‬
‫المحاولت الفاشلة قبل ان يتم اغلق حسابك ؟ وكم ‪ SESSION‬يسمح للمستخدم فتحها فى قاعدة‬
‫البيانات؟ وغيره من السئلة التى يجب عنها ال ‪.PROFILE‬‬
‫وكما ذكرنا سابقا اى مستخدم فى قاعدة البيانات لبد أن يكون له ‪ PROFILE‬إذا لم يتم تحديد‬
‫ذلك عند النشاء فان ال ‪ ORCLE SERVER‬سوف يمنح المستخدم ‪ PROFILE‬يسمى ‪DEFAULT‬‬
‫هذا ال ‪ PROFILE‬يتم خلقه مع إنشاء قاعدة البيانات ول يمن حزفه من قاعدة البيانات ‪.‬‬
‫بالطبع يمكن إنشاء وتعديل وحذف ‪ PROFILE‬من قاعدة البيانات ‪.‬‬

‫والسؤال الن ماهى النقاط التى يديرها ال ‪ PROFILE‬بالنسبة لكلمة السر ؟‬


‫‪ :FAILED_LOGIN_ATTEMPTS‬وهى عدد المحاولت الفاشلة للمستخدم لمحاولة دخول قاعدة‬
‫البيانات قبل اغلق حسابه‪.‬‬
‫‪ :PASSWORD_LIFE_TIME‬لتحديد عدد اليام التى يستطيع بها المستخدم دخول قاعدة البيانات‬
‫بكلمة السر قبل إنتهاءها‪.‬‬
‫‪ :PASSWORD_REUSE_TIME‬لتحديد عدد اليام قبل استخدام كلمة السر مرة اخرى‪ .‬اذا تم‬
‫تحديد هذا الخيار يجب ان يكون الخيار ‪.PASSWORD_REUSE_MAX=UNLIMITED‬‬
‫‪ :PASSWORD_REUSE_MAX‬لتحديد عدد كلمات السر التى تم تغيرها قبل استخداها مرة‬
‫اخرى‪ .‬اذا اتم تحديد هذا الخيار يجب أن يكون الخيار‬
‫‪.PASSWORD_REUSE_TIME=UNLIMITED‬‬
‫‪ :PAWWORD_LOCK_TIME‬لتحديد عدد اليام قبل قفل هذا المستخدم‪.‬‬
‫‪ :PASSWORD_GRACE_TIME‬لتحديد عدد اليام التى بعدها يتم اصدار تحذيرات أنه بعد هذه‬
‫الفترة سيتم إنهاء كلمة السر الحالية‪.‬‬
‫‪ :PASSWORD_VERFY_FUNTION‬لتحديد الدالة التى ترسم سياسة اختيار كلمة السر‪.‬‬

‫‪109‬‬
‫أما بالنسبة بالمصادر المتاحة فيتم تحديد التى ‪:‬‬
‫‪ :CONNECT TIME‬لتحديد الدقائق المسموح بها للمستخدم المتصل بقاعدة البيانات قبل قطع اتصاله‬
‫اليا‪.‬‬
‫‪ :IDLE TIME‬لتحديد الدقائق المسموح بها للمستخدم المتصل بقاعدة البيانات ان يظل عاطل عن‬
‫العمل قبل قطع اتصاله الياُ‪.‬‬
‫‪ :CONCURRENT SESSIONS‬لتحديد عدد ال ‪ SESSEIONS‬المسموح بها للمستخدم للتصال‬
‫بقاعدة البيانات‪.‬‬
‫‪ :PRIVATE SGA‬لتحديد المساحة المتاحة للمستخدم فى ال ‪ PRIVATE SGA‬هذا إذا كنا نعمل فى‬
‫الوضع ‪.SHARED SERVER‬‬

‫الن نفترض الن اننا نريد أنشاء ‪ PROFILE‬جديد اسمه ‪.NEWPROFILE‬‬

‫‪CREATE PROFILE NEWPROFILE LIMIT‬‬


‫‪FAILED_LOGIN_ATTEMPTS 3‬‬
‫‪PASSWORD_LOCK_TIME UNLIMITED‬‬
‫‪PASSWORD_LIFE_TIME 60‬‬
‫‪PASSWORD_REUSE_TIME 60‬‬
‫‪PASSWORD_GRACE_TIME 7‬‬
‫‪CONNECT_TIME 1000‬‬
‫‪IDLE_TIME 30‬‬
‫;‪SESSIONS_PER_USER UNLIMITED‬‬

‫‪110‬‬
‫ اعله‬PROFILE ‫ماذا لو اردنا تعديل ال‬

ALTER PROFILE NEWPROFILE LIMIT


SESSIONS_PER_USER 5;

.PROFILE ‫الن يمكن منح الممستخدمين هذا ال‬

ALTER USER TEST PROFILE NEWPROFILE;

.‫ عند إنشاء المستخدم‬PROFLE ‫بالطبع يمكن منح هذا ال‬

PROFILE ‫لعمل استلم عن ال‬


DBA_PROFILES

.NEWPROFILE PROFILE ‫ولنفترض مثلً اننا نريد معرفة تفاصيل‬

SELECT RESOURCE_NAME,LIMIT FROM DBA_PROFILES WHERE


PROFILE='NEWPROFILE';

111
‫اذا اردنا معرفة كل ال ‪ PROFILES‬الموجودة فى قاعدة البيانات‬

‫;‪SELECT DISTINCT (PROFILE( FROM DBA_PROFILES‬‬

‫كذلك يمكن حذف هذا ال ‪PROFILE‬‬

‫‪112‬‬
DROP PROFILE NEWPROFILE CASCADE;

113
114
‫فى الحقيقة هذا الفصل من الهمية بمكان ‪ ،‬فالحفاظ على بقاء واتاحة قاعدة البيانات هو المر الهم‬
‫لمدير قاعدة البيانات ‪ ،‬لذا كان لزاما على مدير قاعدة البيانات تأمين قاعدة البيانات حتى ل تكون فى‬
‫مهب الريح‪.‬‬

‫وحسب ملحظتى فإن هذا الجانب ل يحظى بالهتمام الكبر بالنسبة لمديرى قاعدة البيانات بل يكون‬
‫التركيز دائما على وضع استراتيجيات مناسبة للنسخ الحتياطى ‪ ،‬رغم أن أننا نلجأ كثيرا لسترجاع النسخ‬
‫الحتياطية نتيجة تقصيرنا فى جانب تأمين قاعدة البيانات ‪ ،‬فلنرفع إذا شعار الوقاية خير من العلج ‪،‬‬
‫ونبادر فى تأمين قاعدة البيانات ‪.‬‬

‫‪115‬‬
‫المر ليس معقدا لكن يعتمد على التخطيط ‪ ،‬خصوصا إذا كانت قاعدة البيانات ضخمة وعدد المستخدمين‬
‫كبير ‪.‬‬

‫والحديث فى هذا الفصل يمكن ان يقسم الى قسمين رئيسيين ‪-:‬‬


‫‪ -1‬تأمين قاعدة البيانات ‪ :‬وهو حماية قاعدة البيانات من المخاطر الداخلية والخارجية ‪.‬‬
‫‪ -2‬مراقبة قاعدة البيانات ‪ :‬فبعد المخاطر ناتجة عن سلوك بعض المستخدمين ‪ ،‬لذا كان على مدير‬
‫قاعدة البيانات مراقبة ما يراه مهما لمتابعة سلوك المستخدين ‪.‬‬

‫‪ -1‬تأمين قاعدة البيانات ‪-:‬‬


‫هناك الكثير من الخطوات التى يمكن أن يتخذها مدير قاعدة البيانات لتأمين فاعدة البيانات ‪ ،‬سأذكر‬
‫منها ما اراه مهما ‪:‬‬

‫‪ -1‬التأكد من تأمين الشبكة ‪ :‬اعرف أن المر ليس من مهامك ادرك هذا جديدا لكن اجلس مع المسؤول‬
‫من تأمين الشبكة وتأكد من إنتفاء جميع المخاطر ‪ ،‬لن تجد هذه النقطة فى كتب اوركل ؛ بل هى تجربة‬
‫شخصية وانا اعمل فى مؤسسة مالية فى احد الدول العربية لول أن النسخ الحتياطى (‪ )Backup‬كان‬
‫حاضرا ؛ لكنا الن فى احد سجون المن القتصادى لهفوة قام بها المسؤول من تأمين الشبكة استطاع من‬

‫‪116‬‬
‫خللها احد القراصنة الدخول للمخدم وتعطيل قاعدة البيانات ‪ ،‬كنت واثقا من عدم مسؤليتى من هذا‬
‫الختراق لكن مشكلتنا فى كثير من الدول العربية أننا لم نستطيع بعد استيعاب مفهوم التخصصية ‪.‬‬

‫‪ -2‬حماية ال ‪ :DATA DICTIONARY‬كل المعلومات التى نحتاجها عن قاعدة البيانات موجودة فى‬
‫ال ‪ DATA DICTIONARY‬لذا كان لزاما على مدير قاعدة البيانات حمايتها ‪.‬‬
‫وذلك بوضغ القيمة ‪ FALSE‬فى المتغير ‪.O7_DICTIONARY_ACCESSIBILITY‬‬

‫عموما فى اوركل ‪ 10g‬هذا المتغير فى الصل ‪.FALSE‬‬


‫يمكن التأكد من ذلك عن طريق‪:‬‬

‫;‪SHOW PARAMETER O7_DICTIONARY_ACCESSIBILITY‬‬

‫بهذه التهيئة نضمن ان اى مستخدم يملك صلحية الوصول الى كل جدول * ‪ANY TABLE‬‬
‫ل ‪ DROP ANY TABLE‬ل يستطيع مسح ال ‪.DATA DICTIONARY‬‬
‫مث ً‬
‫كذلك هذه التهيئة تمنع المستخدم ‪ SYS‬من الدخول لقاعدة البيانات بدون الصلحية ‪.SYSDBA‬‬
‫‪ -3‬سحب الصلحية الغير مهمة من ‪: PUBLIC‬‬
‫وهو ‪ ، DATABASE SERVER USER GROP‬لن كل الصلحيات التى تمنح لل ‪PUBLIC‬‬
‫يستطيع استخدمها مستخدمى قاعدة البيانات لذا يجب سحب كل الصلحيات غير المهمة من ال‬
‫‪.PUBLIC‬‬

‫هكذا نستطيح منح الصلحيات لل ‪.PUBLIC‬‬

‫;‪GRANT ALTER ANY TABLE TO PUBLIC‬‬

‫‪117‬‬
‫الن كل المستخدمين فى قاعدة البيانات يمكنهم استخدام هذه الصلحية ‪.‬‬

‫بالطبع يمكن سحبها‪.‬‬

‫;‪REVOKE ALTER ANY TABLE FROM PUBLIC‬‬

‫‪ -3‬الحد من الصلحيات الدارية من المستخدميين ‪ :‬ما الفائدة من منح كل المستخدمين فى قاعدة‬


‫البيانات ‪ ، DBA ROLE‬هذه ال ‪ ROLE‬تمنح لمدير قاعدة البيانات وليس لكل المستخدين ‪ ،‬كذلك‬
‫الصلحية ‪ SYSDBA & DROP AY TABLE‬وغيرها من الصلحيات التى قد تسبب لك المشاكل‬
‫ول حاجة لمنحها لكل المستخدين ‪.‬‬

‫‪ -4‬منع التحقق من بعد عن طريق نظام التشغيل ‪ :‬وذلك بوضع القيمة ‪ FALSE‬فى المتغير‬
‫‪ ، REMOTE_OS_AUTHET‬حتى نمنع التصال عن بعد بقاعدة البيانات بواسطة التحقق عن‬
‫طريق نظام التشغيل ‪ .‬هذا المتغير فى الصل يأخذ القيمة ‪ FALSE‬فى اوركل ‪. 10g‬‬
‫تحدثنا سابقا عن طرق التحقق من المستخدين وذكرنا أن احد الطرق هو عن طريق نظام التشغيل‬
‫‪. EXTERNAL‬‬

‫‪118‬‬
‫‪ -2‬مراقبة قاعدة البيانات ‪-:))MONITORING OR AUDITING‬‬

‫مراقبة قاعدة البيانات هو جزء من تأمين قاعدة البيانات ونستطيع من خلل عملية المراقبة ايجاد كثير‬
‫من الجابات لبعض المور التى ستظل غامضة لول عملية المراقبة ‪ ،‬ويمكن تقسيم عملية المراقبة الى‬
‫ثلث انواع ‪-:‬‬

‫‪ :Standard Database Auditing -1‬وهو لمتابعة وحفظ معلومات عن عمليات التصال وقطع‬
‫التصال بقاعدة البيانات ‪ ،‬وايضا متابعة أستخدام (‪) System Privileges and Object Privileges‬‬
‫داخل قاعدة البيانات ‪ ،‬كعمليات النشاء والحذف والستعلم والتعديل وغيره من العمليات ‪.‬‬

‫‪ :Value-based auditing -2‬فى النوع الول تابعنا عمليات التصال وكذلك متابعة العمليات داخل‬
‫قاعدة البيانات ‪ ،‬ولكن قد نحتاج للحفاظ عل القيم التى يتم تغيرها فى قاعدة البيانات ‪.‬‬

‫‪ :Fine-grained auditing -3‬هذا النوع لحفظ عبارات ال ‪ SQL‬التى تم تنفيذها فى قاعدة البيانات ‪.‬‬

‫ولكن قبل التفصيل فى انواع المراقبة لبد من الشارة أن قاعدة البيانات اوركل ‪ 10g‬لبد من تهيئتها‬
‫قبل بدء فى عمليات المراقبة بواسطة المتغير ‪ AUDIT_TRAIL‬الذى يأخذ أحد القيم التالية ‪-:‬‬
‫‪ :NONE -1‬وهى تعنى أن قاعدة البيانات غير جاهزة لعملية المراقبة ‪.‬‬
‫‪ :DB -2‬وهى تعنى ان معومات المراقبة يتم حفظها فى قاعدة البيانات فى جداول تنتمى للمستخدم‬
‫‪. SYS‬‬
‫‪ :OS -3‬وهى تعنى أن معلومات المراقبة يتم حفظها على مستوى نظام التشغيل ‪ ،‬فإذا كنا نعمل على‬
‫بيئة ويندوز ‪ Widows‬فان البيانات تحفظ فى ال ‪ ، Event Log‬اما إذا كنا نعمل على ‪UNIX or‬‬
‫‪ LINUX‬فإن المعلومات تخزن كملفات فى المسار المحدد على المتغير ‪. AUDIT_FILE_DEST‬‬

‫‪119‬‬
‫الصدار اوركل ‪ 10g‬يدعم مختلف انواع المراقبة ‪ ،‬بحيث يستطيع مدير قاعدة البيانات مراقبة كل‬
‫الحداث التى تحدث فى قاعدة البيانات ‪ ،‬تخيلت معى حجم البيانات التى يتم تخزينها إذا قمنا بمراقبة كل‬
‫ما يحدث فى قاعدة البيانات ل شك أن ذلك سينعكس سلبا على أداء قاعدة البيانات لذا كان لزاما على‬
‫مدير قاعدة البيانات التركيز فى المراقبة بحيث يتم مراقبة ما نحتاجه دون الفراط فى المراقبة ‪.‬‬
‫فإذا أردنا مثلً مراقبة بعض الجداول فالفضل التركيز على تحديد العمليات التى يجب متابعتها‬
‫مثلً فقط الحذف ‪ ،‬اما اذا قمت بمتابعة كل ما يحدث للجداول فإن ذلك سيؤثر على اداء قاعدة البيانات‬
‫فسوف يتم متابعة الستعلم والتعديل والمسح وغيره ‪ ،‬إذا التركيز امر مهم فى عملية المراقبة ‪.‬‬

‫واول ما يلزمنا فعله هو تهيئة قاعدة البيانات بتغير قيمة المتغير ‪ AUDIT_TRAIL‬من القيمة‬
‫‪ NONE‬الى احد القيم التالية (‪ )DB OR OS‬ولنفترض هنا أننا نريد تخزين معلومات المراقبة داخل‬
‫قاعدة البيانات إذا نختار القيمة ‪.DB‬‬

‫لكن قبل ذلك نتأكد من المتغير ‪.AUDIT_TRAIL‬‬

‫;‪SHOW PARAMETER AUDIT_TRAIL‬‬

‫نقوم بتحويل قيمة المتغير ‪ AUDIT_TRAIL‬ال القيمة ‪ DB‬مع مراعاة أن هذا المتغير غير اّلى ‪ ،‬أى‬
‫يحتاج إلى إغلق وفتح قاعدة البيانات حتى تتأثر قيمة المتغير ‪.‬‬

‫;‪ALTER SYSTEM SET AUDIT_TRAIL=DB SCOPE=SPFILE‬‬


‫ثم نغلق ونفتح قاعدة البيانات ونتأكد من قيمة المتغير ‪.‬‬

‫‪120‬‬
‫‪:Standard Database Auditing -1‬‬
‫كما ذكرنا سابقا هذا النوع من المراقبة يتركز على مراقبة عملية التصال بقاعدة البيانات وكذلك‬
‫متابعة إستخدام (‪. ) System Privileges and Object Privileges‬‬
‫كما يجب الذكر أن هناك خيارين أثناء عملية المراقبة (‪BY SESSION & BY‬‬
‫‪، ) ACCESS‬‬

‫‪121‬‬
‫‪ :BY SESSION‬وهى تعنى تخزين حقل واحد من المعلومات أثناء عمليات المراقبة لنوع معين من‬
‫العمليات لكل ‪ ، SESSION‬ولتضح الرؤية أكثر لنفترض أننا قمنا بمراقبة عملية التعديل على جداول‬
‫مستخدم معين ولنفترض أنه ‪ ، X‬فقام احد المستخدمين بفتح ‪ SESSION‬واستخدم هذه ال ‪SESSION‬‬
‫لتعديل ‪ 5‬جداول تنتمى للمستخدم ‪ .X‬فإن عملية المراقبة ستقوم بتخزين حقل واحد فقط لعملية التعديل ما‬
‫دام أنه قام بالتعديل بنفس ال ‪ ، SESSION‬اى بمعنى اخر أنها توازى عبارة ‪GROUP BY‬‬
‫‪.SESSION‬‬
‫‪ :BY ACCESS‬يمكن اتخاذ نفس المثال السابق ‪ ،‬لكن هنا سيتم تخزين ‪ 5‬حقول كل حقل هو عبارة‬
‫عن عملية التعديل التى حدثت لكل جدول‪.‬‬
‫ل شك أن الخيار ‪ BY SESSION‬قد ل يكون كافيا احيانا لمعرفة تفاصيل معلومات المراقبة لذا قد نلجأ‬
‫للخيار ‪ BY ACCESS‬الذى نجد فيه تفاصيل أكثر لكن بالطبع يزيد عمليات تخزين المعلومات‪.‬‬
‫فى هذا النوع من المراقبة كما ذكرنا الفضل فيه عملية التركيز ويكون التركيز بتحديد المستخدم‬
‫كذلك بتحديد نجاح او فشل العملية (‪. )SUCCESSFUL OR NOT SUCCESSFUL‬‬

‫وهذا النوع من المراقبة ‪ Standard Database Auditing‬يحتوى على اقسام‬


‫فرعية‪-:‬‬
‫* ‪:SESSION AUDITING‬‬
‫وهى جزء من النوع الول من المراقبة ‪ ، Standard Database Auditing‬بحيث يتم مراقبة عمليات‬
‫التصال وقطع التصال بقاعدة البيانات ‪ ،‬ويمكن التركيز بتحديد المستخدم الذى نريد مراقبة عملياتة‬
‫اتصاله كما يمكن متابعة كل المستخدمين بإستخدام المر ‪ AUDIT SESSION‬كما يمكن التركيز ايضا‬
‫بتحديد عملية نجاح أو فشل عملية التصال ‪.‬‬
‫نفترض أننا نريد مراقبة كل عمليات التصال الناجحة وقطع التصال بالنسبة للمستخدم ‪ TEST‬ولننا‬
‫نريد معرفة وقت التصال وقطع التصال فالفضل استخدم الخيار ‪.BY ACCESS‬‬
‫‪AUDIT SESSION BY TEST BY ACCESS WHENEVER‬‬
‫;‪SUCCESSFUL‬‬

‫‪122‬‬
‫ماذا الن لو قام المستخدم ‪ TEST‬بالتصال بقاعدة البيانات‬

‫الن مدير قاعدة البيانات يستطيع أن يشاهد معلومات عن عملية التصال اعله‬

‫‪SELECT‬‬
‫‪SERNAME,TERMINAL,ACTION_NAME,EXTENDED_TIMESTAMP‬‬
‫;‪FROM DBA_AUDIT_SESSION‬‬

‫ظهر لمدير قاعدة البيانات ان المستخدم ‪ TEST‬قام بالتصال بقاعدة البيانات بالتاريخ والزمن‬
‫المحدد من الجهاز ‪ NBS‬كما يمكن استعراض معلومات اخرى عن اسم مستخدم الجهاز وغيره من‬
‫المعلومات ‪.‬‬

‫ماذا لو قام المستخدم ‪ TEST‬بقطع التصال ؟‬


‫بالطبع ستظهر لمدير قاعدة البيانات معلومات اضافية‬

‫‪SELECT‬‬
‫‪USERNAME,TERMINAL,ACTION_NAME,TO_CHAR(EXTENDED_TIM‬‬
‫‪ESTAMP,'DD-MM-YYYY:HH-MI-‬‬
‫('‪SS'(,TO_CHAR(LOGOFF_TIME,'DD-MM-YYYY:HH-MI-SS‬‬
‫;‪FROM DBA_AUDIT_SESSION‬‬

‫‪123‬‬
‫الن يظهر لمدير قاعدة البيانات الن المستخدم ‪ TEST‬قام بقطع التصال بقاعدة البيانات فى الزمن‬
‫المحدد اعله ‪ ،‬اى أنه ظل متصل بقاعدة البيانات حوالى ‪ 21‬دقيقة ‪.‬‬

‫يمكن ايضا استعلم معلومات التصال وقطع التصال بقاعدة البيانات بواسطة الجدول‬
‫‪. DBA_AUDIT_TRAIL‬‬
‫إذا معلومات التصال وقطع التصال بقاعدة البيانات متوفرة فى كل من (‬
‫‪)DBA_AUDIT_SESSION & DBA_AUDIT_TRAIL‬‬

‫يمكن لمدير قاعدة البيانات الستعلم عن خيارات المراقبة التى قام بتهيئتها فى قاعدة البيانات بواسطة‬
‫‪DBA_OBJ_AUDIT_OPTS‬‬
‫‪DBA_STMT_AUDIT_OPTS‬‬
‫‪DBA_PRIV_AUDIT_OPTS‬‬

‫‪SELECT USER_NAME,AUDIT_OPTION,SUCCESS,FAILURE FROM‬‬


‫;‪DBA_STMT_AUDIT_OPTS‬‬

‫بالطبع يمكن إلغاء عملية المراقبة ‪ ،‬فلو أردنا إلغاء عملية مراقبة إتصال المستخدم ‪ TEST‬التى قمنا‬
‫بمراقبتها سابقا‪.‬‬

‫;‪NOAUDIT SESSION BY TEST‬‬

‫الن لو قمنا بعملية استعلم لعرض خيارات المراقبة التى قمنا بتهيئتها فلن نجد خيار مراقبة اتصال‬
‫المستخدم ‪.TEST‬‬

‫‪124‬‬
‫* ‪:SQL STATEMENT AUDITING‬‬
‫تخيل معى أن مدير قاعدة البيانات يريد مراقبة عمليات ال ‪ DDL‬مثل إنشاء او حذف جدول ‪ .‬فى‬
‫هذا النوع من المراقبة يمكن التركيز بواسطة تحديد المستخدم وكذلك بواسطة نجاح او فشل العملية ‪ ،‬لكن‬
‫ل بإنشاء جدول فى ‪ SCHEMA‬لمستخدم اخر فإن‬
‫هذا فى إطار ما يملك المستخدم ‪ ،‬فلو قام مستخدم مث ً‬
‫هذا النوع من المراقبة يدخل فيما يسمى ‪ SYSTEM PRIVILEGE AUDITING‬وهو ما سنناقشه‬
‫لحقا ‪ ،‬أما هنا فقط فى اطار ما يمكلك المستخدم فقط ‪.‬‬

‫ولنفترض أننا نريد مراقبة عملية إنشاء الجداول بواسطة المستخدم ‪ TEST‬داخل مساحته اى فى نفس ال‬
‫‪.SCHEMA‬‬

‫;‪AUDIT CREATE TABLE BY TEST BY ACCESS‬‬

‫ماذا لو قام الن المستخدم ‪ TEST‬بإنشاء جدول ‪.‬‬

‫‪CREATE TABLE USER_MASTER (USER_NO‬‬


‫‪NUMBER(5(,USER_NAME VARCHAR2(40(,CONSTRAINT‬‬
‫;((‪PK_USER_NO PRIMARY KEY(USER_NO‬‬

‫‪125‬‬
‫ستظهر المعلومات لمدير قاعدة البيانات ‪.‬‬

‫‪SELECT USERNAME,OWNER,TO_CHAR(TIMESTAMP,'DD-MM-‬‬
‫‪YYYY:HH-MI-SS'(,OBJ_NAME,ACTION_NAME FROM‬‬
‫;'‪DBA_AUDIT_TRAIL WHERE OWNER='TEST‬‬

‫لكن لو قام المستخدم ‪ TEST‬مثلً بإنشاء جدول فى ‪ SCHEMA‬اخرى فإن خيارات المراقبة اعله لن‬
‫تاتى بمعلومات اللهم إل إذا رقبنا الصلحية ‪ CREATE ANY TABLE‬وهو ما سنناقشه فى الخطوة‬
‫القادمة ‪.‬‬

‫يمكن الستعلم عن الخيار التى قمنا بتهيئتها لمراقبة ‪ SQL STATEMENT‬بواسطة ‪:‬‬
‫‪DBA_STMT_AUDIT_OPTS‬‬
‫‪DBA_PRIV_AUDIT_OPTS‬‬

‫يمكن إلغاء المراقبة بواسطة‬

‫‪126‬‬
‫* ‪:SYSTEM PRIVILEGE AUDITING‬‬
‫وذلك لمراقبة عمليات استخدام الصلحيات ‪ SYSTEM PRIVILEGES‬داخل قاعدة البيانات ‪،‬‬
‫مثلً الصلحية ‪ ، CREATE ANT TABLE‬بالطبع يمكن تركيز عملية مراقبة الصلحيات بواسطة‬
‫مستخدم معين كذلك بواسطة نجاح العملية أو فشلها ‪ ،‬فى الصل يتم تخزين عمليات مراقبة الصلحيات‬
‫‪ SYSTEM PRIVILEGES‬كحقل لكل عملية وذلك لستخدام الخيار ‪ BY ACCESS‬فى الصل‬
‫لكن بالطبع يمكن استعمال الخيار ‪ BY SESSION‬لتقليل عمليات تخزين المعلومات فيتم تخزين حقل‬
‫واحد لكل ‪ SESSION‬قامت بإستخدام الصلحية المراقبة ‪.‬‬

‫ولنفترض أننا نريد مراقبة الصلحية ‪ CREATE ANY TABLE‬للمستخدم ‪ ، TEST‬اى بمعنى اخر‬
‫أننا نريد مراقبة كل الجداول التى يقوم المستخدم ‪ TEST‬بإنشاءها فى ‪ SCHEMA‬اخرى ‪.‬‬

‫‪127‬‬
.‫ أخرى‬SCHEMA ‫ وهى تعنى إنشاء جدول فى‬CREATE ANY TABLE ‫اى مستخدما الصلحية‬

‫ اى فى مساحة‬EMP SCHEMA ‫ بإنشاء جدول فى‬TEST ‫الن ماذا لو قام المستخدم‬


AUDIT CREATE ANY TABLE BY TEST WHENEVER
SUCCESSFUL;

.EMP ‫المستخدم‬

CREATE TABLE EMP.EMPLOYEE (EMP_NO


NUMBER(4(,EMP_NAME VARCHAR(40((;

. ‫بالطبع يستطيع مدير قاعدة البيانات متابعة هذه الخطوة‬

SELECT
USERNAME,OWNER,OBJ_NAME,ACTION_NAME,TO_CHAR(TIMEST
AMP,'DD-MM-YYYY:HH-MI-SS'( FROM DBA_AUDIT_OBJECT
WHERE USERNAME='TEST';

128
‫نعم لقد قام المستخدم ‪ TEST‬بإنشاء جدول ‪ EMPLOYEE‬فى المستخدم ‪ EMP‬فى الزمن‬
‫المحدد اعله ‪.‬‬
‫بالطبع يمكن متابعة باقى الصلحيات مثلً ‪ ))DROP ANY TABLE‬وغيرها من‬
‫الصلحيات ‪.SYSTEM PRIVILEGES‬‬

‫للستعلم عن تهيئة خيارات مراقبة ال ‪.SYSTEM PRIVILEGES‬‬

‫‪SELECT * FROM DBA_PRIV_AUDIT_OPTS WHERE‬‬


‫;'‪PRIVILEGE='CREATE ANY TABLE‬‬

‫يمكن إلغاء المراقبة‬

‫‪129‬‬
‫* ‪:OBJECT PRIVILEGE AUDITING‬‬
‫وهذا النوع لمراقبة العمليات التى تحدث على الكائنات من جداول ‪ TABLES‬ومناظير ‪VIEWS‬‬
‫وغيرها من الكائنات ‪.‬‬
‫يمكن التركيز بواسطة تحديد المستخدم وكذلك بواسطة نجاح أو فشل العملية ‪ .‬الصل فى هذا النوع من‬
‫المراقبة أن تكون ‪ BY SESSION‬ولكن يمكن تحديد الخيار ‪.BY ACCESS‬‬

‫لنفترض أننا نريد مراقبة عمليات الضافة فى الجدول ‪ USER_MASTER‬الموجود فى ال‬


‫‪ SCHEMA‬التى تسمى ‪.TEST‬‬

‫;‪AUDIT INSERT ON TEST.USER_MASTER BY ACCESS‬‬

‫الن لو قام المستخدم ‪ TEST‬بإضافة بيانات فى الجدول ‪. USER_MASTER‬‬

‫يستطيع مدير قاعدة البيانات متابعة ذلك ‪.‬‬

‫‪SELECT USERNAME,TO_CHAR(TIMESTAMP,'DD-MM-YY:HH-‬‬
‫‪MI-SS'(,OBJ_NAME,ACTION_NAME FROM DBA_AUDIT_TRAIL‬‬
‫'‪WHERE USERNAME='TEST' AND OBJ_NAME='USER_MASTER‬‬
‫;'‪AND ACTION_NAME='INSERT‬‬

‫‪130‬‬
‫للستعلم عن خيارات تهيئة مراقبة ال ‪.OBJECT PRIVILEGES‬‬

‫‪select * from DBA_OBJ_AUDIT_OPTS WHERE‬‬


‫;'‪OWNER='TEST' AND OBJECT_NAME='USER_MASTER‬‬

‫هناك ثلث قيم ‪:‬‬


‫‪ : -‬تعنى عدم المراقبة ‪.‬‬
‫‪ :A‬تعنى أن معلومات المراقبة تخزن ‪. BY ACCESS‬‬
‫‪ :S‬تعنى أن معلومات المراقبة تخزن ‪.BY SESSION‬‬

‫لحظ أنه مقابل الحقل ‪ INS‬وجدت القيمة ‪ A/A‬اى أنه تتم مراقبة عملية ال ‪ INSERT‬بواسطة الخيار‬
‫‪ BY ACCESS‬سواء نجحت العملية أو فشلت ‪ ،‬اما إذا كان الخيار ‪WHENEVER‬‬
‫‪ SUCCESSFUL‬فإن القيمة ستكون ‪.-/A‬‬

‫يمكن إلغاء عملية المراقبة بواسطة‪.‬‬

‫هكذا نكون قد ناقشنا الخيارات المتاحة للمراقبة التى تنتمى للجزء الول ‪Standard Database‬‬
‫‪ Auditing‬وهى ‪:‬‬
‫‪.SESSION AUDITING‬‬
‫‪SQL STATEMENT AUDITING‬‬
‫‪SYSTEM PRIVILEGE AUDITING‬‬

‫‪131‬‬
‫‪OBJECT PRIVILEGE AUDITING‬‬

‫‪:Value-Based Auditing -2‬‬


‫فى النوع الول من المراقبة ‪ Standard Database Auditing‬استطعنا مراقبة وحفظ‬
‫معلومات عن العمليات التى تحدث فى قاعدة البيانات ‪ ،‬لكن قد نحتاج احيانا لحفظ القيم التى يتم تعديلها او‬
‫حذفها فى قاعدة البيانات ‪ ،‬هذه القيم ل يتم حفظها فى ال ‪. Standard Database Auditing‬‬
‫يعمل هذا النوع من المراقبة ‪ Value-Based Auditing‬معتمدا على خلق ‪ Trigger‬بحيث‬
‫يتم تنفيذه بعد عملية التعديل أو المسح ليحفظ المعلومات والقيم التى نريدها ويحفظها فى جدول نقوم بخلقه‬
‫خصيصا لتخزين هذه المعلومات ‪.‬‬

‫بالطبع هذا النوع من المراقبة ‪ Value-Based Auditing‬يقلل من أداء قاعدة البيانات اكثر من‬
‫النوع ‪ Standard Database Auditing‬وذلك لن ال ‪ Trigger‬يتم تنفيذه بعد كل عملية تعديل أو مسح‬
‫‪.‬‬
‫ولنفترض الن أننا نريد مراقبة وحفظ القيم المعدلة فى الحقل ‪ BOOK_NAME‬الموجودة فى‬
‫الجدول ‪ BOOK‬المملوك للمستخدم ‪.TEST‬‬

‫يلزم مدير قاعدة البيانات اولً تحديد المعلومات التى يريد حفظها ولنفترض أنها ‪-:‬‬
‫‪ IP Address -1‬للجهاز الذى استخدم للتصال بقاعدة البيانات ‪.‬‬

‫‪132‬‬
‫‪ -2‬اسم مستخدم نظام التشغيل الذ قام بالتصال بقاعدة البيانات ‪.‬‬
‫‪ -3‬التاريخ والزمن ‪.‬‬
‫‪ -4‬قيمة الحقل قبل التعدل وبعد التعديل ‪.‬‬

‫ثانيا‪ :‬يلزم مدير قاعدة البيانات إنشاء الجدول لتخزين المعلومات عن عمليات التعديل ‪,‬‬

‫(‪CREATE TABLE BOOK_AUDIT‬‬


‫‪OS_USER VARCHAR2(70(,‬‬
‫‪UPDATE_DATE DATE,‬‬
‫‪IP_ADDRESS VARCHAR2(16(,‬‬
‫;((‪OLD_NEW_NAME VARCHAR2(100‬‬

‫‪133‬‬
.Trigger ‫ثالثا يقوم مدير قاعدة البيانات بإنشاء ال‬

CREATE OR REPLACE TRIGGER BOOK_NAME_AUDIT


AFTER UPDATE OF BOOK_NAME
ON TEST.BOOK
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF :OLD.BOOK_NAME != :NEW.BOOK_NAME THEN
INSERT INTO BOOK_AUDIT
VALUES (SYS_CONTEXT('USERENV','OS_USER'(,
SYSDATE,
SYS_CONTEXT('USERENV','IP_ADDRESS'(,
:NEW.BOOK_NO ||' BOOK_NO( CHANGED FROM
'||:OLD.BOOK_NAME||
' TO '||:NEW.BOOK_NAME(;
END IF;
END;
/

134
‫هكذا تم إنشاء ال ‪ Trigger‬ولنفترض الن أن المستخدم ‪ TEST‬قام بتعديل فى الجدول ‪.BOOK‬‬

‫يستطيع مدير قاعدة البيانات متابعة ذلك التعديل بواسطة الجدول ‪.BOOK_AUDIT‬‬

‫‪SELECT OS_USER,TO_CHAR(UPDATE_DATE,'DD-MM-YY:HH-‬‬
‫;‪MI-SS'(,IP_ADDRESS,OLD_NEW_NAME FROM BOOK_AUDIT‬‬

‫ليقاف هذ النوع من المراقبة يمكن تعطيل أو حذف هذا ال ‪.Trigger‬‬


‫‪:(Fine-Grained Auditing (FGA -3‬‬
‫النواع السابقة من المراقبة تستطيع حفظ معلومات عن العمليات التى تحدث فى قاعدة البيانات كما‬
‫يمكن حفظ القيم التى تتغير ‪ ،‬أما هذا النوع من المراقبة فهو لحفظ عبارات ال ‪ SQL‬التى تنفذ فى قاعدة‬
‫البيانات ويشمل كل من العبارات التية ‪)SELECT & INSERT & UPDATE & DELETE( :‬‬
‫وذلك باستخدام ‪ ، DBMS_FGA PACKAGE‬هذه الحزمة تحتوى على اربعة من ال ‪Procedure‬‬
‫‪-:‬‬

‫‪ :ADD_POLICY -1‬لضافة ‪ POLICY‬جديدة لمراقبة عبارات ال ‪ SQL‬فى قاعدة البيانات وذلك‬


‫حسب القيم التى سنحددها فى الجراء ‪.‬‬
‫‪ :PROP_POLICY -2‬لحذف ‪ POLICY AUDIT‬موجودة‪.‬‬
‫‪ :ENABLE_POLICY -3‬لتشغيل ‪ POLICY AUDIT‬كانت معطلة ‪.‬‬

‫‪135‬‬
‫‪ :DISABLE POLICY -4‬لتعطيل عمل ‪.POLICY AUDIT‬‬

‫ولنفترض الن أننا نريد حفظ عبارات ال ‪ SELECT‬التى تحدث للجدول ‪ BOOK‬المملوك للمستخدم‬
‫‪ . TEST‬وحتى ل نحفظ كل عبارات ال ‪ SELECT‬التى تحدث للجدول ‪ BOOK‬فمن الممكن التركيز‬
‫على بعض الحقول وذلك بإستخدام بعض الشروط ‪.‬‬
‫ل ‪.WHERE BOOK_NO=1‬‬
‫مث ً‬
‫وذلك لتركيز عملية المراقبة ‪.‬‬

‫مدير قاعدة البيانات دائما يجب ان يراعى أن ل يفرط فى عملية المراقبة ‪ ،‬بل يركز دائما على المطلوب‬
‫‪.‬‬
‫الن نقوم بتنفيذ الجراء ‪ ADD_POLICY‬وذلك لضافة ‪ AUDIT POLICY‬تقوم بحفظ عبارات‬
‫ال ‪ SELECT‬التى تنفذ على الجدول ‪ BOOK‬وذلك حسب الشروط التى نحددها ‪.‬‬

‫بالطبع هذا الجراء ‪ Procedure‬يحتوى على مجموعة من المتغيرات يجب أن نحدد لها قيم ‪ ،‬هذه‬
‫المتغيرات سنتحدث عنها بشى من التفصيل لحقا ‪.‬‬

‫هذه الجراءات ‪ Procedures‬موجودة فى قاعدة البيانات داخل الحزمة ‪ DBMG_FGA‬اى ل تحتاج‬


‫منك انشاؤها فقط تحتاج لتنفيذها بعد تحديد قيم المتغيرات ‪.‬‬

‫‪136‬‬
DECLARE
OBJECT_SCHEMA VARCHAR2(200(;
OBJECT_NAME VARCHAR2(200(;
POLICY_NAME VARCHAR2(200(;
AUDIT_CONDITION VARCHAR2(200(;
AUDIT_COLUMN VARCHAR2(200(;
HANDLER_SCHEMA VARCHAR2(200(;
HANDLER_MODULE VARCHAR2(200(;
ENABLE BOOLEAN;
STATEMENT_TYPES VARCHAR2(200(;
AUDIT_TRAIL BINARY_INTEGER;
AUDIT_COLUMN_OPTS BINARY_INTEGER;

BEGIN
OBJECT_SCHEMA := 'TEST';
OBJECT_NAME := 'BOOK';
POLICY_NAME := 'BOOK_SELEC';
AUDIT_CONDITION := 'BOO_NO=1';
AUDIT_COLUMN := 'BOOK_NAME';
HANDLER_SCHEMA := NULL;
HANDLER_MODULE := NULL;
ENABLE := TRUE;
STATEMENT_TYPES := 'SELECT';
AUDIT_TRAIL := 1;
AUDIT_COLUMN_OPTS := 0;

SYS.DBMS_FGA.ADD_POLICY ( OBJECT_SCHEMA,
OBJECT_NAME, POLICY_NAME, AUDIT_CONDITION,
AUDIT_COLUMN, HANDLER_SCHEMA, HANDLER_MODULE, ENABLE,
STATEMENT_TYPES, AUDIT_TRAIL, AUDIT_COLUMN_OPTS (;
COMMIT;
END;
/

‫ وهى تعنى المستخدم الذى يحتوى الجدول او الكائن الذ نريد مراقبة‬:OBJECT_SCHEMA
.‫ عليه‬SELECT ‫عبارات ال‬

137
‫‪ :OBJECT_NAME‬وهو الكائن الذى نريد مراقبة عبارات ال ‪ SELECT‬عليه‪.‬‬

‫‪ :POLICY_NAME‬وهو اسم ال ‪ AUDIT POLICY‬التى نريد خلقها‪.‬‬

‫‪ :AUDIT_CONDITION‬وهى لتحديد الشروط لتركيز عملية المراقبة‪.‬‬

‫‪ :AUDIT_COLUMN‬وهو العمود الذى نريد تركيز عملية المراقبة عليه‪.‬‬

‫‪ :HANDLER_SCHEMA‬احيانا قد نحتاج لتحديد اجراء ‪ Procedure‬ليقوم ببعض الحداث‬


‫الضافية اثناء عملية المراقبة ‪ ،‬فنقوم هنا يتحديد المستخدم الذى يحوى هذا الجراء‪.‬‬

‫‪ ENABLE :‬لتفعيل عمل ‪ AUDIT POLICY‬ويأخذ هذا المتغير القيمة ‪ TRUE‬فى الصل‪.‬‬

‫‪ STATEMENT_TYPES :‬لتحديد نوع عبارات ال ‪ SQL‬التى نريد مراقبتها والصل ‪.SELECT‬‬

‫‪ :AUDIT_TRAIL‬لتخزين عبارات ال ‪ SQL‬المراقبة فى ال ‪.AUDIT_TRAIL‬‬

‫‪ :AUDIT_COLUMN_OPTS‬ماذا لو قمت بتحديد عدد من العمدة فى المتغير‬


‫‪ ، AUDIT_COLUMN‬هنا لتحديد هل (‪ )ANY OR ANY‬الصل يحتوى عل القيمة ‪ 0‬وهى‬
‫تعنى ‪.ANY‬‬

‫‪138‬‬
‫الن ماذا لو قام المستخدم ‪ EMP‬بعمل استعلم على الجدول ‪ BOOK‬المنتمى للمستخدم ‪ TEST‬بنفس‬
‫الشروط المذكورة اعله ؟‬

‫;‪SELECT * FROM TEST.BOOK WHERE BOOK_NO=1‬‬

‫‪139‬‬
.‫يستطيع مدير قاعدة البيانات الن متابعة هذا الستعلم‬

SELECT
USERHOST,OS_USER,DB_USER,TO_CHAR(TIMESTAMP,'DD-MM-
YY:HH-MI-SS'(,SQL_TEXT FROM DBA_FGA_AUDIT_TRAIL
WHERE DB_USER='EMP;

‫ بعمل إستعلم اخر لم تتحق فيه الشروط الموضحة فى الجراء‬EMP ‫لو قام المستخدم‬
.‫ فإن معلومات هذا الستعلم لن تظهر لمدير قاعدة البيانات‬ADD_POLICY

‫ التى تعمل فى قاعدة‬AUDIT_POLICIES ‫بالطبع يستطيع مدير قاعدة البيانات الستعلم عن‬
. ‫البيانات‬
.DBA_AUDIT_POLICIES

SELECT
POLICY_NAME,OBJECT_SCHEMA,OBJECT_NAME,POLICY_COLUM
N,SEL FROM DBA_AUDIT_POLICIES;

140
.DISABLE_POLICY ‫ بواسطة الجراء‬AUDIT POLICY ‫يمكن تعطيل هذه ال‬

DECLARE
OBJECT_SCHEMA VARCHAR2(200(;
OBJECT_NAME VARCHAR2(200(;
POLICY_NAME VARCHAR2(200(;

BEGIN
OBJECT_SCHEMA := 'TEST';
OBJECT_NAME := 'BOOK';
POLICY_NAME := 'BOOK_SELECT';

SYS.DBMS_FGA.DISABLE_POLICY ( OBJECT_SCHEMA,
OBJECT_NAME, POLICY_NAME (;
COMMIT;
END;
/

.ENABLE_POLICY ‫كما يمكن تفعيلها مره اخرى بواسطة بواسطة الجراء‬

141
DECLARE
OBJECT_SCHEMA VARCHAR2(200(;
OBJECT_NAME VARCHAR2(200(;
POLICY_NAME VARCHAR2(200(;

BEGIN
OBJECT_SCHEMA := 'TEST';
OBJECT_NAME := 'BOOK';
POLICY_NAME := 'BOOK_SELECT';

SYS.DBMS_FGA.ENABLE_POLICY ( OBJECT_SCHEMA,
OBJECT_NAME, POLICY_NAME (;
COMMIT;
END;
/

.DROP_POLICY ‫ بواسطة الجراء‬AUDIT POLICY ‫واخيرا يمكن حذف‬

142
DECLARE
OBJECT_SCHEMA VARCHAR2(200(;
OBJECT_NAME VARCHAR2(200(;
POLICY_NAME VARCHAR2(200(;

BEGIN
OBJECT_SCHEMA := 'TEST';
OBJECT_NAME := 'BOOK';
POLICY_NAME := 'BOOK_SELECT';

SYS.DBMS_FGA.DROP_POLICY ( OBJECT_SCHEMA,
OBJECT_NAME, POLICY_NAME (;
COMMIT;
END;
/

‫ فى قاعدة‬POLICY ‫ فلن تجد هذه ال‬AUDIT_POLICIES ‫الن لو قمت بعمل إستعلم عن ال‬
‫البيانات‬

143
144
145
‫‪-: Oracle Net Services -1‬‬
‫أن يكون لديك مخدم ‪ Server Database‬يحتوى على قاعدة البيانات يتصل به جميع ‪Client‬‬
‫‪ Application‬او جميع الجهزة التى تحتوى على برامج تحتاج للتصال بقاعدة البيانات هذا هو المر‬
‫الطبيعى والمعتاد والذى تعمل به اغلب الشركات فى العالم ‪ ،‬إذ ل يتصور أن تكون جميع الجهزة التى‬
‫تحتوى على برامج تحتاج للتصال بقاعدة البيانات تحتوى ايضا على قاعدة البيانات ‪ ،‬وإل فإننا نحتاج‬
‫لقاعدة البيانات لكل جهاز يحتوى عل برنامج وهذا غير مفبول عقلً ول عملً‪.‬‬

‫وإذا سلمنا بأن يكون لدينا مخدم يحتوى على قاعدة البيانات ‪ Database Server‬تستطيع‬
‫جميع الجهزة التى تحتوى على برامج تحتاج لقاعدة البيانات التصال بهذا المخدم ‪ ،‬فإن محور حديثنا‬
‫فى هذا الفصل سينصب على كيفية إنجاح هذا التصال ‪.‬‬

‫إذا المر سيكون على جانبين ‪ :‬الجانب الول وهو جانب المخدم ‪ Database Server‬وكيف‬
‫يستطيع خدمة جميع الطلبات التى تصله للتصال بقاعدة البيانات ‪.‬‬
‫اما الجانب الثانى وهو جانب ال ‪ Client Application‬وهو الجهاز الذى يريد التصال بقاعدة‬
‫البيانات ‪ ،‬وكيف يستطيع الوصول لقاعدة البيانات ؟‬

‫والن سنتحدث عن الجانب الول وهو جانب المخدم ‪ Database Server‬وكيف يستطيع خدمة جميع‬
‫الطلبات للتصال بقاعدة البيانات ؟‬

‫فى هذا الجانب يستطيع المخدم ‪ Database Server‬خدمة طلبات التصال بقاعدة البيانات بواسطة ال‬
‫‪ Oracle Net Listener‬وهو المسؤول عن عملية معالجة طلبات ال ‪ Clients‬للتصال بقاعدة البيانات ‪،‬‬
‫فبدون ال ‪ Listener‬محاولة عملية التصال بقاعدة البيانات من خارج المخدم ستبوء بالفشل ‪ ،‬لكن عملية‬
‫محاولة التصال بقاعدة البيانات من داخل المخدم ل تحتاج لل ‪ Listener‬إذ أنه متخصص لستقبال‬
‫الطلبات الخارجية ‪.‬‬

‫يستطيع مستمع واحد ‪ One Listener‬خدمة عدد من ال ‪ ، Database Instances‬وهو فى الصل عبار‬
‫عن ملف يوجد فى المسار التى إذا كنا نعمل على نظام التشغيل ‪.WINDOWS‬‬
‫‪ORACLE_HOME%\NETWORK\ADMIN\LISTENER.ORA%‬‬
‫أما إذا كنا نعمل على نظام التشغيل ‪UNIX‬‬
‫‪ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA$‬‬

‫يستطيع مدير قاعدة البيانات تحرير وتهيئة هذا الملف ليستقبل طلبات التصال بقاعدة البيانات ‪،‬‬

‫‪146‬‬
‫هذا نموذج لملف ال ‪ Listener‬بحيث يحتوى على ‪ One Listener‬يسمى ‪ Listener‬يعمل فى المخدم‬
‫‪ nbs‬ويراقب ال ‪ Port 1521‬مستخدما ‪ ، TCP PROTOCOL‬هذا المستمع يخدم ‪INSTANCE‬‬
‫تسمى ‪.ORCL‬‬

‫بالطبع يستطيع مدير قاعدة البيانات إضافة مستمع ‪ LISTENER‬جديد ولنفترض أننا نريد إضافة مستمع‬
‫جديد يسمى ‪ LISTENER1‬يعمل فى نفس المخدم ‪ NBS‬يراقب ال ‪ PORT 1521‬ويخدم نفس ال‬
‫‪ INSTANCE‬التى تسمى ‪ ORCL‬مستخدما ‪. TCP PROTOCOL‬‬

‫يكون شكل الملف بعد التعديل كالتى ‪-:‬‬

‫‪147‬‬
‫لحظت التعديلت الجديدة فى الملف ‪ :‬وهى إضافة مستمع جديد يسمى ‪.LISTENER1‬‬

‫بعد ذلك نستطيع التحكم فى ‪ LISTENERS‬بواسطة المر ‪.LSNRCTL‬‬

‫‪148‬‬
‫الوامر المعروضة ه المتاحة للتعامل مع ال ‪.LISTENER‬‬
‫وهى اوامر لتشغيل وايقاف وعرض حالة المستمع وكذلك وضع كلمة سر وتغيرها للمستمع كنوع من‬
‫التحقق ‪ ،‬وكذلك إعادة تشغيل المستمع ليستوعب ما تم تحديثه من تهيئة لملف ال ‪LISTERNER.ORA‬‬
‫وغيره من الوامر ‪ ،‬وبما أننا اضفنا مستمع جديد اسميناه ‪ LISTENER1‬فالفضل أن نقوم بتشغيل هذا‬
‫المستمع ‪ ،‬لكن يجب التنبيه إلى أنه عند كتابة المر ‪ LISTENER‬فإنه يتم التعامل مع المستمع الصل‬
‫اى ‪ DEFAULT‬والذى هنا هو ‪ LISTENER‬لذا إذا اردنا أن نتعامل مع المستمع غير الصلى فامامنا‬
‫احد خياران‪:‬‬
‫الول ‪ :‬تحيد إسم المستمع عند توجيه المر‬

‫الن قمنا بتشغيل المستمع الجديد الذى انشأناه وهو المستمع ‪ ، LISTENER1‬ولو لم نكتب إسم المستمع‬
‫بعد المر ‪ START‬لتم التعامل مع المستمع الصلى وهو المستمع ‪.LISTENER‬‬

‫الخيار الثانى ‪ :‬استعمال المر ‪ SET CUR LISTENER_NAME‬لوضع ال ‪DEFAULT‬‬


‫‪ LISTENER‬الجديد ‪ ،‬اى سيصبح السم الجديد للمستمع هو الصل الذى سنتعامل معه ‪.‬‬

‫‪149‬‬
‫الن ‪ LISTENER1‬هو ال ‪.DEFAULT LISTENER‬‬

‫بعد إنشاء المستمع ‪ LISTENER1‬وتشغيله يمكن متابعته عن طريق ال ‪ SERVICES‬إذا كنا نعمل عل‬
‫نظام التشغيل ‪.WINDOWS‬‬

‫الن المستمع ‪ LISTENER1‬يستطيع استقبال طلبات التصال بقاعدة البيانات على ال ‪PORT 1521‬‬
‫ل ‪ TCP PROTOCOL‬ليخدم ‪.ORCL INSTANCE‬‬
‫فى المخدم ‪ NBS‬مستعم ً‬

‫إذا أردنا مراقبة ومعرفة معلومات عن المستمع فالفضل استخدام المر ‪ STATUS‬او‬
‫‪ SERVICE‬لعرض معلومات عن المستمع مثل اسم المستمع واصداره ومتى تم تشغبله وال ‪services‬‬
‫التى يخدمها ‪ ،‬ومسار ملف ال ‪ LISTENER.ORA‬وغيرها من المعلومات‪.‬‬

‫‪150‬‬
‫كما ذكرنا أن مستمع واحد يستطيع خدمة عدد من ال ‪ INSTANCES‬كما يمكن ان يتشارك‬
‫عدد من المستمعين ‪ LISTENERS‬فى خدمة ‪ INSTANCE‬واحدة ‪ ،‬كما يمكن ان يكون هناك عدد‬
‫من ال ‪ INSTANCES‬فى الجهاز الواحد فيكون لكل واحد منها مستع يخدمها ‪.‬‬

‫من الصدار ‪ Oracle8i‬فصاعدا يتم تسجيل ال ‪ Instance‬الجديدة اليا فى ال ‪Default‬‬


‫‪ Listener‬اى ل يحتاج مدير قاعدة البيانات إضافتها يدويا فى ال ‪ ، Listener‬وذلك فيما يعرف‬
‫‪. Dynamic Service registration‬‬
‫هكذا نكون إنتهينا من تهيئة الجانب الول وهو المخدم ‪ ، DATABASE SERVER‬وفى الصفحات‬
‫التالية سنتحدث عن الجانب الخر وهو جانب ال ‪.Clients‬‬

‫ليستطيع ال ‪ Client‬التصال بقاعدة البيانات فى ‪ Database Server‬يحتاج لمعرفة بعض‬


‫المعلومات الضرورية لنجاح عملية التصال ‪:‬‬
‫‪ -1‬المخدم او ال ‪ HOST‬الذى يعمل فيه المستمع ‪.Listener‬‬
‫‪ -2‬ال ‪ Port‬الذى يراقبه المستمع‪.‬‬

‫‪151‬‬
‫‪ -3‬البروتكول ‪ Protocol‬الذى يستخدمه المستمع‪.‬‬
‫‪ -4‬اسم ال ‪ service‬او ال ‪ Instance‬الذى يخدمه المستمع‪.‬‬

‫فعندما يطلب البرنامج او ال ‪ Application‬التصال بقاعدة البيانات من خلل المستمع‬


‫‪ Listener‬يحتاج لمعرفة المعلومات الموضحة اعله ليترجم ذلك فى عملية إتصال ناجح ‪ ،‬أما كيف‬
‫يعالج هذه المعلومات لتتم عملية التصال فهناك عدة طرق ‪-:‬‬

‫‪-:Easy Connect -1‬‬


‫فى هذا النوع من التصال يحتاج المستخدم لكتابة كل المعلومات التى يحتاجها ال ‪Client‬‬
‫للتصال بقاعدة البيانات ‪ ،‬يكتب هذه المعلومات اثناء عملية التصال وذلك على النحو التالى‪-:‬‬
‫>‪<username>/<password>@<hostname>:<listener port>/<service name‬‬

‫‪CONN SYSTEM/SYS@NBS:1521/OBAY‬‬

‫حيث ‪ :NBS‬هو اسم الذى يعمل عليه المستمع ‪.Listener‬‬


‫‪ :1521‬هو ال ‪ PORT‬الذى يراقبه المستمع‪.‬‬
‫‪ :OBAY‬هو اسم ال ‪ Instance‬التى يخدمها المستمع‪.‬‬

‫وهذا النوع هو اسهل طرق التصال من حيث أنه ل يحتاج لتهيئة فى ال ‪.Client‬‬

‫‪-:Local Naming‬‬ ‫‪-2‬‬


‫فى النوع السابق من التصال ‪ Easy Connect‬تحتاج لكتابة المعلومات وهى (& ‪host‬‬
‫‪ )protocol & port & service name‬اثناء عملية التصال مما يسبب نوع المشقة ‪ ،‬فى هذا النوع من‬
‫التصال ل نحتاج الى كتابة ذلك عند كل عملية اتصال وانما نقوم بتهيئة الملف‬
‫‪ .ORACLE_HOME/network/admin/tnsnames.ora$‬إذا كنا نعمل على نظام التشغيل ‪UNIX‬‬
‫او الملف التالى إذا كنا نعمل على نظام التشغيل ‪WINDOWS.‬‬
‫‪%ORACLE_HOME%\NETWORK\ADMIN\TNSNAMES.ORA‬‬

‫‪152‬‬
‫بحيث نقوم بعمل اسم مستعار لكل المعلومات المطلوبة اثناء عملية التصال وهى (& ‪host‬‬
‫‪ )protocol & port & service name‬بحيث يمثل هذا السم المستعار المعلومات اعله ‪ ،‬فل نحتاج‬
‫اثناء عملية التصال سواء كتابة السم المستعار مع اسم المستخدم وكلمة السر‬
‫‪ ، username/password@alias‬نستطيع وضع قائمة من عمليات تهيئة السماء المستعارة التى تمثل‬
‫مجموعة التصالت بقاعدة البيانات فى الملف ‪.tnsnames.ora‬‬

‫هذا نموذج للملف ‪ . tnsnames.ora‬يستطيع هذا ال ‪ Client‬التصال بقواعد البيانات مستخدما‬


‫تهيئة هذا الملف ‪.‬‬
‫ولنفترض أن المستخدم فى هذا ال ‪ Client‬كتب العبارة التالية ‪-:‬‬
‫‪CONN USERNAME/PASSWORD@AKSLPNT1‬‬

‫فإن ال ‪ Client‬سيترجم كلمة ‪ AKSLPNT1‬على النحو التالى ‪-:‬‬


‫‪ :HOST‬إسم المخدم الذى يحتوى عل المستمع ‪KASALA-DC‬‬
‫‪:PROTOCOL‬البرتوكول الذى يستعمله وهو ‪.TCP‬‬
‫‪:PORT‬البورت الذى يراقبه المستمع‪.‬‬

‫‪153‬‬
‫‪:SERVICE_NAME‬اسم ال ‪ INSTANCE‬التى تريد التصال بها‪.‬‬

‫من الممكن القيام بعمل اختبار لل ‪ Oracle Net Service aliases‬بواسطة المر ‪ tnsping‬ثم بعده‬
‫نكتب السم المستعار ‪. aliases‬‬

‫لقد تمت عملية الختبار بنجاح ‪.‬‬

‫‪-:Database Link -2‬‬


‫فى قاعدة البيانات الواحدة يستطيع المستخدمون منح صلحيات على الكائنات التى يملكها لغيره‬
‫من المستخدمين ‪ ،‬أما إذا كان لديك اكثر من قاعدة بيانات فمن المتعذر تعامل المستخدمين بين قاعدة‬
‫بيانات واخرى ما لم يكن لدينا ‪ Database Link‬فهى الرابط بين قاعدة بيانات واخرى ‪ ،‬وقد تحتاج ذلك‬
‫كثيرا اثناء عملك فقد يكون لديك اكثر من قاعدة بيانات تحتاج لربطها مع بعض ‪.‬‬

‫ولنفترض أن لدينا قاعدة بيانات تسمى ‪OBAY‬‬

‫;‪SELECT NAME FROM V$DATABASE‬‬

‫‪154‬‬
‫واخرى تسمى ‪.ORCL‬‬

‫نحتاج الن ربط قاعدة البيانات ‪ OBAY‬مع قاعدة البيانات ‪ ، ORCL‬ولنفترض أن المستخدم‬
‫‪ TEST‬فى قاعدة البيانات ‪ OBAY‬يحتاج لعمل استعلم على الجدول ‪ EMPLOYEE‬المملوك‬
‫للمستخدم ‪ VBS‬الموجود فى قاعدة البيانات ‪ ، ORCL‬إذا نحتاج لعمل ‪ Database Link‬بين المستخدم‬
‫‪ TEST‬فى قاعدة البيانات ‪ OBAY‬وبين المستخدم ‪ VBS‬فى قاعدة البيانات ‪.ORCL‬‬

‫لكن قبل إنشاء ال ‪ Database Link‬لبد من الشارة إلى أن المستخدم الذى يقوم بإنشاء ال‬
‫‪ Database Link‬لبد أن يكون لديه الصلحية ‪.CREATE DATABASE LINK‬‬
‫والن المستخدم ‪ TEST‬فى قاعدة البيانات ‪ OBAY‬سيقوم بعمل ‪ Database Link‬بينه وبين‬
‫المستخدم ‪ VBS‬فى قاعدة البيانات ‪.ORCL‬‬

‫اولً‪ :‬يتصل المستخدم ‪ TEST‬ويتأكد أن لديه الصلحية ‪.CREATE DATABASE LINK‬‬

‫‪SELECT * FROM USER_SYS_PRIVS WHERE‬‬


‫;'‪PRIVILEGE='CREATE DATABASE LINK‬‬

‫‪155‬‬
‫ل أننا نعمل على قاعدة البيانات ‪ OBAY‬وتأكدنا ثانيا أن‬
‫فى الخطوة السابقة تأكدنا او ً‬
‫المستخدم ‪ TEST‬يملك الصلحية ‪.CREATE DATABASE LINK‬‬

‫ثانيا‪ :‬يقوم المستخدم ‪ TEST‬بإختبار ال ‪ Oracle Net Service aliases‬الموجودة فى ملف ال‬
‫‪ tnsnames.ora‬وذلك للتأكد من سلمة التصال بقاعدة البيانات الخرى وهى هنا ‪. ORCL‬‬

‫لقد تمت عملية الختبار بنجاح‪.‬‬

‫ثالثاً يقوم المستخدم ‪ TEST‬بإنشاء ال ‪.Database Link‬‬

‫‪CREATE DATABASE LINK TESTVBS CONNECT TO VBS‬‬


‫;'‪IDENTIFIED BY VBS USING 'ORCL‬‬

‫لقد قام المستخدم ‪ TEST‬بإنشاء ‪ Database Link‬تسمى ‪ TESTVBS‬يستطيع من خللها المستخدم‬


‫‪ TEST‬التصال بالمستخدم ‪ VBS‬الموجود فى قاعدة بيانات اخرى تسمى ‪.ORCL‬‬

‫رابعا الن يمكن المستخدم ‪ TEST‬الستعلم عن الجدول ‪ EMPLOYEE‬المملوك للمستخدم ‪VBS‬‬


‫الموجود فى قاعدة البيانات ‪.ORCL‬‬

‫;‪SELECT * FROM EMPLOYEE@TESTVBS‬‬

‫‪156‬‬
‫فى بعد الحيان يكون اسم ال ‪ Database Link‬مصحوبا بإسم الجدول طويل فمن الفضل إنشاء‬
‫مرادف ‪ synonym‬لتسهيل واختصار كتابة العبارات خصوصا تلك التى يتكرر كتابتها‪.‬‬

‫;‪CREATE SYNONYM EMP FOR EMPLOYEE@TESTVBS‬‬

‫لكن يجب مراعاة أن المستخدم يحتاج للصلحية ‪ CREATE SYNONYM‬لنشاء المرادف‪.‬‬

‫الن يمكن كتابة عبارة الستعلم بالشكل التى‪:‬‬

‫;‪SELECT * FROM EMP‬‬

‫تجدر الشارة هنا بأن نقول انك تستطيع من خلل ال ‪ Database Link‬إجراء عمليات ال ‪ DML‬وهى‬
‫(‪ ) SELECT & INSERT & UPDATE &DELETE‬لكن من المتعذر اجراء عمليات ال ‪DDL‬‬
‫مثل ‪.CREATE & ALTER & DROP‬‬

‫‪:PUBLIC DATABASE LINK‬‬

‫‪157‬‬
‫ما قمنا به فى الخطوات السابقة هو ربط المستخدم ‪ TEST‬فى قاعدة البيانات ‪ OBAY‬مع‬
‫المستخدم ‪ VBS‬فى قاعدة البيانات ‪ ORCL‬عن طريق ‪ DATABASE LINK‬تسمى ‪.TESTVBS‬‬

‫لكن هل يستطيع اى مستخدم اخر فى قاعدة البيانات ‪ OBAY‬استخدام ‪TESTVBS‬‬


‫‪ DATABASE LINK‬؟ الجواب وبكل سهولة ل ‪ ،‬وذلك لن ال ‪ Database Link‬التى قمنا بخلقها‬
‫هى خاصة بالمستخدم ‪ TEST‬وليست لكل المستخدمين وهى تسمى ‪PRIVATE DATABASE‬‬
‫‪.LINK‬‬

‫ولكى يستطيع كل المستخدمون فى قاعدة البيانات ‪ OBAY‬التصال بالمستخدم ‪ VBS‬فى‬


‫قاعدة البيانات ‪ ORCL‬نحتاج لنشاء ‪.PUBLIC DATABASE LINK‬‬

‫بالطبع لنشاء هذا النوع نحتاج للصلحية ‪.CREATE PUBLIC DATABASE LINK‬‬

‫قام مدير قاعدة البيانات بمنح المستخدم ‪ TEST‬الصلحية ‪CREATE PUBLIC‬‬


‫‪ DATABASE LINK‬ومن ثم قام المستخدم ‪ TEST‬بإنشاء ‪PUBLIC DATABASE LINK‬‬
‫تسمى ‪ ، PUBTESTVBS‬الن يستطيع جميع المستخدمين فى قاعدة البيانات ‪ OBAY‬استخدم‬
‫‪.PUBTESTVBS DATABASE LINK‬‬

‫‪158‬‬
‫ فى قاعدة البيانات‬DATABASE LINK ‫للستعلم عن ال‬
DBA_DB_LINKS
USER_DB_LINKS
ALL_DB_LINKS
V$DBLINK

SELECT DB_LINK FROM DBA_DB_LINKS;

.DATABASE LINK ‫بالطبع يمكن حذف ال‬

DROP DATABASE LINK TESTVBS;

159
‫كما يمكن حذف ال ‪PUBLIC DATABASE LINK‬‬

‫;‪DROP PUBLIC DATABASE LINK PUBTESTVBS‬‬

‫بالطبع نحتاج للصلحية ‪ DROP PUBLIC DATABASE LINK‬للحذف‪.‬‬

‫‪-:Materialized Views -3‬‬

‫عند مناقشتنا لل ‪ Database Link‬عرفنا كيف يمكن ربط قاعدة بيانات بأخرى وكيف يمكن‬
‫الوصول للكائنات فى قاعدة بيانات من قاعدة بيانات اخرى ‪ ،‬ولكن قد تحتاج فى بعض الحيان لنقل‬
‫وتحديث البيانات الموجودة فى قاعدة البيانات الى قاعدة بيانات أخرى ‪.‬‬

‫كأن تكون مثلً مديرا لمجموعة صيدليات ؛ كل صيدلية تحتوى على قاعدة بيانات ولكن على‬
‫رأس كل ساعة تحتاج لجلب جميع حسابات الصيدليات من قواعد البيانات الموزعة الى قاعدة البيانات‬
‫الرئيسية ‪ ،‬هذه هى مهمة ال ‪ Materialized Views‬؛ ولكن لل ‪ Materialized Views‬مهام اخرى‬
‫ليست هنا مجال تفصيلها‪.‬‬

‫‪160‬‬
‫سنستخدم هنا نفس المثال الذى استخدمناه فى ال ‪ ، Database Link‬ولنفترض هنا أن قاعدة‬
‫البيانات ‪ OBAY‬هى قاعدة البيانات الرئيسية التى ستستقبل البيانات ‪ ،‬ولنفترض أننا سنستقبل البيانات‬
‫فى المستخدم ‪ ، TEST‬أما قاعدة البيانات الخرى ‪ ORCL‬والتى تحتوى على الجدول الرئيسى‬
‫ولنفترض أنه ‪ EMPLOYEE‬المملوك للمستخدم ‪ VBS‬الذى نحتاج الى نقل وتحديث بياناته كل ثانية‬
‫الى قاعدة البيانات الرئيسية ‪.OBAY‬‬

‫بالطبع نحتاج قبل كل شئ لعمل ‪ Database Link‬بين المستخدم ‪ TEST‬فى قاعدة البيانات‬
‫‪ OBAY‬وبين المستخدم ‪ VBS‬فى قاعدة البيانات ‪ ، ORCL‬وذلك لعملية نقل وتحديث بيانات الجدول‬
‫‪ EMPLOYEE‬من قاعدة البيانات ‪ ORCL‬إلى قاعدة البيانات ‪.OBAY‬‬

‫أيضا عملية تحديث البيانات (‪ )Refresh‬بين الجدول الرئيسى وال ‪ Materialized Views‬تنقسم‬
‫الى ثلث أنواع ‪:‬‬
‫‪ -:REFRESH FAST‬فى هذا النوع من التحديث يتم فقط نقل البيانات التى تغيرت بعد اخر‬ ‫‪-1‬‬
‫تحديث فهو ل يحتاج لنقل جميع البيانات ف الجدول وانما فقط ما تم تغيره بعد اخر تحديث ‪ ،‬هذا النوع‬
‫بفى الغالب يختصر الزمن ‪.‬‬

‫‪ :REFRESH COMPLETE -2‬أما فى هذا النوع من التحديث يقوم بنقل جميع بيانات الجدول من‬
‫المصدر الى ال ‪ Materialized Views‬فيقوم بعمل إعادة كتابة البيانات القديمة واضافة البيانات‬
‫الجديدة‪ .‬ف الغالب ان هذا النوع يتطلب زمن اكثر من النوع ‪.FAST‬‬

‫‪ :REFRESH‬هذا النوع بيدأ اول بتطبيق النوع ‪ FAST‬إذا فشلت العملية كأن لم يجد‬ ‫‪FORCE -3‬‬
‫مثلً ال ‪ Materialized Views Logs‬فى جانب المصدر‪ .‬ففى هذه الحالة يطبق النوع‬
‫‪.COMPLETE‬‬

‫إذا لم يحدد نوع التحديث اثناء إنشاء ال ‪ Materialized Views‬فان الصل ‪ DEFAULT‬هو‬
‫‪.FORCE‬‬

‫‪-:Materialized Views Logs‬‬


‫كما سبق وان ذكرنا أن نوع التحديث ‪ FAST‬يقوم فقط بنقل البيانات التى تم تغيرها منذ اخر‬
‫تحديث من الجدول المصدر الى ال ‪ .Materialized Views‬ولكن أين يتم تخزين معلومات عن‬
‫البيانات التى تغيرت فى الجدول المصدر قبل نقلها الى ال ‪ Mataerialized Views‬؟ الجواب يتم‬

‫‪161‬‬
‫تخزينها فى ال ‪ ، Materialized View Logs‬وهو عبارة عن جدول يتم إنشاؤه فى قاعدة البيانات بل‬
‫وفى المستخدم الذى يملك الجدول المصدر وذلك عن طريق المر التالى ‪:‬‬

‫;‪CREATE MATERIALIZED VIEW LOG ON EMPLOYEE‬‬

‫بحيث ‪ EMPLOYEE‬هو الجدول المصدر‪.‬‬

‫فلحظة كتابة المر اعله ؛ قاعدة البيانات تقوم بإنشاء جدول بالصيغة‬
‫‪>MLOG$_<TABLE_NAME‬‬

‫‪:Primary Key Materialized Views‬‬


‫ولكن حتى تستطيع تنظيم الجدول المصدر ‪ ،‬دون التأثير على ال ‪ FAST REFRESH‬وذلك‬
‫بحيث يتم حفظ التغيرات بنا ًء على ال ‪ ، Primary Key‬فنستطيع لحظة إنشاء ال ‪Materialized‬‬
‫‪ Views‬تحديد الخيار ‪ WITH PRIMARY KEY‬وهو الصل ‪ DEFAULT‬فى حالة عدم تحديد‬
‫خيار اخر ‪ ،‬والخيار الخر هو ‪.ROWID‬‬
‫لحظة إنشاء ال ‪ Materialized Views‬بالخيار ‪ Primary Key‬يجب أن يكون الجدول المصدر يحتوى‬
‫على ‪.prmary Key Constraint‬‬

‫كذلك عند تحديد الخيار ‪ Fast Refresh‬عند إنشاء ال ‪ Materialized Views‬يجب أن نكون‬
‫قمنا بإنشاء ال ‪ Materialized View Logs‬فى المستخدم الذى يحوى الجدول المصدر وإل ظهرت لنا‬
‫رسالة خطأ‪.‬‬

‫قد يكون فى الشرح السابق نوع من التعقيد لكن ل عليك ركز معى فى السناريو الذى سننفذه معا‬
‫خطوة خطوة ابتدا ًء من إنشاء المستخدمين وحتى عمل ال ‪ Materialized Views‬وهذا هو بيت القصيد‪.‬‬

‫‪162‬‬
‫قاعدة البيانات الولى تسمى ‪ ، OBAY‬سنقوم بإنشاء مستخدم فيها يسمى ‪ MAIN‬؛ وسنقوم‬
‫بإنشاء ‪ Materialized Views‬فى هذا المستخدم لجلب بيانات موجودة فى الجدول ‪EMPLOYEE‬‬
‫المملوك للمستخدم ‪ SUB‬الموجود فى قاعدة البيانات ‪.ORCL‬‬
‫واليك الخطوات ‪-:‬‬
‫‪ -1‬سنقوم بإنشاء المستخدم ‪ MAIN‬فى قاعدة البيانات ‪ OBAY‬وسنمنحه الصلحيات الكافية‪.‬‬

‫;‪CREATE USER MAIN IDETIFIED BY MAIN‬‬

‫‪GRANT CONNECT,RESOURCE,CREATE DATABASE‬‬


‫;‪LINK,CREATE MATERIALIZED VIEW TO MAIN‬‬

‫‪ -2‬فى الجانب الخر نتأكد من الجدول المصدر وهو هنا ‪ EMPLOYEE‬والتأكد كذلك أنه يحتوى على‬
‫‪ PRIMARY KEY CONSTRAINT‬حتى نستطيع إنشاء ‪ MATERIALIZED VIEWS‬فى‬
‫قاعدة البيانات الخرى بإستخدام الخيار ‪.WITH PRIMARY KEY‬‬

‫‪163‬‬
SELECT * FROM EMPLOYEE;

SELECT
OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME
FROM USER_CONSTRAINTS;
CONSTRAINT PRIMARY ‫ يحتوى على حقلين ويحتوى كذلك على‬EMPLYEE ‫إذا الجدول‬
.KEY

‫ وبين‬MAIN ‫ بين المستخدم‬DATABASE LINK ‫ نقوم بإنشاء‬OBAY ‫ الن فى قاعدة البيانات‬-3


.ORCL ‫ فى قاعدة البيانات‬SUB ‫المستخدم‬

CREATE DATABASE LINK MAINSUB CONNECT TO SUB


IDENTIFIED BY SUB USING 'ORCL';

164
‫ نقوم‬EMPLOYEE ‫ الذى يحوى الجدول المصدر‬SUB ‫ وفى المستخدم‬ORCL ‫ فى قاعدة البيانات‬-4
.MATERIALIZED VIEW LOG ‫بإنشاء‬

CREATE MATERIALIZED VIEW LOG ON EMPLOYEE;

‫ ويمكن التحقق من إنشاء ال‬EMPLOYEE ‫ للجدول‬MATERIALIZED VIEW LOG ‫قمنا بإنشاء‬


‫ بالستعلم التالى‬EMPLOYEE ‫ للجدول‬MATERIALIZED VIEW LOG

SELECT * FROM TAB WHERE TNAME LIKE '%EMPLOYEE';

.MATERIALIZED VIEW ‫ نقوم بإنشاء ال‬OBAY ‫ فى قاعدة البيانات‬-5

165
CREATE MATERIALIZED VIEW EMPLOYEE_MV
REFRESH FAST
START WITH SYSDATE
NEXT SYSDATE + 1/(24*60*60(
WITH PRIMARY KEY
AS SELECT * FROM EMPLOYEE@MAINSUB;

‫ وذلك‬FAST REFRESH ‫ مستخدمين الخيار‬MATERIALIZED VIEW ‫قمنا بإنشاء ال‬


، ‫ فى الجانب الخر وإل ظهرت رسالة خطأ‬MATERIALIZED VIEW LOG ‫لننا قمنا بإنشاء ال‬
‫ وذلك لن الجدول المصدر يحتوى على‬WITH PRIMARY KEY ‫وكذلك استخدمنا الخيار‬
.WITH ROWID ‫ على اى حال هناك خيار اخر هو‬، PRIMARY KEY CONSTRAINT

‫ ستلحظ أنه كل ثانية‬MATERIALIZED VIEW ‫ الن يمكن الستعلم عن الجدول المصدر وال‬-6
‫]تكون النتيجة متطابقة بين الجدول المصدر‬SYSDATE +1/(24*60*60[ ‫كما حددنا ذلك‬
.EMPLOYEE_MV ‫ وهى‬MATERIALIZED VIEW ‫ وبين ال‬EMPLOYEE

SELECT * FROM EMPLOYEE;

166
‫;‪SELECT * FROM EMPLOYEE_MV‬‬

‫‪ -7‬الن لو قمنا بإضافة حقل جديد فى الجدول المصدر ثم بعد ذلك أعدنا عمليات الستعلم اعله‪.‬‬

‫;(’‪INSER INTO EMPLOYEE VALUES (3,’ALI‬‬

‫لحظت معى إضافة حقل ثالث فى الجدول ‪.EMPLOYEE‬‬

‫‪167‬‬
‫ستنعكس الضافة فى الجدول المصدر ‪ EMPLOYEE‬على ‪EMPLOYEE_MV‬‬
‫‪ MATERIALIZED VIEW‬بعد ثانية واحدة من الضافة فى الجدول المصدر‪.‬‬

‫لو قمنا بعمل إستعلم للجدول ‪ MLOG$_EMPLOYEE‬قبل عملية ال ‪ REFRESH‬سنجد معلومات‬


‫عن الحقول التى اضيفت بعد اخر عملية ‪ REFRESH‬ولكن بعد عملية ال ‪ REFRESH‬تختفى‬
‫المعلومات السابقة عن الجدول وفى إنتظار الجديد‪.‬‬

‫يستطيع مدير قاعدة البياناات عمل إستعلم عن ال ‪ MATERIALIZED VIEWS‬التى تعمل فى قاعدة‬
‫البيانات بواسطة الجدول‬
‫‪DBA_MVIEWS‬‬

‫‪168‬‬
‫نستطيع أن نحصل على معلومات اخرى من نفس الجدول‪.‬‬
‫‪.DBA_JOBS‬‬ ‫للستعلم عن ال ‪ JOBS‬بواسطة الجدول‬

‫بالطبع المستخدم ‪ MAIN‬يستطيع حذف ال ‪.MATERIALIZED VIEW‬‬

‫;‪DROP MATERIALIZED VIEW EMPLOYEE_MV‬‬

‫‪169‬‬
170
171
‫‪:UNDO MANAGEMENT -1‬‬
‫فى الفصل الثالث من هذا الكتاب تحدثت عرضا عن ال ‪ Undo Tablespace‬وذكرت أنه‬
‫يستخدم من قبل ال ‪ Oracle Server‬لتخزين ال ‪ ، Undo Information‬لكن هل فكرت يوما فى عملية‬
‫ال ‪ ROLLBACK‬؟ وهل سألت نفسك كيف يمكنك التراجع عن عمليات التعديل التى قمت بها فى‬
‫بعض الحقول؟ ‪ ،‬رغم أنه تم تغير القيم القديمة الى القيم الجديدة ‪.‬‬

‫السناريو بإختصار أنه عند إجراء عملية تعديلت على البيانات فى قاعدة البيانات فإن ال‬
‫‪ Oracle Server‬يقوم يتخزين القيم القديمة فى ال ‪ Undo Tablespace‬قبل ان يتم تغييرها بالقيم‬
‫الجديدة ‪ ،‬هذا السناريو يتيح لنا فرصة التراجع عن العمليات متى احتجنا إلى ذلك بشرط أن تكون القيم‬
‫القديمة ما زالت موجودة فى ال ‪ Undo Tablespace‬إذ ل يتصور أن تظل هذه القيم موجودة إلى‬

‫‪172‬‬
‫مالنهاية فهو فى اخر المر ‪ Tablespace‬له سعة محدودة وكذلك له فترة احتفاظ بالمعلومات محدودة‬
‫يقوم بتهيئتها مدير قاعدة البيانات حسب ما يراه مناسبا ‪ ،‬نستطيع كذلك من خلل هذا السناريو ان ننجز‬
‫عملية ال ‪ Flashback Queries‬إذا توفرت القيم القديمة سنتحدث عن ال ‪ Flashback Queries‬فى‬
‫هذا الفصل ولكن عموما هو عبارة عن استعلم عن قيم لكن فى الماضى عند زمن معين ‪.‬‬

‫فى الصدارات السابقة كان يتم تخزين القيم التى تم تعديلها فى قاعدة البيانات فى ‪Rollback‬‬
‫‪ Segment‬ولكن بعد الصدار ‪ Oracle9i‬فصاعدا قدمت شركة اوركل خيار جديد هو ‪Undo‬‬
‫‪ Segment‬مع إبقاء الخيار الول متاحا ‪ ،‬ولكن تنصح شركة اوركل بقوة استخدام ال ‪Undo‬‬
‫‪.Segment‬‬

‫فال ‪ Undo Tablespace‬تتم إدارته عن طريق ‪ Managed Tablespace Locally‬وايضا‬


‫‪ ، Automatic Extent allocation‬فلحظة بدء العملية يتم تخصيص وإنشاء ‪ Undo Segment‬اليا‬
‫لتخزين القيم التى تتغير فى قاعدة البيانات بواسطة هذه العملية ‪ ،‬بحيث يتم تخصيص ‪Undo Segment‬‬
‫واحدة لكل عمليات ولكن يمكن أن تخدم هذه ال ‪ Segment‬عدد من العمليات‪ ،‬فعند امتلء ال ‪Extent‬‬
‫يتم التحول للتى بعدها فى نفس ال ‪ Segment‬بحيث يكون على القل هناك اثنين من ال ‪ Extents‬فى‬
‫كل ‪ Segement‬أما الحد القصى فيعتمد على ‪ ، DB Block Size‬أما إذا تم ملء جميع ال ‪Extents‬‬
‫فى ال ‪ Undo Segment‬فإنه يتم إعادة الكتابة فى ال ‪ Extent‬إبتداءً من الول ‪ ،‬أو يتم طلب تخصيص‬
‫‪ Extent‬جديدة‪.‬‬

‫قد يكون فى قاعدة البيانات الواحدة اكثر من ‪ Undo Tablespace‬لكن ل يمكن ان يعمل فى‬
‫اللحظة الواحدة اكثر من ‪ Undo Tablespace‬ويتم تحديد عمل ال ‪ Undo Tablespace‬فى قاعدة‬
‫البيانات بواسطة المتغير ‪.Undo_Tablespace‬‬

‫;‪SHOW PARAMETER UNDO_TABLESPACE‬‬

‫لنشاء ‪ Undo Tablespace‬جديد‬

‫‪CREATE UNDO TABLESPACE ORCLUNDO DATAFILE‬‬


‫‪'D:\oracle\product\10.1.0\oradata\ORCL\ORCLUNDO.‬‬
‫‪DBF' SIZE 20M EXTENT MANAGEMENT LOCAL‬‬
‫‪173‬‬
‫;‪AUTOALLOCATE‬‬
‫الن قاعدة البيانات تحتوى على اثنين من ال ‪ Undo Tablespace‬ولكن يعمل واحد فقط هو‬
‫‪ UNDOTBS1‬كما موضح اعله ‪.‬‬

‫ولكن يمكن تغيير ال ‪ Undo Tablespace‬الذى يعمل فى قاعدة البيانات من ‪UNDOTBS1‬‬


‫الى ‪.ORCLUNDO‬‬
‫'‪ALTER SYSTEM SET UNDO_TABLESPACE='ORCLUNDO‬‬
‫;‪SCOPE=BOTH‬‬

‫قاعدة البيانات اوركل ‪ Oracle Database10g‬تتيح خيار ادرة اليا لل ‪Undo Tablespace‬‬
‫وهو ‪ Automatic Undo Management‬ويتم تهيئته بواسطة المتغير‬
‫‪ UNDO_MANAGEMENT‬بحيث يأخذ القيمة ‪ ، AUTO‬أما خيار الدارة اليدوى ‪Manual‬‬
‫‪ Undo Magamenet‬فهو خيار مكلف ويحتاج لعمل اكثر من مدير قاعدة البيانات ‪.‬‬
‫أما خيار الدارة ‪ Automatic Undo Management‬فهو يقلل العبء من مدير قاعدة‬
‫البيانات بحيث تكون إدراته فقط على مستوى ال ‪.Tablespace‬‬

‫مدير قاعدة البيانات ينتظره تهيئة المساحة المناسبة لل ‪ Undo Tablespace‬وذلك حسب المعلومات‬
‫التى سيتم تخزينها ‪ ،‬كذلك لبد من تهيئة فترة الحتفاظ ‪ Undo Retention‬للبيانات فى ال ‪Undo‬‬
‫‪ Segment‬وذلك بواسطة المتغير ‪ UNDO_RETENTION‬الذى يأخذ قيمة هى فترة الحتفاظ‬
‫بالثوانى ‪.‬‬
‫الصل فى هذا المتغير هو أن يأخذ القيمة ‪ 0‬وهى تعنى ‪ Automatic‬اى يعنى محاولة الحتفاظ‬
‫بالمعومات حتى تنتهى ‪ ،‬على أن يتم الحتفاظ بالمعلومات على القل ‪ 15‬دقيقة ‪ ،‬لكن يمكن تحديد قيمة‬
‫اخرى هى فترة الحتفاظ بالثوانى واقصى قيمة هى ‪.232‬‬

‫;‪SHOW PARAMETER UNDO_RETENTION‬‬

‫‪174‬‬
‫وعموما ‪ Undo information‬اى المعلومات الموجودة فى ال ‪ Undo Segments‬تنقسم الى ثلث‬
‫حالت ‪-:‬‬
‫‪ :Uncommitted Undo Information -1‬وهى المعلومات التى لم يتم تثبيتها إلى الن وذلك لن‬
‫العمليات مازالت مستمرة ‪ ،‬هذا النوع من المعلومات ل يمكن حذفها واعادة الكتابة فيها ‪.‬‬
‫‪ :Committed Undo Information -2‬وهى ل نحتاجها لعمليات مستمرة ‪ ،‬ولكن لن فترة الحفاظ‬
‫لم تنتهى بعد "‪ ،"Unexpired‬هذا النوع من العمليات نحتفظ به قدر المكان ما لم يؤدى ذلك لفشل بعض‬
‫العمليات نتيجة عدم وجود مساحة فى ال ‪ Undo Tablespace‬فى هذه الحالة يتم اعادة الكتابة فى هذه‬
‫المعلومات ‪ ،‬ولكن قد يقوم مدير قاعدة البيانات بتهيئة ال ‪ Undo Tablespace‬بحيث نضمن عدم مسح‬
‫واعادة الكتابة فيها وذلك باستخدام الخيار ‪.Guaranteeing Undo Retention‬‬

‫;‪ALTER TABLESPACE ORCLUNDO RETENTION GUARANTEE‬‬

‫هذا الخيار بالطبع غير متاح سواء لل ‪.Undo Tablespace‬‬


‫هكذا نضمن عدم مسح المعلومات التى لم تنتهى فترة احتفاظها حتى لو أدى ذلك لفشل بعض العمليات‬
‫لعدم وجود مساحة فى ال ‪.Undo Tablespace‬‬

‫‪ :Expired Undo Information -3‬وهى ل نحتاجها لعمليات مستمرة ‪ ،‬وكذلك فترة الحتفاظ بها‬
‫انتهت فيمكن اعادة الكتابة فيها متى ما احتجنا لمساحة فى ال ‪.Undo tablespace‬‬

‫من المشاكل التى تحدث كثيرا والتى يجب لمدير قاعدة البيانات مراعاتها ‪-:‬‬
‫‪ -1‬مشكلة المساحة ‪ :Undo Tablespace Space Error‬ويجب على مدير قاعدة البيانات مراقبة‬
‫مساحة ال ‪ Undo Tablespace‬فالعمليات التى ل تجد مساحة فى ال ‪ Undo Tablespace‬تعطى رسالة‬
‫الخطأ‪.‬‬
‫‪ORA-01650: unable to extend rollback segment‬‬

‫‪ :Snapshot too old” Error“ -2‬وهذا الخطأ يظهر عند تنفيذ استعلم يحتاج لمعلومات ‪Undo‬‬
‫‪ Information‬قد تم مسحها واعادة الكتابة فيها ‪ ،‬لذا يجب على مدير قاعدة البيانات مراعاة فترة‬

‫‪175‬‬
Guaranteeing ‫ وكذلك المساحة المناسبة مع مراعاة‬UNDO_RETENTION ‫الحتفاظ المناسبة‬
.Undo Retention

:‫ بواسطة‬UNDO ‫يمكن الستعلم عن ال‬


DBA_UNDO_EXTENT
V$UNDOSTAT

:Flashbach Technology -2

:A- Flashback Query


From Oracle91 & Do use Undo

:B- Flashback Table


From Oracle10g & Do use Undo

176
‫‪:C- Flashback Version Query‬‬
‫‪From Oracle10g & Do use Undo‬‬

‫‪:D- Flashback Transaction‬‬


‫‪From Oracle10g & Do use Undo‬‬

‫‪:E- Flashback Drop‬‬


‫‪From Oracle10g & Do Not use Undo‬‬

‫‪:F- Flashback Database‬‬


‫‪From Oracle10g & Do Not use Undo‬‬

‫‪:A- Flashback Query‬‬


‫هذا النوع متاح منذ الصدار ‪ Oracle9i‬بحيث نستطيع من خلله عمل إستعلم فى قاعدة البيانات‬
‫ليس للبيانات الموجودة حاليا وإنما لبيانات موجودة فى لحظة زمنية فى الماضى ‪ ،‬ويعتمد هذا النوع‬
‫اساسا على ال ‪ ، Undo Tablespace‬فبمجرد عمل الستعلم يتم البحث عن المعلومات فى ال‬
‫‪ ، Undo Segments‬هذه المعلومات التى ستعرض للمستخدم تظل مؤقتة ومتاحة فقط لل ‪Session‬‬
‫الحالية ‪ ،‬بالطبع فقد تفشل عملية ال ‪ Flashback Query‬إذا لم نجد البيانات المطلوبة فى ال ‪Undo‬‬

‫‪177‬‬
‫‪ Tablespace‬مثلً بسبب طول المدة وإعادة كتابة بيانات جديدة فى البيانات المطلوبة لذا على مدير‬
‫قاعدة البيانات تحديد فترة احتفاظ ‪ Retention‬مناسبة‪.‬‬

‫ولنتصور الن السناريو التالى حتى نستوعب عملية ال ‪ Flashback Query‬بصورة اوضح‪:‬‬
‫لدينا الن جدول يسمى ‪ Employee‬يحتوى على على مجموعة من الحقول‪.‬‬

‫;‪SELECT * FROM EMPLOYEE‬‬

‫الجدول ‪ EMPLOYEE‬يحتوى الن على ‪ 8‬حقول‪.‬‬

‫لنفترض أن المستخدم قام بمسح بعض الحقول ‪.‬‬

‫;(‪DELETE EMPLOYEE WHERE EMP_NO IN (1,5,7‬‬

‫الن لو قمنا بإستعراض الجدول‪.‬‬

‫‪178‬‬
‫بقى لدينا فقط ‪ 5‬حقول ‪.‬‬

‫ماذا لو قمنا الن بعمل استعلم على الجدول ولكن فى فترة زمنية فى الماضى ولنفترض انها قبل ‪20‬‬
‫دقائق ‪.‬‬
‫بالطبع سيبحث عن هذه المعلومات فى ال ‪ Undo segements‬ويقوم بعرضها ‪ ،‬أما إذا لم يجدها‬
‫فستظهر رسالة خطأ‪.‬‬
‫اى هذه المعلومات غير متوفرة حاليا فى ال ‪.Undo Tablespace‬‬

‫‪SELECT * FROM EMPLOYEE AS OF TIMESTAMP‬‬


‫‪TO_TIMESTAMP ('11-06-08:03-33-38','DD-MM-‬‬
‫;('‪YY:HH24-MI-SS‬‬

‫‪179‬‬
‫هذه هى نتيجة الستعلم ‪ ،‬عرض ‪ 8‬حقول ‪ ،‬لكن ما هو متاح حاليا هو ‪ 5‬حقول فقط‪.‬‬

‫هكذا قمنا بعرض معلومات فى الماضى ‪ ،‬لكن ماذا لو أردنا أن نأتى بهذه المعلومات فى الحاضر أى‬
‫تظل هذه المعلومات موجودة فى الجدول ‪ ،‬يمكن أن ننشئ جدول جديد من المعلومات المستعرض ومن ثم‬
‫نقوم بحذف الجدول ‪ Employee‬وإعادة تسمية الجدول الجديد الى ‪.Employee1‬‬

‫‪CREATE TABLE EMPLOYEE1 AS (SELECT * FROM‬‬


‫‪EMPLOYEE AS OF TIMESTAMP TO_TIMESTAMP('11-06-‬‬
‫;(('‪08:03-33-38','DD-MM-YY:HH24-MI-SS‬‬

‫الن نقوم بحذف الجدول ‪.Employee‬‬

‫;‪DROP TABLE EMPLOYEE‬‬

‫‪180‬‬
‫ثم نقوم بإعادة تسمية للجدول ‪ EMPLOYEE1‬إلى ‪.EMPLOYEE‬‬

‫الن الجدول ‪ EMPLOYEE‬يحتوى على المعلومات التى كانت به منذ ‪ 20‬دقيقة‪.‬‬

‫فى الخطوات السابقة قمنا بعمل استعلم فى ‪ Session‬معينة عن بيانات فى لحظة معينة فى‬
‫الماضى ‪ ،‬ولكن من الممكن كذلك أن نضع كل هذه الٍ‪ Session‬فى لحظة معينة من الماضى ‪ ،‬بحيث‬
‫تكون نتيجة جميع الستعلمات لقاعدة البيانات من خلل هذه الٍ‪ Session‬فى نقطة معينة من الماضى‬
‫يتم تحديدها اثناء عمل ال ‪ ، Flashback‬ولكن باقى الٍ‪ Sessions‬التى تعمل على قاعدة البيانات ترى‬
‫قاعدة البيانات فى الوقت الحقيقى الن ؛ ما عدا هذه ال ‪ Session‬التى ترى قاعدة البيانات فى لحظة‬
‫معينة من الماضى ‪ ،‬يتم ذلك من خلل الحزمة ‪.DBMS_FLASHBACK‬‬

‫للرجوع بال ‪ Session‬الحالية للماضى يوما كاملً نقوم بتنفيذ الجراء ‪PROCEDURE‬‬
‫‪PACKAGE‬‬ ‫‪ ENABLE_AT_TIME‬الموجود فى الحزمة ‪DBMS_FLASHBACK‬‬

‫‪DECLARE‬‬
‫;‪QUERY_TIME TIMESTAMP‬‬
‫‪BEGIN‬‬
‫;(‪QUERY_TIME := TO_TIMESTAMP(SYSDATE -1‬‬
‫‪SYS.DBMS_FLASHBACK.ENABLE_AT_TIME ( QUERY_TIME‬‬
‫;(‬
‫;‪COMMIT‬‬
‫;‪END‬‬
‫‪/‬‬

‫‪181‬‬
‫هكذا خلل هذه ال ‪ Session‬جميع الستعلمات ترى قاعدة البيانات كما لو كنا بالمس‪.‬‬

‫لبد من الشارة إلى أنه من خلل هذا النمط ل يمكن إجراء عمليات ال ‪ DML‬ماعدا ‪.SELECT‬‬

‫يمكن إلغاء هذا النمط بواسطة الجراء ‪ DISABLE‬الموجود فى الحزمة ‪DBMS_FLASHBACK‬‬

‫هكذا قمنا بإلغاء النمط ‪.Flashback‬‬

‫‪182‬‬
‫‪:B- Flashback Table‬‬
‫ويسمى ايضا ‪ Flashback Table Query‬واستحدث هذا النوع فى الصدار ‪Oracle10g‬‬
‫ويعتمد اساسا على ال ‪ ، Undo Tablespace‬وهو الرجوع بالجدول الى فترة زمنية فى الماضى ويعتمد‬
‫اساسا الى الذهاب الى ال ‪ Undo Segments‬وارجاع الجدول الى لحظة معينة فى الماضى مستفيدا من‬
‫المعلومات الموجودة ‪ ، Undo Segments‬فقد تكون جرت على الجدول عدد من التعديلت سنجدها فى‬
‫ال ‪ ، Undo Tablespace‬بالطبع قد تفشل عملية ال ‪ Flashback Table‬إذا لم نجد المعلومات‬
‫المطلوبة فى ال ‪ Undo Tablespace‬نتيجة لنتهاء فترة الحتفاظ بالمعلومات المطلوبة مثلً‪.‬‬

‫واليك الن السناريو التالى ‪:‬‬


‫لنفترض ان لدينا جولين الول يسمى ‪ DEPT‬وهو جدول الدارات والثانى يسمى ‪ EMP‬وهو جدول‬
‫الموظفين‪.‬‬

‫فلنستعرض كل الجدولين‪.‬‬

‫;‪SELECT * FROM DEPT‬‬

‫‪183‬‬

‫;‪SELECT * FROM EMP‬‬


‫لنضف إدارة جديد فى جدول الدارات ‪.DEPT‬‬

‫;('‪INSERT INTO DEPT VALUES(3,'FINANCE‬‬

‫ونقوم بإضافة موظف جديد فى جدول الموظفين ‪ EMP‬بحيث ينتمى الموظف الجديد للدارة الجديدة‪.‬‬

‫;(‪INSERT INTO EMP VALUES(3,'KHALED',3‬‬

‫لنقوم بعرض الزمن الن‬

‫;‪SELECT SYSDATE FROM DUAL‬‬

‫‪184‬‬
.Flashback Table ‫نحتاجة لعمل ال‬

.‫الن نقوم بحذف الحقلين الذًًين اضفناهما للجدولين‬

DELETE EMP WHERE EMP_NO=3;


DELETE DEPT WHERE DEPT_NO=3;

، EMP_NO=3 ‫ إلى ما قبل حذف الحقل‬EMP ‫ للجدول‬Flashback Table ‫الن لنقوم بعمل‬

FLASHBACK TABLE EMP TO TIMESTAMP


TO_TIMESTAMP('13-06-2008:01-01-06','DD-MM-
YYYY:HH24-MI-SS'(;

Enable Row Movement ‫ وذلك لننا نحتاج لعمل‬Flashback Table ‫فشلت عملية السترجاع‬
.‫ ليوضح للوركل عمليات التعديل‬Data Dictionary ‫ يتم وضعه فى ال‬Flag ‫ وهو عبار عن‬،

ALTER TABLE EMP ENABLE ROW MOVEMENT;

185
‫رسالة خطأ اخرى ‪ ،‬هل عرفت لماذا ؟ لنه قد تم إنتهاك القيد ‪ Foreign Key Constraint‬إذ ل يمكن‬
‫إعادة الموظف رقم ‪ 3‬الى الجدول ‪ EMP‬وهو ينتمى الى الدارة تم حذفها ‘ فهو يبتمى للدارة رقم ‪ 3‬قد‬
‫تم حذفها ‪ ،‬فما الحل إذا؟‬

‫الحل ان نقوم بعمل ‪ Flashback Table‬لكل الجدولين ‪.EMP & DEPT‬‬


‫لكن ل تنسى أن تقوم بعمل ‪.Enable Row Movement‬‬

‫‪FLASHBACK TABLE EMP,DEPT TO TIMESTAMP‬‬


‫‪TO_TIMESTAMP('13-06-2008:01-01-06','DD-MM-‬‬
‫;('‪YYYY:HH24-MI-SS‬‬

‫لقد تمت عملية ال ‪ Flashback Tables‬بنجاح وليس ضروريا أن نقوم بترتيب الجدول فى‬
‫عبارة ال ‪ Flashback‬وذلك لن القيود ‪ Constraint‬يتم التأكد منها بعد نهاية العملية ‪.Transaction‬‬

‫‪186‬‬
‫ملحظة ‪ :‬لو فشلت محاولة استرجاع جدول ‪ Flashback Table‬فى اى عملية فإن العملية‬
‫تتوقف ومن ثم يتم التراجع ‪ ROLLBACK‬عن العملية كلها ‪ ،‬اى لو نجحت عملية استرجاع الجدول‬
‫‪ DEPT‬فى العملية السابقة ولكن فشلت عملية استرجاع الجدول ‪ EMP‬فإن العملية برمتها ستفشل ويتم‬
‫التراجع عن العملية كلها‪.‬‬

‫كما ل حظت عملية ال ‪ Flashback Table‬لسيت مضمونة النجاح ‪ ،‬فقد تفشل فى احد السبابا‬
‫التالية ‪-:‬‬
‫‪ -1‬إذا تم انتهاك احد القيود ‪.Constraint Violated‬‬
‫‪ -2‬إذا لم يتم عمل ‪ Enable Row Movement‬للجدول المطلوب استرجاعه‪.‬‬
‫‪ -3‬إذا لم تتوفر المعلومات المطلوبة فى ال ‪:Undo Tablespace ، ORA-08180‬‬
‫‪”no snapshot found based on specified time‬‬
‫‪ -4‬ل يمكن عمل ‪ Flashback Table‬لجدول فى ‪.Sys Schema‬‬

‫‪:C- Flashback Versions Query‬‬


‫قد تحتاج احيانا كمدير لقاعدة بيانات لمراقبة بعض التعديلت على الحقول فتحتاج لمعرفة القيم‬
‫التى اخذها حقل معين لفترات تاريخية معينة ‪ ،‬فمثل قد تتحول مرتبات الموظفين كل فترة فيتم تعديل‬
‫ملف ال ‪ Salary‬كل فترة زمنية ‪ ،‬ولكن لنفترض أننى احتاج لمعرفة ال ‪ History‬او القيم السابقة‬
‫للمرتب لموظف معين منذ أن تم تعينة ‪ ،‬فكل ما هو متاح لى فى الجدول الن هو اخر قيمة للمرتب‬
‫الحالى‪.‬‬
‫وقد استحدث هذا النوع فى الصدار ‪ Oracle10g‬ويعتمد اساسا على ال ‪.Undo Tablespace‬‬
‫بحيث ياتى بالمعلومات التى يريدها من ال ‪ Undo Segments‬بعد أن نحدد له الفترة الزمنية المحددة أو‬
‫عن طريق ‪.)System Change Number (SCN‬‬

‫‪187‬‬
‫‪SELECT SALARY,VERSIONS_XID AS‬‬
‫‪XID,VERSIONS_STARTSCN,VERSIONS_ENDSCN,VERSIONS_O‬‬
‫‪PERATION FROM SALARY VERSIONS BETWEEN SCN‬‬
‫;‪MINVALUE AND MAXVALUE WHERE EMP_NO=1‬‬

‫لحظ معى قيمة المرتب ابتداءً كانت ‪ 1000‬وكانت نتيجة عمل ‪ Insert‬كما هو موضح‬
‫بالحرف ‪ ، I‬بعد ذلك تم تعديلها الى القيمة ‪ 1500‬نتيجة عمل ‪ Update‬كما هو موضح بالحرف ‪،U‬‬
‫وايضا تم تعديله مرة اخرى الى القيمة ‪ 2000‬بواسطة المر ‪ Update‬كما هو موضح بالحرف ‪.U‬‬

‫لقد قمنا فى المثال السابق بعرض المعلومات مستخدمين ال ‪ ، SCN‬كما يمكن إستخدام ال‬
‫‪. Timestamp‬‬
‫‪.‬‬

‫ملحظــــــــة‪ :‬ل يتم عرض القيم التى لم يتم تثبيتها ‪.Commited‬‬

‫إذا عملية ال ‪ Flashback Versions‬إذا لم تجد الععلومات المطلوبة فى ال ‪Undo‬‬


‫‪ Tablespace‬فأنها ستفشل ‪ ،‬كما ل يمكن عمل ‪ Flashback Versions‬للجداول الخارجية ‪External‬‬
‫‪ Tables‬وكذلك الجداول المؤقتة ‪ Temporary Tables‬وأيضا المناظير ‪.Views‬‬

‫‪188‬‬
:D- Flashback Transaction
Undo Data ‫ يتم استخدام ال‬Flashback Table and Flashback versions ‫فى كل من‬
Undo Data For ‫ فإنه يقوم بإسترجاع جميع ال‬Flashback Transaction ‫ أما ال‬، ‫للكائنات‬
، ‫ اى على مستوى العمليات مهما كانت العمليات مرتبطة بعدد من الكائنات‬transaction
: ‫ التالى‬View ‫ نستخدم ال‬Flashback Transaction ‫للستعلم عن ال‬
.FLASHBACK_TRANSACTION_QUERY

DESC FLASHBACK_TRANSACTION_QUERY;

189
‫ولن البيانات الموجودة فى هذا ال ‪ View‬حساسة جدا لذلك فإن هذا ال ‪ View‬محمى بواسطة‬
‫الصلحية ‪.SELECT ANY TRANSACTION PRIVILEGE‬‬

‫ولن استعلم جميع العمليات على قاعدة البيانات يأتى بعدد كبير جدا من المعلومات ‪ ،‬فمن‬
‫الفضل التركيز فى الستعلم بواسطة الشروط ‪ ،‬فلو أنى مثلً أريد استعراض العمليات التى تمت على‬
‫جدول معين فمن الفضل تحديد الشرط ‪‘WHERE TABLE_NAME=’TABLE_NAME‬‬

‫ولنفترض الن أنى اريد عمل استعلم عن العمليات التى حدثت على الجدول ‪.SALARY‬‬

‫‪SELECT START_TIMESTAMP,UNDO_SQL,TABLE_NAME FROM‬‬


‫‪FLASHBACK_TRANSACTION_QUERY WHERE‬‬
‫;'‪TABLE_NAME='DEPT‬‬

‫لقد تمت عملية ‪ UPDATE‬على الجدول ‪.DEPT‬‬

‫ولكن يمكن استخدام ال ‪ FLASHBACK VERSIONS‬اولً لتحديد ‪XID (Transaction‬‬


‫‪)Identifier‬‬

‫‪190‬‬
SELECT SALARY,VERSIONS_XID AS
XID,VERSIONS_STARTSCN,VERSIONS_ENDSCN,VERSIONS_O
PERATION FROM SALARY VERSIONS BETWEEN SCN
MINVALUE AND MAXVALUE WHERE EMP_NO=1;

Flashback Transaction ‫ سوف نستخدمها فى ال‬، XID=05001D0057030000 ‫لحظ معى‬


.Query
SELECT START_TIMESTAMP,UNDO_SQL,TABLE_NAME FROM
FLASHBACK_TRANSACTION_QUERY WHERE
XID=HEXTORAW('05001D0057030000'(;

191
‫هكذا استخدمنا ‪.FLASHBACK_VERSIONS AND FLASHBACK_TRANSACTION‬‬

‫وعموما فإن ال ‪ FLASHBACK_TRANSACTION‬يستخدم لعرض العمليات التى حدثت فى‬


‫قاعدة البيانات ويستخدم هذا النوع ايضا ال ‪ ، Undo Information‬ويسمى ايضا‬
‫‪.FLASHBACK_TRANSACTION_QUERY‬‬

‫‪:E- Flashback Drop‬‬


‫فى الصدارات السابقة من قاعدة البيانات اوركل ‪ Oracle Database‬لحظة عمل حذف للجدول‬
‫‪ Drop Table‬فإنه سوف يزال ايضا من ال ‪ Data Dictionary‬وسوف نقوم بعمل استرجاع‬
‫‪ Recovery‬لقاعدة البيانات إذا أردت أن استرجع جدول واحدا تم حذفه خطًأ ‪ ،‬ل شك أنه حل مكلف‬
‫وملكلف جدا من حيث الزمن ومن حيث أننا سأفقد بعض العمليات‪.‬‬
‫فعند حذف جدول فى الصدارات السابقة من اوركل يتم تحرير المساحات التى كان يستقلها ‪ ،‬أما‬
‫فى الصدار ‪ Oracle10g‬ل يتم تحرير المساحات التى يستقلها الجدول وما يتبعه من كائنات لحظة‬
‫حذف الجدول ‪ ،‬وإنما يتم وضع الجدول مؤقتا فى سلة المهملت ‪ RECYCLE BIN‬ويظل الجدول‬
‫مملوكا ايضا للمستخدم رغم إنتقاله الى سلة المهملت ‪ ،‬ولكن بالطبع لحظة إنتقاله إلى سلة المهملت يتم‬
‫إعادة تسميته حتى ل يحدث تضارب فى السماء إذا أردت أن اقوم بإنشاء جدول اخر بنفس السم ‪ ،‬هذا‬
‫الوضع يتيح لنا فرصة استرجاع الجدول من سلة المهملت دون الحوجة لسترجاع قاعدة البيانات ‪ ،‬مما‬
‫يقلل لنا فترة السترجاع وكذلك دون أن نفقد اى عمليات ‪.‬‬

‫بكل بساطة سلة المهملت ‪ RECYCLE BIN‬فى قاعدة البيانات اوركل تشبه الى حد كبير‬
‫سلة المهلت فى نظام التشغيل ويندوز ‪.WINDOWS‬‬

‫يمكن الستعلم عن سلة المهملت ‪ RECYCLE BIN‬بواسطة‪:‬‬


‫‪DBA_RECYCLEBIN‬‬
‫‪USER_RECYCLEBIN‬‬
‫كما يمكن الستعلم عن طريق المر‪:‬‬
‫‪SHOW RECYCLEBIN‬‬

‫والن لننتابع معا هذا السناريو‪:‬‬


‫يقوم المستخدم بحذف الجدول ‪ ، USER_MASTER‬ومن ثم نقوم بإستلعم عن سلة المهملت‬
‫‪.RECYCLE BIN‬‬

‫;‪DROP TABLE USER_MASTER‬‬ ‫‪192‬‬


‫;‪SHOW RECYCLE BIN‬‬

‫لحظت معى كيف أنه رغم أننا قمنا بحذف الجدول ‪ USER_MASTER‬إل أن ما زال موجودا فى‬
‫سلة المهملت ويمكننا كذلك استرجاعه ‪.‬‬

‫;‪FLASHBACK TABLE USER_MASTER TO BEFORE DROP‬‬

‫لقد قمنا بإسترجاع الجدول من سلة المحذوفات لكن قد تفشل عملية السترجاع إذا قمنا بإنشاء جدول بنفس‬

‫‪193‬‬
‫السم قبل عملية السترجاع لذلك يمكن اعادة تسميته لتفادى عملية تضارب السماء‪.‬‬

‫‪FLASHBACK TABLE USER_MASTER TO BEFORE DROP‬‬


‫;‪RENAME TO MASTER‬‬

‫لقد قمنا بإسترجاع الجدول ولكن بإسم جديد ‪.‬‬

‫;‪SELECT * FROM USER_RECYCLEBIN‬‬

‫ل يوجد جدول فى سلة المهملت ‪.‬‬


‫يمكن تنظيف سلة المهملت ومسح الجداول من سلة المهملت بواسطة المر ‪.PURGE‬‬

‫;‪PURGE TABLE MASTER‬‬

‫‪194‬‬
‫ل يوجد الن الجدول ‪ MASTER‬فى سلة المهملت ‪.‬‬

‫كذلك يمكن حذف الجدول عن طريق المستخدم دون وضع الجدول فى سلة المهملت وانما حذفه مباشرة‬
‫من قاعدة البيانات بواسطة المر ‪DROP TABLE <TABLE_NAME> PURGE‬‬

‫;‪DROP TABLE EMP PURGE‬‬

‫إذا من الحالت التى يتم فيها حذف الجداول من قاعدة البيانات دون المرور بسلة المهملت ‪-:‬‬
‫‪ -1‬استخدام المر ‪.DROP TABLE <TABLE_NAME> PURGE‬‬
‫‪ -2‬لحظة حذف ال ‪ TABLESPACE‬الذى يحوى الجداول بواسطة المر‬
‫‪.DROP TABLESPACE <TABLESPACE_NAME> INCLUDING CONTENTS‬‬
‫‪ -3‬عند حذف المستخدم الذى يحوى الجداول بواسطة المر‬
‫‪.DROP USER <USER_NAME> CASCADE‬‬

‫‪:F- Flashback Database‬‬


‫هل فكرت يوما ماذا تفعل لو قمت بحذف مستخد ٍم ما خطأً ؟ الجواب وبكل بساطة اقوم بعمل‬
‫استرجاع لقاعدة البيانات ‪ Recovery‬من النسخ الحتياطى ‪.Backup‬‬
‫هذا الحل صحيح ولكن مكلف من حيث الزمن خصوصا إذا كانت قاعدة البيانات كبيرة ‪،‬‬
‫فإسترجاع احجام كبيرة من الملفات ل بد أنه مكلف من حيث الزمن ‪.‬‬
‫ما الحل إذا ‪ ،‬الحل هو ‪.Flashback Database‬‬

‫ال ‪ Flashback Database‬هى إرجاع قاعدة البيانات الى نقطة زمنية معينة فى الماضى ‪،‬‬
‫بحيث جميع التعديلت التى حدثت فى قاعدة البيانات من تلك النقطة الى الن كأن لم تكن‪.‬‬

‫نستفيد من ال ‪ Flashback Database‬فى حالة حدوث اخطاء منطقية ‪ ،‬كأن يحذف مدير قاعدة‬
‫البيانات مستخدم عن طريق الخطأ أو عمل ‪ ، Truncate Table‬أما الخطاء الفيزيائية كأن نفقد ‪Data‬‬

‫‪195‬‬
‫‪ File‬او غيره من الملفات فل نستطيع الستفادة من ال ‪ Flashback Database‬وكل ما نستطيعه هو‬
‫عمل استرجاع للملفات من النسخ الحتياطى بالطريقة التقلدية‪.‬‬

‫عملية ال ‪ Flashback Database‬هى عملية سريعة جدا للرجوع بقاعدة البيانات لفترة زمنية‬
‫فى الماضى مقارنة بعملية السترجاع من ملفات النسخ الحتياطى بالطريقة التقلدية وذلك لننا ل نحتاج‬
‫ارجاع ملفات النسخ الحتياطى لقاعدة البيانات‪.‬‬

‫لحظة عمل ‪ Enable Flashback Database‬يتم إنشاء ‪ Background Process‬يسمى‬


‫‪ )Recovery Writer (RVWR‬ويتم تخصيص جزء فى الذاكرة ‪ SGA‬يسمى ‪Flashback Buffer‬‬
‫ويتم تخصيص جزء من الدسيك لل ‪ Flashback logs‬وهذا الجزء هو دائما ال ‪Flash Recovery‬‬
‫‪. Area‬‬
‫يكون السناريو بحيث يتم وضع كل ‪ Block‬تم تعديله فى قاعدة البيانات الى ال ‪Flash Buffer‬‬
‫بعد ذلك يقوم ال ‪ RVWR‬بوضع هذه ال ‪ Blocks‬من ال ‪ Flashback Buffer‬إلى ال ‪Flashback‬‬
‫‪. Logs‬‬

‫هذا السناريو يشبه الى حد كبير سناريو ال ‪ Redo Log Buffer‬وال ‪ Redo Log Files‬ولكن‬
‫الختلف فى أنه ليس كل التعديلت تكتب فى ال ‪ Flashback Buffer‬كما يحدث فى ال ‪Redo Log‬‬
‫‪ Buffer‬وإنما ‪ ، Complete Block Images‬كذلك ال ‪ Flashback Loges‬ل تتم ارشفته كما يحدث‬
‫لل ‪.Redo Log Files‬‬

‫كما ذكرت أنه ليست كل التعديلت تكتب فى ال ‪ Flashback Buffer‬وإنما ‪Complete‬‬


‫‪ ، Block Images‬لذا فإن هناك كثير من التعديلت تحدث ول يتم كتابتها مباشرة فى ال ‪Flashback‬‬
‫‪ Buffer‬وإنما يتم تأخيرها وربما تحدثت تعديلت اخرى قبل أن تكتب فى ال ‪ ، Flashback Buffer‬ما‬
‫أرمى اليه أنا أنه قد يتم كتابة ‪ Complete Block‬وهو يحوى مجموعة مختلفة من التعديلت حدثت فى‬
‫ازمنة مختلفة ‪ ،‬لذا عملية ال ‪ Flashback Database‬لوقت مضبوط هى من الصعوبة بمكان ‪ ،‬لذا فإن‬
‫ال ‪ Flashback Database‬يحتاج لن تكون قاعدة البيانات فى النمط ‪ Archive Log Mode‬وذلك‬
‫لن الرشيف يحتوى على جميع تفاصيل التعديلت التى حدثت فى قاعدة البيانات على خلف‬
‫‪ ، Flashback Logs‬إذا ال ‪ Flashback Logs‬مع ال ‪ Archive Logs‬يستطيعان أن ينجحا عملية‬
‫ال ‪Flashback Database‬‬

‫‪196‬‬
‫لتهيئة ال ‪ Flashback Database‬نتبع الخطوات التية‪-:‬‬
‫‪ -1‬التأكد من أن قاعدة البيانات تعمل فى النمط ‪.Archive Log Mode‬‬
‫تحدثنا فى فصول سابقة على أن قاعدة البيانات تعمل على القل على اثنين من ‪Redo Log‬‬
‫‪ Files‬وهى ملفات تحوى على التعديلت التى تمت فى قاعدة البيانات ‪.‬‬
‫وأن ‪ Background Process LGWR‬يقوم بكتابة التعديلت الموجودة فى ال ‪Redo Log‬‬
‫‪ Buffer‬ويضعها فى ال ‪ ، Redo Log Files‬وتكون عملية الكتابة بشكل دورى بين ال ‪Redo Log‬‬
‫ويتم إعادة الكتابة فى ال ‪ ، Redo Logs‬مما يؤدى لفقدان البيانات الموجودة فيه لذا كان الحل هو تشغيل‬
‫قاعدة البيانات فى النمط ‪ Archive Log Mode‬بحيث يتم إنشاء ‪ Background Process‬جديد يسمى‬
‫‪ ARCn‬بحيث يقوم بعمل نسخ لملفات ال ‪ Redo Log Files‬بحيث ل نفقد البيانات الموجودة فى هذه‬
‫الملفات والتى نعتمد عليها فى عملية السترجاع ‪ Recovery‬؛ والتى بدونها تفشل عملية ال‬
‫‪.Recovery‬‬

‫لمعرفة هل قاعدة البيانات تعمل فى الوضع ‪ Archive Log Mode‬ام ل؟‬

‫;‪SELECT LOG_MODE FROM V$DATABASE‬‬

‫إذا قاعدة البيانات فى الوضع ‪.No Archive Log‬‬

‫لتهيئة قاعدة البيانات فى الوضع ‪ Archive Log‬نقوم بالخطوات التية‪:‬‬


‫‪ -A‬تحديد المكان الذى سوف نضع فيه الرشيف بواسطة المتغير ‪ LOG_ARCHIVE_DEST‬مع‬
‫مراعاة أنه يمكن تحديد ‪ 10‬إتجاهات مختلفة وذلك بواسطة المتغيرات ‪n_LOG_ARCHIVE_DEST‬‬
‫حيث ‪ n‬تاخذ القيم من ‪ 1‬الى ‪.10‬‬

‫‪ALTER SYSTEM SET‬‬


‫’\‪LOG_ARCHIVE_DEST_1='LOCATION=D:\ARCHIVE‬‬
‫;‪SCOPE=SPFILE‬‬

‫‪197‬‬
‫كما ذكرت سابقا يمكن تحديد اتجاهات اخرى للرشيف ‪ ،‬كما يمكن تهيئة متغيرات اخرى لكنها غير‬
‫ل ‪ LOG_ARCHIVE_FORMAT‬هذا المتغير لتحديد الفورمات التى يخرج بها ملف‬
‫ضرورية مث ً‬
‫الرشيف ‪ ،‬فى الصل يأخذ القيمة ‪.‬‬

‫حيث‪-:‬‬

‫‪ -B‬نغلق قاعدة البيانات ونفتحها فى الوضع ‪ ، Mount‬ثم ننفذ المر ‪ALTER DATABASE‬‬
‫‪.ARCHIVELOG‬‬

‫‪198‬‬
ALTER DATABASE ARCHIVELOG;

. ARCHIVELOG MODE ‫الن قاعدة البيانات تعمل فى النمط‬

:‫ بواسطة‬ARCHIVELOG MODE ‫يمكن الستعلم ايضا عن عمل‬

SELECT ARCHIVER FROM V$INSTANCE;

.‫ للرشيف‬REDO LOG FILE ‫ يتم عمل نسخ لملف ال‬SWITCH LOGFILE ‫لحظة عمل‬

ALTER SYSTEM SWITCH LOGFILE;

199
‫كما يمكن الستعلم عن ملفات الرشيف‬

SELECT NAME FROM V$ARCHIVED_LOG;

.‫هذه هى ملفات الرشبف‬

:Flash Recovery Area ‫ تهيئة ال‬-2


‫ وهى مكان‬Flash Recovery Area ‫ ل تتم إدارته إلى فى ال‬Flashback Logs ‫ذكرت سابقا أن ال‬
‫ ويتم تحديد مساحة هذا المكان‬DB_RECOVERY_FILE_DEST ‫يتم تخصيصة بواسطة المتغير‬
Flash ‫ إذا لتهيئة ال‬، DB_RECOVERY_FILE_DEST_SIZE ‫المخصص بواسطة هذا المتغير‬
DB_RECOVERY_FILE_DEST_SIZE( ‫ يلزمنا تهيئة المتغيران‬Recovery Area
) & DB_RECOVERY_FILE_DEST

ALTER SYSTEM SET


DB_RECOVERY_FILE_DEST=’D:\ORACLE\PRODUCT\10.1.0\
FLASH_RECOVERY_AREA;

ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=2G;

SHOW PARAMETER DB_RECOVERY_FILE_DEST; 200


‫‪ -3‬تحديد فترة الحتفاظ بال ‪:Flashback Log‬‬
‫وذلك قبل أن يتم استخدامه وإعادة الكتابة فيه مرة اخرى ويتم تحديد ذلك بواسطة المتغير‬
‫‪ DB_FLASHBACK_RETENTION_TARGET‬وهو زمن الحتفاظ بالدقائق والصل أن يتم‬
‫الحتفاظ لمدة يوم‪.‬‬

‫‪ALTER SYSTEM SET‬‬


‫;‪DB_FLASHBACK_RETENTION_TARGET=1440‬‬

‫‪ -4‬اغلق وفتح قاعدة البيانات فى الوضع ‪:Mount‬‬

‫ومن ثم تمكين ال ‪ Flashback‬بواسطة المر ‪ALTER DATABASE FLASHBACK ON‬‬

‫‪201‬‬
ALTER DATABASE FLASHBACK ON;

.Flashback ‫هكذا انتهينا من تهيئة ال‬

:‫ نقوم بعمل الستعلم التى‬Flashback ‫للتأكد من تهيئة ال‬

SELECT FLASHBACK_ON FROM V$DATABASE;

Flashback ‫لمراقبة ال‬

SELECT * FROM V$FLASHBACK_DATABASE_LOG;

202
‫لمعرفة كيفية استخدام ال ‪ Flashback Database‬نتابع معا هذا السناريو‪:‬‬
‫‪ -1‬مدير قاعدة البيانات قام بحذف المستخدم ‪ TEST‬عن طريق الخطأ‪.‬‬

‫;‪DROP USER TEST CASCADE‬‬

‫الن ل يوجد مستخدم اسمه ‪ TEST‬فى قاعدة البيانات‪.‬‬

‫‪203‬‬
‫‪ -2‬اغلق قاعدة البيانات وفتحها فى الوضع ‪ Mount‬ومن ثم عمل ‪ Flashback Database‬للزمن‬
‫‪ 54-55-08:12-06_17‬وهو الوقت ما قبل حذف المستخدم ‪.TEST‬‬

‫‪FLASHBACK DATABASE TO TIMESTAMP‬‬


‫‪TO_TIMESTAMP('17-06-08:12-55-54','DD-MM-YY:HH24-‬‬
‫;('‪MI-SS‬‬

‫‪ ً-3‬نفتح قاعدة البيانات فى الوضع ‪. Resetlogs‬‬

‫;‪ALTER DATABASE OPEN RESETLOGS‬‬

‫‪SELECT USERNAME FROM DBA_USERS WHERE‬‬


‫;'‪USERNAME='TEST‬‬

‫‪ -4‬اخيرا لنتأكد من وجود المستخدم ‪.TEST‬‬

‫أما إذا لم نكن نعرف مثلً وقت حذف المستخدم المستخدم ‪ TEST‬فليس عندنا حل سواء التخمين‬
‫ومن ثم فتح قاعدة البيانات فى الوضع ‪ Read Only‬والتأكد من جدوى السترجاع وقد نلجأ لغلق‬

‫‪204‬‬
‫قاعدة البيانات وفتحها مرة اخرى ومن ثم إعادة ال ‪ Flashback Database‬لوقت اخر ‪ ،‬ولن نفتح‬
‫قاعدة البيانات مباشرة فى الوضع ‪ Resetlogs‬لن الخيار ‪ Restlogs‬يقوم بإعادة تهيئة ال ‪Log‬‬
‫‪ Sequence Number‬ويبدأ بأخذ القيمة (‪ )001‬من جديد‪.‬‬

‫‪205‬‬

You might also like