数据迁移中碰见的一些问题

简介: 单位有一套Oracle 9i的古老测试数据库,因为机房搬迁,所以需要迁移数据,新库是Oracle 11g了,一个比较简单的需求,但过程中碰见了一些问题,看似比较琐碎,值得总结一下。

单位有一套Oracle 9i的古老测试数据库,因为机房搬迁,所以需要迁移数据,新库是Oracle 11g了,一个比较简单的需求,但过程中碰见了一些问题,看似比较琐碎,值得总结一下。


由于源库是9i,因此只能用imp/exp,不能用数据泵。


问题1:导入目标库用户的默认表空间


源库由于不规范的使用,对象默认存储的是数据库默认表空间USERS,既然是迁移,新库就要尽量规范一些。但问题来了,impdp/expdp可以使用remap_tablespace映射新旧表空间,exp/imp应该如何做?


网上有一种说法是,首先收回用户user的unlimited tablespace权限,然后设置user默认表空间为bank_tbs,再将user对system和users表空间配额设置为0,意图是让imp导入的时候,发现users表空间无权限,则自动找用户的默认表空间bank_tbs。

revokeunlimited tablespace from user;

alteruser user quota unlimited on bank_tbs;

alteruser user quota 0 on system;

alteruser user quota 0 on users;


但从我实测看,并不是这样,可以使用imp命令的show选项,看dmp文件内容,create table子句是会跟着tablespace users,即指定了表使用的表空间名称,由于user用户在users表空间配额为0,因此会报quota相关的错误,并不会找用户默认的bank_tbs表空间。


我们再捋一下,

1. dump文件中有指定了tablespace users表空间。

2. 目标库存在users表空间,但用户在users表空间配额为0,其默认表空间为bank_tbs。

3. imp执行导入,报错users表空间quota错误。


用户默认表空间的作用,是若create table语句未指定tablespace子句,则会默认存储此表空间,既然如此,既然如此,又由于这是一套测试库,因此首先改一下users表空间名称,

alter tablespace users rename to users_k;

然后执行imp导入,就可以正常存入user用户默认的bank_tbs中。顺着思路想,可以改一下数据库的默认表空间users,只要保证不存在users表空间,dmp中create table语句就不能根据tablesapce子句,插入对应的表空间,而是找用户默认的表空间。


除此之外,可以初始化就导入users表空间,然后拼接SQL语句,将对象可以move至其他表空间,当然这就需要两倍的空间。另外还可以收工改一下dmp文件中tablespace子句对应的表空间,但只适应于小容量文件。


这里有一些知识点值得关注,

1. unlimited tablespace权限,是为用户授予resource角色是自动添加的,但从安全性的角度来考虑,在创建用户并且授予resource角色之后应该回收unlimited tablespace这个系统权限,原因就是有了这个权限,用户可以在任意表空间中创建对象,就有可能恶意占领系统表空间,影响数据库的正常运行。

2. Oracle 9i以前,数据库默认用户的表空间是SYSTEM,这是极为不合理的,因为SYSTEM存储的是数据库重要的底层数据字典信息,如果无限制地存储用户数据,极有可能影响数据库的运行。从9i开始,默认表空间则变为了USERS,建库的时候会默认创建。

使用如下语句,可以查询当前系统默认表空间,

select property_value from database_properties where property_name = 'DEFAULT_PERMANENT_TABLESPACE';

使用如下语句,可以改下当前数据库默认的用户表空间以及临时表空间,

alter database default [temporary] tablespace tablespace_name;



问题2:数据库字符集


为了保证数据导出导入,不会出现乱码,字符集要尽量保持一致,可以使用如下语句检索当前数据库使用的字符集,

select userenv('language') from dual;

例如返回结果是AMERICAN_AMERICA.ZHS16GBK。

若要检索当前操作系统字符集,可以使用,

echo $NLS_LANG

例如返回结果是AMERICAN_AMERICA.AL32UTF8。

若要更新操作系统字符集,可以使用,

export  NLS_LANG=AMERICAN_AMERICA.ZHS16GBK



问题3:导入过程中的一些报错


报错1:

Export file created by EXPORT:V09.02.00 via conventional path
IMP-00013: only a DBA can import a file exported by another DBA
IMP-00000: Import terminated unsuccessfully

错误信息提示,只用DBA用户可以导入另一个DBA导出的文件。意思就是这个dmp文件,导出用户是有DBA角色的,因此导入使用的用户,必须要有DBA角色。

解决方法1:使用非DBA角色的用户,重新exp导出,再用非DBA用户imp导入。

解决方法2:使用DBA用户执行imp导入操作。

相比而言,生产系统一般会选择方案1,毕竟一般业务数据的属主,不会是一个DBA角色的用户,如果用方案2,则要求目标端用户需要DBA角色,未来要是再有导出导入需求,还是需要DBA角色,无休无止了。


报错2:

Export file created by EXPORT:V09.02.00 via conventional path
import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
IMP-00031: Must specify FULL=Y or provide FROMUSER/TOUSER or TABLES arguments
IMP-00000: Import terminated unsuccessfully

此时执行imp可以指定full=y,或者使用fromuser和touser参数,例如,

imp user/user file=... log=... fromuser=user touser=user

明确导出和导入的用户名称。



问题4:创建视图报错


导入日志中显示,创建视图的时候报错了,

ORA-01031: insufficient privileges

原因就是为用户授予resource和connect常规角色,并不会自动授予创建视图的权限,具体可以参考(http://blog.csdn.net/bisal/article/details/31735185),此时可以授予,

SQL> grant createany view to user;

Grant succeeded.

再次导入,即可以正常完成了。


对于测试数据迁移,其实还有一点,就是是不是所有数据,都需要迁移?因为往往测试库中有一些,仅临时使用的表对象等信息,如果执行前,筛选一下真正需要的数据,再开始执行导出导入,可能只需要迁移小部分数据,对于垃圾数据就可以直接忽略,这就是人们常说优化的极致,即不做任何事。



如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

目录
相关文章
|
4月前
|
SQL 分布式计算 DataWorks
Dataphin常见问题之补数据任务卡着不动如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
1月前
|
数据库
面试准备 数据迁移解决方案
【8月更文挑战第8天】
34 7
|
1月前
|
安全 API 数据库
OceanBase数据库clog日志,删前请三思!一不小心可能引发数据灾难,快来了解正确的日志管理之道!
【8月更文挑战第7天】ModelScope(魔搭)作为开放的模型即服务平台,提供丰富的预训练模型。访问令牌在此类平台中至关重要,用于验证用户身份并授权访问特定模型或服务。本文介绍访问令牌的概念、获取方法及使用示例,强调安全性与有效期内的使用,并简述刷新令牌机制。掌握这些知识可帮助用户安全高效地利用ModelScope的资源。
37 0
|
2月前
|
SQL 负载均衡 安全
阿里云DTS踩坑经验分享系列|全量迁移加速方法指南
阿里云数据传输服务DTS是一个便捷、高效的数据迁移和数据同步服务。一般而言,一个完整的DTS数据迁移任务主要包括预检查、结构迁移,全量迁移,增量迁移等阶段,其中全量迁移会将源数据库的存量数据全部迁移到目标数据库。面对各种各样的用户场景, 本文将重点介绍如何使用阿里云DTS实现全量数据迁移加速,以缩短迁移时间,确保数据迁移的效率和稳定性。
282 0
|
3月前
|
运维 关系型数据库 Serverless
PolarDB产品使用问题之恢复慢,有什么办法可以优化
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
SQL 安全 关系型数据库
DMS产品常见问题之DMS的postgis时而掉线如何解决
DMS(数据管理服务,Data Management Service)是阿里云提供的一种数据库管理和维护工具,它支持数据的查询、编辑、分析及安全管控;本汇总集中了DMS产品在实际使用中用户常遇到的问题及其相应的解答,目的是为使用者提供快速参考,帮助他们有效地解决在数据管理过程中所面临的挑战。
|
4月前
|
关系型数据库 MySQL 数据库
Mysql基础第三十二天,数据库维护
Mysql基础第三十二天,数据库维护
76 0
|
前端开发 大数据 关系型数据库
一次做数据报表的踩坑经历,让我领略了数据同步增量和全量的区别
嗨喽,大家好,我是创作新人,新时代新的农民工小赵,在今年的七月结束了大学生活,目前在一家大数据公司做开发。对于初入职场的同学来说,在实际的工作开发中会遇到各种各样问题,将问题沉淀、输出、总结,才会让后面的路走的越来越轻松。那么,接下来我会通过以下几个方面进行分享。
一次做数据报表的踩坑经历,让我领略了数据同步增量和全量的区别
|
SQL 数据库连接 数据库
游戏版本要回滚,还好我机智备份了数据库,代码直接拿走
今天有空整了下之前写的数据库备份的代码。
263 0
游戏版本要回滚,还好我机智备份了数据库,代码直接拿走
|
数据库
备份恢复学的这么差,试用期你都过不了
备份恢复学的这么差,试用期你都过不了
115 0
备份恢复学的这么差,试用期你都过不了