参考 https://blog.51cto.com/maclean/1278181
今天看表空间文件名子编号不太好看(c09.dbf -> c010.dbf),强迫症想改回来
SQL:
alter tablespace [TABLESPACE_NAME] offline;
命令行:
mv /a/b/c010.dbf /a/b/c10.dbf
提示没有文件!?
ll /a/b/c*
列出的部分文件名带问号??!
/a/b/c010.dbf?
/a/b/c01.dbf
/a/b/c02.dbf
/a/b/c03.dbf
/a/b/c04.dbf
/a/b/c05.dbf?
/a/b/c06.dbf?
/a/b/c07.dbf?
/a/b/c08.dbf?
/a/b/c09.dbf?
强迫症,删除问号
mv /a/b/c05.dbf? /a/b/c05.dbf
mv /a/b/c06.dbf? /a/b/c06.dbf
mv /a/b/c07.dbf? /a/b/c07.dbf
mv /a/b/c08.dbf? /a/b/c08.dbf
mv /a/b/c09.dbf? /a/b/c05.dbf
mv /a/b/c010.dbf? /a/b/c10.dbf
修改数据库
alter table [TABLESPACE_NAME] rename datafile '/a/b/c010.dbf' to ‘/a/b/c10.dbf’;
提示没有 ‘/a/b/c010.dbf’ ???!!
想起刚才改名里的问号“?”!!
select file_name from dba_data_files where tablespace_name = '[TABLESPACE_NAME]';
没看出个啥。
换sql图形化工具(plsql,dbvis)再执行一次
双击结果,发现问题了,正常file_name内容只有一行,有问题的居然是两行,那个文件系统的问号,是一个未知符号造成换行。就是一个乱码
怎么改名?
1、直接打问号,失败
2、转义问号,失败
3、把换行用hex显示出来,失败了
4、搜到把数据库重启到mounted状态,然后alter system rename file …,但是还是一样有 换行/问号 问题,都懒得试了
5、用文件id代替文件名改名,找不到教程
最后终于找到这篇
https://blog.51cto.com/maclean/1278181
方法一好复杂。
方法二搜出文件名原文作为 alter tablespace rename 的变量执行。
方法三用rman。
我最终用方法二处理完成。
为免原文被删除。以下我再拷贝一份
方法1. 通过alter database backup controlfile to trace; 修改backup controlfile to trace生成的CREATE CONTROLFILE脚本,把存在乱码的数据文件名修改为目标文件名; 这种方法稍微费力一点…
方法2. 通过以下动态SQL执行alter database rename来修改数据文件名:
declare
x varchar2(600);
y varchar2(600);
begin
y:='/s01/rename.dbf';
select file_name into x from dba_data_files where file_id=20;
execute immediate 'alter database rename file '''||x||''' to '''||y||'''';
end;
/
方法3.RMAN
`在这里插入代码片RMAN> copy datafile 20 to ‘/s01/rename1.dbf’;
copy datafile 20 to '/s01/rename1.dbf';
switch datafile 20 to copy;
recover datafile 20;
sql ' alter database datafile 20 online';
直接使用RMAN COPY+ SWITCH DATAFILE TO COPY或者SETNAME都可以代劳帮助你解决该问题,因为RMAN可以直接使用FILE#指代而不需要如ALTER DATABASE RENAME FILE这样必须输入员文件名。