حسام فيصل

دروس متقدمة في قواعد البيانات أوراكل

26 ردود في هذا الموضوع

السلام عليكم ورحمة الله :

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

سأبدأ هذه الدروس حول مفاهيم القواعد الموزعة 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 [email protected];

حيث أن remoteDataLink هي اسم الوصلة و الجدول RemoteTable هو في قاعدة أخرى على الشبكة .... ما رأيكم بذلك أليست رائعة ؟؟

و ليس كذلك فقط ، بل حتى يمكننا أن ننشئ مرادف synonym لذلك بحيث :

create synonym	remotetable for [email protected];

عندها يمكنه إجراء عملية select بالشكل :

select * from remotetable;

مارأيكم بذلك ؟؟؟؟

ما رأيكم بإنشاء view إعتماداً على Database link ؟؟

create view  myview as 
select * from [email protected];

و حتى يمكنك أن تقوم بعملية تعديل للبيانات الموجودة في القاعدة الأخرى :

 update [email protected]  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/[email protected]
Connected.
SQL> grant create database link to scott;

Grant succeeded.

SQL>

لنقوم بإنشاء وصلة بين scott على القاعدة orcl و scott على القاعدة db2 :

نلاحظ أن الحسابين متماثلين بالإسم و كلمة المرور لذلك :

SQL> connect scott/[email protected]
Connected.
SQL> create database link db2link
2 connect to current_user
3 using 'db2';

Database link created.

لنجلب البيانات من الجدول emp :

select * from [email protected];

ما رأيكم بإنشاء وصلة بين scott على القاعدة orcl و hr على القاعدة db2 :

SQL> connect scott/[email protected]
Connected.
SQL> create database link db2hrlink
2 connect to hr identified by hr
3 using 'db2';

Database link created.

SQL> select * from [email protected] ;

ما رأيكم أن نسهل الأمور أكثر و نقوم بإنشاء synonym :

SQL> create synonym employees for [email protected];

Synonym created.

SQL> select * from employees;

الوصلات الديناميكية Dynamic Links : استخدام أمر Copy في SQL PLUS :

راينا في القسم السابق كيف استطعنا أن نقوم بجلب البيانات من قاعدة إلى أخرى بإستخدام الوصلات و لكن يجب أن نضع في تفكيرنا دوماً فكرة أن البيانات تبقى في القاعدة الثانية و أن هذه البيانات ليست موجودة في القاعدة الأولى ,,

قد نظطر إلى عملية نسخ البيانات من القاعدة الثانية Remot إلى الأولى local بحيث تصبح البيانات موجودة فعلاً في القاعدتين ، سأتحدث اليوم عن الأمر copy الذي نستخدمه لنسخ البيانات من قاعدة إلى قاعدة أخرى :

copy from
[ remote username/ remote [email protected] connect string]
[to username/ [email protected] 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/[email protected]
Connected.
SQL> copy from hr/[email protected] to scott/[email protected] 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 [email protected]
107 rows inserted into HR_EMP.
107 rows committed into HR_EMP at [email protected]

SQL>

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

ملاحظة مهمة : إذا قام المستخدم hr في القاعدة db2 بإضافة بيانات أو حذف أو أي تعديل كان فإن هذا لن يؤدي إلى إجراء هذه التعديلات على الجدول hr_emp للمستخدم scott الموجود بالقاعدة orcl أتوماتيكياً بل يجب عليك تنفيذ أمر copy مرة أخرى :

SQL> connect scott/[email protected]
Connected.
SQL> copy from hr/[email protected] to scott/[email protected] 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 [email protected]
107 rows inserted into HR_EMP.
107 rows committed into HR_EMP at [email protected]

SQL>

طبعاً يوجد طريقة أتوماتيكية لفعل ذلك تدعى بــ Replication التي سأشرحها في الدرس القادم إن شاء الله ...

و الآن انتهى درسنا اليوم و أتمنى أن يكون واضحاً ... بإذن الله سوف اشرح Replication غداً إن شاء الله فأستعدوا للمعركة .....

و السلام

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم :

رأينا في الدرس السابق أن 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/[email protected] 
SQL> grant create Materialized view to scott;

Grant succeeded.

SQL>

2- لننشئ Materialized View :

SQL>connect scott/[email protected]  
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 [email protected];

و السؤال كيف سنحضر البيانات ؟؟

SQLl> select * from copy_fromHRDB2;

أعود و أذكر أن البيانات أصبحت في القاعدة orcl بعد نسخها من القاعدة db2 ....

التحديث سيتم كل يوم و السب أن حددنا أننا نريد البدء من اللحظة الحالية start with sysdate و التحديث كل يوم sysdate + 1 ... و لكي تتوضح الفكرة لنقم بعملية بسيطة :

1- سنجري تعديلات على الجدول employees في حساب hr في القاعدة db2 :

SQL> connect hr/[email protected]
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,'[email protected]', sysdate);

1 row created.

2- سنرى الآن هل سيتم نقل التغيرات إلى النسخة copy_fromhrdb2 الموجودة في القاعدة orcl ؟؟

SQL> connect scott/[email protected]
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 [email protected];

و لكن يجب أن نضع في بالنا مقدار الضغط الذي قد ينتج عن هذه العمليات ....

و السؤال الذي سيطرح نفسه : هل نستطيع إجراء التعديلات على النسخة copy_fromhrdb2 ؟؟؟

لنجرب :

SQL> connect scott/[email protected]
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,'[email protected]', 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,'[email protected]', sysdate)
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view


SQL>

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

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

تم تعديل بواسطه informat
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اتمنى ان يكون الدرس القادم عن الcluster

وشكراً

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الله يعطيك العافية اخى العزيز

و يففقك

لقد استفدنا كثير من شرحك

و حقيقا شرح جميل و وافى و اضح جدا

ادامك لله للخير و عطاك البركة فى الرزق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

:) :) :)

شرح جميل و اكثر من رائع

-waf

:) :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الله يعطيك العافية اخى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الأخ الفاضل حسام

لن أقول لك شئ سوي أن يجازيك الله خيراً علي هذه المساعدات القيمة

حاولت ربط قاعدتي بيانات بنفس الطريقة التي قلتها حضرتك في بداية المشاركة

ولكن عن تنفيذ الاستعلام أحصل علي الخطأ الآتي :

ORA-28030: Server encountered problems accessing LDAP directory service

وحاولت الحصول علي حل ولم أجد

مع العلم أنني أربط بين قاعدتي بيانات

Oracle 8.1.7

ولن أستطيع ترقيتها في الوقت

أرجو أن أجد عندك الحل لأنني أحتاجه ضروري جداً

محمود درويش

[email protected],cc

[email protected]

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هذه مشكلة نظام و ليست مشكلة أوراكل أخي الكريم ...

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الأخ الكريم حسام

شاكر اهتمامك وردك

وقد عثرت علي الحل وهو :

alter session set global_names = false

وسؤالي هل أجعل هذا الحل دائم بتعديل هذه القيمة في ملف

init.ora

مع خالص وتحياتي لمجهوداتك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

درس رائع ومفيد

شكراً جزيلا...........

أطلب منك إذا سمحت تزويدنا بشرح مفصل نوعا ما عن كيفية عمل back-up للبيانات من الdata base

ولك جزيل الشكر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

انا سعيد جدا بالعمل الرائع وحقيقي استفت من كل الدروس المعروض ولا املك الا هذا " ربنا يكرمكم جمعيا "

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مشكورة جهودك أخي الكريم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مشكور جدآ على المجهود الكبير والثمين.

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

باستخدام RMAN

lمع الشكر الجزيل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

لقد تتبعت هذا الموضوع ووجدته مفيدا و مفسرا

أخي الكريم أنا مهتم بإنشاء vue materialisé وقمت بتطبيق التعليمات التي بينتها لكن لم يحصل تحديث بعد دقائق في الجدول employees مع العلم أني تتبعت جميع القواعد وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خير ا يا خي العزيز على هذا العطاء الكبير واسأل الله أن يجزيك الخير الكبير وان يجعل ماتفضلت به علينا خالصا لوجهه الكريم

واود ان اذكرك بحديث

((إذا مات ابن آدم انقطع عمله الا من ثلاث ............. , أو علم ينتفع به))

أطال الله في عمرك :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاكم الله خيرا وجعلها الله فى ميزان حسناتك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بارك الله فيك يا اخي ونحن في انتظار المزيد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بســم الله الـرحمــن الرحيــم السلام عليكــم ورحمـة الله وبركاتــه

مجهود رائع ولكن ينقصة شىء وهوا كيفية نسخ البيانات فور عمل حفظ لها وايضا لابد من عمل لوج ماتيريا ليزد فيو وجزاج الله كل خير

رجاء سرعة الرد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بصراحة الشرح روعه الف شكر وجزاك الله خير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الله يعطيك العافية

بس احنا مواضيعنا غير شكل في ادارة القواعد البيانات

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .