الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يعلم Online Redo Log

مغلق
بدأه عبدالرحمن المعزاب في 27 أكتوبر 2001 · 9 رد · 2,494 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

قرأت عن هذا الموضوع في كتاب لأوراكل ولكن لم أفهم شيئين

أولا :-

ما هو الفرق بين Online Redo و rollback فإذاكان rollback يقوم بخزن المعلومات التي تتعرض للتغيير في جداول خاصة لكي يستطيع المستخدم التراجع عن عملة في إي وقت والحصول على النسخة السابقة من المعلومات فما هو فائدة Redo

ثانيا:-

كيف يعمل Redo Log قرأت في الكتاب أنه يقوم بخزن المعلومات على إثنين log-a ,logb يبداء بالوضع في log-a حتى يمتلئ ثم يضع في log-b فإذا إمتلاء log-b يعود ليضع في log-a هذا يعني أن المعلومات التي كانت في log-a قد تم الكتابة عليها فماذا يعني هذا وهل فهمي للموضوع صحيح

#2

دعني اشرح لك كل وحده حتى نصل للهدف

بالنسبة للRollback

كما ذكرت سابقا فان اوراكل يستخدم جزء من الذاكره لادارة عمليات المستخدمين على قاعدة البيانات

لنفترض لدينا مستخدم قام بالعمليات التالية

1- بناء جدول A

2- اضافة بيانات في الجدول A

3- حذف بيانات من الجدول B

4-حذف جدول كامل C

5- RollBack

في حال قام المستخدم بعملية RollBack او في حال لم يقم بالتثبيت Commite وهي العملية العكسية ل RollBack

فان الناتج النهائي من هذه العمليات سوف يصبح كاالتالي

الجدول A موجود

الجدول C غير موجود

لا يتم اضافة البيانات الى الجدول A

يتم التراجع عن حذف البيانات في الجدول B

الان لو قمنا باضافة خطوة بعض الخطوة الثانية لتصبح كالتالي

1- بناء جدول A

2- اضافة بيانات في الجدول A

3-Commite

4- حذف بيانات من الجدول B

5-حذف جدول كامل C

6-RollBack

سيتم التراجع فقط عن عملية حذف البيانات من الجدول B

اذا نكتشف عدة اكتشافات

اولا يتم التراجع عن اي عملية قام بها المستخدم من عمليات DML وليست عمليات DDL

ثانيا يتم التراجع عن جميع العمليات حتى اخر نقطه تم تثبيت البيانات بها

ملاحظة

في حال لم تقم بعمل Commit قبل خروجك فان جميع العمليات من DML سوف يتم التراجع عنها تلقائيا

بالنسبة لملفات Redo

هذه ميزة يتم تشغيلها في قاعدة البيانات ويسمونها ادارة المقاطع ويمكن تشغيل اكثر من ملف وعلى الاقل تكون بملفين باكثر من نسخه يعني

لدينا الملف A والملف B يقوم اوراكل بتسجيل كل العمليات التي قمت بها ولنفترض ان حجمه محدد بحجم صغير مع العلم ان الحجم انت من تتحكم به بناء على معادلات حساب المستخدمين وامور اخرى مرتبطة بقاعدة البيانات

1- بناء جدول A

2- اضافة بيانات في الجدول A

3- حذف بيانات من الجدول B

4-حذف جدول كامل C

5- Commtie

تم الان امتلاء الملف Redo A وننتقل الان للملف b

تم وضع اخطوات التالية في اليوم التالي

1- عملية Update على بيانات الموظفين الذين لهم اكثر من عشر سنوات باضافة رواتبهم 10 بالمائة

2- حذف بيانات الموردين الذين لهم اكثر من 5 سنوات لم نتعامل معهم

3-Commite

حصل فشل في قاعدة البيانات في اليوم الثالث الان قمنا بعمل Recovery لها مع العلم اننا قمنا بعمل اخر نسخه احتياطية منها في اليوم الثاني ونريد ارجاع قاعدة البيانات الى حالتها في اليوم الاول

فان ملفات Redo تبين برقم تسلسلي يحدد تاريخها والعمليات التي قامت بها ويمكنك تحديد مكان اعادة البيانات الى اي يوم او الى اي عملية انت تريدها ولنفترض انها كانة الى اليوم الاول وبهذا جميع المعلومات من اليوم الثاني ومابعدها يجب اعادة وضعها مرة اخرى

ارجوا اكون قد وضحت الطريقتين لك وللجميع

جديد مدونتي الشخصية http://www.badwi.com

ادعو لنا بظاهر الغيب

MyBooksExchange.jpg

#3

يوجد خطأ في رد الأخ محمد بدوي وللفائدة العامة والتصحيح :

السؤال يمكن ان يرد عليه بثلاثة اقسام:

القسم الأول: شرح عملية الحفظ ( commit) والتراجع (rollback) وتأثيرهما على عمليات معالجة البيانات(DML) وعمليات تعريف تركيب البيانات (DDL) .

القسم الثاني:شرح فائدة قطعة التراجع (rollback segment) وطريقة استخدام اوراكل لها.

القسم الثالث : شرح فائدة redo log files وطريقة استخدام اوراكل لها.

القسم الأول:

عند اجراء اي عملية ( DML ) ( يعني insert ,update ,delete ) او اي مجموعة من هذه العمليات والتي تسمى ( transaction ) فإما ان تحفظ بواسطة الأمر commit او يتم التراجع عنها بواسطة الأمر rollback.

مثل الكود التالي

SQL>  insert into dept(deptno,dname,loc) values(50,'hr','riyadh');

1 row created.

SQL>  insert into dept(deptno,dname,loc) values(60,'re','jeddah');

1 row created.

SQL> update dept set loc='dammam' where deptno=50;

1 row updated.

SQL> delete dept where deptno = 60;

1 row deleted.

SQL> commit;

Commit complete.

فمجموعة العمليات هذه تم حفظها وبعد عملية الحفظ سيتمكن المستخدمون الآخرون من رؤية هذه التعديلات ولا يمكن التراجع عنها.

او بالإمكان التراجع عنها بإستخدام امر rollback بدلا من الأمر commit مع ملاحظة انه يمكن التراجع فقط عن العمليات التي لم تحفظ بواسطة الأمر commit اما بعد الحفظ commit فلا يمكن التراجع عنها.

اما عمليات DDL التي هي عمليات تعريف تراكيب البيانات مثل create table,drop table,alter table, create user , create index وغيرها الكثير فلا تحتاج لعمل commit و لايمكن التراجع عنها الا بطلب الأمر المعاكس لها مثل create table x التراجع عنها يكون بالأمر العكسي drop table x.

اما النقطة المهمة والتي يخطئ الكثير فيها وقد وقع فيها الأخ بدوي فهي:

ان اي عملية DDL تطلب اتوماتيكيا معها عملية الحفظ commit على سبيل المثال (سنأخذ مثال الأخ بدوي):

1- بناء جدول A

2- اضافة بيانات في الجدول A

3- حذف بيانات من الجدول B

4-حذف جدول كامل C

5- RollBack

للتوضيح ومعرفة اوامر DDL واوامر DML

1.DDL

2.DML

3.DML

4.DDL

لذلك فإن عملية rollback في الخطوة رقم 5 لن ثؤثر في البيانات لأنها قد حفظت اتوماتيكيا عند طلب الخطوة رقم 4 التي هي DDL.

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

والنقطة المهمةهنا التي لم ينتبه لها الأخ محمد ان اي عملية DDLتحفظ ما قبلها اتوماتيكيا

وهناك نقطة مهمة لو خرجت من برنامح sql plus بواسطة زر الأغلاق ولم تطلب الأمر commit فإنه سيتم حفظ البيانات اتوماتيكيا اما لو خرجت بشكل غير طبيعي مثل انقطاع الكهرباء او end task فإن البيانات لن تحفظ.

اما النقطة هنا فهي عدم التفرقة بين الخروج الطبيعي والخروج الإجباري.

القسم الثاني:

قطعة rollback segment وهي كائن فعلي موجود في تركيبة قاعدة البيانات ويستخدم في حفظ القيم القديمة قبل التغيير حتي لا يتمكن المستخدمين الآخرين من قراءة البيانات الجديدة قبل حفظها لأن القراءاة هنا ستتم من هذه القطعة وليس من الجدول المراد وكذلك تستخدم لإرجاع البيانات في حاله طلب الأمر rollback او في حالة الخروج غير الطبيعي.

القسم الثالث: نضيف الى ما ذكره الأخ محمدالآتي:

redo log file وهي تستخدم لتسريع عملية الحفظ حيث يتم حفظ القيم الجديدة فقط في هذا الملف وفيما بعد يتم نقلها الى الملفات الرئيسية بواسطة قاعدة البيانات.

وفي حال كون قاعدة البيانات في حالة ارشفه archive log mode فإن هذه الملفات توضع في مكان مستقل حتى يكون بلإمكان ارجاع قاعدة البيانات الى حالتها الأصلية في حال وجود خطأ معين في قاعدة البيانات.

امل ان تكون الصورة واضحة الآن.

ولاتنسونا من دعائكم

#4

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

بالنسبة ل SQL Plus والله اعلم (لانه ليس امامي لآتاكد) انه يوجد خيار يجعلك لاتقوم بالحفظ التلقائي عند الخروج العادي وحتى الي اعرفه ان هذه الخاصية تكون مقفلة بالوضع الافتراضي اي عدم الحفظ عند الخروج في اي حالة سواء الاجباري وغيره

جديد مدونتي الشخصية http://www.badwi.com

ادعو لنا بظاهر الغيب

MyBooksExchange.jpg

#5

شكرا لأخوين محمد وOracle man على الرد وجزاكما الله خير فقد شرحتم وأوفيتم

ولقد قمت بالربط بين ما ذكرتما وما أعرفه من قبل للحصول على مفهوم شامل نوعا ما وأرجو أن يكون صحيح

وألخص ما فهمته منكما كما يلي :-

rollback :-

مجال عمله :-

يعمل فقط على التراجع عن التغيرات DML

طريقة العمل:-

عندما يستخدم لأمر commit يتم حفظ المعلومات في الجدول وتبدل المعلومات في rollback segment بالمعلومات الجديدة وتحفظ المعلومات الأخرى في في RBS (إختصار ل RollBack Space) وتتم تسجيل هذة التغيرات في Redo لكي يسهل إخراج المعلومات مرة أخرى من RollBack عند الحاجة لذالك إذا كانت قاعدة البيانات في وضع Archivelog فإنه يتم خزن المعلومات الموجودة في ملفي redo عند إمتلائهما في ملفات خاصة لكي يمكن إسترجاع البيانات على المدى البعيد

أما إذا كانت قاعدة البيانات في وضع NonArchivelog فإنه يتم تغطية البيانات في الملف الأول بعد إمتلاء الملف الثاني ولا يتم حفظ ملفات إي أنه ليس بإمكانك إرجاع البيانات إلا على المدى القريب

يتم إستدعاء commit تلقائيا عند إستخدام أي جملة DDL وإذا أغلقت نافذة SQL pluse فإنه لا يتم إستدعاء commit وكذالك عند الأنقطاع المفاجئ للتيار الكهربائي .

إذا إكتمل ملف Redo فإنه يمكن إسترجاع البيانات منه أما إذا إنقطع التيار قبل إكتمال بناء الملف فسوف يفقد جميع المعلومات التي عليه

هذا ما إستطعت فهمه وأتمنى من الأخوة التصحيح إذا كان هناك خطاء لأني جديد على هذة المفاهيم

وجزاكم الله خير

#6

كلامك صحيح ولكن احب اوضح لك بعض الامور بشكل اكبر

اي عملية تقوم بها يتم تسجيلها في ملف Redo ولا دخل ل Commit او rolllback بها في حالة كانة هذه الخاصية تعمل واقصد Archive

في حال كانة قاعدة البيانات non Archive فانها لاتقوم باستخدام اي ملفات Redo نهائيا

اما الباقي فصحيح

وهنا احب اوضح ان

Rollback و Commite تستخدم لجلسة العمل الحالية لكل مستخدم على حدى وتنتهي بانتهاء عمله

اما عملية Redo فهي على مستوى قاعدة البيانات ككل ويتم تسجيل بها كل شيء من قبل جميع المستخدمين

جديد مدونتي الشخصية http://www.badwi.com

ادعو لنا بظاهر الغيب

MyBooksExchange.jpg

#7

أخي محمد كيف يمكن أن أعرف أن قاعدة البيانات تعمل في وضع من الأوضاع non Archive أو Archive

#8

بعد التحية

الأخوة الأعزاء شكرا لكم على هذه المعلومات القيمة ولكن نتمنى من أحد الأخوان ان يشرح لناالتالي :-

1-control files.

2-redo log file .

3-archive .

وأخص بالذكر الأخ السني والأخ oracle_man والأخ النبع ارجوا ان يعطونا درس عن هذا الموضوع جزاهم الله خيرا ....

أخوكم محمدالشنقيطي

#9

هناك عدة طرق ولا اذكر الان سوى طريقة واحدة وهي ان تقوم بفتح ملف الكونترول التوصيفي الخاص باقلاع قاعدة البيانات وتبحث عن هذا وهو ملف نصي وترى الخيار هل هو مشغل ام لا

وسوف اوافيك بالطرق الاخرى باقرب وقت

جديد مدونتي الشخصية http://www.badwi.com

ادعو لنا بظاهر الغيب

MyBooksExchange.jpg

#10

اخي الكريم لمعرفة وضع قاعدة البيانات إذا كانت في وضع archive log mode ام لا :

يوجد ثلاث طرق :

1.من server manager :

اكتب الأمر التالي :

svrmgr>archive log list

2.

select log_mode from v$database;

3.

select archiver from v$instance;

كم يوجد بعض الأخطاء في فهم المواضيع المذكورة اعلاه

واعدكم بشرح كل منها في وقت قريب جدا جدا

لاتنسونا من دعائكم

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…