数据库文件的迁移

作者: admin 分类: 公众号存档            2 次浏览 发布时间: 2014-03-24 08:34

公众号:杨建荣的学习笔记 · 作者:笔记21天 · 发布:2014-03-24 08:34:57 · 原文链接

关于数据库中的文件迁移,需要考虑普通数据文件,redo日志文件(还需要考虑是否为current状态),undo表空间,临时表空间,system,sysaux表空间。
文件迁移可以参考下面的伪代码:
move_non_system_tablespace ,需要在open状态

                    {

                    alter tablespace xxxx offline;

                    cp datafiles

                    alter tablespace xxx rename sourcexxxxx   to targetxxxxx;

                    alter tablespace xxxxx online;

                    }

move_system_tablespace(system,sysaux,undo),需要在mount状态

                    {

                    cp datafiles

                    alter database rename  file  sourcexxxxx   to targetxxxxx;

                    alter database open;

                    }

move_redo_logs

                    {

                   1. for current/active logfiles, need to in mount state

                        cp logfiles

                        alter database rename  file  sourcexxxxx   to targetxxxxx;

                   2. for inactive/unused logfiles,can change online

                        cp logfiles

                        alter database rename  file  sourcexxxxx   to targetxxxxx;

                    }

move_temp_files

                    {

                    cp datafiles

                    alter database rename  file  sourcexxxxx   to targetxxxxx;

                    alter database tempfile xxxx online;

                    }

示例脚本如下:

##### normal tablespace  ####
alter tablespace TEST_DATA offline;
!cp ‘/oravl08/oradata/TESTDB/TEST_DATA_1.dbf’ ‘/oravl01/oracle/TEST_DATA_1.dbf’;
alter tablespace TEST_DATA rename datafile ‘/oravl08/oradata/TESTDB/TEST_DATA_1.dbf’ to ‘/oravl01/oracle/TEST_DATA_1.dbf’;
alter tablespace TEST_DATA online;

alter tablespace TEST_IX offline;
!cp ‘/oravl08/oradata/TESTDB/TEST_IX_1.dbf’ ‘/oravl01/oracle/TEST_IX_1.dbf’;
alter tablespace TEST_IX rename datafile ‘/oravl08/oradata/TESTDB/TEST_IX_1.dbf’ to ‘/oravl01/oracle/TEST_IX_1.dbf’;
alter tablespace TEST_IX online;

##### temp files ####
alter database tempfile ‘/oravl08/oradata/TESTDB/TEMP_1.dbf’ offline;
!cp ‘/oravl08/oradata/TESTDB/TEMP_1.dbf’ ‘/oravl01/oracle/TEMP_1.dbf’
alter database  rename file ‘/oravl08/oradata/TESTDB/TEMP_1.dbf’ to ‘/oravl01/oracle/TEMP_1.dbf’;
alter database tempfile ‘/oravl01/oracle/TEMP_1.dbf’ online;
#### system,sysaux,undo ####
!cp ‘/oravl08/oradata/TESTDB/SYSTEM_1.dbf’ ‘/oravl01/oracle/SYSTEM_1.dbf’
alter database  rename file ‘/oravl08/oradata/TESTDB/SYSTEM_1.dbf’ to ‘/oravl01/oracle/SYSTEM_1.dbf’;

!cp ‘/oravl08/oradata/TESTDB/SYSAUX_1.dbf’ ‘/oravl01/oracle/SYSAUX_1.dbf’
alter database  rename file ‘/oravl08/oradata/TESTDB/SYSAUX_1.dbf’ to ‘/oravl01/oracle/SYSAUX_1.dbf’;

!cp ‘/oravl08/oradata/TESTDB/UNDOTBS_1.dbf’ ‘/oravl01/oracle/UNDOTBS_1.dbf’
alter database  rename file ‘/oravl08/oradata/TESTDB/UNDOTBS_1.dbf’ to ‘/oravl01/oracle/UNDOTBS_1.dbf’;

#### logfiles ####
!cp ‘/oravl03/oradata/TESTDB/redo_g1_m1.dbf’ ‘/oravl01/oracle/redo_g1_m1.dbf’
alter database  rename file ‘/oravl03/oradata/TESTDB/redo_g1_m1.dbf’ to ‘/oravl01/oracle/redo_g1_m1.dbf’;

!cp ‘/oravl03/oradata/TESTDB/redo_g1_m2.dbf’ ‘/oravl01/oracle/redo_g1_m2.dbf’
alter database  rename file ‘/oravl03/oradata/TESTDB/redo_g1_m2.dbf’ to ‘/oravl01/oracle/redo_g1_m2.dbf’;

最后带给大家一些福利,关于文件的迁移,可以参考如下的脚本。

if [[ -d $1 ]]; then

    echo ‘Directory has found :)’

else

    echo “Directory doesn’t exists! :(“

    exit

fi

#used for 11g

#select regexp_count(file_name,’/’) from dba_data_files

#used for 10g,9i..

#select (length(file_name)-length(replace(file_name,’/’,null)))/(length(‘/’)) from dba_data_files

#get file_name

# select substr(file_name,instr(file_name,’/’,1,regexp_count(file_name,’/’))) from dba_data_files;

sqlplus -s / as sysdba <<EOF

set linesize 200

set pages 0

prompt ########## Scripts as below #######

select ‘DB is now in ‘||status||’ status’  from gv\$instance;

select

 ‘alter tablespace ‘||tablespace_name||’ offline; ‘||chr(10)

||’!cp ‘||chr(39)||file_name||chr(39)||’ ‘ ||chr(39)||’$1’||substr(file_name,instr(file_name,’/’,1,regexp_count(file_name,’/’)))||chr(39)||’; ‘||chr(10)

||’alter tablespace ‘||tablespace_name||’ rename datafile ‘||chr(39)||file_name||chr(39)||’ to ‘||chr(39)||’$1’||substr(file_name,instr(file_name,’/’,1,regexp_count(file_name,’/’)))||chr(39)||’; ‘||chr(10)

|| ‘alter tablespace ‘||tablespace_name||’ online; ‘

 from dba_data_files where tablespace_name not in (‘SYSTEM’,’SYSAUX’) and tablespace_name not like ‘UNDO%’;

prompt ##### temp files ####

select ‘alter database tempfile ‘||chr(39)||name||chr(39)||’ offline;’||chr(10)

||’!cp ‘||chr(39)||name||chr(39)||’ ‘ ||chr(39)||’$1’||substr(name,instr(name,’/’,1,regexp_count(name,’/’)))||chr(39)||’  ‘||chr(10) 

||’alter database  rename file ‘||chr(39)||name||chr(39)||’ to ‘||chr(39)||’$1’||substr(name,instr(name,’/’,1,regexp_count(name,’/’)))||chr(39)||’; ‘||chr(10)

|| ‘alter database tempfile ‘||chr(39)||’$1’||substr(name,instr(name,’/’,1,regexp_count(name,’/’)))||chr(39)||’ online; ‘ 

 from v\$tempfile;

prompt #### system,sysaux,undo ####

select

‘!cp ‘||chr(39)||f.name||chr(39)||’ ‘ ||chr(39)||’$1’||substr(f.name,instr(f.name,’/’,1,regexp_count(f.name,’/’)))||chr(39)||’ ‘||chr(10)

||’alter database  rename file ‘||chr(39)||f.name||chr(39)||’ to ‘||chr(39)||’$1’||substr(f.name,instr(f.name,’/’,1,regexp_count(f.name,’/’)))||chr(39)||’; ‘

 from v\$datafile f,v\$tablespace t where t.ts#=f.ts# and (t.name  in (‘SYSTEM’,’SYSAUX’) or t.name like ‘UNDO%’); 

prompt #### logfiles ####

select

‘!cp ‘||chr(39)||member||chr(39)||’ ‘ ||chr(39)||’$1’||substr(member ,instr(member ,’/’,1,regexp_count(member ,’/’)))||chr(39)||’  ‘||chr(10) 

||’alter database  rename file ‘||chr(39)||member ||chr(39)||’ to ‘||chr(39)||’$1’||substr(member ,instr(member ,’/’,1,regexp_count(member ,’/’)))||chr(39)||’; ‘ 

 from v\$logfile f,v\$log l where f.group#=l.group# and l.status!=’CURRENT’;

EOF

exit

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注