آموزش، مشاوره و پشتیبانی دیتابیس اوراکل

۱۳۰ مطلب با موضوع «پایگاه‌داده :: Oracle DBA» ثبت شده است

ساخت سرویس جدید در سناریو دیتاگارد بدون زیرساخت Grid

تو سناریوی اوراکل دیتاگارد ما یک مدار دیتابیسی تشکیل میدیم که هر وقت سرور اصلی در سایت A از دسترس خارج شد اپلیکیشن با وقفه کوتاهی بتونه به سرور دوم در سایت B متصل بشه (تو سناریو حداکثر پایداری بهتره اپلیکیشن های ریپورت به دیتاگارد متصل نشن و برای سناریو اکتیو دیتاگارد یک دیتاگارد مجزا و مختص به ریپورت به صورت آبشاری راه اندازی بشه که بار روی سرور اصلی هم نباشه)

جهت انجام خودکار این سناریو به طوری که اپلیکیشن به یک سرویس جدا وصل بشه و وابسته به سرویس و IP در هر Instance در مواقع Failover و Switchover نباشه میتونید به شیوه زیر عمل کنید:

ادامه مطلب...
۰۸ آبان ۰۰ ، ۱۴:۰۱ ۰ نظر
مهدی غفاری

داستانهای واقعی: افزایش فضای shared pool

یک RAC سه نود بر روی اوراکل نسخه 12.2 داریم. مدتی بود در وقت های پیک کاری اپلیکیشن، با ویت ایونت gc current block 2-way و ... و با مقدار بالا برخورد میکردم به نحوی که کارکرد اپلیکیشن رو مورد تاثیر خود قرار داده بود. از طرفی تمام موارد مرتبط با GC در کلاستر رو با دقت و وسواس بالا با توجه به آخرین Best Practiceها پیکربندی و بازبینی کرده بودم (به خصوص پارامترهای مرتبط با LMS مانند GCS_SERVER_PROCESSES) و با مانیتورینگ شبکه و سرعت Interconnect هام از سرعت و وضعیت خوب اونها مطمئن بودم همچنین با توجه به مشاهدات محیطی به این نتیجه رسیده بودم که در طول 2 ماه کارکرد اپلیکیشن تنها در انتهای بازه های پیک اپلیکیشن این مشکل دیده میشد پس این موضوع کنجکاوی من رو برای این که بفهمم مشکل کجا بود بیشتر کرد.

تو بررسی هام از طریق Memory Advisor در Enterprise Manager متوجه شدم که در این روزها فضای shared pool به طرز قابل توجهی بالا میره و فضای buffer cache بسیار کوچیک میشه پس با این فرض همه چیز منطقی به نظر میومد. چون با رشد فضای shared pool فضای کافی برای buffer cache نبود.

زمانی که سیستم در وضعیت و پرفورمنس مناسب قرار داشت

 

ادامه مطلب...
۲۷ مهر ۰۰ ، ۰۷:۴۵ ۴ نظر
مهدی غفاری

خطای ORA-65114: space usage in container is too high در datapatch

داشتم PSU با شماره Patch 32904851 - Database Release Update 19.12.0.0.210720 رو اپلای میکردم، بعد از اپلای طبق معمول شروع به زدن datapatch اون کردم که موقع انجام عملیات به یه خطای عجیب برخورد کردم:


Current state of release update SQL patches:
Binary registry:
19.12.0.0.0 Release_Update 210716141810: Installed
PDB PDB3:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.16.581942 PM
PDB APIGWYDB:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.17.490873 PM
PDB CDB$ROOT:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.07.436745 PM
PDB DEPLOYDB:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.18.406588 PM
PDB DFNDB:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.17.490873 PM
PDB DSTCHDB:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.17.490873 PM
PDB PDB1:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.10.490613 PM
PDB IMENDB:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.19.319451 PM
PDB OLTPDTNDB:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.17.490873 PM
PDB PDB$SEED:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.17.490873 PM
PDB PDB4:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.13.536972 PM
PDB PDB2:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.13.536972 PM
PDB SHATOOTCORE:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.17.490873 PM
PDB SVCGWYDB:
Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 31-JAN-21 10.36.17.490873 PM
Adding patches to installation queue and performing prereq checks...done
Installation queue:
For the following PDBs: CDB$ROOT PDB1 PDB2 PDB3 PDB4
No interim patches need to be rolled back
Patch 32904851 (Database Release Update : 19.12.0.0.210720 (32904851)):
Apply from 19.10.0.0.0 Release_Update 210108185017 to 19.12.0.0.0 Release_Update 210716141810
No interim patches need to be applied
For the following PDBs: PDB$SEED DEPLOYDB IMENDB SVCGWYDB APIGWYDB OLTPDTNDB DFNDB DSTCHDB SHATOOTCORE
No interim patches need to be rolled back
Patch 32904851 (Database Release Update : 19.12.0.0.210720 (32904851)):
Apply from 19.10.0.0.0 Release_Update 210108185017 to 19.12.0.0.0 Release_Update 210716141810
No interim patches need to be applied
DBD::Oracle::st execute failed: ORA-65114: space usage in container is too high
ORA-06512: at line 2 (DBD ERROR: OCIStmtExecute) [for Statement "BEGIN
INSERT INTO sys.dba_registry_sqlpatch_ru_info
(patch_id,
patch_uid,
patch_descriptor,
ru_version,
ru_build_description,
ru_build_timestamp,
patch_directory)
VALUES
(:patch_id,
:patch_uid,
:patch_descriptor,
:ru_version,
:ru_build_description,
TO_TIMESTAMP(:ru_build_timestamp, 'YYMMDDHH24MISS'),
:patch_directory);
COMMIT;
END;" with ParamValues: :patch_descriptor=OCIXMLTypePtr=SCALAR(0x27bfd28), :patch_directory='PK........J.▒R..$▒....▒M......32904851_rollback.sql▒.[s.H.@▒▒+x.▒.▒l▒U.M▒▒x.%q.-▒,gfg_T.▒L..@▒VR▒▒▒ .!.▒:.U.▒C
+.8:▒▒▒▒▒e:▒Ц▒▒?▒▒g..▒.▒▒▒&▒▒▒▒T;L▒▒.{Y.
▒2ɴ▒.▒.f.#▒.:▒KӶlK▒▒{=~s<.kQ▒▒
▒▒.3▒W▒▒▒...|8.h▒▒|▒▒.m2▒s▒▒▒▒.▒v▒▒"▒r▒7..▒..▒.'▒O:о}▒.▒)gY.Es▒▒4+^▒i..▒▒▒X▒▒▒x▒=Ϳ▒3/Y▒`-..▒▒
.▒.ϵ.▒.▒.n..<▒.▒▒▒▒▒▒3M▒▒▒(▒^▒▒Ϋ▒.▒▒ū%EyR-
▒▒▒.▒O.,▒S▒_~9x▒▒.▒x▒▒.▒▒▒ѻ▒▒▒CD..▒p▒T▒▒▒/▒s.,_▒.▒{gڳ▒▒▒tz▒|▒#.&'▒▒▒Ë▒▒▒p▒▒▒▒▒▒.▒▒▒▒É▒z߾.▒.▒.▒▒▒w▒▒▒9?;ծ.▒]▒▒▒<x%▒▒?;;▒.▒.▒
▒▒▒▒▒.▒.^.▒T▒...
M.▒▒...,▒f1M..^...▒..▒▒7.▒ʍ^▒.▒▒{▒▒▒o.'▒▒y.▒Էx▒▒.▒2.▒.._.▒▒z▒▒.▒▒.▒.▒.▒.▒▒..▒W▒▒|▒▒▒▒▒.;"..▒▒▒..▒{٫▒.p)K[▒ɭ+A~▒▒▒R..zxr1>..▒tz|6▒
AG.▒▒▒.▒▒▒▒▒▒▒P^_▒▒;▒▒H.▒,▒B▒K▒.▒▒▒▒j13G.▒m▒▒Y*▒▒▒▒Y.▒.gVEu.2z/.▒▒.v▒vrv~▒▒▒X.....O.▒▒W▒n▒5▒▒▒.▒r▒x.a▒|▒
▒o▒=ٻ▒e"▒▒k.▒ir6..▒▒.
▒LQ.▒I&▒▒▒UAZ▒h8▒▒.▒▒.X▒.kh▒:▒i
'ө9▒.▒▒p▒/▒.▒▒..isf
▒▒.N▒Ӿm▒f.▒..▒▒▒-▒..▒▒▒?.▒VF▒O▒▒▒u▒.▒▒.X▒#▒4F▒..▒▒▒u▒v.▒▒6N▒Scd▒..▒..▒.3Mc▒8{.(.▒G▒▒▒▒▒▒H▒;.▒~▒VN.D}▒▒CX▒y..▒.▒8.Q▒▒▒<▒:.▒..`▒▒"1mk(os▒▒c.#▒g g.▒1▒▒.M...', :patch_id='32904851', :patch_uid='24343243', :ru_build_description='Release_Update', :ru_build_timestamp='210716141810', :ru_version='19.12.0.0.0'] at /u01/oracle/product/19c/db_1/sqlpatch/sqlpatch.pm line 5841.

Please refer to MOS Note 1609718.1 and/or the invocation log
/u01/oracle/cfgtoollogs/sqlpatch/sqlpatch_5848_2021_09_20_19_12_46/sqlpatch_invocation.log
for information on how to resolve the above errors.
SQL Patching tool complete on Mon Sep 20 19:13:09 2021

این خطا با دستورات زیر رفع شد:

alter pluggable database PDB1 storage unlimited;
alter pluggable database PDB2 storage unlimited;
alter pluggable database PDB3 storage unlimited;
alter pluggable database PDB4 storage unlimited;

 

۲۹ شهریور ۰۰ ، ۱۹:۳۳ ۰ نظر
مهدی غفاری

انتقال DATAPUMP با استفاده از DBLINK

یکی از روش های رایج برای انتقال اسکیما استفاده از Datapump اوراکل هستش. به طور معمول شما باید از سرور مبدا یک فایل Datapump تهیه کنید و با ابزارهایی مثل SCP اون رو به سرور مقصد انتقال بدید و سپس اقدام به IMPORT اون کنید.

یک روش ساده دیگه برای انجام این کار استفاده از TNS در سرور مقصد هستش به این ترتیب که شما اول یک DBLINK در سرور مبدا (در CDB و یا اون PDB) ایجاد میکنید بعد یک EXPORT با دی بی لینک بر روی سرور مقصد میگیرید که این عمل باعث این میشه که فایل شما روی سرور مقصد ایجاد بشه بعد اقدام به IMPORT فایل می کنید.

CREATE PUBLIC DATABASE LINK DBT_LINK
CONNECT TO system IDENTIFIED BY dba1
USING '<TNS_Origin>'

expdp system@<TNS_DEST> directory=DATA_PUMP_DIR LOGFILE=MyExpdp.log network_link=DBT_LINK schemas=MyRemoteDBSchema1,MyRemoteDBSchema2
impdp system@<TNS_DEST> directory=DATA_PUMP_DIR LOGFILE=MyImpdp.log schemas=MyRemoteDBSchema1,MyRemoteDBSchema2

http://www.oracle-wiki.net/startdocshowtousedatapumpoveradatabaselink

۰۳ شهریور ۰۰ ، ۰۷:۴۲ ۰ نظر
مهدی غفاری

نصب و راه‌اندازی اوراکل 20C بر روی Oracle Linux 7

امروز میخوایم نصب و راه‌اندازی اوراکل 20C (نسخه پیش‌نمایش سازمانی) بر روی اوراکل لینوکس ۷ رو جهت آزمایش نحوه نصب با هم انجام بدیم.

نسخه سیستم‌عامل محیط تست من Oracle Linux 7.5 و دیتابیس من LINUX.X64_200000_db_home نسخه پیش‌نمایش هستش

منابعی که من برای این نصب در نظر گرفتم با توجه به نوع نصب ۱۰۰ گیگ دیسک مجازی و ۸ گیگ رم بر روی پلتفرم VMware Workstation هستش

نصب لینوکس به صورت مینیمال انجام میشه (اگر در محیطهای عملیاتی قرار دارید پیشنهاد میشه نصب سیستم‌عامل توسط تیم پشتیبانی سیستم‌عامل صورت بگیره)

بعد از نصب سیستم‌عامل مراحل زیر را دنبال کنید

ویرایش فایل هاست

فایل /etc/hosts رو با توجه به محیط خودتون درست کنید:

[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.56.107 localhost localhost.localdomain

و همچنین فایل /etc/hostname:

[root@localhost ~]# cat /etc/hostname
localhost.localdomain

نصب اتوماتیک

من برای نصب از پکیج oracle-database-preinstall-19c به دلیل اینکه هنوز پکیج 20C در دسترس قرار نگرفته استفاده میکنم. نکته خوبی که در اینجا باید بهش اشاره کنم اینه که دیگه شما وابسه به سیستم‌عامل اوراکل لینوکس برای نصب این پکیج نیستید و می‌تونید این پکیج رو به شکل مستقیم از لینک زیر دانلود کنید و به راحتی اون رو روی ردهت/ سنت او اس نصب کنید تا کارهای مقدماتی برای نصب اوراکل انجام بشه:

# yum install -y https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm

با توجه به اینکه این پکیج خیلی از تنظیمات مورد نیاز رو به شکل نسبتا مناسبی انجام میده من برای این نصب نیازی به تغییر این پیکربندی‌ها نمی‌بینم ولی اگه شما در یک محیط عملیاتی حساس هستید حتما جهت مشاوره با من تماس بگیرید تا بهترین راهنمایی در محیط خود را داشته باشید.

کارهای تکمیلی

توجه کنید ما در یک محیط آزمایشگاهی هستیم پس از این دستورالعمل در محیط عملیاتی استفاده نکنید.

 

تغییر پسورد کاربر اوراکل

passwd oracle

تغییر حالت selinux

cat /etc/selinux/config
SELINUX=permissive
# setenforce Permissive

غیرفعال کردن فایروال

# systemctl stop firewalld
# systemctl disable firewalld

ساخت دایرکتوری‌های مورد نیاز

mkdir -p /u01/app/oracle/product/20.0.0/dbhome_1
mkdir -p /u02/oradata
chown -R oracle:oinstall /u01 /u02
chmod -R 775 /u01 /u02

تنظیم بش پروفایل کاربر اوراکل

mkdir /home/oracle/scripts
[oracle@localhost ~]$ cat /home/oracle/scripts/setEnv.sh
# Oracle Settings
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_HOSTNAME=localhost.localdomain
export ORACLE_UNQNAME=cdb1
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/20.0.0/dbhome_1
export ORA_INVENTORY=/u01/app/oraInventory
export ORACLE_SID=cdb1
export PDB_NAME=pdb1
export DATA_DIR=/u02/oradata
export PATH=/usr/sbin:/usr/local/bin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
cat .bash_profile
# Oracle Settings
#. /home/oracle/scripts/setEnv.sh

ایجاد اسکریپت برای روشن و خاموش کردن صحیح دیتابیس

cat > /home/oracle/scripts/start_all.sh <<EOF
#!/bin/bash
. /home/oracle/scripts/setEnv.sh

export ORAENV_ASK=NO
. oraenv
export ORAENV_ASK=YES

dbstart \$ORACLE_HOME
EOF


cat > /home/oracle/scripts/stop_all.sh <<EOF
#!/bin/bash
. /home/oracle/scripts/setEnv.sh

export ORAENV_ASK=NO
. oraenv
export ORAENV_ASK=YES

dbshut \$ORACLE_HOME
EOF

chown -R oracle:oinstall /home/oracle/scripts
chmod u+x /home/oracle/scripts/*.sh

شروع نصب

خب از اینجا می‌تونید از ویزارد نصاب استفاده کنید یا از حالت سایلنت ادامه کار رو پیگیری کنید. من تو این نصب از ویزارد استفاده میکنم.

به فولدر ORACLE_HOME تغییر جهت میدیم و نصاب رو اجرا میکنیم

[oracle@localhost ~]$ cd $ORACLE_HOME
[oracle@localhost ~]$ unzip -oq /home/oracle/LINUX.X64_200000_db_home.zip

مرحله اول

تو این مرحله گزینه set up software only رو انتخاب میکنیم.

نکته بسیار جالب داستان اینجاست که چون ما در حال نصب نسخه preview هستیم صفحه مربوط به وارد کردن ایمیل پشتیبانی ظاهر نمیگردد.

مرحله دوم

در این مرحله گزینه اول که مرتبط با نصب یک single instance هست رو انتخاب می‌کنیم:

مرحله سوم

من چون در حال برنامه تست فیچرهای EE هستم نسخه EE رو انتخاب می‌کنم:

مرحله چهارم تا آخر

حالا اسکریپتهای داده شده رو با کاربر root اجرا می‌کنیم:

اتمام نصب نرم‌افزار

۲۴ مهر ۹۹ ، ۱۸:۵۸ ۰ نظر
مهدی غفاری

پیش نمایشی از نسخه 20C دیتابیس اوراکل

اگه در جریان خبرهای دنیای اوراکل باشید قطعا از در راه بودن نسخه 20C دیتابیس اوراکل اطلاعات کافی دارید یکی از نسخه هایی که با ایده‌های جدید و نوآورانه وارد کار شده و مثل همیشه در دنیای دیتابیس ها یکه تازی می‌کنه.

از اوراکل 12C ورژن 12.1.0.2 کمپانی اعلام کرد معماری non-CDB در حال منسوخ شدن (deprecated) است و در نسخه 20C دیگر ما شاهد معماری non-CDB نیستیم، این یعنی نسخه 19C آخرین نسخه با معماری non-CDB است. توصیه من به همه سایت‌های اوراکلی در داخل و خارج این هستش که برای کمتر سوپرایز شدن در اسرع وقت از معماری CDB استفاده کنند. نکته خوب ماجرا اینه که از نسخه 19C شما می تونید بدون پرداخت هزینه لایسنس Multitenant به این ویژگی با محدودیت حداکثر ۳ pdb دسترسی داشته باشید.

همونطور که می‌دونید یکی از نسخه‌ها که با پشتیبانی بلند مدت (long term support) انتشار یافته است نسخه 19C تا انتهای سال ۲۰۲۶ است و البته مشخص نیست نسخه بعدی با پشتیبانی بلند مدت (long term support) کدوم نسخه و در چه زمانی است.

حالا نسخه 20C دیتابیس اوراکل مدتی هست اومده ولی در حال حاضر در دسترس عموم قرار نگرفته، تاریخ عرضه نسخه 20C جهت دسترسی عموم هنوز به شکل دقیق مشخص نشده ولی گفته شده در یکی از ماه‌های سال ۲۰۲۰ این نسخه انتشار پیدا میکنه. نسخه فعلی در مرحله preview قرار داره و به صورت محدود در اختیار تست قرار گرفته است و ابداً برای محیط عملیاتی قابل استفاده نیست.

نقل قول از تیم اوراکل:

Oracle Database 20c is available only for preview. It is not available for production use. Upgrades to or from Oracle Database 20c are not supported.

جهت تست نسخه‌ای برای من (برای پلتفرم لینوکس) ارسال شده در این مطلب می‌خواهیم با هم به ویژگی‌های جدید این نسخه سری بزنیم (نسخه ای که برای بنده ارسال شده فاقد نرم افزار grid است.)

همیشه بهترین منبع یادگیری سایت رسمی اوراکل هستش پس ازش غفلت نکنید:

https://docs.oracle.com/en/database/oracle/oracle-database/20/index.html

برای اینکه ببینیم چه ویژگی‌هایی در این نسخه پشتیبانی شده یا پشتیبانی اون‌ها تموم شده باید سری به لینک زیر بزنید:

https://apex.oracle.com/database-features

ویژگی‌های جدید این نسخه موراد بسیار زیادی هستش که می‌تونید همه اونها رو در مستند زیر مطالعه کنید به این علت که من باید تمام این ویژگی‌ها رو  در یک بازه زمانی کوتاه تست کنم شاید نتونم تمام این ویژگی‌ها رو مستند کنم البته تمام سعی‌ام رو میکنم مهمترین مواردشون رو در این ویلاگ مستند کنم.

دریافت
حجم: 1.21 مگابایت

 

به نظر من چندتا از این ویژگی‌های جذاب میتونه موارد زیر باشه:

Oracle Database Utilities

-- Oracle Data Pump Includes and Excludes in the Same Operation

-- Oracle Data Pump Parallelizes Transportable Tablespace Metadata Operations

-- Oracle Data Pump Provides Optional Index Compression

-- Oracle SQL*Loader Supports Native JSON Data Type

Oracle Multitenant

-- MAX_IDLE_BLOCKER_TIME Parameter

-- Expanded Syntax for PDB Application Synchronization

Security Solutions

-- SYSLOG Destination for Common Unified Audit Policies

-- Unified Audit Policies Enforced on the Current User

-- Auditing for Oracle XML DB HTTP and FTP Services

-- Oracle Blockchain Table

Oracle Advanced Security

-- Ability to Set the Default Tablespace Encryption Algorithm

-- Enhanced Database Availability with Zero Downtime to Switch Over to an Updated PKCS#11 Library

SQL

-- SQL Macros

-- Expression Support for Initialization Parameters

-- Enhanced SQL Set Operators

Upgrades and Migration

-- Oracle Database Automates Database Upgrades with AutoUpgrade

 

برای آپگرید به این نسخه هنوز طرحی از طرف اوراکل ارائه نشده اما پیشنهاد میکنم آپگرید مستقیم به نسخه 19C رو تا فرصت از پیش نرفته از دست ندید.

 

اگه با توجه به جدول بالا در حال حاضر قادر به ارتقای مستقیم نیستید حتما در مرحله اول patch کنید و یا از روشهای زیر استفاده کنید:

-- از طریق دستورات dbupgrade یا دستور جدید autoupgrade یا ویزارد DBUA

-- انتقال TBSها از طریق ویژگی full transportable یا traditional TTS

-- استفاده از DataPump و انتقال فایل با شبکه یا از طریق db link

 

خب اگه برای آپگرید آماده‌اید و در محیط‌های پیچیده که نیازمند دقت و دانش بالا جهت آپگرید بی دردسر است قرار دارید تیم ما میتونه به عنوان مشاور در کنار شما باشه. ما می‌تونیم:

 

-- آپگرید ۱ تا ۱۰۰ دیتابیس رو به شکل همزمان از A تا Z بدون مشکل انجام بدیم.

-- ما می‌تونیم طرح آپگرید رو برای شما آماده کنیم و فیچرهای جدیدی که می‌تونید در سایت خود داشته باشید رو بهتون اعلام کنیم.

-- اگه تو مراحل آپگرید نیاز به یک دیتابیس گارد فوری دارید روی ما حساب کنید.

-- انجام انواع سناریو PATH و حل تمام مشکلات ORA-600 سایت شما رو انجام بدیم.

 

 

شاد و پیروز باشید

۲۳ مهر ۹۹ ، ۱۷:۱۳ ۰ نظر
مهدی غفاری

داستان‌های واقعی: حل مشکل اجرا نشدن جاب های اتوماتیک PDB

هر نسخه ای از دیتابیس شامل بهبودها و ویژگی‌های جدید بسیار زیادی است که همین موضوع همیشه اشتیاق من رو برای نگهداری بهتر سرویس دیتابیس بالا نگه میداره

در کنار تمام بهبودها و ویژگی‌های جدید جذاب و پر زرق و برق باید یادمون بمونه که هر نرم‌افزاری باگ داره مهم نیست اون نرم‌افزار توسط چه تیم یا کمپانی مدیریت شده باشه همیشه یادمون باشه جا برای داشتن باگ وجود داره

همیشه برای من دیتابیس و کارم مثل بچه ام بوده پس کوچکترین باگی رو اگه ببینم از حل موضوع کنار نخواهم اومد.

همونطور که قبلا نوشتم من از یک کلاستر ۳ نود همراه با ۴ دیتا گارد اکتیو پشتیبانی می‌کنم. زیرساخت من از گرید ۱۹.۳ و دیتابیس ام از نسخه ۱۲.۲ تشکیل شده.

داستان این باگ

نزدیک ۴ ماه پیش بود شخصی در گروه پیام داد که به مشکل زیر برخورد کرده

"در ورژن 12c به بالا automatic maintennace task ها رو باید روی CDB فعال کرد یا PDB ضمن اینکه روی PDB جاب Sql Tuning اجرا نمیشه (احتمالا باگ هست)"

موضوع اجرا نشدن جاب SQL Tunning در PDB برای من بسیار جالب بود. 

در بررسی موضوع به دایکومنت زیر اشاره کردیم

Automatic SQL Tuning Advisor Task Does Not Run At PDB Level (Doc ID 2538576.1)

و با توجه به مستند زیر 

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/admin/administering-a-cdb-with-sql-plus.html#GUID-DF42C0D3-8968-4810-9327-9D176337D356

و جمله زیر در این مستند

Automatic SQL Tuning Advisor runs only in the CDB root. See the SQL Tuning Advisor row in this table for information about data collected by Automatic SQL Tuning Advisor.

شاید از نظر هر ادمین دیگه ای بود کار تمام شده در نظر گرفته می‌شد اما برای من نه

از دوستمون آقای Seif که بنده رو از این باگ مطلع کرده بود درخواست کردم دلیل خود را برای این ادعا بیان کند و ایشون به باگ زیر اشاره کردند

Bug 29853847 : AUTOTASK JOBS NOT RUNNING ON 12.2.0.1 FOR PDB

این باگ با یک دستورالعمل دیاگ مشخص در پی اثبات این موضوع است که جابهای اتوماتیک پیش فرض اوراکل

در سطح pdb شروع می‌شوند اما واقعا اجرا نمی‌شوند.

پس با این دیاگ مشخصا یک باگ در اوراکل برای نسخه ۱۲.۲ ثبت شده است

بعد از واضح شدن این موضوع برای من شروع به آنالیز در محیطهای تست و عملیاتی خودم کردم و با تعجب این مشکل را در نسخه ۱۲.۲ با آخرین PSU در محیطهای خودم مشاهده نکردم همچنین توضیحات زیر در صفحه باگ من رو برای بررسی بیشتر کار بیشتر و بیشتر علاقه مند میکرد. پس برای بررسی بیشتر کار ادامه دادم:

در ادامه بررسی متوجه شدم باگ شماره 29853847 با باگ 23296836 مشابه است پس قاعدتا باگ 29853847 بسته شده - در حقیقت باگ 29853847 به خاطر باگ 23296836 ایجاد میگردد پس بیس این باگ برابر باگ 23296836 است.

تو صفحه باگ 23296836 عنوان شده که ورژن‌های زیر تحت تاثیر این باگ قرار دارند

همونطور که می‌بینید این باگ تنها در نسخه 20.1.0 و 19.4.0.0.190716 حل شده ولی چرا این مشکل اصلا به وجود میاد؟

در توضیحات اومده: برای پردازش PL/SQL notification ها صفهای AQ's Classic با جابهای DBMS Scheduler و با اسامی AQ$_PLSQL_NTFN_<TIMESTAMP> ثبت میشوند. هنگامی که مقدار پارامتر job_queue_process روی عددهای کم مثل ۱۰ پیکربندی می‌شه، ممکنه هیچ یک از کارهای AQ$_PLSQL_NTFN به وضعیت اجرا نرسه و همه اونها در وضعیت ثبت شده (Submitted) باقی بمونه. دلیل این موضوع ممکنه این باشه که ۱۰ تا جاب دیگه در حال اجرا هستش و تمام ۱۰ فضای خالی اشغال شده.
در این سناریو، اسلیوهای EMON که جابهای AQ$_PLSQL_NTFN رو ثبت می‌کنند، اطلاع ندارند که جابهای AQ Notification ثبت شده اند یا نه. در نتیجه، آنها به ثبت جابهای جدید ادامه می‌دهند گرچه تمام آنها در وضعیت Submitted می‌مانند. و ظرف مدت چند ساعت ما مشاهده میکنیم که هزاران یا میلیون ها جاب AQ$_PLSQL_NTFN_* در dba_scheduler_jobs به صورت submitted قرار دارند.

موضوع برای من بسیار جالب شد پس پارامتر job_queue_process را در محیط زیر برابر ۱۰ قرار دادم و موضوع را بررسی کردم

Database Apr 2020 Release Update : 12.2.0.1.200414

همونطور که فکر میکردم مشکل وجود داشت پس مشکل را با تست کیس‌ها و آنالیزهای متفاوت به اوراکل گزارش دادم.

بعد از ایجاد درخواست و پیگیری های فراوان در مرحله توسعه و تست بعد از ۴ ماه دیشب پچ اون برای نسخه 12.2.0.1.200414 در دسترس قرار گرفت.

لازم به ذکره پچ اصلی ۱۹ روز پیش برای نسخه 12.1.0.2.0 در دسترس قرار گرفته بود

در نهایت اگر دنبال ادمین و یا مشاور با انگیزه برای پروژه‌های خود هستید می‌تونید اطلاعات تماس بنده رو از لینک تماس با من پیدا کنید.

همچنین من مشتاقانه از پیشنهادات کاری به صورت job offer در شرکتهای اروپایی استقبال میکنم.

۲۵ شهریور ۹۹ ، ۱۶:۰۸ ۰ نظر
مهدی غفاری

خطای ORA-39232: invalid remap function: C

مدتی میگذره که از من درخواست کرده بودند دیتای برخی جداول رو Mask کنم. تو بین سولوشن‌های اوراکل ۲ تا سولوشن نظر من رو به خودش جلب کرد.

سولوشن اول

استفاده از OEM

توجه کنید شما برای استفاده از این سولوشن نیازمند تهیه لایسنس OEM به صورت جداگانه هستید. توی داکیومنتی که در پایین اشاره کردم اوراکل به صورت کامل این قابلیت OEM رو به همراه مثال توضیح داده همچنین شما می‌تونید از بخش subsetting گذر کنید.

https://docs.oracle.com/database/121/DMKSB/intro.htm#DMKSB-GUID-24B241AF-F77F-46ED-BEAE-3919BF1BBD80

سولوشن دوم

اسفاده از پارامتر کامندی REMAP_DATA در Oracle Data Pump

توی این مطلب به سولوشن دوم می‌پردازیم.

این ویژگی در کامند expdp به شما این امکان رو میده که یک remap فانکشن رو مشخص کنید که مقدار اصلی ستون تهیه شده رو به عنوان منبع ورودی فانکشن در نظر بگیره و مقدار remap شده از فانکشن رو باز گردونه و در فایل dump جایگذاری بکنه. یکی از استفاده‌های رایج از این ویژگی Mask کردن دیتا برای جا به جایی دیتا از یک سیستم عملیاتی به یک محیط توسعه است.

قدم اول ساخت remap فانکشن

من فانکشن زیر رو ایجاد کردم اگه اون رو بهتر کردید حتما ویرایش خودتون رو در کامنت‌ها برای من بفرستید تا اون رو اعمال کنم.

نکته: این فانکشن برای ۴ دیتا تایپ VARCHAR2, NUMBER, FLOAT, BLOB با در نظر گرفتن حروف فارسی نوشته شده. همچنین در دیتاتایپ BLOB صرفاً عملیات پاک سازی دیتا انجام میشه

https://gist.github.com/mghaffari94/53583fcbac03df98c8cb3bca24263e61

CREATE OR REPLACE PACKAGE C##MAHDI_GH.OBFUSCATING IS
     FUNCTION VAR(R IN VARCHAR2) RETURN VARCHAR2;
     FUNCTION NUM(R IN NUMBER) RETURN NUMBER;
     FUNCTION FLO(R IN FLOAT) RETURN FLOAT;
     FUNCTION CLEAR_BLOB(col blob) RETURN BLOB;
  END;
/
=======================================================
CREATE OR REPLACE PACKAGE BODY C##MAHDI_GH.OBFUSCATING
IS
    FUNCTION VAR (R IN VARCHAR2)
        RETURN VARCHAR2
    AS
    BEGIN
        RETURN (TRANSLATE (
                    R,
                    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()_+-=\/ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی',
                    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxضصثیسشبلفغاریبلفثقهتلیاستیذزلیفثهس'));
    END;


    FUNCTION NUM (R IN NUMBER)
        RETURN NUMBER
    AS
        S   NUMBER;
    BEGIN
        S := R * 2 / 1 + 10;

        RETURN (S);
    END;

    FUNCTION FLO (R IN FLOAT)
        RETURN FLOAT
    AS
        S   FLOAT;
    BEGIN
        S := R * 2 / 1 + 10;

        RETURN (S);
    END;

    FUNCTION CLEAR_BLOB (col IN BLOB)
        RETURN BLOB
    AS
        b1   BLOB := EMPTY_BLOB ();
    BEGIN
        RETURN b1;
    END clear_blob;
END;
/

قدم دوم

طبق داکیومنت اوراکل توی مرحله دوم باید به شکل زیر از این فانکشن‌ها برای remap دیتا استفاده کنید:

https://docs.oracle.com/database/121/SUTIL/GUID-B1D13216-93D3-4FFC-A0BB-082E133FD2B9.htm#SUTIL861

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sutil/oracle-data-pump-export-utility.html#GUID-B1D13216-93D3-4FFC-A0BB-082E133FD2B9

REMAP_DATA=[schema.]tablename.column_name:[schema.]pkg.function


یک مثال طبق داکیومنت به این شکل هستش:

REMAP_DATA=HB.USER.FIRST_NAME:C##HB.OBFUSCATING.VAR

حالا شما می‌تونید از این پارامتر در ابزار expdp به شکلی که نیاز دارید استفاده کنید. ۲ روش کلی برای استفاده از پارامترها در expdp وجود داره.

روش اول

به شکل ۱ دستور واحد

[oracle@test par]$ expdp C##HB@pdb directory=backup dumpfile=OBFUSCATING_001.dmp logfile=OBFUSCATING_001.log schemas=HB REMAP_DATA=HB.USER.TITLE:C##HB.OBFUSCATING.VAR

روش دوم

استفاده از پارامتر فایل

[oracle@test par]$ expdp C##HB@pdb directory=backup dumpfile=OBFUSCATING_001.dmp logfile=OBFUSCATING_001.log schemas=test2 parfile=/home/oracle/par/01.par

همونطور که در syntax دستور در داکیومنت مشخص هستش شما باید اسم جدول با اسم ستون هر کدوم از ستونهایی که نیاز دارید Mask بشوند رو در دستور وارد کنید. اینجا اگه تعداد زیادی جدول با ستون داشته باشید ممکنه اذیت بشید.

من برای حل این مشکل یک dynamic query نوشتم که به جز ستون‌های مشخص شده که نباید Mask دیتا بر روی اونها انجام بشه باقی ستون‌ها دستورش نوشته بشه

select x from (select 'REMAP_DATA='||OWNER || '.' || table_name || '.' || COLUMN_NAME || ':C##MAHDI_GH.OBFUSCATING.VAR"' x from all_tab_columns 
where OWNER='HB'
and COLUMN_NAME not in ('ID', 'MOBILE_NUMBER', 'USERNAME', 'USER_ID', 'IS_VERIFIED_MOBILE')
and DATA_TYPE not in ('TIMESTAMP(6)', 'DATE', 'LONG')
and DATA_TYPE = 'VARCHAR2');

اما مشکلی که به اون برخوردم و برای من حل این مشکل بسیار جالب بود و خوشحالم از اینکه وقت این رو دارم با شما به اشتراک بذارم مشکل زیر بودش.

من تمام ستون هایی که میخواستم رو با داینامیک کویری درآوردم و به دستور expdp با روش اول یعنی به شکل یک دستور دادم.

شما می‌تونید به ۲ صورت زیر از این دستور استفاده کنید و اینجا فرقی نداره از کدوم روش استفاده کنید.

REMAP_DATA=HB.USER.TITLE:C##MAHDI_GH.OBFUSCATING.VAR, HB.KEY.NO:C##HB.OBFUSCATING.NUM
REMAP_DATA=HB.USER.TITLE:C##MAHDI_GH.OBFUSCATING.VAR REMAP_DATA=HB.KEY.NO:C##HB.OBFUSCATING.NUM

مساله ای که پیش میاد من بیش از ۱۵۰ ستون رو باید در یک خروجی data pump با هم mask کنم. وقتی این دستورات رو کنار هم بذارید مثلا با ابزاری مانند ++notepad و بخواهید اکسپورت رو اجرا کنید فقط تعداد محدودی از این ورودی ها مورد قبول دستور expdp میگردد. این به دلیل محدودیت ابزار expdp برای قبول ورودی از خط فرمان برای بیشتر از ۱۵۰۰ کاراکتره.

[oracle@test ~]$ expdp HB@pdb directory=backup dumpfile=HB_OBFUSCATING_001.dmp logfile=HB_OBFUSCATING_001.log schemas=HB remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR Export: Release 12.2.0.1.0 - Production on Sun Aug 23 18:55:44 2020Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit ProductionStarting "HB"."SYS_EXPORT_SCHEMA_01":  HB/********@ganjehpdb directory=backup dumpfile=HB_OBFUSCATING_001.dmp logfile=HB_OBFUSCATING_001.log schemas=HB remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR 
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/IDENTITY_COLUMN
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
. . exported "HB"."a"                        1.1 MB   1 rows
. . exported "HB"."b"                 1.1 MB   1 rows
. . exported "HB"."c"                  1.1 MB   1 rows
. . exported "HB"."e"                1.1 MB   1 rows
Master table "HB"."RT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for HB.SYS_EXPORT_SCHEMA_01 is:  /backup/HB_OBFUSCATING_001.dmpJob
"HB"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Aug 23 18:57:15 2020 elapsed 0 00:01:31

به دلیل وجود این محدودیت شما نمی‌تونید از این روش برای mask ستونهای زیاد در یک اکسپورت واحد استفاده کنید. (یک راه حلی که ممکنه در اینجا به ذهن بیاد اینه که از هر جدول به صورت مجزا export تهیه بشه و در نهایت با n تا export اینکار انجام بشه.)

برای همین سراغ روش دوم یعنی فایل پارامتر می‌رویم.

با توجه به داکیومنت اوراکل استفاده از remap_data در پارامتر فایل به شکل زیر امکان پذیر هستش

https://docs.oracle.com/database/121/SUTIL/GUID-B1D13216-93D3-4FFC-A0BB-082E133FD2B9.htm#SUTIL861

[mehdi@test ~]$ cat parmeter.par

REMAP_DATA=datapump_test.test.col_01:datapump_remap_test.toggle_case
REMAP_DATA=datapump_test.test.col_02:datapump_remap_test.toggle_case

اما من وقتی به این شکل فایل پارامتر ام رو می‌ساختم به خطای زیر می‌خوردم:

[root@db1 ~]# cat /home/oracle/parfile08.par
remap_schema=datapump_test.test.col_01:C##MAHDI_GH.OBFUSCATING.VAR
remap_schema=datapump_test.test.col_02:C##MAHDI_GH.OBFUSCATING.VAR
.
.
.

[oracle@db1 ~]$ expdp C##HB@pdb directory=backup dumpfile=OBFUSCATING_001.dmp logfie=/home/oracle/parfile11.par

Export: Release 12.2.0.1.0 - Production on Sun Aug 23 19:17:31 2020
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
ORA-39001: invalid argument value
ORA-39232: invalid remap function: C

بعد از ساختن ۱۲ پارامتر فایل و خواندن API دیتا پامپ، سرچ‌های بسیار و بعد از ۴ ساعت مشکل رو پیدا کردم. به این دلیل که به دست آوردن تجربه بسیار گران است من این تجربه رو با شما به اشتراک میذارم تا شما هم از این تجربه بهره ببرید.

برای حل این مشکل کافیه از علامت دابل کوتیشن " در ابتدا و انتهای دستور remap_data استفاده کنید.

[root@db1 ~]# cat /home/oracle/par/02.par

REMAP_DATA="datapump_test.test.col_01:C##MAHDI_GH.OBFUSCATING.VAR"
REMAP_DATA="datapump_test.test.col_02:C##MAHDI_GH.OBFUSCATING.VAR"
.
.
.

در بین تلاش برای رفع این مشکل و در آخرین لحظات ناامیدی از این پارامتر کامند لاین داشتم می‌رفتم که از یک بلاک PL-SQL و API Data Pump استفاده و کار رو انجام بدم که خوشبختانه راه‌حل مشکل رو کشف کردم.

اطلاعات بیشتر برای نحوه کار با API

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_DATAPUMP.html

و یک مثال کوچک که نوشتم

dbms_datapump.data_remap (handle => dph,
name => 'job',
table_name => test,
column => phone,
function => 'C##MAHDI_GH.OBFUSCATING.NUM',
schema => 'hb');

در نهایت همیشه اکثر مشکلات توسط یک اراده قوی قابل حل هستند. اگر از این مطلب استفاده کردید اون رو به DBA های دیگه هم معرفی کنید و اگه پیشنهاد همکاری برای من داشتید می‌تونید با من در تماس باشید.

 

شاد و خرم باشید

بدرود

۰۲ شهریور ۹۹ ، ۲۲:۲۴ ۰ نظر
مهدی غفاری

بررسی هنگ کردن اوراکل

برای انجام این پروسه میشه از sqlplus  و با استفاده از دستور oradebug  اطلاعاتی را به دست آورد. فرمان oradebug hanganlyze اطلاعاتی را در فایل trace برای بررسی بیشتر ارائه خواهد کرد. روال کلی با استفاده از فرمان های  زیر است:

sqlplus / as sysdba
oradebug setmypid
oradebug unlimit
oradebug hanganlyze 3
oradebug dump ashdumpseconds 30
oradebug dump systemstate 266
oradebug tracefile_name

در مواقع هنگ کامل که با sqlplus / as sysdba به دیتابیس نمی توان متصل شد از سوئیچ زیر استفاده کنید:

sqlplus /nolog
set _prelim on
۲۸ مهر ۹۸ ، ۰۸:۱۰ ۰ نظر
مهدی غفاری

چک کردن سایز دیتابیس اوراکل NonCDB و CDB

می‌خوایم نحوه چک کردن سایز فعلی دیتابیس اوراکل رو برای Non-CDB و CDBها ببینیم. اکثرا این اطلاعات در نرم‌افزارهایی مثل Toad For Oracle به سادگی قابل روئیت هستند اما اگر شما در سایت عملیاتی باشید و دسترسی به ابزار نداشته باشید بهترین راهکار اجرای کوئری در sqlplus هستش.

محیط Non-CDB

چک کردن سایز اشغال شده دیتافایلها در دیسک:

select sum(bytes)/1024/1024 size_in_mb from dba_data_files;

چک کردن تمام فضای استفاده شده توسط سگمنت‌ها:

select sum(bytes)/1024/1024 size_in_mb from dba_segments;

چک کردن سایز اسکیماها در اوراکل:

select owner, sum(bytes)/1024/1024 Size_MB from dba_segments group by owner;

چک کردن فضای آزاد و فضای اشغال شده در دیتابیس:

select
"Reserved_Space(MB)", "Reserved_Space(MB)" - "Free_Space(MB)" "Used_Space(MB)","Free_Space(MB)"
from(
select
(select sum(bytes/(1014*1024)) from dba_data_files) "Reserved_Space(MB)",
(select sum(bytes/(1024*1024)) from dba_free_space) "Free_Space(MB)"
from dual );

چک کردن سایز تمام فایل‌های دیتابیس بعلاوه tempها و redoها:

select
( select sum(bytes)/1024/1024/1024 data_size from dba_data_files ) +
( select nvl(sum(bytes),0)/1024/1024/1024 temp_size from dba_temp_files ) +
( select sum(bytes)/1024/1024/1024 redo_size from sys.v_$log ) +
( select sum(BLOCK_SIZE*FILE_SIZE_BLKS)/1024/1024/1024 controlfile_size from v$controlfile) "Size in GB"
from
dual;

محیط CDB و دیتابیسهای PDB

چک کردن سایز PDB:

select con_id, name, open_mode, total_size from v$pdbs;

چک کردن سایز CDB:

select sum(size)/1024/1024/1024 from cdb_data_files;

منبع

https://smarttechways.com/2018/04/23/check-the-size-of-oracle-database-and-pdbs-database/

۲۰ مهر ۹۸ ، ۱۹:۰۲ ۰ نظر
مهدی غفاری