الاثنين، 6 أبريل 2009

نقل جميع الأغراضOBJECTS الموجودة في Tablespace إلى TableSpace آخر



ملاحظة : لا بد أن أكون على مستخدم لديه صلاحيات إدارة قاعدة البيانات .

الطريقة: أقوم بإنشاء Tablespace جديد كالتالي :

CREATE TABLESPACE MY_Source

DATAFILE '/recovery/Mydata/Source_data01.dbf' SIZE 10000M

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 100M;

كما تلاحظون لقد قمت بإنشاء Tablespace جديد باسم MY_Source وبما ان البيئة التي أعمل عليها هي Unix فلقد وضعت Datafile في المسار التالي /recovery/Mydata/ ووضعت حجمه 10G

أما طريقة إدارتة فوضعتها LOCAL ولمزيد من المعلومات عن هذه الطريقة راجع كتاب DBA Fundamental I

سأقوم الآن بإضافة two Datafile كما ستلاحظون في الكود التالي :

ALTER TABLESPACE MY_Source

ADD DATAFILE '/recovery/Mydata/Source_data02.dbf' SIZE 10000M;

ALTER TABLESPACE MY_Source

ADD DATAFILE '/recovery/Mydata/Source_data03.dbf' SIZE 10000M;

الآن أصبح الـ TableSpace جاهز الآن سأقوم بنقل الأغراض من ال Tablespace القديم الى الجديد واليكم الطريقة :

لنقل الجداول شرط أن تكون Nonpartitioned Table)):

لدينا في data dictionary جدول باسم dba_segments سأقوم بإنشاء كود من كود لكل الجداول الموجودة في الفضاء السابق لأنقلها إلى الفضاء الجديد :

Select ‘alter table ‘||segment_name ||’ MOVE TABLESPACE MY_Source ’

From dba_segments

Where segment_type=’TABLE’

And Tablespace_name=’WALEED’;

كما تلاحظون لقد انشات كود من كود وذلك لعمل نقل للجداول من الفضاء القديم إلى الجديد وهذه النتائج :

alter table REGIONS MOVE TABLESPACE MY_Source;

alter table LOCATIONS MOVE TABLESPACE MY_Source;

alter table DEPARTMENTS MOVE TABLESPACE MY_Source;

alter table JOBS MOVE TABLESPACE MY_Source;

alter table EMPLOYEES MOVE TABLESPACE MY_Source;

alter table JOB_HISTORY MOVE TABLESPACE MY_Source;

alter table EMP MOVE TABLESPACE MY_Source;

alter table ME MOVE TABLESPACE MY_Source;

alter table WW MOVE TABLESPACE MY_Source;

عندما أقوم بتنفيذ هذا الكود سأكون قمت بنقل جميع الجداول من الفضاء القديم إلى الجديد ولكن المشكلة تبقت لدي القيود والفهارس لم تنقل فكيف أقوم بنقلها إليكم الكود التالي :

Select 'ALTER INDEX '||segment_name ||' REBUILD TABLESPACE MY_SOURCE; '

From dba_segments

Where segment_type='INDEX'

And Tablespace_name='WALEED';

سيكون لدي الكود التالي :

ALTER INDEX REG_ID_PK REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX LOC_ID_PK REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX DEPT_ID_PK REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX DEPT_LOCATION_IX REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX LOC_CITY_IX REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX LOC_COUNTRY_IX REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX JOB_ID_PK REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX EMP_EMAIL_UK REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX EMP_EMP_ID_PK REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX EMP_JOB_IX REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX EMP_MANAGER_IX REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX EMP_NAME_IX REBUILD TABLESPACE MY_SOURCE;

ALTER INDEX JHIST_JOB_IX REBUILD TABLESPACE MY_SOURCE;

بتنفيذ هذا الكود أكون فد نقلت القيود والفهارس إلى الفضاء الجديد.

وبهذا أكون قد نقلت الجداول والفهارس والقيود من الفضاء القديم إلى الفضاء الجديد

ولكن تبقى لدي مشكلة وهي أن المستخدم الذي أستخدمه للتعامل مع قاعدة البيانات هذه معرف على الفضاء القديم ولا بد من تعديله حتى يعمل على الفضاء الجديد وإليكم الكود:

ALTER USER MY_USER

DEFAULT TABLESPACE My_source;

أكواد إضافية للتأكد من التنفيذ :

للتأكد من وجود الـ datafile :

select * from dba_data_files

where TABLESPACE_NAME='MY_SOURCE';

للتأكد من أن الجداول قد تم نقلها :

SELECT * FROM dba_segments

where Tablespace_name='MY_SOURCE'

and segment_type='TABLE';

للتأكد من أن الفهارس قد تم نقلها :

SELECT * FROM dba_segments

where Tablespace_name='MY_SOURCE'

and segment_type='INDEX';

للتأكد من أن المستخدم قد تم تعديل الفضاء الافتراضي له :

SELECT USERNAME,DEFAULT_TABLESPACE FROM dba_users

where username='MY_USER';

ليست هناك تعليقات:

إرسال تعليق

Powered By Blogger