===============================================================================
oracle查询标的记录数
select * from user_tables where num_rows>0;
查询表大小
select segment_name,segment_type,round(BYTES/1024/1024,2) from user_segments where segment_type like 'TABLE%';
select * from user_segments;
===============================================================================
问题 引用的表的字段非主键
利用mysql migration toolkit工具将oracle数据库迁移到mysql
第一步 创建并修改脚本
(一)字段长度过大,mysql中不含text与blob字段的表行长度最大为65535个字节--修改字段长度或将任一varchar类型改为blob或text类型
(二)索引长度过大,mysql索引最大长度为756字节,--修改索引长度
(三)不能创建外键,这是因为主外键所属字段的类型及长度不一致,--统一数据类型及长度即可
第二步 修改完后重新创建脚本
===============================================================================
增加外键约束
ALTER TABLE `boss`.`finac_payable`  
  ADD CONSTRAINT `fkerrorid2` FOREIGN KEY (`numerrorid`) REFERENCES `boss`.`inf_reserror`(`numerrorid`) ON UPDATE NO ACTION ON DELETE NO ACTION;
修改列属性
ALTER TABLE `boss`.`finac_payable`   
  CHANGE `numoperid` `numoperid` BIGINT(10) NULL;

已经在数据库创建对象的情况下,插入数据就勾掉在数据库的建表过程



20151207数据库迁移记录
========================================================================
--  删除外键 (存在主外键关系的表无法删除)
select 'alter table '||table_name||' drop constraint '|| constraint_name||';' from user_constraints where constraint_type = 'R';
-- 分批删除数据库表
select 'drop table '||tname||' purge;' from tab rownum-- 删除序列(保证数据一致)
select 'drop sequence '||sequence_name||';' from user_sequences;
导入数据
-- 记录对比
select 'select '''||tname||''',count(*) cnt from '||tname||' union all' from tab;
-- 主外键查询
select a.owner, --主键拥有者  
        a.table_name, --主键表  
        b.column_name, --主键列  
        c.OWNER, --外键拥有者  
        c.table_name, --外键表  
        d.column_name, --外键列  
        d.constraint_name
 from user_constraints  a  
 left join user_cons_columns b   
             on  a.constraint_name=b.constraint_name  
 left join user_constraints c   
             on c.R_CONSTRAINT_NAME=a.constraint_name  
 left join user_cons_columns d  
             on c.constraint_name=d.constraint_name  
 where  a.constraint_type='P'  
     and  a.table_name='BOSS_MISSIVE' --需要查看主外键关系的表  
 order by a.table_name;

创建表空间
select 'create tablespace '||name||' datafile''d:\oracle\dbdata\'||name||'.bdf'' size 50M autoextend on next 20Mmaxsize unlimited;' from v$tablespace;
赋予用户权限
create user xxx;
grant ...
导出数据
exp scott/tiger@xxxx file=scott.dmp log=scottlog owner=scott;
导入数据
imp boss/boss206mng fromuser=boss touser=boss rows=y indexes=n commit=y buffer=30485760 feedback=100000 ignore=n file=d:\dumpboss.dmp log=boss_yyyymmdd.log
===============================================================
问题
1.导入时模式冲突
即指定owner又指定tables是会产生冲突
2.插入主键冲突
用序列生成主键的表,导入数据时只删除目标库的表而没有删除序列,表的已存在的主键值大于当前序列的nextval值,导致序列生成的主键在表中已存在而导致主键冲突;所以删除表的同时要删除序列;
3.用户无表空间使用权限,导致表无法创建;
4.无备份空间,备份文件传输结束,文件大小不一致,df -Th发现该磁盘空间已满;
5.监听和tns中host项用主机名不是ip,主机迁移可以不用改服务器及客户端相关的连接设置;
6.字符集
原库和目标数据库的字符集不一致时,导入数据时会报最大允许值是xxx,实际值是xxx的错误
查看数据库字符集
select * from nls_database_parameters
修改字符集
1.       关闭数据库

SQL>SHUTDOWN IMMEDIATE

2. 启动到Mount

SQL>STARTUP MOUNT;

SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;

SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;

SQL>ALTER DATABASE OPEN;

SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;

SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;

SQL>SHUTDOWN IMMEDIATE;

SQL>STARTUP












09-19 21:56