یکی از مباحث خیلی مهم در سطح دیتابیس Tablespaceها هستند.
گفتیم رکوردهای ما رو سطح DataFile ذخیره میشوند، حال اگر بخواهیم DataFile را در سطح اوراکل ایجاد کنیم علاوه بر DataFile ای که قبلاً رو سطح دیتابیس وجود داشته باید از سک دستور SQL استفاده کنیم.
توی اوراکل مدیریت DataFileها و دستهبندی DataFileها توسط یک موجودیت منطقی مدیریت میشه به نام موجودیت Tablespace پس وقتی ما یک DataFile ایجاد میکنیم بعد از ایجاد DataFile مورد نظرمون اونو داخل یک tablespace میذاریم بعد جدولمون رو به tablespaceامون وصل میکنیم.
پس DataFile رو ایجاد میکنیم DataFile یک ساختار فیزیکی داره به یک tablespace لینکش میکنیم بعد جداولمون رو به tablespaceامون وصل میکنیم. جدول ما از لحظهای که به tablespaceامون وصل میشه اطلاعاتش رو میریزه در داخل DataFile ای که به Tablespace مدنظر وصل شده است.
به این ترتیب مدیریت DataFileها توسط Tablespace انجام میشود و شما هیچوقت یک جدول رو به طور مستقیم به یک DataFile وصل نمیکنید همیشه یک جدول رو به یک Tablespace وصل میکنید.
Tablespace در اصل واسط شما و DataFileتون است.
س: میتوان یک جدول را دخل چند Tablespace قرار داد؟
ج: بله، اما به شرطی که partitioning کرده باشید
س: آیا آدرس DataFileها در CTL قرار میگیره؟
ج: بله، آدرس DataFileها در CTL قرار میگیره
س: جداولی که بدون مشخص کردن Tablespace موردنظر ساخته میشوند در کدام Tablespace قرار میگیرند؟
ج: در DefaultTableSpace قرار میگیرند
س: مشکل DefaultTableSpace چیست؟
ج: مشکل این است که DefaultTableSpace محدودیت حجمی نداره یعنی دیتابیس شما به صورت بیپایان در خودش میتونه جداول رو ذخیره کنه.
س: Tablespace میتونه به چند DataFile اشاره کنه؟
ج: بله
س: آیا Tablespace به schema خاصی مربوط میشود؟
ج: به صورت پیشفرض کسی که Tablespace را میسازد صاحب اون Tablespace است ولی میتوان یک Tablespace را به یک schema خاص اختصاص داد.
نکته: میتوان کاری کرد که هر table که توسط schema خاصی ساخته میشود وارد یک tablespace مشخص گردد.
نکته: یک زمانی ممکنه بیاد که شما نخواهید table رو به tablespace ای اضافه کنید، در این حالت به صورت پیشفرض table شما در داخل default tablespace یوزر قرار میگیرد.
ما در برخی مواقع میخواهیم ممانعت کنیم از اینکه مثلاً بیشتر از ۱۰۰ مگ توی یک table اطلاعات دخیره نشه پس باید DataFileبا حجم ۱۰۰ مگابایت ایجاد کنیم بعد اون DataFile رو به یک Tablespace اختصاص دهیم بعد table موردنظرمون رو به اون Tablespace لینک کنیم تا اطلاعات توسط Tablespace بر روی DataFile 100MB ما نوشته شود.
خب زمانی که اطلاعات ما به ۱۰۰ مگابایت برسه DataFile ما دیگه جایی برای ذخیرهسازی دادهها نداره و اوراکل خطا میده و میگه من دیگه نمیتونم اطلاعات رو ذخیره کنم.
البته خطاهای اوراکل از ۷۵ درصد مونده به پر شدن DataFile شروع میشه و هی اخطار میندازه تو Log و میگه مواظب باش این Tablespace دیتافایلش داره پر میشه تا وقتی به ۱۰۰ برسه اگه شما تراکنشی اجرا کنید اتوماتیک تراکنش RollBack میشه توسط اوراکل چون دیگه رو سطح DataFile اطلاعات رو نمیتونه ذخیرهسازی بکنه
حالت کلی ایجاد Tablespace و DataFile
CREATE TABLESPACE <tablespace_name> DATAFILE 'datafile_name.dbf' SIZE 100M;
مثال: میخواهیم DataFile و Tablespace بسازیم که بیش از ۱۰۰ مگابایت را در خود نتوانند ذخیرهسازی کنند؟
SQL> CREATE TABLESPACE TS DATAFILE 'E:/A.DBF' SIZE 100M;
Tablespace created.
نکته: از لحاظ اوراکل این فضا یک فضای اختصاص داده شده به صورت کامل است. یعنی حتی وقتی که هیچ دادهای درون این دیتافایل نیست این ۱۰۰ مگابایت یک فضای رزرو شده به صورت کامل برای اوراکل است.
SQL> host dir e:\A.dbf
Volume in drive E has no label.
Volume Serial Number is 7A3C-7523
Directory of e:\
05/03/2015 12:15 PM 104,865,792 A.DBF
1 File(s) 104,865,792 bytes
0 Dir(s) 99,245,846,528 bytes free
شکل کلی ارسال یک جدول به tablespace:
ALTER TABLE <table_name> MOVE TABLESPACE <tablespace_name>;
مثال: یک جدول را به Tablespace ایجاد شده در مثال قبل متصل کنید:
SQL> CREATE TABLE PERSON(ID NUMBER);
Table created.
SQL> ALTER TABLE PERSON MOVE TABLESPACE TS;
Table altered.
از این لحظه به بعد دادههای جدول PERSON روی DATAFILEای میخوابه به نام A.DBF و حداکثر میتونه ۱۰۰ مگ فضا میتونه اشغال کنه. و وقتی بیش از ۱۰۰ مگ بخواهیم داده INSERT کنیم اوراکل اسم TABLESPACE و TABLE و اسم آخرین DATAFILE مربوط شده به TABLESPACE را میآورد و خطای Not enough free space میدهد.
س: آیا میتوان در آینده DATAFILE ای را در اثر پر شدن DATAFILEهای TABLESPACEامون به TABLESPACE اضافه کرد؟
ج: بله
س: ساختار TABLE از TABLESACE فعلی چطور به TABLESPACE مدنظر انتقال مییابد؟
ج: اوراکل هم میتونه به صورت تیکه تیکه ساختار TABLE رو انتقال بده یعنی یه تیکه رو ببره رو TABLESPACE جدید و مابقی در TABLESPACEقدیمی باشد و هم میتونه کلاً MOV کنه و کلاً بره رو TABLESPACE و DATAFILE جدید.
نکته: در حالت فعلی کل اطلاعات به TABLESPACE و DATAFILE جدید MOV میشود.
نکته: هرگز به صورت دستور زیر مسیر DBF را تعیین نکنید، چون با این عمل کل اون پارتیشن به عنوان DataFile در نظر گرفته میشود(و تمام اطلاعات شما از بین میرود و کل فضای پارتیشن به ۱۰۰ مگابایت میرسد) و دیگر از طریق سیستمعامل نمیتوانید وارد پارتیشن موردنظر بشوید و کل فضا به اوراکل اختصاص مییابد:
CREATE TABLESPACE TS DATAFILE 'E:/' DIZE 100M;
س: چند جدول را میتوان در یک Tablespace قرار داد؟
ج: بله، هیچ مشکلی ایجاد نمیشه
یادآوری
یک DataFile ممکنه از چندین Segment تشکیل شده باشه هر segment تقریباً معادل یک جدوله، پس میشه یک DataFile درون خودش چندین جدول(سگمنت) را ذخیره سازی کند (در حقیقت اینکار را توسط شاخص گذاری انجام میدهد، یک index رو سطح فیزیکی میذاره بعد هرچی میخواد ایندکس رو میده دیتاها را میگیره مثل Hashmap در جاوا رفتار میکنه).
نکته: DefaultTableSpace آنقدر گسترش پیدا میکنه تا هارد شما کاملاً پر شود.
یه چیزی تو بحث سرویسدهی دیتابیس اوراکل است که بهتره بدونید اوراکل وحشتناک گرونه یعنی هزینه ۱ گیگ دیتابیس و ۱ ماه نگهداری اون چیزی حدود ۸ میلیون تومان هزینه داره.
واسه همین همیشه در اپلیکیشنهای جاوا و اوراکلای اپلیکیشن در یک سرور جدا قرار میگیرد و فقط دیتابیس آن در یک هاست اوراکلی نگهداری میشود.
در سمت هاست اوارکل به شما یک user میدهند و به دسترسیهاتون رو محدود میکنن رو مثلاً ۵۰ مگ که دیتابیس شما نتونه بیش از ۵۰ مگ دیتافایل داشته باشه
نکته: موقع drop کردن tablespace باید جوری tablespace را drop کنید که تمام موجودیتهای متصل به اون از بین برود.
نکته: اگر tablespace را بدون پاک کردن dbf آن پاک کنید dbf آن در اوراکل میماند و دیگر قادر به پاک کردن آن dbf نیستید تا زمانی که یک tablespace به آن dbf متصل کنید.