سیستمعامل انتخابی ما OEL 6.6 است که فایل ISO اش رو دانلود کردیم و در هارد داریم
از منوی file گزینهی new virtual machine رو انتخاب میکنیم و نصب رو به صورت typical ادامه میدیم
سیستمعامل انتخابی ما OEL 6.6 است که فایل ISO اش رو دانلود کردیم و در هارد داریم
از منوی file گزینهی new virtual machine رو انتخاب میکنیم و نصب رو به صورت typical ادامه میدیم
ما برای اینکه اوراکل رو روی لینوکس نصب کنیم یک فضایی برای سیستمعامل و نرمافزارهای grid, oracle و یک فضایی هم برای asm نیاز داریم چون ما میخوایم دیتابیس رو روی asm بیاریم بالا
حداقل فضایی که برای سیستمعامل باید در نظر بگیرید ۲۰ گیگابایت است (۳۰ به بالا بهتر است)
۲۰ گیگ برای دیسک اصلی asm
۱۰ گیگ برای دیسک FRA
پس نزدیک ۵۰ گیگ به عنوان حداقل فضاتون نیاز دارید
بعد برای اینکه اوراکل درست نصب بشه حداقل ۲ گیگ رم نیاز دارید
همچنین نیاز به 4 core سیپیپو داریم
داشتم فکر میکردم که آیا راهی وجود داره که بشه آخرین رکورد از جدول رو بدست آورد. در این مورد مشخص و واضحه که از تعداد رکوردهای موجود در یک جدول بی اطلاعام. فقط میخوام کوئری بنویسم که بتونه تمام ستونهای آخرین رکورد رو بدست بیاره. من سعی کردم از ROWNUM استفاده کنم، اما حدس میزنم که شیوه کار اینطور نیست. اگر یک گزارشی ایجاد کنم، میخوام که گزارشام بر پایهی کوئری باشه که به سادگی تمام ستونهای آخرین رکورد رو بدست بیاره.
آیا دستوری وجود داره که بشه باهاش آخرین رکورد از جدول رو بدست آورد؟
با تشکر
حسن
میدونی که آخرین رکورد درج شده در جدول میتونه اولین رکوردی باشه که توسط “select * from t” بازگشت داده میشه یا ممکنه صدمی باشه، ممکنه هزارمی باشه، در واقع میتونه هر رکوردای باشد.
یادت باشه رکوردها در هیچ ترتیب خاصی ذخیره و بازگردونی نمیشن.
ولی اگه آخرین رکورد درج شده را میخوای، باید یک فیلد timestamp یا sequence ای برای هر رکوردای که درج میشه موقع درج رکورد مشخص کنی اینجوری «آخرین» رکورد رو میتونی داشته باشی یادت باشه این تنها راه است.
یادت باشه تنها راه برای انجام این کار اینه که ستونی داشته باشی که بتونی مرتبش کنی تا «آخرین» رکورد رو پیدا کنی.
ROWID و ROWNUM به دلایل زیر کار نمیکنند:
ROWID کار نمیکنه. چون دادهاش بر پایهی ترکیبی از شماره file/block/slot سرور فعلی است. یادت باشه ما از ROWID ها دوباره استفاده میکنیم، حتی میتونیم تغییرشون بدیم (مثلا با پارتیشنبندی جداول). پس ممکنه که Extent شمارهی 1 رو در فایل 55 و Extent شمارهی 2 رو در فایل 2 داشته باشید. Extent 4 حتی ممکنه در بلاک 555 از فایل 3 باشه، حتی ممکنه Extent 5 در بلاک 2 از فایل 3 باشه. ROWIDها قابل مرتب کردن نیستند.
ROWNUM هم کار نمیکنه چون یک ستون منطقیه(در جدول درج نشده) و با هر SELECT شماره ردیف رکوردهای SELECT مربوط رو برمیگردونه
همانطور که میدونید مرتبسازی حروف فارسی در دیتابیس اوراکل بصورت صحیح انجام نمیشه. حال بوسیله statement زیر میتونید در دیتابیس اوراکل عمل مرتبسازی بر روی اطلاعات فارسی را انجام بدید. شما فقط باید نام جدول و فیلدی را که نیاز دارید مرتب شود را جایگزین کنید.
SELECT
NAME ,FAMILY
FROM EMP
ORDER BY TRANSLATE(LTRIM(RTRIM(FAMILY)),'پچحخدذرزژسشصضطظعغگو','ةحخدذرزسشصض×طظعغـàه')
نکته: در صورتیکه برای کارکتر 'ک' از کد اسکی 123 استفاده شده باشد آن کلمه ای که با این کارکتر باشد باید در مرتبسازی در ابتدا آورده میشود. برای تصحیح کردن میتونید بصورت زیر عمل کنید.
SELECT
NAME ,FAMILY
FROM EMP
ORDER BY TRANSLATE(LTRIM(RTRIM(replace(FAMILY,chr(152),chr(223)))),'پچحخدذرزژسشصضطظعغگو','ةحخدذرزسشصض×طظعغـàه')
یه مشکلی که امروز برای یکی از دیتابیسهام پیش اومد این بود که درایو undo tablespaceام یکهو unmount شد و دیتابیس shutdown abortشد.
(دیتابیس مورد بحث SI با FS)
Details
The instance has been terminated by a database process because of a fatal internal condition, or a critical background process was killed by the user.
Logwriter is unable to write to any member of the log group because of an IO error.
Archiver is unable to archive a redo log because the output device is full or unavailable.
Agent Connection to Instance
Status
Failed Details ORA-12505: TNS:listener does not currently know of SID given in connect descriptor (DBD ERROR: OCIServerAttach)
اولین کاری که باید بکنید بالا آوردن دیتابیس تو حالت mountه
بعد با دستور زیر undo_management اتون رو روی حالت manual بذارید
alter system set undo_management = manual scope=spfile;
چون undo tablespaceامون صدمه دیده و اوراکل نمیتونه به دیتافایلهاش دسترسی داشته باشه باید یک undo tablespace دیگه ایجاد کنیم و default رو روی این tablespace بذاریم
create undo tablespace undotbs2 datafile '/oradata/undotbs110.dbf' size 10g autoextend on next 50m;
بعد از ساخت undo tablespace باید دیتابیس رو shutdown کنید اگر با حالت immediate موفق به shutdown نشد abort کنید
نکته: اگه نیاز بود datafileهای مشکلدار undo رو offline کنید
alter database datafile 20 online;
حالا یک pfile از روی spfileاتون بسازید و مقدار undo_tablespace رو به tablespace جدید مقدار بدید
دیتابیس رو startup کنید و undo_managment رو روی mode auto بذارید
alter system set undo_management = auto scope=spfile;
حالا یک spfile از روی pfileاتون بسازید و دیتابیس رو خاموش و روشن کنید
همچنین دیتایکشنریهای زیر برای مانیتور کردن وضعیت مشکلات خیلی کمک میکنه:
select file#,status from v$datafile;
select tablespace_name, sum((bytes/1024)/1024) free from dba_free_space group by tablespace_name;
select tablespace_name,status from dba_tablespaces;
select tablespace_name from dba_tablespaces;
نکته: اگه datafileهای undo قدیمیتون احتیاج به recover داشت حق دارید recoverاشون کنید ولی در مورد باقی datafileها به هیچ عنوان حق recover ندارید(چون با ctlfileهاتون تداخل ایجاد میشه - recover کردن undo هم به این دلیل مشکلی نداره چون دیتای undo رو نیازی نداریم)
نکته۲: قبل از ساختن spfile حتما با pfile نتیجه رو امتحان منید و بعد اگه خواستید spfileاش کنید حتما از قبلی یه backup بگیرید
منابع:
به مثال زیر دقت کنید:
Create database link myTestlink connect to system identified by 123 using 'orcl2';
خب حالا هر زمان ما از عبارت myTestlink استفاده کنیم دیتابیس اوراکل با یوزر system و پسورد 123 وصل میشه به دیتابیس orcl2
نکته: اگر مخزن در سرور localhost نیست مخزن را به صورت orcl2_computername وارد کنید. مثال: orcl2_localhost به مخزن orcl2 در همین کامپیوتر اشاره دارد. همچنین میتوانید به جای اسم سرور از ip سرور نیز استفاده کنید.
بعد از ساخت Database link میتوان گفت:
Select * from dual@myTestlink;
برای حذف Database Link میتوانید به صورت زیر عمل کنید:
drop database link myTestlink;
همیشه یادتون باشه وقتی Export میگیرید از ورژن بالا به پایین در برخی موارد خاص ممکنه به مشکل بخورید ولی باز هم میتونید Export رو انجام بدید.
من خودم از 12 اکسپورت بردم رو 11 از 11 بردم رو 10 و مشکل خاصی نداشتم.
معمولاً بیشترین مشکلی که در Export روی ورژنهای مختلف موجوده SPها هستن چون مثلاً یه SP تو 12 بوده و بعد موقع بازیابی روی مثلاً 10g چون اون SP وجود نداره SPها برنمیگردن البته بازیابی انجام میشه ولی همه SPها از کار افتادن، در این مواقع میتوان SPها رو دوباره نوشت و کامپایل کرد.
با استفاده از دستور expdp میتوان عملیات exportگیری به روش Data Pump را شروع کرد، به مثال زیر دقت کنید:
C:\Users\Mahdi>expdp
Export: Release 12.1.0.1.0 - Production on Sat Aug 1 16:58:44 2015
Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.
Username: test
Password:
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit
Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing opt
ions
Starting "TEST"."SYS_EXPORT_SCHEMA_01": test/********
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 64 KB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
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
. . exported "TEST"."T1" 5.484 KB 3 rows
Master table "TEST"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for TEST.SYS_EXPORT_SCHEMA_01 is:
E:\APP\ORACLE\ADMIN\ORCL\DPDUMP\EXPDAT.DMP
Job "TEST"."SYS_EXPORT_SCHEMA_01" successfully completed at Sat Aug 1 17:00:20 2
015 elapsed 0 00:00:56
C:\Users\Mahdi>
خب همانطور که میبیندی بعد از ورود دستور expdp فقط کافی است اطلاعات اکانتی که میخواهید از آن بکآپ بگیرید را وارد کنید. بعد از وارد کردن اطلاعات اکانت به طور خودکار بکآپ گیری از جداول و رولهای یوزر شروع شده و در آخر مسیر ذخیره فایل نمایش داده میشود.
برای بازیابی اطلاعات از فایل بکآپ ابتدا یوزر موردنظر را از سطح دیتابیس پاک میکنیم سپس اقدام به بازیابی میکنیم:
SQL> drop user test cascade;
User dropped.
حال از دستور impdp برای بازیابی اطلاعات از روی فایل بکآپ Data Pump استفاده میکنیم:
C:\Users\Mahdi>impdp
Import: Release 12.1.0.1.0 - Production on Sat Aug 1 17:19:08 2015
Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.
Username: system
Password:
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit
Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing opt
ions
Master table "SYSTEM"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_FULL_01": system/********
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "TEST"."T1" 5.484 KB 3 rows
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "SYSTEM"."SYS_IMPORT_FULL_01" successfully completed at Sat Aug 1 17:19:36 2
015 elapsed 0 00:00:16
نکته: موقع بازیابی با Data Pump به طور خودکار user برمیگرده و نیازی به ایجاد user مانند حالت classic export نیست.
نکته: به طور معمول در سازمانها(بسته به سیاست بکآپ گیری سازمان متغیر خواهد بود) هفتهای یکبار Data Pump Export انجام میشود و روزانه یکبار بکآپ با RMAN
SQL> select * from test.t1;
ID NAME
---------- --------------------
1 mahdi
2 mohsen
2 mohammad
نکته: impdp از همان مسیری که به صورت پیشفرض expdp بکآپ را گرفته بازیابی اطلاعات را انجام میدهد. اگر شما بخواهید از Export گرفته شده در سرور دیگری استفاده کنید باید دقیقاً فایل بکآپ را در مسیر پیشفرض Data Pump قرار دهید تا impdp بتواند بازیابی را انجام دهد.
نکته: میتوان با تنظیم یک Environment variable مسیر پیشفرض impdp را برای بازیابی و یا موقع بکآپ برای expdp تغییر داد. ولی به صورت پیشفرض از ROOT اوراکل برای بکآپ و بازیابی استفاده میکنند.(اطلاعات بیشتر)
از ورژن 10g ابزاری به اوراکل اضافه شد به نام Data Pump Export وظیفه این ابزار این بود که به جای Exp که یه عمل بسیار کندیه برای Exportگیری از دیتابیس عمل Expگیری رو سریعتر انجام بده و اصطلاحاً dynamic buffer است
نکته: Classic Exp به صورت static buffer عمل میکند، یعنی در حین انجام عملیات Exportگیری بافرش تغییر نمیکنه و از یک بافر ثابت استفاده میکنه پس اگر بافر رو زیاد بدید عمل Exportگیری سریع انجام میشه اما اگه transaction زیاد موقع Exportگیری روی دیتابیس بیوفته دیتابیس کرش میکنه و اگر بافر رو کم بدید موقع transaction زیاد دیتابیس کرش نمیکنه ولی عمل Exportگیری ممکنه چندین روز طول بکشه
پس راهحل استفاده از Data Pump است که به صورت dynamic buffer عمل میکنه.
خب در حقیقت با exportگیری کل structure دیتابیس رو انتقال میدهیم یعنی میتوانیم کل structure یک دیتابیس را از یک سرور به یک سرور دیگه به صورت کامل انتقال دهیم. ولی برای بکآپ گیری به صورت معمول از RMAN استفاده میشود.
نکته: تو محیط RMAN میتوان بکآپ با structure هم گرفت.
در اوراکل محیط export شامل ۲ ورژن میشه:
قبل از exportگیری محیطی را برای تست آماده میکنیم:
Enter user-name: system
Enter password:
Last Successful login time: Sat Apr 25 2015 22:24:51 +04:30
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> create user test identified by 123;
User created.
SQL> grant dba, connect to test;
Grant succeeded.
SQL> connect test
Enter password:
Connected.
SQL> create table t1(id number, name varchar2(20));
Table created.
SQL> insert into t1 values (1, 'mahdi');
1 row created.
SQL> insert into t1 values (2, 'mohsen');
1 row created.
SQL> insert into t1 values (2, 'mohammad');
1 row created.
SQL> select * from t1;
ID NAME
---------- --------------------
1 mahdi
2 mohsen
2 mohammad
SQL>