المساعدة - البحث - قائمة الأعضاء - التقويم
نسخة كاملة: دروس متقدمة في قواعد البيانات أوراكل
برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة > منتديات قواعد البيانات > Oracle قسم قواعد البيانات أوراكل > قسم إدارة قاعدة البيانات أوراكل
م. حسام فيصل
السلام عليكم ورحمة الله :
بعد أن طلب العيد من الأخوة مواضيع متقدمة في إدارة قواعد أوراكل وجدت أنه من الأنسب أن أقوم بإضافة موضوع جديد يختص بدروس متقدمة عن الإدارة ، و السبب أنني لم أرد أن أضم هذه الدروس إلى الدورة التي تجري حالياً لخوفي على المبتدئين في هذا المجال من إصابتهم بالإحباط نظراً لسوية هذه الدروس ، على أن يتم دمج المواضيع في منهاج متكامل نفخر به في هذا المنتدى ...
سأبدأ هذه الدروس حول مفاهيم القواعد الموزعة Distributed Database و القواعد عن بعد Remote Database و سأتطرق إلى مفهوم قواعد البيانات الغرضية في أوراكل Object Oriented Database و سأتناول مفهوم Cluster ... و غيرها ...


مقدمة :
قد يفرض عليك العمل أن تحتاج إلى أكثر من قاعدة في المؤسسة التي تعمل بها ، إما لكثرة المستخدمين بالتالي لا تستطيع القاعدة الواحدة تحمل الضغط أو لوجود تقسيمات في العمل تساعدك على ذلك .. فمثلاً : تريد للذاتية قاعدة خاصة بهم و قسم المحاسبة قاعدة أخرى بالتالي تصبح الإدارة نظرياً أسهل ...
و لكن توجد مشاكل أخرى : ماذا لو إشترك القسمان في بيانات مشتركة بين القاعدتين ؟ مثلاً ذاتية الموظفين في المؤسسة ؟؟؟؟
عندها ستضطر إلى نقل البيانات من القسم إلى الآخر .. و هذا غير معقول أليس كذلك ؟؟
إذاً نحتاج إلى آلية تمكن الموظفين في أحد هذين القسمين أن يصل القاعدة الأخرى و يقوم بجلب البيانات من جدول منها للإستفادة ..
إنتهبوا إلى ملاحظة مهمة جداً : إن جلب البيانات من القاعدة الثانية لا يتطلب أ ن يسجل الدخول إليها ... ما معنى هذا ؟ نعلم أنه في SQL PLUS نستطيع تسجيل الدخول على أي قاعدة نريدها عبر الشبكة و ذلك عبر Local Naming .. هنا الوضع مختلف : سيقوم المستخدم بتسجيل الدخول على قاعدة واحدة و سيطلب البيانات من الأخرى بدون تسجيل الدخول إليها ... هل فهم الفرق ؟؟؟؟
الحل : وصلة البيانات Database Link و Replication ( ترجمتها في القاموس هي الصدى !!!!! ) ..
من أجل تنفيذ الأمثلة في هذه الدروس سوف أعتمد على قاعدتين هما orcl و القاعدة الأخرى db2 ..
يمكن من لديه شبكة أن يقوم بتنصيب القاعدتين على جهازين مختلفين ، و من لديه جهاز واحد (مثلي ) عليه إنشاء قاعدتين على جهازه ( راجع دورة الإدارة من أجل إنشاء قواعد جديدة ) ...
و لنبدأ :

وصلة القواعد Database Link :
أكاديمياُ : هي إتصال connection يتم بين قاعدة نسميها Local Database بقاعدة أخرى Remote Database بحساب مستخدم معين و كلمة سره للإستفادة من الأغراض الموجودة داخل حساب هذا الشخص ...
عملياً :
عندما نريد أن نحضر بيانات من جدول ما في نفس القاعدة فإن التعليمة هي :
كود
select * from local_table;

أما إذا أردنا أن نحضر بيانات من جدول في قاعدة أخرى فيمكننا استعمال Database link بالشكل :
كود
select * from remotetable@remoteDatalink;

حيث أن remoteDataLink هي اسم الوصلة و الجدول RemoteTable هو في قاعدة أخرى على الشبكة .... ما رأيكم بذلك أليست رائعة ؟؟
و ليس كذلك فقط ، بل حتى يمكننا أن ننشئ مرادف synonym لذلك بحيث :
كود
create synonym    remotetable for remotetable@remotedatalink;

عندها يمكنه إجراء عملية select بالشكل :
كود
select * from remotetable;

مارأيكم بذلك ؟؟؟؟
ما رأيكم بإنشاء view إعتماداً على Database link ؟؟
كود
create view  myview as
select * from remotetable@remotedatalink;

و حتى يمكنك أن تقوم بعملية تعديل للبيانات الموجودة في القاعدة الأخرى :
كود
update remotetable@remotedatalink  set col1=value1  ;


الآن كفانا تشويقاً و لنقوم بعملية إنشاء هذه الوصلة :
كود
create [shared] [public] database link REMOTE_CONNECT
connect to {current_user | username identified by password [authentication clause]}
using 'connect string';

يوجد نوعين من الوصلات : عامة public أي يمكن لجميع المستخدمين في هذه القاعدة استخدامها و خاصة private فقط للمستخدم الذي أنشأها ( يجب أن يملك هذا المستخدم صلاحية Create Database link لإنشاء الوصلة ( ..
لنشرح التعليمة :
Connect to : نحدد هنا الحساب الذي نريد الإتصال به و لدينا خيارات عدة :
Current_user : هنا سيحاول الإتصال بنفس اسم المستخدم الحالي و كلمة سره بالقاعدة الأخرى ...
Username : هنا نستطيع تحديد المستخدم الذي نريد الإتصال به و عندها يجب أن نحدد كلمة السر password لهذا الحساب ..
Connect String : هو اسم معرف الإتصال Connection Host الذي نضعه في tnsnames.ora ( راجع دورة إدارة قواعد أوراكل قسم Local Name net Configuration ) ..

ما رأيكم بأمثلة ؟؟؟
لنمنح أولاً مستخدمنا scott على القاعدة orcl صلاحية إنشاء Database Link :
كود
SQL> connect system/oracle@orcl
Connected.
SQL> grant create database link to scott;

Grant succeeded.

SQL>

لنقوم بإنشاء وصلة بين scott على القاعدة orcl و scott على القاعدة db2 :
نلاحظ أن الحسابين متماثلين بالإسم و كلمة المرور لذلك :
كود
SQL> connect scott/tiger@orcl
Connected.
SQL> create database link db2link
  2  connect to current_user
  3  using 'db2';

Database link created.

لنجلب البيانات من الجدول emp :
كود
select * from emp@db2link;

ما رأيكم بإنشاء وصلة بين scott على القاعدة orcl و hr على القاعدة db2 :
كود
SQL> connect scott/tiger@orcl
Connected.
SQL> create database link  db2hrlink
  2  connect to hr identified by hr
  3  using 'db2';

Database link created.

SQL> select * from employees@db2hrlink ;

ما رأيكم أن نسهل الأمور أكثر و نقوم بإنشاء synonym :
كود
SQL> create synonym employees for employees@db2hrlink;

Synonym created.

SQL> select * from employees;


الوصلات الديناميكية Dynamic Links : استخدام أمر Copy في SQL PLUS :
راينا في القسم السابق كيف استطعنا أن نقوم بجلب البيانات من قاعدة إلى أخرى بإستخدام الوصلات و لكن يجب أن نضع في تفكيرنا دوماً فكرة أن البيانات تبقى في القاعدة الثانية و أن هذه البيانات ليست موجودة في القاعدة الأولى ,,
قد نظطر إلى عملية نسخ البيانات من القاعدة الثانية Remot إلى الأولى local بحيث تصبح البيانات موجودة فعلاً في القاعدتين ، سأتحدث اليوم عن الأمر copy الذي نستخدمه لنسخ البيانات من قاعدة إلى قاعدة أخرى :
كود
copy from
[ remote username/ remote password@ connect string]
[to username/ password@ connect string]
{ append|create|insert|replace}
table_name
using subquery;

حيث :
Append : يقوم بإضافة البيانات إلى الجدول و تنشئه في حالة عدم وجوده ..
Create : تنشئ جدولاً جديداً و تضع البيانات فيه
Insert : هنا تتم إضافة البيانات إلى الجدول table_name و في حال عدم وجوده فإنه يعطي خطأ ..
Replace : هنا يتم حذف الجدول table_name ثم إنشائه مرة أخرى ووضع البيانات بداخله ..

مثال :
لنقم بإنشاء جدول عند المستخدم scott في القاعدة orcl يحوي على بيانات من الجدول employees الموجود لدى hr في القاعدة db2 :
كود
SQL> connect scott/tiger@orcl
Connected.
SQL> copy from hr/hr@db2 to scott/tiger@orcl create  hr_emp  using select first_name , last_name from employees

Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)
Table HR_EMP created.

   107 rows selected from hr@db2.
   107 rows inserted into HR_EMP.
   107 rows committed into HR_EMP at scott@orcl.

SQL>

أين أصبحت البيانات ؟؟؟ أصبحت في جدول اسمه hr_emp في حساب scott في القاعدة الأولى ........


ملاحظة مهمة : إذا قام المستخدم hr في القاعدة db2 بإضافة بيانات أو حذف أو أي تعديل كان فإن هذا لن يؤدي إلى إجراء هذه التعديلات على الجدول hr_emp للمستخدم scott الموجود بالقاعدة orcl أتوماتيكياً بل يجب عليك تنفيذ أمر copy مرة أخرى :
كود
SQL> connect scott/tiger@orcl
Connected.
SQL> copy from hr/hr@db2 to scott/tiger@orcl REPLACE  hr_emp  using select first_name , last_name from employees

Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)
Table HR_EMP created.

   107 rows selected from hr@db2.
   107 rows inserted into HR_EMP.
   107 rows committed into HR_EMP at scott@orcl.

SQL>

طبعاً يوجد طريقة أتوماتيكية لفعل ذلك تدعى بــ Replication التي سأشرحها في الدرس القادم إن شاء الله ...
و الآن انتهى درسنا اليوم و أتمنى أن يكون واضحاً ... بإذن الله سوف اشرح Replication غداً إن شاء الله فأستعدوا للمعركة .....
و السلام
م. حسام فيصل
السلام عليكم :
رأينا في الدرس السابق أن Database Link هي الأداة التي نستطيع استخدامها لنحقق تحكم ببيانات موجودة في قاعدة أخرى ، و في نهايته تكلمنا عن الأمر copy لنسخ البيانات من قاعدة إلى آخرى ، ووجدنا أنه يجب علينا دوماً تنفيذ هذا الأمر يدوياً في كل مرة ، أفلا توجد طريقة أتوماتيكية لتنفيذ ذلك ؟؟؟؟ لنرى :

Materialized Views :

كانت تدعى في الإصدارات السابقة بــsnap shots . تستخدم لتخزين نسخ عن كامل جدول معين أو نتيجة إستعلام من أكثر من جدول و قد يحوي على Group by أو Sub query .. إلخ ..
يوجد عدة أنواع : نوع يتم تحديد فواصل زمنية يقوم بتحديث البيانات خلالها ، و نوع آخر أفضله هو Transaction-Based و فيه يقوم الجدول الأساسي بإرسال التغييرات إلى القاعدة الثانية عندما تتم عمليات التغيير على البيانات و يتم الحفظ ، و يمكنك حتى منع عمليات التغيير على النسخ أي تصبح العملية عملية حفظ فقط و لا تسمح بالتغيير ، و نوع آخر يقوم بإرسال التغييرات التي تجرى عليه إلى الجدول الأساسي أي تصبح العملية عكسية و يتم إجراء التعديلات بالإتجاهين و هنا تبدأ المشاكل :
ماذا لو قمنا بحذف سجل من الجدول المنسوخ و كان هذا السجل في الجدول الأساسي يرتبط بعلاقة مفتاح أجنبي ( foreign key ) في الجدول الأساسي ؟؟؟؟ ما الذي سيتم عمله ؟؟ كل هذه الأمور يجب أن تبقى في فكرنا عندما نريد إنشاء Materialized View ...

لإنشاء Materialized View يجب على المستخدم أن يملك إحدى الصلاحيتين :
CREATE MATERIALIZED VIEW or CREATE SNAPSHOT و طبعاً صلاحيات إنشاء الجداول لتخزين النسخ CREATE TABLE or CREATE ANY TABLE ..
تعليمة الإنشاء :
كود
create materialized view [ user.] name
[ organization index iot_clause]
[ { { segment attributes clauses }
| cluster cluster ( column [, column] ...) }
[ { partitioning clause | parallel clause | build clause } ]
| on prebuilt table [ {with | without} reduced precision ] ]
[ using index
[ { physical attributes clauses| tablespace clause }
[ physical attributes clauses| tablespace clause ]
| using no index ]
[ refresh clause ]
[ for update ] [{disable | enable} query rewrite]
as subquery;

سنقسم تعليمة الإنشاء إلى أربعة أقسام رئيسية :
1- اسم Material view :
كود
create materialized view [ user.] name

2- هنا نحدد قيم عبارة storage التي يعلمها الجميع في إدارة Segments و Extents في الجدول الجديد الذي سنقوم بتخزين البيانات داخله و إذا كان هذا الجدول موجود فإننا نستخدم عبارة on prebuilt table ...
كود
[ organization index iot_clause]
[ { { segment attributes clauses }
| cluster cluster ( column [, column] ...) }
[ { partitioning clause | parallel clause | build clause } ]
| on prebuilt table [ {with | without} reduced precision ] ]
[ using index
[ { physical attributes clauses| tablespace clause }
[ physical attributes clauses| tablespace clause ]
| using no index ]


3-الآن :
إذا كان Materialized view من النوع الذي يقوم بتحديث نفسه خوال فواصل زمنية فإننا نحدد عبارة
[ refresh clause ] حيث :
كود
{ refresh
{ { fast | complete | force }
| on { demand | commit }
| { start with | next } date
| with { primary key | rowid }
| using
{ default [ master | local ] rollback segment
| [ master | local ] rollback segment rollback_segment
}
[ default [ master | local ] rollback segment
| [ master | local ] rollback segment rollback_segment
]...
}
[ { fast | complete | force }
| on { demand | commit }
| { start with | next } date
| with { primary key | rowid }
| using
{ default [ master | local ] rollback segment
| [ master | local ] rollback segment rollback_segment
}
[ default [ master | local ] rollback segment
| [ master | local ] rollback segment rollback_segment
]...
]...
| never refresh

نحدد خيار التحديث إما fast فبالتالي سيقوم بإنشاء log يقوم بتسجيل السجلات داخله ثم يقوم بوضعها داخل الجدول بالتالي سيقوم فقط بنقل التغييرات أما complete فيقوم بإعادة خلق re-create لــMaterialized View لإدخال البيانات من جديد أما خيار force فإنه يجبر أوراكل على إستخدام الخيار fast إذا كان ذلك ممكناً و إلا فإنه سيتم إستخدام Complete ...
2- إذا كان النسخ من جدول واحد فإننا نستطيع تحديد on commit بالتالي سيتم نقل التغييرات حفظها على الجدول الرئيسي مباشرة أما الخيار on demand فلن يتم نقل التغييرات إذا طلبنا نقلها يدوياً ..
3- نحدد الفواصل الزمنية لعملية التحديث في عبارة start with date ..
4- نحدد rollback الذي نريد استخدامه ...

4- نحدد إذا كان Materialized من النوع updateable أي التغييرات التي ستتم عليه سيتم نقلها إلى الجدول الرئيسي و إذا لم نحدد ذلك فإنه سيكون Read only أي سيتم نقل التغييرات بإتجاه واحد من الرئيسي إلى المنسوخ فقط ..
كود
[ for update ] [{disable | enable} query rewrite]
as subquery;

ما رأيكم بمثال :
سنقوم بإنشاء Materialized View من النوع Read only لنقوم بنسخ البيانات من الجدول employees لدى المستخدم hr في القاعدة db2 إلى حساب scott في القاعدة الثانية orcl بالتالي سنستخدم الوصلة db2hrlink لتنفيذ ذلك ، و سيكون التحديث كل يوم :

1- أولاً نقوم بمنح الصلاحيات للمستخدم Scott من أجل القيام بعملية الإنشاء :
كود
SQL> connect system/oracle@orcl
SQL> grant create Materialized view to scott;

Grant succeeded.

SQL>

2- لننشئ Materialized View :
كود
SQL>connect scott/tiger@orcl  
SQL>  create materialized view copy_fromHRDB2
  2   storage (initial 100K next 100K pctincrease 0)
  3   tablespace users
  4   refresh force
  5   start with sysdate next sysdate+ 1
  6   as
  7   select * from  employees@db2hrlink;


و السؤال كيف سنحضر البيانات ؟؟
كود
SQLl> select * from copy_fromHRDB2;

أعود و أذكر أن البيانات أصبحت في القاعدة orcl بعد نسخها من القاعدة db2 ....
التحديث سيتم كل يوم و السب أن حددنا أننا نريد البدء من اللحظة الحالية start with sysdate و التحديث كل يوم sysdate + 1 ... و لكي تتوضح الفكرة لنقم بعملية بسيطة :
1- سنجري تعديلات على الجدول employees في حساب hr في القاعدة db2 :
كود
SQL> connect hr/hr@db2
Connected.
SQL> insert into employees (employee_id  , first_name , last_name , job_id , department_id , email, hire_date ) values(1000 , 'arabteam', 'arabteam','IT_PROG',60,'oracle@arabteam.com', sysdate);

1 row created.

2- سنرى الآن هل سيتم نقل التغيرات إلى النسخة copy_fromhrdb2 الموجودة في القاعدة orcl ؟؟
كود
SQL> connect scott/tiger@orcl
Connected.
SQL> select first_name from copy_fromhrdb2 where first_name='arabteam';

no rows selected

إذاً سجل مستخدمنا arabteam قد تمت إضافته على الأساسي و لكنه لم ينتقل إلى النسخة copy_fromhrdb2 و إنما سينتقل بعد فترة زمنية قدرها 24 ساعة ... ما ذا لو أردنا نقل التغييرات كل 1 دقيقة ؟؟
كود
SQL>  create materialized view copy_fromHRDB2
  2   storage (initial 100K next 100K pctincrease 0)
  3   tablespace users
  4   refresh force
  5   start with sysdate next sysdate+ 1/3600
  6   as
  7   select * from  employees@db2hrlink;

و لكن يجب أن نضع في بالنا مقدار الضغط الذي قد ينتج عن هذه العمليات ....
و السؤال الذي سيطرح نفسه : هل نستطيع إجراء التعديلات على النسخة copy_fromhrdb2 ؟؟؟
لنجرب :
كود
SQL> connect scott/tiger@orcl
Connected.
SQL> insert into copy_fromhrdb2 (employee_id  , first_name , last_name , job_id , department_id , email, hire_date ) values(1200 , 'arabteam2', 'arabteam2','IT_PROG',60,'oracle@arabteam.com', sysdate);
insert into copy_fromhrdb2 (employee_id  , first_name , last_name , job_id , department_id , email, hire_date ) values(1200 , 'arabteam2', 'arabteam2','IT_PROG',60,'oracle@arabteam.com', sysdate)
            *
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view


SQL>

طبعاً فشلت عملية الإضافة و السبب أن هذا Materialized view هو Read only ....

إلى هنا أنتهى درسنا اليوم على أن أكمله إن شاء الله في الأيام القادمة ....
omarcom
اتمنى ان يكون الدرس القادم عن الcluster

وشكراً
omar_alreyati
اين باقي الدروس
ahmed2114
الله يعطيك العافية اخى العزيز
و يففقك
لقد استفدنا كثير من شرحك
و حقيقا شرح جميل و وافى و اضح جدا
ادامك لله للخير و عطاك البركة فى الرزق
ahmed2114
regular_smile.gif regular_smile.gif regular_smile.gif
شرح جميل و اكثر من رائع
w_wafaqakom.gif
regular_smile.gif regular_smile.gif
abd l rahman
مجهود ممتاز
شكرا جزيلا
alosious
الله يعطيك العافية اخى
alex_ora
الأخ الفاضل حسام
لن أقول لك شئ سوي أن يجازيك الله خيراً علي هذه المساعدات القيمة
حاولت ربط قاعدتي بيانات بنفس الطريقة التي قلتها حضرتك في بداية المشاركة
ولكن عن تنفيذ الاستعلام أحصل علي الخطأ الآتي :
ORA-28030: Server encountered problems accessing LDAP directory service
وحاولت الحصول علي حل ولم أجد
مع العلم أنني أربط بين قاعدتي بيانات
Oracle 8.1.7
ولن أستطيع ترقيتها في الوقت
أرجو أن أجد عندك الحل لأنني أحتاجه ضروري جداً
محمود درويش
m.darwish@alexandria,cc
mahmouddarwish1@gmail.com
م. حسام فيصل
هذه مشكلة نظام و ليست مشكلة أوراكل أخي الكريم ...
alex_ora
الأخ الكريم حسام
شاكر اهتمامك وردك
وقد عثرت علي الحل وهو :
alter session set global_names = false
وسؤالي هل أجعل هذا الحل دائم بتعديل هذه القيمة في ملف
init.ora
مع خالص وتحياتي لمجهوداتك
محمد المغاري
درس رائع ومفيد
شكراً جزيلا...........
أطلب منك إذا سمحت تزويدنا بشرح مفصل نوعا ما عن كيفية عمل back-up للبيانات من الdata base
ولك جزيل الشكر
aborabieh
انا سعيد جدا بالعمل الرائع وحقيقي استفت من كل الدروس المعروض ولا املك الا هذا " ربنا يكرمكم جمعيا "
mudarhm
مشكورة جهودك أخي الكريم
Almazzy
مشكور جدآ على المجهود الكبير والثمين.

ياريت موضوع النسخ الإحتياطي والإسترجاع. Backup & Restore
باستخدام RMAN

lمع الشكر الجزيل
مثنى العزاوي
بارك الله فيك ... وعاشت أيدك
lassad
السلام عليكم
لقد تتبعت هذا الموضوع ووجدته مفيدا و مفسرا
أخي الكريم أنا مهتم بإنشاء vue materialisé وقمت بتطبيق التعليمات التي بينتها لكن لم يحصل تحديث بعد دقائق في الجدول employees مع العلم أني تتبعت جميع القواعد وشكرا
yah_wa
جزاك الله خير ا يا خي العزيز على هذا العطاء الكبير واسأل الله أن يجزيك الخير الكبير وان يجعل ماتفضلت به علينا خالصا لوجهه الكريم
واود ان اذكرك بحديث
((إذا مات ابن آدم انقطع عمله الا من ثلاث ............. , أو علم ينتفع به))
أطال الله في عمرك regular_smile.gif
ASSIMAWAD
جزاكم الله خيرا وجعلها الله فى ميزان حسناتك
ismeal2002
بارك الله فيك يا اخي ونحن في انتظار المزيد
هذه "نسخة - خفيفة" من محتويات الرئيسية للإستعراض الكامل مع المزيد من الصور والخيارات الرجاء إضغط هنا.
Invision Power Board © 2001-2009 Invision Power Services, Inc.