数据库文件的迁移

关于数据库中的文件迁移,需要考虑普通数据文件,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

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-03-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

Mysql Insert Or Update语法例子

有的时候会需要写一段insert的sql,如果主键存在,则update;如果主键不存在,则insert。Mysql中提供了这样的用法:ON DUPLICATE...

23110
来自专栏我的博客

ubuntu安装puref-ftpd

1.安装pureftpd sudo apt-get install pure-ftpd sudo apt-get install pure-ftpd-mysql...

2804
来自专栏北京马哥教育

五分钟 SQL Server 学习入门——基本篇

? 作者:My_heart_ 来源:http://blog.csdn.net/my_heart_/article/details/62425140 首先相信...

3734
来自专栏用户2442861的专栏

【Linux】Ubuntu下C语言访问MySQL数据库入门

首先以用户rick登录MySQL数据库(用户rick已经被root权限用户赋予了创建数据库等等的权限):

743
来自专栏杨建荣的学习笔记

关于primary key和unique index的奇怪问题 (58天)

今天一个dba交给我一个问题,让我帮忙查一下。说有个脚本运行的时候有错,让我看看是什么原因。 脚本的思路如下: 先drop PK,FK之类的constraint...

26512
来自专栏杨建荣的学习笔记

impdp ORA-39002,ORA-39166,ORA-39164的问题及解决(r2第6天)

今天在做imp和impdp的性能测试时,发现如果表中存在lob字段,加载真是慢的厉害,每秒钟大概1000条的样子,按照这种速度,基本上不用干活了。 比如5千万条...

2837
来自专栏xingoo, 一个梦想做发明家的程序员

Mysql Insert Or Update语法实例

有的时候会需要写一段insert的sql,如果主键存在,则update;如果主键不存在,则insert。Mysql中提供了这样的用法:ON DUPLICATE...

1877
来自专栏杨建荣的学习笔记

通过shell定制dbms_advisor.quick_tune(r4笔记第15天)

在平时的调优工作中,在11g中的新特性sql monitor可以极大的简化性能监控的工作,对于执行时间超过5秒的sql语句都会记入v$sql_monitor中...

2784
来自专栏轮子工厂

数据库性能优化,原来还可以有这种操作

531
来自专栏数据和云

追本溯源:Oracle 只读表空间的探索实践

作者简介 ? 胡中豪 云和恩墨西区交付工程师,多年一线 DBA 经验,曾服务于运营商、电网、政府行业、银行等行业客户;擅长数据库故障处理、性能优化、实施升级 本...

2623

扫码关注云+社区