oracle迁移至mysql数据表字段以及索引核对

由于mysql数据库是从oracle最早的用户下拉取的数据表,后期oracle的用户又对这些数据表进行了变更,没有及时同步所以有很大的出入,所以要将mysql下的所有数据表字段类型与Oracle用户已开发好的数据表字段类型保持一致。

其实有比较简单的方式可以进行核对,目前项目还没上线,数据库表中也没有数据,完全可以重新建库,由于甲方没有给重新建库的权限,所以只能想其他的办法进行核对表和字段类型。如下:

核对索引

1.查询mysql索引及对应的字段

有两种方式,根据自己的需求任选其一

select a.table_name,a.column_name,a.index_name
from intormation.schema.statistics a
group by a.table_schema,a.table_name,a.index_name,a.column_name;

-- 将联合索引字段进行拼接
select upper(a.table_name),upper(group_concat(column_name order by column_name)) as
from information_schema.statistics a 
group by a.table_schema,a.table_name ,a.index_name
order by a.table_name ;

2.oracle查询所有表的索引及对应的字段

select t.TABLE_NAME,t.COLUMN_NAME, 
       i.index_name,i.UNIQUENESS
from user_ind_columns t,user_indexes i
where t.index_name = i.index_name
 and t.table_name = i.table_name
and table_owner='EWS' -- 用户名
group by t.table_name,i.index_name,i.UNIQUENESS
order by t.table_name ;

 -- 将联合索引字段进行拼接
select t.TABLE_NAME,listagg(t.COLUMN_NAME,',') within group(order by t.COLUMN_NAME) as COL, 
       i.UNIQUENESS,i.index_name 
from user_ind_columns t,user_indexes i
where t.index_name = i.index_name
 and t.table_name = i.table_name
and table_owner='EWS' -- 用户名
group by t.table_name,i.index_name,i.UNIQUENESS
order by t.table_name ;

-- 查询oracle数据库下所有的索引
select t.TABLE_NAME,t.COLUMN_NAME, i.index_type
from user_ind_columns t, user_indexes i
where t.index_name = i.index_name
  and t.table_name = i.table_name ;

3.查看索引同步情况

创建两张临时表用于存放oracle与mysql查询的索引字段,便于查询出oracle存在而mysql不存在的索引

将查询到的所有字段数据导出csv格式,在oracle中导入临时表中

1.创建临时表
create table MYSQL_INDEX(
  table_name VARCHAR2(255), 
  col VARCHAR2(255),
  index_type VARCHAR2(255)
  )

create table ORACLE_INDEX(
  table_name VARCHAR2(255), 
  col VARCHAR2(255),
  index_type VARCHAR2(255),
  index_name VARCHAR2(255)
  )
插入临时表MYSQL_INDEX,ORACLE_INDEX中
直接使用以下sql,点击解锁图标,选中需要插入的字段。直接复制粘贴数据,填入需要的空字段中,提交
select rowid, t.* from MYSQL_INDEX t;
select rowid, t.* from ORACLE_INDEX t;
2.查看oracle存在而mysql不存在的索引
select t.table_name,t.col,T.index_TYPE,T2.index_TYPE
FROM oracle_index T
LEFT JOIN MYSOL_index T2 ON T.table_name = T2.table_name
WHERE T2.COL IS NULL
GROUP BY t.table_name,t. col,T. index_TYPE,T2.index_TYPE
ORDER BY t. table_name;
select a.col,a.table_name
from mysql_index a

3.查询mysql与oracle不一致的索引字段
select a.col, a.table_name 
from mysql_index a
where a.col not in
(
select a.col as col
from oracle_index
left join mysql_index b on a.table_name 
where ь.table_name and a.col b.col
)

核对字段

查询两张表的字段是否相等
在查询之前需要将oracle和mysql数据库的字段全部导出
mysql字段需要在notpad++中转换成大写,将数据类型转换成oracle对应的字段类型,方便作比较

1.查询mysql所有的表,字段以及字段类型

SELECT
CONCAT_WS('',TABLE_NAME ,COLUMN_NAME )AS COLUMN_NAME,COLUMN_TYPE
FROM
information_schema.columns a
WHERE
EXISTS( SELECT 1 FROM
 information_schema.tables b
WHERE b.table_type ='BASE TABLE'
AND a.table_name = b.table_name AND table_schema ='ews_20')
ORDER BY a.TABLE_NAME, a.COLUMN_NAME

2.查询oracle所有的表,字段以及字段类型


SELECT table_name||'.'||column_name,
case when data_type = 'NUMBE'THEN data_type||'('||data_precision||','||DATA_SCLE ||')'
     when data_type = 'DATE' THEN data_type
ELSE data_type||'('||char_col_decl_length||')' END AS data_typeS
FROM ALL_TAB_COLUMNS
WHERE OWNER = UPPER('ews');
查询该用户下所有表
SELECT * FROM ALL_TAB_COLUMNS WHERE OWNER = UPPER('ews');

3.查询字段同步情况

创建两张临时表用于存放oracle与mysql查询的字段类型,便于查询出oracle存在而mysql不存在的字段类型

将查询到的所有字段数据导出csv格式,在oracle中导入临时表中

1.创建临时表
create table MYSQL_COLUMNS_INFO(
  table_name VARCHAR2(255), 
  col VARCHAR2(255)
  )

create table oracle_columns_info(
  table_name VARCHAR2(255), 
  col VARCHAR2(255)
  )
插入临时表MYSQL_COLUMNS_INFO, oracle_columns_info中
直接使用以下sql,点击解锁图标,选中需要插入的字段。直接复制粘贴数据,填入需要的空字段中,提交
select rowid, t.* from mysql_columns_info t;
select rowid, t.* from oracle_columns_info t;
2.查询出mysql存在而oracle中不存在的字段
select distinct upper(substr(a.col,1,instr(a.col,'.') -1)) as table_name
from mysql_columns_info a
left join oracle_columns_info b
on upper(substr(a.col,1,instr(a.col,'.') -1)) F upper(substr(b.col,1,instr(b.col,'.') - 1))
where b.colis null;
3.查询mysql与oracle字段类型不一致的字段
SELECT A.COL,B.T_TYPE as oracle_type,A.T_TYPE as mysql_type
FROM oracle_columns_info B
LEFT JOIN MYSQL_COLUMNS_INFO A 
ON A.COL = B.COL AND B.T_TYPE<>A.T_TYPE
WHERE A.COL Is NOT NULL;

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值