من كازيمير سايتوس
تم النشر في نوفمبر 2005
تعرَّف على بعض برامج bash shell النصية الأساس لتثبيت قواعد بيانات Oracle وتشغيلها وصيانتها على نظام التشغيل Linux.
منذ حوالي سبع سنوات، أصدرت Oracle أول قاعدة بيانات تجارية على Linux. ومنذ ذلك الحين، كانت Oracle وRed Hat وNovell/SUSE تتعاون بثبات بشأن التغييرات التي تطرأ على Linux kernel من حيث علاقتها بأداء قاعدة البيانات والتطبيقات. ولهذا السبب، تتضمن Oracle Database 10g for Linux تحسينات مرتبطة ارتباطًا وثيقًا بنظام التشغيل. والآن أكثر من أي وقت مضى، يحتاج مسؤولو قواعد البيانات إلى المعرفة والخبرة على هذه المنصة من أجل إدارة الأنظمة الموجودة تحت المراقبة.
هناك ترابط تقليدي للمسؤوليات بين مسؤولي النظام ومسؤولي قاعدة البيانات (DBA). غير أن التمييز ليس واضحًا دائمًا في الممارسة العملية. تستخدم العديد من محلات تكنولوجيا المعلومات الأشخاص غير المحترفين الذين يعالجون المخاوف على قاعدة البيانات وكذلك مستويات نظام التشغيل. وبالطبع، تستخدم Oracle Database نفسها موارد نظام التشغيل وهي مصممة للتفاعل بشكل وثيق مع بيئتها.
علاوة على ذلك، يجد العديد من مسؤولي النظام ومسؤولي قاعدة البيانات أنه من الضروري أو المناسب أتمتة المهام المتعلقة بعملهم. إن تثبيت البرامج، ومراقبة موارد النظام، وإدارة الأنظمة تنطوي على مهام متكررة معرضة للخطأ يتم معالجتها بشكل أفضل من خلال العمليات الآلية من الإجراءات اليدوية.
تتمثل إحدى الطرق المستخدمة لأتمتة مثل هذه المهام في كتابة برامج shell النصية. تلعب برامج shell النصية دورًا مهمًا في نظام Linux من وقت تثبيته. يتم استدعاء برامج نصية متنوعة عند بدء تشغيل النظام وإيقاف تشغيله. يتم استدعاء البرامج المساعدة من Oracle وموردي الطرف الثالث الآخرين من خلال برامج shell النصية. ونظرًا إلى أنه يمكن تطويرها بسرعة، فقد تم استخدامها تاريخيًا لتطبيقات النماذج الأولية. وقد استفاد مسئولو النظام من الوظائف المتاحة من خلال برامج shell النصية من أجل توفير حلول مصممة خصيصًا للمتطلبات والمواصفات المعينة للأنظمة الموجودة تحت المراقبة.
في هذه المقالة، سأقدم الوظائف المتاحة من خلال البرمجة النصية "bash" ذات الصلة بتثبيت قواعد بيانات Oracle وتشغيلها وصيانتها على منصة Linux. لاحظ أن هذه المقالة تم تصميمها للمبتدئين في كتابة Linux أو مسؤولي قواعد البيانات (DBA) الجدد نسبيًا في Linux؛ معظم مسئولي أنظمة Linux ذوي الخبرة لن يجداها مفيدة.
ما المقصود ببرمجة Shell النصية؟
تعد برمجة Shell النصية ببساطة ملف نصي يحتوي على تسلسل من الأوامر. عند تشغيل الملف—أو البرنامج النصي—فإنه ينفذ الأوامر الواردة في الملف. يشير مصطلح shell ببساطة إلى واجهة مستخدم سطر الأوامر المحددة التي تستخدمها للاتصال بـ Linux kernel. تتوفر عدة shell مختلفة، بما في ذلك C shell (csh)، وKorn shell (ksh)، وBourne shell (sh)، وBourne-Again shell (bash). shell نفسه هو أمر يقرأ السطور إما من ملف أو وحدة طرفية، ويفسرها، وينفذ الأوامر الأخرى بشكل عام. تتضمن Bourne-Again shell ميزات shells الأخرى المذكورة وهي تلك التي تم استخدامها لبرامج نصية التي توضحها هذه المقالة.
يمكن استخدام السطر الأول في ملف البرنامج النصي لتحديد وحدة shell التي سيتم استخدامها لتشغيل البرنامج النصي. هذا هو معنى السطر الأول الموجود في كل أمثلة البرنامج النصي:
#!/bin/bash
لماذا تستخدم برامج Shell النصية؟
تبعًا لخلفيتك، قد لا ترى أي قيمة فورية لكتابة برامج shell النصية فيما يتعلق بعمل مسؤول قاعدة البيانات. إذا لم يكن لديك خبرة في أنظمة UNIX أو UNIX الشبيهة، فقد يكون عدد لا يحصى من الأوامر المشفرة سببًا للقلق. بالإضافة إلى ذلك، بالإضافة إلى كونه قاعدة بيانات علائقية، توفر Oracle 10g منصةً قويًا لمعالجة البيانات داخل قاعدة البيانات بالإضافة إلى العديد من طرق التفاعل مع نظام التشغيل خارج قاعدة البيانات.
ومع ذلك، هناك العديد من الأسباب التي قد تجد نفسك غارقًا في عالم برامج shell النصية، بما في ذلك ما يلي:
عند عدم استخدام برامج Shell النصية
تتضمن Oracle Database وظائف تتجاوز التعريف التقليدي لنظام RDBMS. مثل أي برنامج آخر، يستخدم الموارد التي يوفرها نظام التشغيل، ولكن يمكنه "رؤية" و "تغيير" بيئته إلى درجة أكبر بكثير من البرامج الأخرى. توفر عروض SQL وOracle الثابتة صورة للنظام من داخل قاعدة البيانات، بينما يوفر برناج shell النصي عرضًا للنظام من خارج قاعدة البيانات. إن برمجة Shell النصية ليست الحل لكل مشكلة.
من المهم إدراك أنه يمكن مراقبة العديد من جوانب نظام التشغيل وتعديلها من داخل قاعدة البيانات. يمكن استخدام طرق العرض الثابتة من Oracle (طرق العرض ذات بادئة v$) لتحديد اسم مضيف الجهاز (v$instance) أو اسم المنصة التي تعمل عليها قاعدة البيانات (v$database). كما يمكن تحديد موقع الملفات المقترنة بقاعدة البيانات والسمات الأخرى الخاصة بها بهذه الطريقة أيضًا. يمكن الاستعلام عن الموقع والسمات الأخرى لملفات البيانات (v$datafile وdba_data_files) والملفات المؤقتة (v$tempfile وdba_temp_files) وسجلات الإعادة (v$logfile) وسجلات الأرشيف (v$archived_log) وملفات التحكم (v$controlfile) مباشرة من قاعدة البيانات. يمكنك تحديد معلومات عن منطقة الاستعادة الفورية ($recovery_file_dest) من طريقة العرض هذه، بالإضافة إلى النظر في بعض معلمات init.ora (db_recovery_file_dest، db_recovery_file_dest_size). كما يمكن الاستعلام عن حالة العمليات (v$process) والذاكرة (v$sga، v$sgastat، وما إلى ذلك). توجد العديد من حزم PL/SQL المضمنة بالإضافة إلى القدرة على إنشاء كائنات قاعدة بيانات Java وC التي تسمح بالوصول الإضافي إلى نظام التشغيل الأساسي.
إذا كنت تفكر في البرمجة النصية لمهمة تتطلب قدرًا كبيرًا من الوصول إلى قاعدة البيانات، فربما لا يكون استخدام البرمجة النصية أفضل خيارًا لك. في وقت لاحق من هذه المقالة، يوجد وصف لكيفية الوصول إلى قاعدة البيانات باستخدام SQL*Plus ولكن في كثير من الحالات، من الأفضل التعامل مع المشكلة باستخدام لغة أخرى.
يلخص الرسم البياني أدناه المعلومات التي يمكن الوصول إليها من داخل قاعدة البيانات نفسها:
تعريف الخادم | استعلام مندوب | ملاحظات> |
---|---|---|
اسم المضيف حيث يتم تشغيل المثيل |
|
يمكنك أيضًا الحصول على هذه المعلومات عن طريق تشغيل ما يلي من bash:
أو
|
منصة نظام التشغيل |
|
يتم إرجاع معلومات مشابهة إذا قمت بتشغيل uname -s |
مواقع ملفات Oracle | استعلام مندوب | ملاحظات |
---|---|---|
ملفات التحكم |
|
موقع ملفات التحكم في قاعدة البيانات. كما تحتوي control_files لمعلمة init.ora على هذه المعلومات. |
Datafiles |
|
موقع ملفات بيانات قاعدة البيانات |
الملفات المؤقتة |
|
موقع الملفات المؤقتة لقاعدة البيانات |
ملفات السجل |
|
موقع سجلات الإعادة |
السجلات المحفوظة |
|
موقع سجلات الإعادة المحفوظة. كما تحتوي معلمات init.ora log_archive_dest_n على هذه المعلومات. لن يقوم هذا الاستعلام بإرجاع نتائج إذا لم تكن قاعدة البيانات في وضع أرشيف الحفظ. |
منطقة الاستعادة الفورية |
|
الدليل المستخدم في تثبيت Oracle 10g لمنطقة الاستعادة الفورية. كما تحتوي المعلمة init.ora db_recovery_file_dest على هذه المعلومات. |
نقاط وصول أخرى في نظام الملفات المشار إليها بواسطة المعلمات |
|
يمكن أن تختلف نتائج هذا الاستعلام بشكل كبير، تبعًا لتثبيت Oracle Database وإصدارها. تتضمن المعلمات التي يمكن إرجاعها ما يلي: ملف spfile standby_archive_dest utl_file_dir background_dump_dest user_dump_dest core_dump_dest audit_file_dest dg_broker_config_file1 dg_broker_config_file2 |
الوصول البرمجي إلى نظام الملفات | حدد directory_path من dba_directories |
يمكن استخدام معلمة Oracle UTL_FILE_DIR وكائنات قاعدة البيانات DIRECTORY للوصول إلى الملفات التي ليست جزءًا من الأداء القياسي لقاعدة البيانات. |
المعالج/العمليات | استعلام مندوب | ملاحظات |
---|---|---|
عمليات الدورة |
|
يمكن ربط spid بنتائج ps -ef لمقارنة المعلومات المتوفرة في قاعدة البيانات بمعلومات نظام التشغيل لعملية معينة. |
العمليات المرتبطة بالتوازي |
|
يمكن للعديد من جوانب Oracle Database، مثل التحميل والاستعلام وإنشاء الكائنات والاستعادة والنسخ المتماثل، الاستفادة من التوازي لتسريع الأنشطة التي يمكن تقسيمها. تعين المعلمة parallel_threads_per_cpu درجة التوازي الافتراضية للمثيل. |
الذاكرة | استعلام مندوب | ملاحظات |
---|---|---|
المنطقة العامة للبرنامج | اختر * من V$PGASTAT |
يتم استخدام المعلمة pga_aggregate_target لتكوين الذاكرة لكافة اتصالات الخادم المخصصة. يمكن استخدام أدوات Linux المساعدة، بما في ذلك vmstat والأعلى، لمراقبة استخدام الذاكرة. |
المنطقة العامة للنظام | اختر * من v$sga |
تُستخدم المعلمتان SGA_MAX_SIZE وSGA_TARGET لتكوين ميزات تخصيص الذاكرة الديناميكية الخاصة بـ Oracle Database 10 g. يمكن استخدام معلمات أخرى لتخصيص الذاكرة يدويًا لأغراض معينة. ومرة أخرى، تتوفر عدة أدوات مساعدة لنظام Linux لمراقبة تخصيص الذاكرة. |
برامج BASH نصية
يتم استدعاء السكريبتات إما كجزء من عملية آلية (بدون تدخل بشري) أو تعمل بشكل تفاعلي، مع استجابة المستخدم للمطالبات. طالما أن لديك إذن تنفيذي لملف، يمكنك تشغيله من سطر الأوامر بكتابة اسمه. إذا لم يكن لديك إذن تنفيذي للملف ولكن لديك إذن قراءة، فيمكنك تشغيل البرنامج النصي عن طريق سبقها بـ sh
.
إذا تم تصميم اسكربت ليتم تشغيله دون إدخال المستخدم، تتوفر عدة خيارات لاستدعائه. يمكنك تشغيل برنامج نصي في الخلفية والمتابعة حتى في حالة قطع الاتصال عن طريق إدخال أمر في النموذج التالي:
nohup /path_to_dir/myscript_here.sh &
قد يكون هذا مفيدًا لتشغيل البرامج النصية التي تستغرق وقتًا طويلًا للإكمال. يمكن استخدام الأمر at
لتنفيذ برنامج نصي في المستقبل، ويمكن استخدام cron
لجدولة البرامج النصية للتنفيذ على أساس متكرر.
تغطي الأمثلة التالية الجوانب الأساسية لتوفير المخرجات للعرض (باستخدام echo
) وحلقات الجمل البرمجية والمنطق الشرطي وتعيين المتغير.
print_args.sh. الوسائط عبارة عن كلمات على يمين اسم الأمر التي يتم تمريرها إلى البرنامج النصي. للوصول إلى المعلمة الأولى، استخدم المتغير $1
. يحتوي المتغير $0
على اسم البرنامج النصي ذاته. يحتوي المتغير $#
على عدد الوسائط في البرنامج النصي. تتضمن الطريقة المفيدة للتكرار عبر جميع المعلمات التي تم تمريرها استخدام سلسلة الجمل البرمجية while
وأمر التحول. هذا الأمر هو ما يتيح لك تكرار كل الوسائط في قائمة الوسائط (بدلًا من البقاء في سلسلة جمل برمجية لا نهائية).
while [ $# -ne 0 ]
do
echo $1
shift
done
إذا استغرق برنامج نصي اسم ملف كوسيطة (أو يطالب مستخدمًا باسم ملف) وقراءة الملف لاحقًا في البرنامج النصي، فمن المستحسن التحقق مما إذا كان يمكن الوصول إليه وقراءته. على سبيل المثال، قد يطالب برنامج نصي للاستعادة الذي يتضمن تحديد ملف التحكم الاحتياطي المستخدم بإجراء تحديد سيتم استخدامه لاحقًا في البرنامج النصي لاستعادة الملف.
if [ ! -r $1 ]; then # not exists and is readable
echo "File $1 does not exist or is not readable."
exit;
fi
تسلسل الأحرف
إذا كان [ ! -r $1 ];
هو ما يؤدي فعلًا الاختبار. إذا كان تقييم المحتويات بين الأقواس بالقيمة "حقيقية"، فسيتم تنفيذ الأوامر التي تظهر بين if وfi. يظهر الاختبار الفعلي بين الأقواس. تعمل نقطة التعجب على إبطال الاختبار الذي تقوم به. يقوم الخيار -r
بالتحقق لمعرفة ما إذا كان الملف قابلًا للقراءة أم لا. ما يتم اختباره في هذه الحالة بالذات هو الوسيطة الأولى التي يتم تمريرها إلى البرنامج النصي. باستخدام اختبار مختلف ( -d
)، يمكنك التحقق لمعرفة ما إذا كان الإدخال المحدد دليلاً (انظر is_a_directory.sh).
do_continue.sh. هذا المثال عبارة عن تسلسل تمثيلي بسيط من الأوامر التي يمكن استخدامها لقراءة إدخال المستخدم لأغراض متنوعة. قبل تشغيل عملية قد تؤدي إلى فقد البيانات أو نتائج غير مرغوب فيها أخرى في ظل شروط معينة غير قابلة للتحديد من داخل البرنامج النصي، يُنصح بتضمين مطالبة تسأل عما إذا كان المستخدم يريد فعليًا أن ينفذ البرنامج النصي الأمر أو الأوامر التالية. يسأل المثال التالي عما إذا كان المستخدم يريد المتابعة، ويقرأ متغيرًا بالاسم doContinue
من سطر الأوامر، ويقيّم ما أدخله المستخدم. إذا قام المستخدم بإدخال أي شيء بخلاف "y"، يتم إخطار هذا الشخص بأن البرنامج النصي هو "في حالة إنهاء" وينتهي دون تنفيذ بقية البرنامج النصي بعد نهاية كتلة if ( fi
).
doContinue=n
echo -n "Do you really want to continue? (y/n) "
read doContinue
if [ "$doContinue" != "y" ]; then
echo "Quitting..."
exit
fi
من الضروري أن يقوم المستخدمون الذين لديهم الأذونات والبيئة الصحيحة بتشغيل برنامج نصي محدد فحسب. تحقق مفيد في برنامج نصي يختبر المستخدم الذي يحاول تشغيل البرنامج النصي. إذا قمت بإرفاق أمر داخل حرف ' ( ') الخاص بالتسعير الخلفي، يمكن إرجاع نتائج الأمر إلى البرنامج النصي. يسترجع المثال التالي المستخدم المسجل دخوله حاليًا، باستخدام whoami
، ويعرض التاريخ باستخدام أمر التاريخ لاحقًا في البرنامج النصي.
echo "You are logged in as ‘whoami‘";
if [ ‘whoami‘ != "oracle" ]; then
echo "Must be logged on as oracle to run this script."
exit
fi
echo "Running script at ‘date‘"
تتطلب البرامج النصية المكتوبة للتفاعل مع Oracle Database في بعض الأحيان إدخال معلومات حساسة مثل كلمة سر قاعدة البيانات. يقوم الأمر stty –echo
بإيقاف تشغيل ارتداد الشاشة، بحيث لا تظهر المعلومات المدخلة لأمر القراءة اللاحق على الشاشة. بعد قراءة المعلومات الحساسة وتخزينها في متغير ( pw
في المثال أدناه)، يمكن إعادة تشغيل العرض باستخدام صدى قوي.
stty -echo
echo -n "Enter the database system password: "
read pw
stty echo
Oracle Scripts
توجد بعض الملفات في موقع ثابت لتثبيت محدد من Oracle. يمكنك تحديد مخزون Oracle عن طريق عرض ملف /etc/oraInst.loc. يحدد ملف /etc/oratab قواعد البيانات (وغيرها من برامج Oracle) المثبتة على الخادم.
get_inv_location.sh. يعد هذا البرنامج النصي أقل بديهية من الأمثلة السابقة. من خلال تقسيم البرنامج النصي إلى أوامر مكونه، سوف تحصل على فهم أفضل لما يتم إنجازه.
لتحديد موقع المخزون، ستقوم بتوجيه نتائج أمر الفئة (الذي يعرض محتويات الملف) إلى grep (أداة مساعدة تطبع السطور التي تطابق نمطًا معينًا). أنت تبحث عن سطور تحتوي على الحرف inventory_loc.
الفئة /etc/oraInst.loc | grep inventory_loc
في حالة وجود أكثر من موقع مخزون بسبب عمليات التثبيت المتعددة، يجب استبعاد السطور التي تم التعليق عليها بـ #. يستثني الخيار -v السطور التي تحتوي على النمط المحدد.
cat /etc/oraInst.loc |grep -v "#"|grep inventory_loc
ستبدو نتيجة هذا الأمر كما يلي:
inventory_loc=/u01/oraInventory
يمكنك إعادة توجيه المعيار إلى ملف، باستخدام إعادة توجيه >. في حالة عدم وجود الملف، يتم تكوينه. في حالة وجوده، تتم الكتابة فوقه.
cat /etc/oraInst.loc|grep -v "#"|grep inventory_loc > tmp
بمجرد أن يكون لديك السجل الذي يشير إلى موقع المخزون، فإنك تريد إزالة جزء السجل قبل علامة يساوي. في هذه المرة تقوم بتوصيل نتائج أمر الفئة للغة awk (غالبًا تستخدم لغة المسح الضوئي للنمط والمعالجة لتقسيم الحقول ذات الطول المتغير)، والتي تقوم في الأساس بتقسيم السلسلة. يقوم الخيار –F
بتوجيه لغة awk لاستخدام علامة المساواة كمحدد. ثم تقوم بطباعة الرمز الثاني من هذه السلسلة ( $2
)، وهو كل شيء على يمين علامة يساوي. والنتيجة هي موقع المخزون (/u01/oraInventory).
القط tmp | wk -F= '{print $2}'
لا يوجد سبب معين للسماح للملف المؤقت (tmp) بالبقاء، لذلك يمكن إزالته.
rm tmp
list_oracle_homes.sh. إذا كنت ترغب في تحديد ORACLE_HOME لقاعدة بيانات محددة، يتوفر لديك العديد من الخيارات. يمكنك تسجيل الدخول كمستخدم قاعدة بيانات وecho
المتغير $ORACLE_HOME. يمكنك أيضًا البحث من خلال ملف /etc/oratab وتحديد الاسم المقترن بطبعة معينة. إدخالات قاعدة البيانات في هذا الملف في النموذج
$ORACLE_SID:$ORACLE_HOME:<N|Y>:
تطبع البطانة الواحد التالي ORACLE_HOME للإدخال مع ORACLE_SID من TESTDB:
cat /etc/oratab | awk -F: '{if ($1=="TESTDB") print $2 }'
ومع ذلك، ماذا لو كان لديك متطلب بضرورة تنفيذ عملية على كل ORACLE_HOME مدرج في ملف /etc/orainst؟ يمكنك التكرار عبر مثل هذه القائمة باستخدام القصاصة البرمجية التالية.
dblist=‘cat /etc/oratab | grep -v "#" | awk -F: '{print $2 }'‘
for ohome in $dblist ; do
echo $ohome
done
يتم استخدام المتغير dblist
كمصفوفة. يتم الاحتفاظ بجميع مسارات ORACLE_HOME بواسطة هذا المتغير. يتم استخدام سلسلة الجمل البرمجية for
للتكرار خلال هذه القائمة، ويتم تعيين كل إدخال إلى المتغير ohome
ثم يتم ارتداده إلى وضع المعايير.
search_log.sh. يتم إنشاء مجموعة متنوعة من السجلات بواسطة منتجات Oracle، وقد تكون مهتمًا بمراقبتها. يحتوي سجل تنبيهات قاعدة البيانات على رسائل هامة لعمليات قاعدة البيانات. ويتم أيضـًا إنشاء ملفات السجل عند تثبيت المنتجات أو إلغاء تثبيتها وعند تطبيق التصحيحات. تتكرر البرمجة النصية التالية فوق ملف تم تمريره إليها كوسيطة. إذا تم العثور على أية سطور تحتوي على ORA-، يتم إرسال رسالة بريد إلكتروني إلى مستلم محدد.
cat $1 | grep ORA- > alert.err
if [ ‘cat alert.err|wc -l‘ -gt 0 ]
then
mail -s "$0 $1 Errors" administrator@yourcompany.com < alert.err
fi
الاختبار المحدد الذي يتم إجراؤه هو عدد من الكلمات الموجودة في الملف تنبيه err، والذي تتم كتابته عند إعادة التوجيه إلى تنبيه err. إذا كان عدد الكلمات ( wc
) أكبر من ( -gt
) صفرًا، فسيتم تنفيذ محتويات الكتلة if. في هذه الحالة، أنت تستخدم mail
(يمكن أيضًا استخدام send mail
) لإرسال رسالة. يحتوي عنوان الرسالة على البرمجة النصية التي يتم تنفيذها ( $0
)، واسم السجل الذي يتم البحث فيه ( $1
)، والسطور التي تطابق بحثنا الأولي ( ORA-
) كنص الرسالة.
يمكن استخدام المتغيرات البيئية مثل ORACLE_HOME وORACLE_BASE وORACLE_SID لتحديد موقع الموارد غير الموجودة في موقع ثابت في بيئة Linux. إذا كنت تقوم بإدارة مثيل تطبيق Oracle E-Business Suite 11i، فسيكون لديك العديد من المتغيرات البيئية الأخرى التي يمكن استخدامها لتحديد موقع الموارد. وهي تشمل APPL_TOP وTWO_TASK وCONTEXT_NAME وCONTEXT_FILE على سبيل المثال لا الحصر. لرؤية قائمة كاملة في البيئة الخاصة بك، قم بتنفيذ الأمر التالي وفحص الملف الناتج (myenv.txt):
env > myenv.txt
يمكن استخدام العديد من توليفات هذه المتغيرات البيئية كموقع لملف يتم البحث عنه. على سبيل المثال، قد يتم تعيين موقع سجل التنبيه على أنه
$ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log
استنادًا إلى المبادئ المقدمة في هذا البرنامج النصي، يمكن كتابة جدول أكبر للتنفيذ على فترات دورية تقوم بالبحث في محتويات سجل التنبيهات (أو ملف آخر ذي أهمية) وإرسال بريد إلكتروني في حالة وجود أي أخطاء. ثم يمكن نقل محتويات السجل إلى ملف آخر، بحيث يتم إرسال أحدث رسائل الخطأ فقط عبر البريد الإلكتروني.
برامج Oracle Recovery Manager نصية. Oracle Recovery Manager (RMAN) هو أداة يمكن استخدامها لإدارة النسخ الاحتياطي لقاعدة البيانات واستردادها. وهذا يعمل على تبسيط الإدارة بشكل كبير على العديد من المنصات، حيث يمكن كتابة جميع البرامج النصية للنسخ الاحتياطي لكي يتم تشغيلها بواسطة RMAN، مما يقلل من كمية التعليمات البرمجية الخاصة بالمنصة. يمكن استدعاء RMAN بواسطة المنصة الأساس والبرنامج النصي الذي تم تمريره. على سبيل المثال، قد يتكون النسخ الاحتياطي البارد (cold.sh) من البرنامج النصي التالي:
#!/bin/bash
rman target / <<EOF
shutdown immediate;
startup mount;
backup spfile;
backup database;
alter database open;
delete noprompt obsolete;
quit;
EOF
يشير السطر 1 إلى أنك تستخدم bash shell. يستدعي السطر الثاني Oracle Recovery Manager ويحدد تسجيل دخول مستخدم نظام التشغيل إلى قاعدة البيانات الهدف (المحدد في المتغير البيئي $ORACLE_SID). تشير <<EOF
التالية إلى أنه سيتم تمرير الأوامر اللاحقة إلى RMAN لتتم معالجتها. يشير EOF في السطر الأخير إلى أنك قد وصلت إلى نهاية سلسلة الأوامر التي سيتم تمريرها إلى RMAN. يتم استخدام RMAN بعد ذلك لإيقاف تشغيل قاعدة البيانات وبدء تشغيل قاعدة البيانات وتوصيلها، والانتقال إلى النسخ الاحتياطي لملف معلمة الخادم ومحتويات قاعدة البيانات. يتم بعد ذلك فتح قاعدة البيانات. ويتم بعد ذلك حذف أية نسخ احتياطية أقدم من تلك المحددة في نهج الاستبقاء. راجع وثائق RMAN لإنشاء نسخة احتياطية ملائمة لموقفك.
عادة تتم جدولة النسخ الاحتياطية الليلية وتشغيلها تلقائيًا. يمكن استدعاء البرنامج النصي أعلاه وإرسال محتوياته القياسية إلى عنوان بريد إلكتروني بالأمر التالي:
sh cold.sh | mail -s"النسخ الاحتياطي 'date'" administrator@yourcompany.com
يمكن تشغيل أدوات Oracle المساعدة الأخرى من داخل اسكربتات shell أيضًا. يمكن استخدام الأداة المساعدة tnsping لمعرفة ما إذا كان معرف اتصال Oracle معين يمكنه الاتصال بالمستمع أم لا. يمكنك تشغيل هذه الأداة المساعدة للتحقق من مشكلات الاتصال:
tnsping ptch04 |grep TNS-
كما تعد عمليات تصدير قاعدة البيانات واستيرادها (ضخ بيانات وضخ تقليدي) مرشحين جيدين لبرمجة عمليات التكرار نصية.
تثبيت قاعدة البيانات. يمكن أتمتة العديد من الخطوات المضمنة في إعداد قاعدة البيانات. قبل تثبيت Oracle 10g على Linux، يجب إجراء اختبارات متنوعة للتحقق من الحد الأدنى المطلوب لإصدار الحزم وإعدادات معلمات kernel. يمكنك الاستعلام عن إصدار حزمة باستخدام الأمر rpm
مع الخيار –q
.
rpm -q compat-libstdc++
يمكنك تحديد جوانب مختلفة من النظام من خلال النظر في نظام الملفات /proc "ظاهري" أو "افتراضي". لا يحتوي على ملفات حقيقية، بل، معلومات نظام وقت التشغيل التي يمكن عرضها كما لو كانت موجودة في الملفات. على سبيل المثال، يحتوي /proc/meminfo على معلومات الذاكرة للنظام، ويعرض grep MemTotal /proc/meminfo
إجمالي ذاكرة النظام. باستخدام awk
كما فعلت سابقًا، يمكنك عزل كمية الذاكرة بالكيلوبايت، باستخدام:
grep MemTotal /proc/meminfo | awk '{print $2}'
ويمكن استخدام مثل هذا الأمر في سياق نص من شأنه إجراء مقارنات والاستجابة حسب ذلك (حتى تحديث النظام نفسه). يعرض نموذجا البرامج النصية 10gchecks_kernel.sh و10gchecks.sh الإصدارات والإعدادات الحالية والمقترحة استنادًا إلى وثائق Oracle.
مراقبة قاعدة البيانات. يمكن استخدام الأمر ps
للإبلاغ عن حالة العملية وللتحقق من تشغيل قاعدة بيانات أو مستمع أو اسكربت أو أي عملية أخرى ذات أهمية. إذا كنت ترغب في سرد كل قواعد البيانات التي تعمل حاليًا على خادم، يمكنك تشغيل الأمر التالي:
echo "‘ps -ef | grep smon|grep -v grep|awk '{print $8}'| awk -F \"_\" '{print$3}'‘"
على الرغم من أن هذا يعمل، إلا أنه من الصعب فهمه للوهلة الأولى. الأمر الأول، ps
(باستخدام خيارات -ef
لقائمة كاملة بجميع العمليات)، يبحث عن جميع العمليات التي تعمل على الخادم. يقوم grep
التالي بالبحث عن SMON (معالجة خلفية Oracle System Monitor)، والتي تشير إلى أن قاعدة البيانات قيد التشغيل. أنت تريد إزالة الإدخالات التي تشير إلى الأمر grep نفسه، الجاري تشغيله. ثم استخدم awk
لتحديد موقع العمود الثامن في القائمة، والذي يحتوي على اسم عملية مراقبة النظام بالصيغة ora_smon_<oracle_sid>. ثم تستخدم المثيل الأخير من لغة awk حرف الشرطة السفلية كمحدد للبحث عن اسم قاعدة البيانات الذي يمتلك عملية SMON وطباعته. ويجب أن يظهر حرف الشرطة السفلية بين علامتي اقتباس، ويتم استخدام الشرطة المائلة للخلف قبل كل علامة من علامات الاقتباس لتجنب علامات الاقتباس هذه (لأن السلسلة بأكملها تظهر ضمن مجموعة من علامتي اقتباس مزدوجتين).
exec_sql.sh. كما ذكرنا سابقًا، يمكن الاستعلام عن قاعدة البيانات من برنامج shell النصي شريطة أن يكون للمستخدم حق الوصول إلى sqlplus. يعرض المثال التالي قائمة (محددة بمسافات) بالأجهزة التي تحافظ حاليًا على جلسات العمل في قاعدة البيانات:
#!/bin/bash
output=‘sqlplus -s "/ as sysdba" <<EOF
set heading off feedback off verify off
select distinct machine from v\\$session;
exit
EOF
‘
echo $output
يشبه هذا البرنامج النصي برنامج RMAN النصي السابق، إذ تقوم بإدخال الأوامر في برنامج آخر. تم إنشاء اتصال محلي مصدق عليه بنظام التشغيل بقاعدة البيانات كـ sysdba. لمنع إرجاع رسائل خارجية، يقوم هذا البرنامج النصي بإيقاف تشغيل العنوان والملاحظات والتحقق من خيارات SQL*Plus. يتم تنفيذ الاستعلام عند الخروج من SQL*Plus.
لاحظ الشرطة المائلة للخلف المزدوجة قبل علامة الدولار في اسم طريقة العرض. هذه هي تسلسلات الإلغاء المطلوبة داخل السلسلة: أول شرطة مائلة تهرب من الشرطة المائلة الثانية، والتي تهرب من علامة الدولار. مرة أخرى، ليست جميلة، ولكن وظيفية.
كما ذكرنا سابقًا، إذا كنت ستكتب شيئًا يتطلب وصولًا واسعًا إلى قاعدة البيانات، فإن برمجة shell النصية ليست الخيار الأفضل. قد يكون من الأفضل إعادة كتابة البرنامج النصي في PL/SQL أو Perl (الذي يستخدم صياغة مشابهة للصياغة المستخدمة في برنامج نصي shell) أو Python أو Java أو لغة أخرى من اختيارك.
النتيجة
يمكن أن تكون برمجة Shell النصية أداة فعالة لأتمتة المهام الإدارية المتكررة المعرضة للخطأ بسرعة. توفر الأمثلة في هذه المقالة مقدمة عن الإمكانيات المتاحة ولكنها بعيدة كل البعد عن الشمول. يحتوي كل نظام على صفات مميزة وأجزاء مميزة وتكوين فريد. سيقوم المسئول بتطوير حلول فريدة لتلبية احتياجات النظام المحدد.
Casimir Srabos هو مسؤول في Oracle Certified DBA، ومطور مؤسسة معتمد من IBM، ومبرمج Java المعتمد من Sun الموجود في ألين تاون، Pa.