نصب و راه‌اندازی اوراکل 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 سایت شما رو انجام بدیم.

 

 

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

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

طولانی شدن زمان های GC CR MULTIBLOCK REQUEST

ما یک RAC سه نود رو نگهداری می‌کنیم. به طور معمول کوئری‌های سنگین ما از نظر زمان اجرا خیلی باهم متفاوت هستند. به این علت که حجم دیتای بیزنس ما زیاد و دارای نوسان زیادی است در دیتای ما واریانسهای طبیعی زیادی وجود داره. با این حال خیلی از بلاکهای این نوسانها تا حدی توی حافظه RAC قرار دارند.

من یکسری تست‌ها انجام دادم که یه رخدادی رو به من نشون میده که میتونم اون رو به عنوان یک مشکل غیر منتظره در وبلاگم ثبت کنم.

تسک ما اجرای یک کوئری با چندین join هستش که باعث ایجاد هش جویان های زیادی در سیستم میشه

مشکل ما این بود که تاخیرهای مرتبط با گرفتن دیتا با Full Table Scan از روی دیسک کمتر از گرفتن دیتا از روی شبکه interconnect بود. در حقیقت به این معنی که همه بلوک ها روی node ای قرار می‌گیرند که از همه دورتر است پس wait های GC CR MULTIBLOCK REQUEST به مقدار زیادی بالا بودند.

میانگین waitهای scattered-read من به طور معمول ۸ میلی ثانیه و میانگین waitهای GC CR MULTIBLOCK REQUEST به طور معمول ۲۱ میلی ثانیه بود.

اگر هرکدام از جدول ها توسط یک کوئری از قبل فراخوانی شده بودند، یا کوئری‌های مشابه در همان روز از دیتابیس گرفته شده باشد و در نتیجه اوراکل محتوای جدول را در نود far-side (دورترین نود - نود ۳) قرار داده باشه اونوقت hash joinهای ما ۴۵ دقیقه طول میکشه و توسط wait ما (GC CR MULTIBLOCK REQUEST) محاصره میشه 

حالا اگه هر نود ما alter system flush buffer cache رو اجرا کنه که در نتیجه اتفاق خواندن از دیسک انجام میشه اونوقت همون کوئری وقتی دوباره اجرا بشه ۵ دقیقه طول میکشه و ایندفعه توسط wait ای به نام scattered/sequential read محاصره میشه

خواننده گرامی قبل از ادامه کار شما باید با Cache Fusion در RAC و مفاهیم Past Image و انواع Waitها در RAC آشنایی داشته باشید. سعی میکنم در مقاله ‌های بعدی به این موضوعات بپردازم.

وقتی اوراکل بلوک های درخواست شده رو از نود دور (far-side) به نود نزدیک (near-side) منتقل میکنه با فرض اینکه همه چیز به شکل صحیح پیکربندی شده باشه کلاستر اوراکل از شبکه private استفاده میکنه.

حقیقتاً به نظر من ۲۱ میلی ثانیه خیلی طولانی میاد بیشتر سیستم هایی که من دیدیم یا درباره اونها تحقیق کرده ام خوندن اطلاعاتشون بین ۸ تا ۱۰ میلی ثانیه طول میکشه در کل خوندن بلاک از interconnect باید کمتر از چند میلی ثانیه طول بکشه به عنوان یک اصل کلی این عدد برای سلامت RAC اوراکل بیش از حد مهم و بالاست هستش.

سوالی که برای من پیش میاد اینه که تحت چه شرایطی ممکنه wait یک کوئری با GC CR MULTIBLOCK REQUEST بیشتر از waitهای scattered-read باشه؟ (به عبارت دیگه چرا ممکنه انتقال بلوکها از طریق interconnect بیشتر از انتقال از طریق disk طول بکشه؟)

خب در جواب سوال باید بگم مقایسه بین انتقال اطلاعات در CR global cache بین نودها با خواندن از روی دیسک مثل مقایسه هویج و بادمجون ه.

یادمون باشه تحت خیلی از شرایط ممکنه این مشکل پیش بیاد اول از همه اینکه پیکربندی شبکه برای private امون چیه؟ آیا از اترنت گیگابیت استفاده میکنیم؟ (در کل بهتره از یک شبکه 10G یا Infiniband استفاده کنیم). آیا این شبکه private واقعا private ه یا شخص دیگه ای هم توی شبکه است؟ (در صورت شلوغی این شبکه خود این شبکه ممکنه باعث این چنین مشکلاتی بشه)

اوراکل توصیه میکنه حتما از jumbo frame برای این شبکه استفاده بشه خب با پیگیری های فراوان قبلاً در شبکه ما jumbo frame پیکربندی شده بود و این رخداد به تازگی و بدون تغییر در بیزنس اپلیکیشن رخ داده بود.

خب در ادامه باید بگم اوراکل در انتقال CR Global Cache یک read image واحد درخواست میکنه اونم به خاطر این که یک تراکنش ممکنه یک تغییری در بلوکی که در instance دیگه  وجود داره ایجاد کنه پس ما نیاز به خوندن یک ایمیج واحد داریم

ایمیج برداشته شده از روی دیسک در صورتی که هنوز commit نشده باشه همچنان نیاز داره که با session درخواستی به دیتابیس هماهنگ بشه پس تغییراتی که هنوز commit نشدند باید قبل از اینکه session بتونه ازشون استفاده بکنه rollback بشوند.

در غیر این صورت  ایمیج برداشته شده از روی دیسک یک بلوک current هستش که در این مورد ایمیج همونطور که هست و بوده در اون instance استفاده میشه و در مقیاسه با به دست آوردن ایمیج CR کار کمتری مورد نیازش هست و بار کمتری ایجاد میکنه (چون ایمیج CR باید به صورت منسجم از نودها فراخوانی بشه)

با تمام این توضیحات مشکل رو یا باید در شبکه جستجو میکردم یا در پیکربندی‌های اخیر - با این توضیح که قبلاً چنین مشکلی وجود نداشت و تست‌های انجام شده بر روی شبکه مشکلی رو نشون نمیداد سراغ پارامتر UNDO_RETENTION رفتم

یک توضیحی باید بدم که من برای گرفتن export از یکی از جداولمون که سایز بسیار زیادی داره (بیش از ۳ ترابایت) این پارامتر رو روی ۷ روز تنظیم کرده بودم

خب وقتی به یاد این پارامتر افتادم فهمیدم مشکل کجاست چون همین پارامتر قطعاً در رفتار کلاستر تفاوت ایجاد میکنه - مقدار من برابر ۷ روز بود پس دیتاها توی اینتنس ۱ لود شده و برای مدت طولانی در آینده گرفته میشوند اگه یک کوئری توی اینستنس ۲ اجرا بشه اوراکل ممکنه تصمیم بگیره که نیاز به یک read image منسجم داره ... خب همونطور که میدونید بازسازی مجدد بلاک مقداری زمان میبره به ویژه اگه حجم عظیمی از تغییرات در undo وجود داشته باشند چیزی که گیج کننده بود اینه که تراکنشی که تغییر رو ایجاد کرده باید تا الان وضعیت اش مشخص شده باشه پس به جای بلوک CR باید یک بلوک current درخواست میکرد ولی از اونجایی که بلوک CR به دفعات درخواست شده بود این موضوع نشون میده که تغییرات جداول مرتبط هنوز commit نشده بودند.

در نهایت با پایین آوردن مقدار این پارامتر به عدد دیفالت (۹۰۰) یا همون ۱۵ دقیقه این مشکل رو حل کردم.

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

خطای 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 های دیگه هم معرفی کنید و اگه پیشنهاد همکاری برای من داشتید می‌تونید با من در تماس باشید.

 

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

بدرود

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

فراموشی URL در Anyconnect نسخه مک

یه مشکل اذیت کننده توی Anyconnect نسخه ۴.۶ مک این ه که هربار URL جدید وارد می‌کنید بعد از بستن برنامه و باز کردن مجدد آن این URL فراموش میشه و آدرس قدیمی به کاربر نشان داده میشه

کافیه به مسیر زیر برید و فایل profile.xml را باز کنید

sudo vim /opt/cisco/anyconnect/profile/profile.xml

و حالا بخش زیر رو ویرایش کنید

        <ServerList>
                <HostEntry>
                    <HostName>C.20DNSC.IN</HostName>
                    <HostAddress>C.20DNSC.IN</HostAddress>
                </HostEntry>
        </ServerList>

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

نحوه خارج شدن از telnet در لینوکس

شاید برای شما هم اتفاق افتاده باشه که در telnet client لینوکس بعد از اتصال موفق به ftp گیر کرده باشید!

[oracle@pydev ~]$ telnet 172.30.23.26 21
Trying 172.30.23.26...
Connected to 172.30.23.26.
Escape character is '^]'.
220 Microsoft FTP Service

در این مواقع ctrl+c یا ctrl+z نیز ما رو از محیط این برنامه خارج نمیکنند!

[oracle@pydev ~]$ telnet 172.30.23.26 21
Trying 172.30.23.26...
Connected to 172.30.23.26.
Escape character is '^]'.
220 Microsoft FTP Service

^C
^C
^C
^C
^Z

در این مواقع شما یا باید منتظر شوید تا سرور ftp شما رو بیرون کند

Connection closed by foreign host.

یا با استفاده از دکمه ctrl+] (کنترل + براکت بسته) و سپس اینتر وارد خط لاین telnet شوید و با q از محیط ftp client لینوکس خارج شوید.

[oracle@pydev ~]$ telnet 172.30.23.26 21
Trying 172.30.23.26...
Connected to 172.30.23.26.
Escape character is '^]'.
220 Microsoft FTP Service

^]

telnet> q
Connection closed.
[oracle@pydev ~]$
۱۸ آبان ۹۸ ، ۲۰:۵۹ ۰ نظر
مهدی غفاری

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

برای انجام این پروسه میشه از 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/

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

داکرفایل OracleInstantClient

پروژه شما نیاز به ارتباط با دیتابیس اوراکل داره و شما نیاز به نصب Oracle Client دارید. اینجا دیگه نباید از ایمیج alpine استفاده کنید (توضیحات بیشتر) بلکه باید از ایمیج oracle linux slime که اوراکل ارائه داده استفاده کنید. داکر فایل قرار داده شده در ریپازیتوری زیر به ما در ایجاد داکر فایل شخصی خودمون کمک خواهد کرد:

https://github.com/oracle/docker-images/tree/master/OracleInstantClient

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

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

FROM oraclelinux:7-slim

ARG release=19
ARG update=3
# define the directory to work in
WORKDIR /code
# copy the requirements.txt file to the work directory
COPY requirements.txt .

RUN yum -y install oracle-release-el7 && yum-config-manager --enable ol7_oracle_instantclient && \
yum -y install oracle-instantclient${release}.${update}-basic oracle-instantclient${release}.${update}-devel oracle-instantclient${release}.${update}-sqlplus && \
rm -rf /var/cache/yum && \
yum -y install oracle-epel-release-el7 && \
yum -y install python36 && \
yum -y install vim sudo && \
ln -fs /usr/bin/python3 /usr/bin/python && \
python3 -m pip install --no-cache-dir -r requirements.txt

# Optional Oracle Network or Oracle client configuration files can be
# copied to the default configuration file directory. These files
# include tnsnames.ora, sqlnet.ora, oraaccess.xml and cwallet.sso.
# For example:
# COPY wallet/* /usr/lib/oracle/${release}.${update}/client64/lib/network/admin

# Uncomment if the tools package is added
# ENV PATH=$PATH:/usr/lib/oracle/${release}.${update}/client64/bin

# Copy rest of the source code
COPY src/ src/
# EXPOSE the needed ports, for example 8080
EXPOSE 8080
# Running Command or Entry Point
CMD python src/app.py
CMD tail -f /dev/null
۰۵ مهر ۹۸ ، ۱۱:۵۸ ۰ نظر
مهدی غفاری

بیلد یک پروژه کوچیک با استفاده از داکر ایمیج پایتون

اول از همه چیز باید هدف داکر یادمون باشه، سلامت یک پروژه با حداقل بسته‌های وابستگی! پس برای پروژه نرم‌افزاری خودتون تا جایی که می‌تونید حداقل پابستگی‌ها را در فایل Requirements.txt مشخص کنید.

با کم کردن حجم شما برای خودتون بهترین رویکرد در deploy رو با کم کردن حجم دانلودها، حجم push ها به سرور عملیاتی رو ایجاد کردید. پس این نکات وقتی دارید داکر ایمیج ایجاد می‌کنید توی ذهنتون باشه.

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